X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fsend.c;h=e63074caac7cefcc357a0474a7fab20bf487563f;hp=0660e9588a376d52f640b0be4a4a81785ec06c03;hb=10e03b3fba3e01052baf92c963c46a2a5529b4e0;hpb=ca0b3e830b86700d9e5e31b1784de2bdcaf58fc5 diff --git a/uip/send.c b/uip/send.c index 0660e95..e63074c 100644 --- a/uip/send.c +++ b/uip/send.c @@ -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: @@ -434,6 +455,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 +549,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 +580,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; }