X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fspost.c;h=1c1a8bc904b51522f59979adf5f5da76d3e08cd4;hp=5bc41d8a25cde8b2e5375255b8b1040f42e11007;hb=d8916ff5d389de5ab225cd6f40aeda1b285d0f28;hpb=794dab6aa5027ffaf024506140c258f6a0a9322d diff --git a/uip/spost.c b/uip/spost.c index 5bc41d8..1c1a8bc 100644 --- a/uip/spost.c +++ b/uip/spost.c @@ -6,6 +6,10 @@ * when "sendmail" is the transport system. * * $Id$ + * + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ #include @@ -13,9 +17,9 @@ #include #include #include -#include - -#define uptolow(c) ((isalpha(c) && isupper (c)) ? tolower (c) : c) +#include +#include +#include #define MAX_SM_FIELD 1476 /* < largest hdr field sendmail will accept */ #define FCCS 10 /* max number of fccs allowed */ @@ -54,7 +58,7 @@ struct swit switches[] = { #define VERSIONSW 15 { "version", 0 }, #define HELPSW 16 - { "help", 4 }, + { "help", 0 }, #define DEBUGSW 17 { "debug", -5 }, #define DISTSW 18 @@ -176,6 +180,8 @@ extern char *sendmail; extern char *getfullname (void); extern char *getusername (void); +extern boolean draft_from_masquerading; /* defined in mts.c */ + /* * static prototypes */ @@ -185,7 +191,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 insert_fcc (struct headers *, char *); +static void insert_fcc (struct headers *, unsigned char *); static void file (char *); static void fcc (char *, char *); @@ -347,13 +353,14 @@ main (int argc, char **argv) } else { #ifdef HAVE_MKSTEMP - mkstemp (tmpfil); + if ((out = fdopen( mkstemp (tmpfil), "w" )) == NULL ) + adios (tmpfil, "unable to create"); #else mktemp (tmpfil); -#endif if ((out = fopen (tmpfil, "w")) == NULL) adios (tmpfil, "unable to create"); chmod (tmpfil, 0600); +#endif } hdrtab = (msgstate == normal) ? NHeaders : RHeaders; @@ -530,6 +537,18 @@ putfmt (char *name, char *str, FILE *out) 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 ); } } @@ -560,10 +579,19 @@ finish_headers (FILE *out) case normal: if (!(msgflags & MDAT)) fprintf (out, "Date: %s\n", dtimenow (0)); - if (msgflags & MFRM) - fprintf (out, "Sender: %s\n", from); + + if (msgflags & MFRM) { + /* There was already a From: in the draft. Don't add one. */ + if (!draft_from_masquerading) + /* mts.conf didn't contain "masquerade:[...]draft_from[...]" + so we'll reveal the user's actual account@thismachine + address in a Sender: header (and use it as the envelope + From: later). */ + fprintf (out, "Sender: %s\n", from); + } else fprintf (out, "From: %s\n", signature); + #ifdef notdef if (!(msgflags & MVIS)) fprintf (out, "Bcc: Blind Distribution List: ;\n"); @@ -573,9 +601,17 @@ finish_headers (FILE *out) case resent: if (!(msgflags & MRDT)) fprintf (out, "Resent-Date: %s\n", dtimenow(0)); - if (msgflags & MRFM) - fprintf (out, "Resent-Sender: %s\n", from); + if (msgflags & MRFM) { + /* There was already a Resent-From: in draft. Don't add one. */ + if (!draft_from_masquerading) + /* mts.conf didn't contain "masquerade:[...]draft_from[...]" + so we'll reveal the user's actual account@thismachine + address in a Sender: header (and use it as the envelope + From: later). */ + fprintf (out, "Resent-Sender: %s\n", from); + } else + /* Construct a Resent-From: header. */ fprintf (out, "Resent-From: %s\n", signature); #ifdef notdef if (!(msgflags & MVIS)) @@ -595,7 +631,7 @@ get_header (char *header, struct headers *table) struct headers *h; for (h = table; h->value; h++) - if (!strcasecmp (header, h->value)) + if (!mh_strcasecmp (header, h->value)) return (h - table); return NOTOK; @@ -684,9 +720,9 @@ putone (char *adr, int pos, int indent) static void -insert_fcc (struct headers *hdr, char *pp) +insert_fcc (struct headers *hdr, unsigned char *pp) { - char *cp; + unsigned char *cp; for (cp = pp; isspace (*cp); cp++) continue; @@ -713,13 +749,30 @@ make_bcc_file (void) char *vec[6]; FILE * in, *out; +#ifdef HAVE_MKSTEMP + fd = mkstemp(bccfil); + if (fd == -1 || (out = fdopen(fd, "w")) == NULL) + adios (bccfil, "unable to create"); +#else mktemp (bccfil); if ((out = fopen (bccfil, "w")) == NULL) adios (bccfil, "unable to create"); +#endif chmod (bccfil, 0600); fprintf (out, "Date: %s\n", dtimenow (0)); - fprintf (out, "From: %s\n", signature); + if (msgflags & MFRM) { + /* There was already a From: in the draft. Don't add one. */ + if (!draft_from_masquerading) + /* mts.conf didn't contain "masquerade:[...]draft_from[...]" + so we'll reveal the user's actual account@thismachine + address in a Sender: header (and use it as the envelope + From: later). */ + fprintf (out, "Sender: %s\n", from); + } + else + /* Construct a From: header. */ + fprintf (out, "From: %s\n", signature); if (subject) fprintf (out, "Subject: %s", subject); fprintf (out, "BCC:\n\n------- Blind-Carbon-Copy\n\n");