X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;ds=inline;f=uip%2Fspost.c;h=4d0b48a04c8955b34f14db5d966b4c261c783acf;hb=a26906e6feefe63dfe0d8f9535444150b2ca0a08;hp=476227babdfadbfcae919811a18f80dee707a319;hpb=cf1205b5cbea2f0cd6ea710ec16c637df85b647c;p=mmh diff --git a/uip/spost.c b/uip/spost.c index 476227b..4d0b48a 100644 --- a/uip/spost.c +++ b/uip/spost.c @@ -56,6 +56,7 @@ static struct swit switches[] = { #define MVIS 0x0008 /* we've seen sighted addrs */ #define MINV 0x0010 /* we've seen blind addrs */ #define MRDT 0x0020 /* we've seen a Resent-Date: */ +#define MFMM 0x0040 /* The Mail is From a Alternative-Mailbox Addresse */ struct headers { char *value; @@ -114,6 +115,7 @@ static char *tmpfil; static char *subject = NULL; /* the subject field for BCC'ing */ static char fccs[BUFSIZ] = ""; struct mailname *bccs = NULL; /* list of the bcc recipients */ +struct mailname *sender = NULL; static struct headers *hdrtab; /* table for the message we're doing */ static FILE *out; /* output (temp) file */ @@ -182,17 +184,20 @@ main(int argc, char **argv) continue; } } - if (msg) + if (msg) { adios(EX_USAGE, NULL, "only one message at a time!"); - else + } else { msg = cp; + } } - if (!msg) + if (!msg) { adios(EX_USAGE, NULL, "usage: %s [switches] file", invo_name); + } - if ((in = fopen(msg, "r")) == NULL) + if ((in = fopen(msg, "r")) == NULL) { adios(EX_IOERR, msg, "unable to open"); + } if (debug) { verbose++; @@ -221,13 +226,9 @@ main(int argc, char **argv) for (compnum = 1, state = FLD;;) { switch (state = m_getfld(state, name, buf, sizeof(buf), in)) { case FLD: - compnum++; - putfmt(name, buf, out); - continue; - case FLDPLUS: compnum++; - cp = add(buf, cp); + cp = getcpy(buf); while (state == FLDPLUS) { state = m_getfld(state, name, buf, sizeof(buf), in); @@ -324,12 +325,17 @@ putfmt(char *name, char *str, FILE *out) if ((i = get_header(name, hdrtab)) == NOTOK) { /* no header we would care for */ - if (mh_strcasecmp(name, attach_hdr)!=0 && - mh_strcasecmp(name, sign_hdr)!=0 && - mh_strcasecmp(name, enc_hdr)!=0) { - /* push it through */ - fprintf(out, "%s: %s", name, str); + if (mh_strcasecmp(name, attach_hdr)==0) { + return; } + if (mh_strcasecmp(name, sign_hdr)==0) { + return; + } + if (mh_strcasecmp(name, enc_hdr)==0) { + return; + } + /* push it through */ + fprintf(out, "%s: %s", name, str); return; } /* it's one of the interesting headers */ @@ -411,6 +417,42 @@ putfmt(char *name, char *str, FILE *out) ** -- meillo@marmaro.de 2012-02 */ + if (hdr->set & MFRM) { + struct mailname *mp = NULL; + struct mailname *my = NULL; + unsigned int fromcnt = 0; + + /* needed because the address parser holds global state */ + ismymbox(NULL); + + while ((cp = getname(str)) != NULL) { + fromcnt++; + mp = getm(cp, NULL, 0, AD_NAME, NULL); + if (ismymbox(mp)) { + msgflags |= MFMM; + if (my == NULL) { + my = mp; + } else { + mnfree(mp); + mp = NULL; + } + } else { + mnfree(mp); + mp = NULL; + } + } + + if (fromcnt > 1) { + sender = my; + } else { + mnfree(my); + } + + free(cp); + cp = NULL; + + } + if (hdr->flags & HSUB) { subject = getcpy(str); } @@ -433,11 +475,17 @@ finish_headers(FILE *out) fprintf(out, "%sDate: %s\n", resentstr, dtimenow()); } - snprintf(from, sizeof(from), "%s@%s", getusername(), LocalName()); - if ((cp = getfullname()) && *cp) { - snprintf(signature, sizeof(signature), "%s <%s>", cp, from); + if (sender != NULL) { + snprintf(signature, sizeof(signature), "%s", sender->m_text); + } else if ((cp = context_find("Default-From")) != NULL) { + snprintf(signature, sizeof(signature), "%s", cp); } else { - snprintf(signature, sizeof(signature), "%s", from); + snprintf(from, sizeof(from), "%s@%s", getusername(), LocalName()); + if ((cp = getfullname()) && *cp) { + snprintf(signature, sizeof(signature), "%s <%s>", cp, from); + } else { + snprintf(signature, sizeof(signature), "%s", from); + } } if (!(msgflags & MFRM)) { fprintf(out, "%sFrom: %s\n", resentstr, signature); @@ -446,7 +494,9 @@ finish_headers(FILE *out) ** Add a Sender: header because the From: header could ** be fake or contain multiple addresses. */ - fprintf(out, "%sSender: %s\n", resentstr, from); + if (!(msgflags & MFMM) || sender != NULL) { + fprintf(out, "%sSender: %s\n", resentstr, signature); + } } if (!(msgflags & MVIS)) { fprintf(out, "%sBcc: undisclosed-recipients:;\n", resentstr); @@ -471,7 +521,6 @@ get_header(char *header, struct headers *table) return (h - table); } } - return NOTOK; } @@ -502,7 +551,7 @@ putadr(char *name, struct mailname *nl) /* a local name - see if it's an alias */ cp = akvalue(mp->m_mbox); if (cp == mp->m_mbox) { - /* wasn't an alias - use what the user typed */ + /* wasn't an alias - use it unchanged */ linepos = putone(mp->m_text, linepos, namelen); } else { /* an alias - expand it */ @@ -524,7 +573,7 @@ putadr(char *name, struct mailname *nl) } } } else { - /* not a local name - use what the user typed */ + /* not a local name - use it unchanged */ linepos = putone(mp->m_text, linepos, namelen); } mp2 = mp; @@ -537,13 +586,13 @@ putadr(char *name, struct mailname *nl) static int putone(char *adr, int pos, int indent) { - register int len; + int len; static int linepos; len = strlen(adr); - if (pos == indent) + if (pos == indent) { linepos = pos; - else if (linepos+len > OUTPUTLINELEN) { + } else if (linepos+len > OUTPUTLINELEN) { fprintf(out, ",\n%*s", indent, ""); linepos = indent; pos += indent + 2;