#include <stdlib.h>
#endif
+#include "config.h"
#include "fetchmail.h"
#define HEADER_END(p) ((p)[0] == '\n' && ((p)[1] != ' ' && (p)[1] != '\t'))
#ifdef TESTMAIN
static int verbose;
+char *program_name = "rfc822";
#endif /* TESTMAIN */
char *reply_hack(buf, host)
char *buf; /* header to be hacked */
const char *host; /* server hostname */
{
- char *from, *cp, last_nws = '\0';
+ char *from, *cp, last_nws = '\0', *parens_from = NULL;
int parendepth, state, has_bare_name_part, has_host_part;
+#ifndef TESTMAIN
int addresscount = 1;
+#endif /* TESTMAIN */
if (strncasecmp("From: ", buf, 6)
&& strncasecmp("To: ", buf, 4)
}
#ifndef TESTMAIN
+ if (outlevel >= O_DEBUG)
+ report_build(stdout, "About to rewrite %s", buf);
+
/* make room to hack the address; buf must be malloced */
for (cp = buf; *cp; cp++)
if (*cp == ',' || isspace(*cp))
#endif /* TESTMAIN */
/*
- * This is going to foo up on some ill-formed addresses. For example,
- * "From: John Smith (Systems) <jsmith@domain>" will get rewritten as
- * "From: John Smith@my.pop.server (Systems) <jsmith@domain>" because
- * the state machine can't look ahead to the <> part past the comment
- * and instead treats `John Smith' as a bareword address.
- *
- * Also note that we don't rewrite the fake address <> in order to
+ * This is going to foo up on some ill-formed addresses.
+ * Note that we don't rewrite the fake address <> in order to
* avoid screwing up bounce suppression with a null Return-Path.
*/
* 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] == '(')
+ else if ((*from == ',' || HEADER_END(from))
&& has_bare_name_part
&& !has_host_part
- && last_nws != ';' && last_nws != ')')
+ && last_nws != ';')
{
int hostlen;
+ char *p;
+ p = from;
+ if (parens_from)
+ from = parens_from;
while (isspace(*from) || (*from == ','))
--from;
from++;
cp[hostlen+1] = *cp;
*from++ = '@';
memcpy(from, host, hostlen);
- from += hostlen;
+ from = p + hostlen + 1;
has_host_part = TRUE;
}
+ else if (from[1] == '('
+ && has_bare_name_part
+ && !has_host_part
+ && last_nws != ';' && last_nws != ')')
+ {
+ parens_from = from;
+ }
else if (!isspace(*from))
has_bare_name_part = TRUE;
break;
*/
if (from[-1] == ',' && !parendepth) {
has_host_part = has_bare_name_part = FALSE;
+ parens_from = NULL;
}
}
+#ifndef TESTMAIN
+ if (outlevel >= O_DEBUG)
+ report_complete(stdout, "Rewritten version is %s\n", buf);
+#endif /* TESTMAIN */
return(buf);
}