X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=rfc822.c;h=9bb10b0055353147d628d5ed6f0a8972702deb7d;hb=e1c30f00b092f08e00c1f26ade947e53150935ee;hp=5e9e2da56a63bb8690262af1d0ee2a56dc68a684;hpb=7052f7f510a90d1cce53bb1541ef99d092033503;p=~andy%2Ffetchmail diff --git a/rfc822.c b/rfc822.c index 5e9e2da5..9bb10b00 100644 --- a/rfc822.c +++ b/rfc822.c @@ -20,23 +20,49 @@ static int verbose; #endif /* TESTMAIN */ -void reply_hack(buf, host) +char *reply_hack(buf, host) /* hack message headers so replies will work properly */ char *buf; /* header to be hacked */ const char *host; /* server hostname */ { - char *from, *cp; + char *from, *cp, last_nws = '\0'; int parendepth, state, has_bare_name_part, has_host_part; + int addresscount = 1; if (strncasecmp("From: ", buf, 6) && strncasecmp("To: ", buf, 4) && strncasecmp("Reply-To: ", buf, 10) && strncasecmp("Return-Path: ", buf, 13) && strncasecmp("Cc: ", buf, 4) - && strncasecmp("Bcc: ", buf, 5)) { - return; + && strncasecmp("Bcc: ", buf, 5) + && strncasecmp("Resent-From: ", buf, 13) + && strncasecmp("Resent-To: ", buf, 11) + && strncasecmp("Resent-Cc: ", buf, 11) + && strncasecmp("Resent-Bcc: ", buf, 12) + && strncasecmp("Apparently-From:", buf, 16) + && strncasecmp("Apparently-To:", buf, 14) + && strncasecmp("Sender:", buf, 7) + && strncasecmp("Resent_Sender:", buf, 14) + ) { + return(buf); } +#ifndef TESTMAIN + /* make room to hack the address; buf must be malloced */ + for (cp = buf; *cp; cp++) + if (*cp == ',' || isspace(*cp)) + addresscount++; + buf = (char *)xrealloc(buf, strlen(buf) + addresscount * strlen(host) + 1); +#endif /* TESTMAIN */ + + /* + * This is going to foo up on some ill-formed addresses. For example, + * "From: John Smith (Systems) " will get rewritten as + * "From: John Smith@my.pop.server (Systems) " because + * the state machine can't look ahead to the <> part past the comment + * and instead treats `John Smith' as a bareword address. + */ + parendepth = state = 0; has_host_part = has_bare_name_part = FALSE; for (from = buf; *from; from++) @@ -63,6 +89,8 @@ const char *host; /* server hostname */ break; case 1: /* we've seen the colon, we're looking for addresses */ + if (!isspace(*from)) + last_nws = *from; if (*from == '<') state = 3; else if (*from == '@') @@ -70,14 +98,14 @@ const char *host; /* server hostname */ else if (*from == '"') state = 2; /* - * Not expanding on from[-1] == ';' deals with groupnames, + * Not expanding on last non-WS == ';' deals with groupnames, * an obscure misfeature described in sections * 6.1, 6.2.6, and A.1.5 of the RFC822 standard. */ else if ((*from == ',' || HEADER_END(from) || from[1] == '(') && has_bare_name_part && !has_host_part - && from[-1] != ';') + && last_nws != ';' && last_nws != ')') { int hostlen; @@ -130,6 +158,8 @@ const char *host; /* server hostname */ has_host_part = has_bare_name_part = FALSE; } } + + return(buf); } char *nxtaddr(hdr)