X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmsgbase.c;h=60648431e3e2c8e100b439a11522bda71cafcd4a;hb=b23b175f8f7701e17e888b152adb57409d618d33;hp=819913f47a9e87203212d886ab1dff6edfcda623;hpb=8a3a9962ecc5faf81e0f5c3e18726545bf198249;p=citadel.git diff --git a/citadel/msgbase.c b/citadel/msgbase.c index 819913f47..60648431e 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -1593,6 +1593,31 @@ char *qp_encode_email_addrs(char *source) } +/* If the last item in a list of recipients was truncated to a partial address, + * remove it completely in order to avoid choking libSieve + */ +void sanitize_truncated_recipient(char *str) +{ + if (!str) return; + if (num_tokens(str, ',') < 2) return; + + int len = strlen(str); + if (len < 900) return; + if (len > 998) str[998] = 0; + + char *cptr = strrchr(str, ','); + if (!cptr) return; + + char *lptr = strchr(cptr, '<'); + char *rptr = strchr(cptr, '>'); + + if ( (lptr) && (rptr) && (rptr > lptr) ) return; + + *cptr = 0; +} + + + /* * Get a message off disk. (returns om_* values found in msgbase.h) */ @@ -1706,7 +1731,7 @@ int CtdlOutputPreLoadedMsg( /* nhdr=yes means that we're only displaying headers, no body */ if ( (TheMessage->cm_anon_type == MES_ANONONLY) - && (mode == MT_CITADEL) + && ((mode == MT_CITADEL) || (mode == MT_MIME)) && (do_proto) ) { cprintf("nhdr=yes\n"); @@ -1755,6 +1780,9 @@ int CtdlOutputPreLoadedMsg( if (k != 'M') { if ( (TheMessage->cm_fields[k] != NULL) && (msgkeys[k] != NULL) ) { + if ((k == 'V') || (k == 'R') || (k == 'Y')) { + sanitize_truncated_recipient(TheMessage->cm_fields[k]); + } if (k == 'A') { if (do_proto) cprintf("%s=%s\n", msgkeys[k], @@ -1792,8 +1820,10 @@ int CtdlOutputPreLoadedMsg( safestrncpy(suser, mptr, sizeof suser); } else if (i == 'Y') { - if ((flags & QP_EADDR) != 0) + if ((flags & QP_EADDR) != 0) { mptr = qp_encode_email_addrs(mptr); + } + sanitize_truncated_recipient(mptr); cprintf("CC: %s%s", mptr, nl); } else if (i == 'P') { @@ -1824,13 +1854,16 @@ int CtdlOutputPreLoadedMsg( { if (haschar(mptr, '@') == 0) { + sanitize_truncated_recipient(mptr); cprintf("To: %s@%s", mptr, config.c_fqdn); cprintf("%s", nl); } else { - if ((flags & QP_EADDR) != 0) + if ((flags & QP_EADDR) != 0) { mptr = qp_encode_email_addrs(mptr); + } + sanitize_truncated_recipient(mptr); cprintf("To: %s", mptr); cprintf("%s", nl); } @@ -2998,8 +3031,8 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ /* * Convenience function for generating small administrative messages. */ -void quickie_message(char *from, char *fromaddr, char *to, char *room, char *text, - int format_type, char *subject) +void quickie_message(const char *from, const char *fromaddr, char *to, char *room, const char *text, + int format_type, const char *subject) { struct CtdlMessage *msg; struct recptypes *recp = NULL;