Use trim() to strip whitespace from the end of header fields
[mmh] / uip / send.c
index 0660e95..bf37600 100644 (file)
@@ -46,6 +46,7 @@ static void armed_done(int) NORETURN;
 static void anno(struct stat *);
 static int sendaux(char **, int, char *, struct stat *);
 static int attach(char *);
+static int signandenc(char *);
 static void clean_up_temporary_files(void);
 static int get_line(void);
 static void make_mime_composition_file_entry(char *);
@@ -261,6 +262,26 @@ sendsbr(char **vec, int vecp, char *drft, struct stat *st)
                break;
        }
 
+       /*
+       ** Sign and encrypt the message as needed.
+       ** Use the mhbuild composition file for the draft if there was
+       ** a successful conversion because that now contains the MIME
+       ** message.  A nice side effect of this is that it leaves the
+       ** original draft file untouched so that it can be retrieved
+       ** and modified if desired.
+       */
+       switch (signandenc(drft)) {
+       case OK:
+               drft = composition_file_name;
+               break;
+
+       case NOTOK:
+               return (NOTOK);
+
+       case DONE:
+               break;
+       }
+
        done=armed_done;
        switch (setjmp(env)) {
        case OK:
@@ -404,9 +425,7 @@ attach(char *draft_file_name)
        while (get_line() != EOF && *field && *field != '-') {
                if (strncasecmp(field, attach_hdr, length) == 0 &&
                                field[length] == ':') {
-                       for (p = field+length+1; *p==' ' || *p=='\t'; p++) {
-                               continue;
-                       }
+                       p = trim(field+length+1);
                        if (*p == '+') {
                                /* forwarded message */
                                fprintf(composition_file, "#forw [forwarded message(s)] %s\n", p);
@@ -434,6 +453,53 @@ attach(char *draft_file_name)
        return (OK);
 }
 
+static int
+signandenc(char *draft_file_name)
+{
+       char buf[BUFSIZ];
+       int dosign = 0;
+       int doenc = 0;
+
+       if (!(draft_file = fopen(draft_file_name, "r"))) {
+               adios(NULL, "can't open draft file `%s'.", draft_file_name);
+       }
+
+       /* We'll grow the buffer as needed. */
+       field = (char *)mh_xmalloc(field_size = 256);
+
+       /* Scan the draft file for an attachment header field name. */
+       while (get_line() != EOF && *field != '\0' && *field != '-') {
+               if (strncasecmp(field, sign_hdr, strlen(sign_hdr))==0 &&
+                               field[strlen(sign_hdr)] == ':') {
+                       dosign = 1;
+               }
+               if (strncasecmp(field, enc_hdr, strlen(enc_hdr))==0 &&
+                               field[strlen(enc_hdr)] == ':') {
+                       doenc = 1;
+               }
+       }
+       if (!dosign && !doenc) {
+               return DONE;
+       }
+
+       strcpy(composition_file_name, draft_file_name);
+
+       /* We're ready to roll! */
+       sprintf(buf, "mhsign -m%s '%s'", doenc ? " -e" : "",
+                       draft_file_name);
+       if (system(buf) != 0) {
+               /* some problem */
+               return (NOTOK);
+       }
+       /* Remove the automatically created backup of mhsign. */
+       snprintf(buf, sizeof buf, "%s.orig", draft_file_name);
+       if (unlink(buf) == -1) {
+               advise(NULL, "unable to remove original draft file.");
+       }
+
+       return (OK);
+}
+
 static void
 clean_up_temporary_files(void)
 {
@@ -481,6 +547,7 @@ make_mime_composition_file_entry(char *file_name)
        char content_type[BUFSIZ];
        char cmdbuf[BUFSIZ];
        char *cmd = mimetypequeryproc;
+       int semicolon = 0;
 
        for (np = m_defs; np; np = np->n_next) {
                if (strcasecmp(np->n_name, mimetypequery)==0) {
@@ -511,11 +578,23 @@ make_mime_composition_file_entry(char *file_name)
                adios(NULL, "unable to access file `%s'", file_name);
        }
 
-       cp = (!(cp = strrchr(file_name, '/'))) ? file_name : cp + 1;
-       fprintf(composition_file, "#%s; name=\"%s\" <> [%s] {attachment}",
-                       content_type, cp, cp);
+       /* Check for broken file(1). See man page mh-profile(5). */
+       for (cp=content_type; *cp; cp++) {
+               if (isspace(*cp)) {
+                       if (!semicolon) {
+                               adios(NULL, "Sorry, your Mime-Type-Query command (%s) is broken.\n\tThe output misses a semicolon before the whitespace.\n\tOutput was: %s", cmd, content_type);
+                       }
+               } else if (*cp == ';') {
+                       semicolon = 1;
+               } else {
+                       semicolon = 0;
+               }
+       }
 
-       fprintf(composition_file, " %s\n", file_name);
+       cp = (!(cp = strrchr(file_name, '/'))) ? file_name : cp + 1;
+       fprintf(composition_file,
+                       "#%s; name=\"%s\" <> [%s] {attachment} %s\n",
+                       content_type, cp, cp, file_name);
 
        return;
 }