Don't allow blind aliases with sendmail/pipe mts. Before this change,
[mmh] / uip / post.c
index 3c47161..09ca15e 100644 (file)
@@ -133,6 +133,8 @@ static struct swit switches[] = {
     { "mhlproc", -3 },
 #define MTSSW                   40
     { "mts smtp|sendmail/smtp|sendmail/pipe", 2 },
+#define MESSAGEIDSW             41
+    { "messageid localname|random", 2 },
     { NULL, 0 }
 };
 
@@ -260,6 +262,7 @@ static char bccfil[BUFSIZ];
 static char from[BUFSIZ];      /* my network address            */
 static char sender[BUFSIZ];    /* my Sender: header             */
 static char efrom[BUFSIZ];     /* my Envelope-From: header      */
+static char fullfrom[BUFSIZ];  /* full contents of From header  */
 static char signature[BUFSIZ]; /* my signature                  */
 static char *filter = NULL;    /* the filter for BCC'ing        */
 static char *subject = NULL;   /* the subject field for BCC'ing */
@@ -526,6 +529,13 @@ main (int argc, char **argv)
                        adios (NULL, "missing argument to %s", argp[-2]);
                     save_mts_method (cp);
                    continue;
+
+               case MESSAGEIDSW:
+                   if (!(cp = *argp++) || *cp == '-')
+                       adios (NULL, "missing argument to %s", argp[-2]);
+                    if (save_message_id_style (cp) != 0)
+                       adios (NULL, "unsupported messageid \"%s\"", cp);
+                   continue;
            }
        }
        if (msg)
@@ -699,7 +709,21 @@ putfmt (char *name, char *str, FILE *out)
     }
 
     if ((i = get_header (name, hdrtab)) == NOTOK) {
-       fprintf (out, "%s: %s", name, str);
+       if (strncasecmp (name, "nmh-", 4)) {
+           fprintf (out, "%s: %s", name, str);
+       } else {
+           /* Filter out all Nmh-* headers, because Norm asked.  They
+              should never have reached this point.  Warn about any
+              that are non-empty. */
+           if (strcmp (str, "\n")) {
+               char *newline = strchr (str, '\n');
+               if (newline) *newline = '\0';
+               if (! whomsw) {
+                   advise (NULL, "ignoring header line -- %s: %s", name, str);
+               }
+           }
+       }
+
        return;
     }
 
@@ -830,8 +854,22 @@ putfmt (char *name, char *str, FILE *out)
                else
                    if (mp->m_gname)
                        putgrp (namep, mp->m_gname, out, hdr->flags);
-               if (mp->m_ingrp)
+               if (mp->m_ingrp) {
+                   if (sm_mts == MTS_SENDMAIL_PIPE) {
+                       /* Catch this before sendmail chokes with:
+                          "553 List:; syntax illegal for recipient
+                           addresses".
+                          If we wanted to, we could expand out blind
+                          aliases and put them in Bcc:, but then
+                          they'd have the Blind-Carbon-Copy
+                          indication. */
+                       adios (NULL,
+                              "blind aliases not compatible with"
+                              " sendmail/pipe");
+                   }
+
                    grp++;
+               }
                if (putadr (namep, qp, mp, out, hdr->flags))
                    msgflags |= (hdr->set & (MVIS | MINV));
                else
@@ -891,6 +929,23 @@ putfmt (char *name, char *str, FILE *out)
                mnfree (mp);
        }
 
+    /*
+     * If this is a From:/Resent-From: header, save the full thing for
+     * later in case we need it for use when constructing a Bcc draft message
+     */
+
+    if ((msgstate == RESENT) ? (hdr->set & MRFM) : (hdr->set & MFRM)) {
+       strncpy(fullfrom, str, sizeof(fullfrom));
+       fullfrom[sizeof(fullfrom) - 1] = 0;
+       /*
+        * Strip off any trailing newlines
+        */
+
+       while (strlen(fullfrom) > 0 && fullfrom[strlen(fullfrom) - 1] == '\n') {
+           fullfrom[strlen(fullfrom) - 1] = '\0';
+       }
+    }
+
     if (grp > 0 && (hdr->flags & HNGR)) {
        advise (NULL, "%s: field does not allow groups", name);
        badmsg++;
@@ -919,6 +974,7 @@ start_headers (void)
     from[0] = '\0';
     efrom[0] = '\0';
     sender[0] = '\0';
+    fullfrom[0] = '\0';
 
     if ((cp = getfullname ()) && *cp) {
        strncpy (sigbuf, cp, sizeof(sigbuf));
@@ -970,8 +1026,7 @@ finish_headers (FILE *out)
 
            fprintf (out, "Date: %s\n", dtime (&tclock, 0));
            if (msgid)
-               fprintf (out, "Message-ID: <%d.%ld@%s>\n",
-                       (int) getpid (), (long) tclock, LocalName (1));
+               fprintf (out, "Message-ID: %s\n", message_id (tclock, 0));
            /*
             * If we have multiple From: addresses, make sure we have an
             * Sender: header.  If we don't have one, then generate one
@@ -1020,8 +1075,8 @@ finish_headers (FILE *out)
 
            fprintf (out, "Resent-Date: %s\n", dtime (&tclock, 0));
            if (msgid)
-               fprintf (out, "Resent-Message-ID: <%d.%ld@%s>\n",
-                       (int) getpid (), (long) tclock, LocalName (1));
+               fprintf (out, "Resent-Message-ID: %s\n",
+                        message_id (tclock, 0));
            /*
             * If we have multiple Resent-From: addresses, make sure we have an
             * Resent-Sender: header.  If we don't have one, then generate one
@@ -1271,13 +1326,12 @@ make_bcc_file (int dashstuff)
 
     tfile = m_mktemp2(NULL, "bccs", NULL, &out);
     if (tfile == NULL) adios("bcc", "unable to create temporary file");
-    chmod (bccfil, 0600);
     strncpy (bccfil, tfile, sizeof(bccfil));
 
+    fprintf (out, "From: %s\n", fullfrom);
     fprintf (out, "Date: %s\n", dtime (&tclock, 0));
     if (msgid)
-       fprintf (out, "Message-ID: <%d.%ld@%s>\n",
-               (int) getpid (), (long) tclock, LocalName (1));
+       fprintf (out, "Message-ID: %s\n", message_id (tclock, 0));
     if (subject)
        fprintf (out, "Subject: %s", subject);
     fprintf (out, "BCC:\n");