(profile, default: `Attach')
.RE
.PP
+.BR Sign-Header :
+Sign
+.RS 5
+The (pseudo) header in draft messages, that requests the message to be
+signed automatically by
+.BR send ,
+using
+.BR mhsign .
+If you like to type a lot, name it `X-MH-Sign-This-Message'.
+(profile, default: `Sign')
+.RE
+.PP
+.BR Enc-Header :
+Enc
+.RS 5
+The (pseudo) header in draft messages, that requests the message to be
+signed and encrypted by
+.BR send ,
+using
+.BR mhsign .
+If you like to type a lot, name it `X-MH-Encrypt-This-Message'.
+(profile, default: `Enc')
+.RE
+.PP
.BR Mime-Type-Query :
file \-b \-\-mime
.RS 5
static struct procstr procs[] = {
{ "attachment-header", &attach_hdr },
+ { "sign-header", &sign_hdr },
+ { "enc-header", &enc_hdr },
{ "context", &context },
{ "mh-sequences", &mh_seq },
{ "draft-folder", &draftfolder },
static struct proc procs [] = {
{ "attachment-header", &attach_hdr },
+ { "sign-header", &sign_hdr },
+ { "enc-header", &enc_hdr },
{ "context", &context },
{ "mh-sequences", &mh_seq },
{ "editor", &defaulteditor },
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 *);
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:
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)
{