From: markus schnalke Date: Sun, 12 Feb 2012 16:49:57 +0000 (+0100) Subject: Various rework in spost. X-Git-Tag: mmh-thesis-end~298 X-Git-Url: http://git.marmaro.de/?a=commitdiff_plain;h=4c513fd6ebd0f1b08b8f9504b6d6c8aef2351d4a;p=mmh Various rework in spost. - Removed some unused flags. - Don't care for multiple Subject: headers. They aren't allowed. - Correctly handle headers that are folded before the first word of the value. - Outsourced code from putfmt() into new process_fcc(). --- diff --git a/uip/spost.c b/uip/spost.c index 7b74dcc..4a8ffdc 100644 --- a/uip/spost.c +++ b/uip/spost.c @@ -58,10 +58,8 @@ struct swit switches[] = { #define HSUB 0x0004 /* Subject: header */ #define HTRY 0x0008 /* try to send to addrs on header */ #define HBCC 0x0010 /* don't output this header */ -#define HNGR 0x0020 /* no groups allowed in this header */ -#define HFCC 0x0040 /* FCC: type header */ -#define HNIL 0x0080 /* okay for this header not to have addrs */ -#define HIGN 0x0100 /* ignore this header */ +#define HFCC 0x0020 /* FCC: type header */ +#define HIGN 0x0040 /* ignore this header */ /* flags for headers->set */ #define MFRM 0x0001 /* we've seen a From: */ @@ -81,22 +79,22 @@ struct headers { static struct headers NHeaders[] = { { "Return-Path", HBAD, 0 }, { "Received", HBAD, 0 }, - { "Reply-To", HADR|HNGR, 0 }, - { "From", HADR|HNGR, MFRM }, + { "Reply-To", HADR, 0 }, + { "From", HADR, MFRM }, { "Sender", HADR|HBAD, 0 }, { "Date", HNOP, MDAT }, { "Subject", HSUB, 0 }, { "To", HADR|HTRY, MVIS }, { "Cc", HADR|HTRY, MVIS }, - { "Bcc", HADR|HTRY|HBCC|HNIL, MINV }, + { "Bcc", HADR|HTRY|HBCC, MINV }, { "Message-Id", HBAD, 0 }, { "Fcc", HFCC, 0 }, { NULL, 0, 0 } }; static struct headers RHeaders[] = { - { "Resent-Reply-To", HADR|HNGR, 0 }, - { "Resent-From", HADR|HNGR, MRFM }, + { "Resent-Reply-To", HADR, 0 }, + { "Resent-From", HADR, MRFM }, { "Resent-Sender", HADR|HBAD, 0 }, { "Resent-Date", HNOP, MRDT }, { "Resent-Subject", HSUB, 0 }, @@ -144,6 +142,7 @@ static void finish_headers(FILE *); static int get_header(char *, struct headers *); static void putadr(char *, struct mailname *); static int putone(char *, int, int); +static void process_fcc(char *); static void fcc(char *, char *); static void make_bcc_draft(char *); @@ -396,132 +395,102 @@ static void putfmt(char *name, char *str, FILE *out) { int i; - char *cp, *pp; + char *cp; struct headers *hdr; - while (*str == ' ' || *str == '\t') + /* remove all leading whitespace (even newlines) */ + while (*str==' ' || *str=='\t' || *str=='\n') { str++; + } if ((i = get_header(name, hdrtab)) == NOTOK) { - /* some boring header: push it through */ + /* no header we would care for: push it through */ fprintf(out, "%s: %s", name, str); return; } - /* one of the interesting headers */ + /* it's one of the interesting headers */ hdr = &hdrtab[i]; - if (hdr->flags & HIGN) { + if (hdr->flags & HIGN || !*str) { return; } + if (hdr->flags & HBAD) { advise(NULL, "illegal header line -- %s:", name); badmsg++; return; } + msgflags |= hdr->set; - if (hdr->flags & HSUB) { - if (subject) { - /* concatenate mupliple subject */ - char *cp = concat(subject, "\t", str, NULL); - free(subject); - subject = cp; - } else { - subject = getcpy(str); - } + if (hdr->flags & HFCC) { + process_fcc(str); + return; } - if (hdr->flags & HFCC) { - if (strlen(str)+strlen(fccs) > sizeof fccs /2) { - adios(NULL, "Too much Fcc data"); + if (hdr->flags & HBCC) { + struct mailname *mp = NULL; + + /* Create list of Bcc addrs. */ + while ((cp = getname(str))) { + mp = getm(cp, NULL, 0, AD_HOST, NULL); + mp->m_next = bccs; /* push */ + bccs = mp; } - /* todo: better have three states: SEPARATOR, PLUS, WORD */ - int state = 0; - for (cp=pp=str; *cp; cp++) { - switch (*cp) { - case ' ': - case '\t': - case '\n': - case ',': - if (state != 0) { - state = 0; - *cp = '\0'; - if (*pp=='+' || *pp=='@') { - strcat(fccs, " "); - } else { - strcat(fccs, " +"); - } - strcat(fccs, pp); - } - break; - default: - if (state == 0) { - state = 1; - pp = cp; - } - break; + return; + } + + if (aliasflg && hdr->flags & HTRY) { + /* + ** This header contains address(es) that we have to do + ** alias expansion on. Because of the saved state in + ** getname we have to put all the addresses into a list. + **/ + struct mailname *f = NULL; + struct mailname *mp = NULL; + + while ((cp = getname(str))) { + mp = getm(cp, NULL, 0, AD_HOST, NULL); + if (!f) { + f = mp; + mp->m_next = mp; + } else { + mp->m_next = f->m_next; + f->m_next = mp; + f = mp; } } + f = mp->m_next; + mp->m_next = NULL; + /* Now munch on the list, possibly expanding aliases */ + putadr(name, f); return; } - if (*str != '\n' && *str != '\0') { - if (hdr->flags & HBCC) { - struct mailname *mp = NULL; + /* + ** The author(s) of spost decided that alias substitution wasn't + ** necessary for the non-HTRY headers. Unfortunately, one of + ** those headers is "From:", and having alias substitution work on + ** that is extremely useful for someone with a lot of POP3 email + ** accounts or aliases. post supports aliasing of "From:"... + ** + ** Since "From:"-processing is incompletely implemented in this + ** unsupported and undocumented spost backend, I'm not going + ** to take the time to implement my new draft-From:-based email + ** address masquerading. If I do ever implement it here, I'd almost + ** certainly want to implement "From:" line alias processing as well. + ** -- Dan Harkless + */ + /* + ** Although there is no masquerading anymore in mmh, we might want + ** to have aliasing of From: addresses. Think about it. + ** -- meillo@marmaro.de 2012-02 + */ - /* Create list of Bcc adds. */ - while ((cp = getname(str))) { - mp = getm(cp, NULL, 0, AD_HOST, NULL); - mp->m_next = bccs; /* push */ - bccs = mp; - } - } else if (aliasflg && hdr->flags & HTRY) { - /* - ** this header contains address(es) that we have to do - ** alias expansion on. Because of the saved state in - ** getname we have to put all the addresses into a - ** list. We then let putadr munch on that list, - ** possibly expanding aliases. - **/ - register struct mailname *f = 0; - register struct mailname *mp = 0; - - while ((cp = getname(str))) { - mp = getm(cp, NULL, 0, AD_HOST, NULL); - if (f == 0) { - f = mp; - mp->m_next = mp; - } else { - mp->m_next = f->m_next; - f->m_next = mp; - f = mp; - } - } - f = mp->m_next; mp->m_next = 0; - putadr(name, f); - } else { - /* - ** The author(s) of spost decided that alias - ** substitution wasn't necessary for the non-HTRY - ** headers. Unfortunately, one of those headers - ** is "From:", and having alias substitution - ** work on that is extremely useful for someone - ** with a lot of POP3 email accounts or aliases. - ** post supports aliasing of "From:"... - ** - ** Since "From:"-processing is incompletely - ** implemented in this unsupported and - ** undocumented spost backend, I'm not - ** going to take the time to implement my new - ** draft-From:-based email address masquerading. - ** If I do ever implement it here, I'd almost - ** certainly want to implement "From:" line - ** alias processing as well. - ** -- Dan Harkless - */ - fprintf(out, "%s: %s", name, str); - } + if (hdr->flags & HSUB) { + subject = getcpy(str); } + fprintf(out, "%s: %s", name, str); } @@ -663,6 +632,44 @@ putone(char *adr, int pos, int indent) static void +process_fcc(char *str) +{ + char *cp, *pp; + int state = 0; + + if (strlen(str)+strlen(fccs) > sizeof fccs /2) { + adios(NULL, "Too much Fcc data"); + } + /* todo: better have three states: SEPARATOR, PLUS, WORD */ + for (cp=pp=str; *cp; cp++) { + switch (*cp) { + case ' ': + case '\t': + case '\n': + case ',': + if (state != 0) { + state = 0; + *cp = '\0'; + if (*pp=='+' || *pp=='@') { + strcat(fccs, " "); + } else { + strcat(fccs, " +"); + } + strcat(fccs, pp); + } + break; + default: + if (state == 0) { + state = 1; + pp = cp; + } + break; + } + } +} + + +static void fcc(char *file, char *folders) { int status;