Here's a patch that should close #1919 (decode-save may delete a message even if it wasn't successfully decoded or decrypted). It touches quite a bit more code than would be ideal (albeit in fairly trivial ways), so I'd appreciate another set of eyes.
Index: copy.c =================================================================== RCS file: /home/roessler/cvs/mutt/copy.c,v retrieving revision 3.21 diff -u -p -r3.21 copy.c --- copy.c 9 Aug 2005 16:10:40 -0000 3.21 +++ copy.c 10 Aug 2005 17:25:08 -0000 @@ -546,6 +546,7 @@ _mutt_copy_message (FILE *fpout, FILE *f char prefix[SHORT_STRING]; STATE s; long new_offset = -1; + int rc = 0; if (flags & M_CM_PREFIX) { @@ -657,7 +658,7 @@ _mutt_copy_message (FILE *fpout, FILE *f if (WithCrypto && flags & M_CM_VERIFY) s.flags |= M_VERIFY; - mutt_body_handler (body, &s); + rc = mutt_body_handler (body, &s); } else if (WithCrypto && (flags & M_CM_DECODE_CRYPT) && (hdr->security & ENCRYPT)) @@ -725,7 +726,7 @@ _mutt_copy_message (FILE *fpout, FILE *f mutt_free_body (&body->parts); } - return 0; + return rc; } int Index: crypt-gpgme.c =================================================================== RCS file: /home/roessler/cvs/mutt/crypt-gpgme.c,v retrieving revision 3.6 diff -u -p -r3.6 crypt-gpgme.c --- crypt-gpgme.c 9 Aug 2005 16:24:15 -0000 3.6 +++ crypt-gpgme.c 10 Aug 2005 17:25:10 -0000 @@ -1882,7 +1882,7 @@ static void copy_clearsigned (gpgme_data /* Support for classic_application/pgp */ -void pgp_gpgme_application_handler (BODY *m, STATE *s) +int pgp_gpgme_application_handler (BODY *m, STATE *s) { int needpass = -1, pgp_keyblock = 0; int clearsign = 0; @@ -1891,7 +1891,7 @@ void pgp_gpgme_application_handler (BODY char buf[HUGE_STRING]; FILE *pgpout = NULL; - gpgme_error_t err; + gpgme_error_t err = 0; gpgme_data_t armored_data = NULL; short maybe_goodsig = 1; @@ -2130,9 +2130,11 @@ void pgp_gpgme_application_handler (BODY { state_attach_puts (_("[-- Error: could not find beginning" " of PGP message! --]\n\n"), s); - return; + return -1; } dprint (2, (debugfile, "Leaving pgp_application_pgp handler\n")); + + return err; } /* @@ -2140,13 +2142,14 @@ void pgp_gpgme_application_handler (BODY */ /* MIME handler for pgp/mime encrypted messages. */ -void pgp_gpgme_encrypted_handler (BODY *a, STATE *s) +int pgp_gpgme_encrypted_handler (BODY *a, STATE *s) { char tempfile[_POSIX_PATH_MAX]; FILE *fpout; BODY *tattach; BODY *orig_body = a; int is_signed; + int rc = 0; dprint (2, (debugfile, "Entering pgp_encrypted handler\n")); a = a->parts; @@ -2158,7 +2161,7 @@ void pgp_gpgme_encrypted_handler (BODY * if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"), s); - return; + return -1; } /* Move forward to the application/pgp-encrypted body. */ @@ -2170,7 +2173,7 @@ void pgp_gpgme_encrypted_handler (BODY * if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: could not create temporary file! " "--]\n"), s); - return; + return -1; } tattach = decrypt_part (a, s, fpout, 0, &is_signed); @@ -2187,7 +2190,7 @@ void pgp_gpgme_encrypted_handler (BODY * { FILE *savefp = s->fpin; s->fpin = fpout; - mutt_body_handler (tattach, s); + rc = mutt_body_handler (tattach, s); s->fpin = savefp; } @@ -2214,16 +2217,18 @@ void pgp_gpgme_encrypted_handler (BODY * fclose (fpout); mutt_unlink(tempfile); dprint (2, (debugfile, "Leaving pgp_encrypted handler\n")); + + return rc; } /* Support for application/smime */ -void smime_gpgme_application_handler (BODY *a, STATE *s) +int smime_gpgme_application_handler (BODY *a, STATE *s) { char tempfile[_POSIX_PATH_MAX]; FILE *fpout; BODY *tattach; int is_signed; - + int rc = 0; dprint (2, (debugfile, "Entering smime_encrypted handler\n")); @@ -2234,7 +2239,7 @@ void smime_gpgme_application_handler (BO if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: could not create temporary file! " "--]\n"), s); - return; + return -1; } tattach = decrypt_part (a, s, fpout, 1, &is_signed); @@ -2251,7 +2256,7 @@ void smime_gpgme_application_handler (BO { FILE *savefp = s->fpin; s->fpin = fpout; - mutt_body_handler (tattach, s); + rc = mutt_body_handler (tattach, s); s->fpin = savefp; } @@ -2286,6 +2291,8 @@ void smime_gpgme_application_handler (BO fclose (fpout); mutt_unlink(tempfile); dprint (2, (debugfile, "Leaving smime_encrypted handler\n")); + + return rc; } Index: crypt-gpgme.h =================================================================== RCS file: /home/roessler/cvs/mutt/crypt-gpgme.h,v retrieving revision 3.1 diff -u -p -r3.1 crypt-gpgme.h --- crypt-gpgme.h 28 Jan 2005 13:17:22 -0000 3.1 +++ crypt-gpgme.h 10 Aug 2005 17:25:10 -0000 @@ -35,9 +35,9 @@ int smime_gpgme_decrypt_mime (FILE *fpin int pgp_gpgme_check_traditional (FILE *fp, BODY *b, int tagged_only); -void pgp_gpgme_application_handler (BODY *m, STATE *s); -void smime_gpgme_application_handler (BODY *a, STATE *s); -void pgp_gpgme_encrypted_handler (BODY *a, STATE *s); +int pgp_gpgme_application_handler (BODY *m, STATE *s); +int smime_gpgme_application_handler (BODY *a, STATE *s); +int pgp_gpgme_encrypted_handler (BODY *a, STATE *s); BODY *pgp_gpgme_make_key_attachment (char *tempf); @@ -50,4 +50,5 @@ int smime_gpgme_verify_one (BODY *sigbdy int pgp_gpgme_send_menu (HEADER *msg, int *redraw); int smime_gpgme_send_menu (HEADER *msg, int *redraw); +int smime_gpgme_verify_sender (HEADER *h); #endif Index: crypt-mod-pgp-classic.c =================================================================== RCS file: /home/roessler/cvs/mutt/crypt-mod-pgp-classic.c,v retrieving revision 3.2 diff -u -p -r3.2 crypt-mod-pgp-classic.c --- crypt-mod-pgp-classic.c 3 Feb 2005 17:01:43 -0000 3.2 +++ crypt-mod-pgp-classic.c 10 Aug 2005 17:25:10 -0000 @@ -41,9 +41,9 @@ static int crypt_mod_pgp_decrypt_mime (F { return pgp_decrypt_mime (a, b, c, d); } -static void crypt_mod_pgp_application_handler (BODY *m, STATE *s) +static int crypt_mod_pgp_application_handler (BODY *m, STATE *s) { - pgp_application_pgp_handler (m, s); + return pgp_application_pgp_handler (m, s); } static char *crypt_mod_pgp_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) @@ -86,9 +86,9 @@ static BODY *crypt_mod_pgp_traditional_e return pgp_traditional_encryptsign (a, flags, keylist); } -static void crypt_mod_pgp_encrypted_handler (BODY *m, STATE *s) +static int crypt_mod_pgp_encrypted_handler (BODY *m, STATE *s) { - pgp_encrypted_handler (m, s); + return pgp_encrypted_handler (m, s); } static void crypt_mod_pgp_invoke_getkeys (ADDRESS *addr) Index: crypt-mod-pgp-gpgme.c =================================================================== RCS file: /home/roessler/cvs/mutt/crypt-mod-pgp-gpgme.c,v retrieving revision 3.2 diff -u -p -r3.2 crypt-mod-pgp-gpgme.c --- crypt-mod-pgp-gpgme.c 3 Feb 2005 17:01:43 -0000 3.2 +++ crypt-mod-pgp-gpgme.c 10 Aug 2005 17:25:10 -0000 @@ -50,14 +50,14 @@ static int crypt_mod_pgp_decrypt_mime (F return pgp_gpgme_decrypt_mime (a, b, c, d); } -static void crypt_mod_pgp_application_handler (BODY *m, STATE *s) +static int crypt_mod_pgp_application_handler (BODY *m, STATE *s) { - pgp_gpgme_application_handler (m, s); + return pgp_gpgme_application_handler (m, s); } -static void crypt_mod_pgp_encrypted_handler (BODY *m, STATE *s) +static int crypt_mod_pgp_encrypted_handler (BODY *m, STATE *s) { - pgp_gpgme_encrypted_handler (m, s); + return pgp_gpgme_encrypted_handler (m, s); } static int crypt_mod_pgp_check_traditional (FILE *fp, BODY *b, int tagged_only) Index: crypt-mod-smime-classic.c =================================================================== RCS file: /home/roessler/cvs/mutt/crypt-mod-smime-classic.c,v retrieving revision 3.2 diff -u -p -r3.2 crypt-mod-smime-classic.c --- crypt-mod-smime-classic.c 3 Feb 2005 17:01:43 -0000 3.2 +++ crypt-mod-smime-classic.c 10 Aug 2005 17:25:10 -0000 @@ -41,9 +41,9 @@ static int crypt_mod_smime_decrypt_mime { return smime_decrypt_mime (a, b, c, d); } -static void crypt_mod_smime_application_handler (BODY *m, STATE *s) +static int crypt_mod_smime_application_handler (BODY *m, STATE *s) { - smime_application_smime_handler (m, s); + return smime_application_smime_handler (m, s); } static char *crypt_mod_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) Index: crypt-mod-smime-gpgme.c =================================================================== RCS file: /home/roessler/cvs/mutt/crypt-mod-smime-gpgme.c,v retrieving revision 3.2 diff -u -p -r3.2 crypt-mod-smime-gpgme.c --- crypt-mod-smime-gpgme.c 3 Feb 2005 17:01:43 -0000 3.2 +++ crypt-mod-smime-gpgme.c 10 Aug 2005 17:25:10 -0000 @@ -50,9 +50,9 @@ static int crypt_mod_smime_decrypt_mime return smime_gpgme_decrypt_mime (a, b, c, d); } -static void crypt_mod_smime_application_handler (BODY *m, STATE *s) +static int crypt_mod_smime_application_handler (BODY *m, STATE *s) { - smime_gpgme_application_handler (m, s); + return smime_gpgme_application_handler (m, s); } static char *crypt_mod_smime_findkeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc) Index: crypt-mod.h =================================================================== RCS file: /home/roessler/cvs/mutt/crypt-mod.h,v retrieving revision 3.1 diff -u -p -r3.1 crypt-mod.h --- crypt-mod.h 17 Jun 2004 20:36:13 -0000 3.1 +++ crypt-mod.h 10 Aug 2005 17:25:10 -0000 @@ -34,8 +34,8 @@ typedef int (*crypt_func_valid_passphras typedef int (*crypt_func_decrypt_mime_t) (FILE *a, FILE **b, BODY *c, BODY **d); -typedef void (*crypt_func_application_handler_t) (BODY *m, STATE *s); -typedef void (*crypt_func_encrypted_handler_t) (BODY *m, STATE *s); +typedef int (*crypt_func_application_handler_t) (BODY *m, STATE *s); +typedef int (*crypt_func_encrypted_handler_t) (BODY *m, STATE *s); typedef void (*crypt_func_pgp_invoke_getkeys_t) (ADDRESS *addr); typedef int (*crypt_func_pgp_check_traditional_t) (FILE *fp, BODY *b, Index: crypt.c =================================================================== RCS file: /home/roessler/cvs/mutt/crypt.c,v retrieving revision 3.28 diff -u -p -r3.28 crypt.c --- crypt.c 24 Jun 2005 22:32:38 -0000 3.28 +++ crypt.c 10 Aug 2005 17:25:10 -0000 @@ -758,7 +758,7 @@ static void crypt_fetch_signatures (BODY * This routine verifies a "multipart/signed" body. */ -void mutt_signed_handler (BODY *a, STATE *s) +int mutt_signed_handler (BODY *a, STATE *s) { char tempfile[_POSIX_PATH_MAX]; char *protocol; @@ -770,9 +770,10 @@ void mutt_signed_handler (BODY *a, STATE int sigcnt = 0; int i; short goodsig = 1; + int rc = 0; if (!WithCrypto) - return; + return -1; protocol = mutt_get_parameter ("protocol", a->parameter); a = a->parts; @@ -801,8 +802,7 @@ void mutt_signed_handler (BODY *a, STATE state_attach_puts (_("[-- Error: " "Inconsistent multipart/signed structure! --]\n\n"), s); - mutt_body_handler (a, s); - return; + return mutt_body_handler (a, s); } @@ -823,8 +823,7 @@ void mutt_signed_handler (BODY *a, STATE state_printf (s, _("[-- Error: " "Unknown multipart/signed protocol %s! --]\n\n"), protocol); - mutt_body_handler (a, s); - return; + return mutt_body_handler (a, s); } if (s->flags & M_DISPLAY) @@ -881,10 +880,12 @@ void mutt_signed_handler (BODY *a, STATE state_attach_puts (_("[-- Warning: Can't find any signatures. --]\n\n"), s); } - mutt_body_handler (a, s); + rc = mutt_body_handler (a, s); if (s->flags & M_DISPLAY && sigcnt) state_attach_puts (_("\n[-- End of signed data --]\n"), s); + + return rc; } Index: cryptglue.c =================================================================== RCS file: /home/roessler/cvs/mutt/cryptglue.c,v retrieving revision 3.5 diff -u -p -r3.5 cryptglue.c --- cryptglue.c 3 Feb 2005 17:01:43 -0000 3.5 +++ cryptglue.c 10 Aug 2005 17:25:11 -0000 @@ -147,17 +147,21 @@ int crypt_pgp_decrypt_mime (FILE *a, FIL } /* MIME handler for the application/pgp content-type. */ -void crypt_pgp_application_pgp_handler (BODY *m, STATE *s) +int crypt_pgp_application_pgp_handler (BODY *m, STATE *s) { if (CRYPT_MOD_CALL_CHECK (PGP, application_handler)) - (CRYPT_MOD_CALL (PGP, application_handler)) (m, s); + return (CRYPT_MOD_CALL (PGP, application_handler)) (m, s); + + return -1; } /* MIME handler for an PGP/MIME encrypted message. */ -void crypt_pgp_encrypted_handler (BODY *a, STATE *s) +int crypt_pgp_encrypted_handler (BODY *a, STATE *s) { if (CRYPT_MOD_CALL_CHECK (PGP, encrypted_handler)) - (CRYPT_MOD_CALL (PGP, encrypted_handler)) (a, s); + return (CRYPT_MOD_CALL (PGP, encrypted_handler)) (a, s); + + return -1; } /* fixme: needs documentation. */ @@ -290,10 +294,12 @@ int crypt_smime_decrypt_mime (FILE *a, F } /* MIME handler for the application/smime content-type. */ -void crypt_smime_application_smime_handler (BODY *m, STATE *s) +int crypt_smime_application_smime_handler (BODY *m, STATE *s) { if (CRYPT_MOD_CALL_CHECK (SMIME, application_handler)) - (CRYPT_MOD_CALL (SMIME, application_handler)) (m, s); + return (CRYPT_MOD_CALL (SMIME, application_handler)) (m, s); + + return -1; } /* MIME handler for an PGP/MIME encrypted message. */ Index: handler.c =================================================================== RCS file: /home/roessler/cvs/mutt/handler.c,v retrieving revision 3.19 diff -u -p -r3.19 handler.c --- handler.c 3 Feb 2005 17:01:43 -0000 3.19 +++ handler.c 10 Aug 2005 17:25:11 -0000 @@ -41,8 +41,7 @@ #define BUFO_SIZE 2000 -typedef void handler_f (BODY *, STATE *); -typedef handler_f *handler_t; +typedef int (*handler_t) (BODY *, STATE *); int Index_hex[128] = { -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, @@ -767,7 +766,7 @@ static void enriched_set_flags (const ch } } -void text_enriched_handler (BODY *a, STATE *s) +int text_enriched_handler (BODY *a, STATE *s) { enum { TEXT, LANGLE, TAG, BOGUS_TAG, NEWLINE, ST_EOF, DONE @@ -889,6 +888,8 @@ void text_enriched_handler (BODY *a, STA FREE (&(stte.buffer)); FREE (&(stte.line)); FREE (&(stte.param)); + + return 0; } /* @@ -963,7 +964,7 @@ static int flowed_visual_strlen (char *l return j; } -static void text_plain_flowed_handler (BODY *a, STATE *s) +static int text_plain_flowed_handler (BODY *a, STATE *s) { char line[LONG_STRING]; char indent[LONG_STRING]; @@ -1185,7 +1186,8 @@ static void text_plain_flowed_handler (B if (col) state_putc ('\n', s); - + + return 0; } @@ -1197,7 +1199,7 @@ static void text_plain_flowed_handler (B #define TXTPLAIN 2 #define TXTENRICHED 3 -static void alternative_handler (BODY *a, STATE *s) +static int alternative_handler (BODY *a, STATE *s) { BODY *choice = NULL; BODY *b; @@ -1205,6 +1207,7 @@ static void alternative_handler (BODY *a char buf[STRING]; int type = 0; int mustfree = 0; + int rc = 0; if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE || a->encoding == ENCUUENCODED) @@ -1347,18 +1350,22 @@ static void alternative_handler (BODY *a /* didn't find anything that we could display! */ state_mark_attach (s); state_puts(_("[-- Error: Could not display any parts of Multipart/Alternative! --]\n"), s); + rc = -1; } if (mustfree) mutt_free_body(&a); + + return rc; } /* handles message/rfc822 body parts */ -void message_handler (BODY *a, STATE *s) +int message_handler (BODY *a, STATE *s) { struct stat st; BODY *b; long off_start; + int rc = 0; off_start = ftell (s->fpin); if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE || @@ -1382,12 +1389,14 @@ void message_handler (BODY *a, STATE *s) state_puts (s->prefix, s); state_putc ('\n', s); - mutt_body_handler (b->parts, s); + rc = mutt_body_handler (b->parts, s); } if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE || a->encoding == ENCUUENCODED) mutt_free_body (&b); + + return rc; } /* returns 1 if decoding the attachment will produce output */ @@ -1431,12 +1440,13 @@ int mutt_can_decode (BODY *a) return (0); } -void multipart_handler (BODY *a, STATE *s) +int multipart_handler (BODY *a, STATE *s) { BODY *b, *p; char length[5]; struct stat st; int count; + int rc = 0; if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE || a->encoding == ENCUUENCODED) @@ -1487,19 +1497,21 @@ void multipart_handler (BODY *a, STATE * state_printf(s, "%s: \n", p->form_name); } - mutt_body_handler (p, s); + rc = mutt_body_handler (p, s); state_putc ('\n', s); - if ((s->flags & M_REPLYING) - && (option (OPTINCLUDEONLYFIRST)) && (s->flags & M_FIRSTDONE)) + if (rc || ((s->flags & M_REPLYING) + && (option (OPTINCLUDEONLYFIRST)) && (s->flags & M_FIRSTDONE))) break; } if (a->encoding == ENCBASE64 || a->encoding == ENCQUOTEDPRINTABLE || a->encoding == ENCUUENCODED) mutt_free_body (&b); + + return rc; } -void autoview_handler (BODY *a, STATE *s) +int autoview_handler (BODY *a, STATE *s) { rfc1524_entry *entry = rfc1524_new_entry (); char buffer[LONG_STRING]; @@ -1512,6 +1524,7 @@ void autoview_handler (BODY *a, STATE *s FILE *fperr = NULL; int piped = FALSE; pid_t thepid; + int rc = 0; snprintf (type, sizeof (type), "%s/%s", TYPE (a), a->subtype); rfc1524_mailcap_lookup (a, type, entry, M_AUTOVIEW); @@ -1539,7 +1552,7 @@ void autoview_handler (BODY *a, STATE *s { mutt_perror ("fopen"); rfc1524_free_entry (&entry); - return; + return -1; } mutt_copy_bytes (s->fpin, fpin, a->length); @@ -1566,6 +1579,7 @@ void autoview_handler (BODY *a, STATE *s state_mark_attach (s); state_printf (s, _("[-- Can't run %s. --]\n"), command); } + rc = -1; goto bail; } @@ -1626,9 +1640,11 @@ void autoview_handler (BODY *a, STATE *s mutt_clear_error (); } rfc1524_free_entry (&entry); + + return rc; } -static void external_body_handler (BODY *b, STATE *s) +static int external_body_handler (BODY *b, STATE *s) { const char *access_type; const char *expiration; @@ -1642,7 +1658,7 @@ static void external_body_handler (BODY state_mark_attach (s); state_puts (_("[-- Error: message/external-body has no access-type parameter --]\n"), s); } - return; + return -1; } expiration = mutt_get_parameter ("expiration", b->parameter); @@ -1718,6 +1734,8 @@ static void external_body_handler (BODY CH_DECODE , NULL); } } + + return 0; } void mutt_decode_attachment (BODY *b, STATE *s) @@ -1753,7 +1771,7 @@ void mutt_decode_attachment (BODY *b, ST iconv_close (cd); } -void mutt_body_handler (BODY *b, STATE *s) +int mutt_body_handler (BODY *b, STATE *s) { int decode = 0; int plaintext = 0; @@ -1763,6 +1781,7 @@ void mutt_body_handler (BODY *b, STATE * long tmpoffset = 0; size_t tmplength = 0; char type[STRING]; + int rc = 0; int oflags = s->flags; @@ -1913,7 +1932,7 @@ void mutt_body_handler (BODY *b, STATE * /* process the (decoded) body part */ if (handler) { - handler (b, s); + rc = handler (b, s); if (decode) { @@ -1941,7 +1960,9 @@ void mutt_body_handler (BODY *b, STATE * } fputs (" --]\n", s->fpout); } - + bail: s->flags = oflags | (s->flags & M_FIRSTDONE); + + return rc; } Index: mutt_crypt.h =================================================================== RCS file: /home/roessler/cvs/mutt/mutt_crypt.h,v retrieving revision 3.8 diff -u -p -r3.8 mutt_crypt.h --- mutt_crypt.h 17 Jun 2004 20:36:13 -0000 3.8 +++ mutt_crypt.h 10 Aug 2005 17:25:11 -0000 @@ -117,7 +117,7 @@ int mutt_is_application_pgp (BODY *); int mutt_is_application_smime (BODY *); -void mutt_signed_handler (BODY *, STATE *); +int mutt_signed_handler (BODY *, STATE *); int mutt_parse_crypt_hdr (char *, int); @@ -171,10 +171,10 @@ int crypt_pgp_valid_passphrase (void); int crypt_pgp_decrypt_mime (FILE *a, FILE **b, BODY *c, BODY **d); /* MIME handler for the application/pgp content-type. */ -void crypt_pgp_application_pgp_handler (BODY *m, STATE *s); +int crypt_pgp_application_pgp_handler (BODY *m, STATE *s); /* MIME handler for an PGP/MIME encrypted message. */ -void crypt_pgp_encrypted_handler (BODY *a, STATE *s); +int crypt_pgp_encrypted_handler (BODY *a, STATE *s); /* fixme: needs documentation. */ void crypt_pgp_invoke_getkeys (ADDRESS *addr); @@ -233,7 +233,7 @@ int crypt_smime_valid_passphrase (void); int crypt_smime_decrypt_mime (FILE *a, FILE **b, BODY *c, BODY **d); /* MIME handler for the application/smime content-type. */ -void crypt_smime_application_smime_handler (BODY *m, STATE *s); +int crypt_smime_application_smime_handler (BODY *m, STATE *s); /* fixme: Needs documentation. */ void crypt_smime_getkeys (ENVELOPE *env); Index: pgp.c =================================================================== RCS file: /home/roessler/cvs/mutt/pgp.c,v retrieving revision 3.49 diff -u -p -r3.49 pgp.c --- pgp.c 9 Aug 2005 17:41:31 -0000 3.49 +++ pgp.c 10 Aug 2005 17:25:12 -0000 @@ -233,7 +233,7 @@ static void pgp_copy_clearsigned (FILE * /* Support for the Application/PGP Content Type. */ -void pgp_application_pgp_handler (BODY *m, STATE *s) +int pgp_application_pgp_handler (BODY *m, STATE *s) { int needpass = -1, pgp_keyblock = 0; int clearsign = 0, rv, rc; @@ -300,7 +300,7 @@ void pgp_application_pgp_handler (BODY * if ((tmpfp = safe_fopen (tmpfname, "w+")) == NULL) { mutt_perror (tmpfname); - return; + return -1; } fputs (buf, tmpfp); @@ -330,7 +330,7 @@ void pgp_application_pgp_handler (BODY * if ((pgpout = safe_fopen (outfile, "w+")) == NULL) { mutt_perror (tmpfname); - return; + return -1; } if ((thepid = pgp_invoke_decode (&pgpin, NULL, &pgperr, -1, @@ -384,6 +384,7 @@ void pgp_application_pgp_handler (BODY * { mutt_error _("Could not decrypt PGP message"); pgp_void_passphrase (); + rc = -1; goto out; } @@ -446,6 +447,8 @@ void pgp_application_pgp_handler (BODY * } } + rc = 0; + out: m->goodsig = (maybe_goodsig && have_any_sigs); @@ -463,8 +466,10 @@ out: if (needpass == -1) { state_attach_puts (_("[-- Error: could not find beginning of PGP message! --]\n\n"), s); - return; + return -1; } + + return rc; } static int pgp_check_traditional_one_body (FILE *fp, BODY *b, int tagged_only) @@ -816,7 +821,11 @@ BODY *pgp_decrypt_part (BODY *a, STATE * rewind (fpout); if (fgetc (fpout) == EOF) + { + mutt_error _("Decryption failed"); + pgp_void_passphrase (); return NULL; + } rewind (fpout); @@ -870,12 +879,13 @@ int pgp_decrypt_mime (FILE *fpin, FILE * return (0); } -void pgp_encrypted_handler (BODY *a, STATE *s) +int pgp_encrypted_handler (BODY *a, STATE *s) { char tempfile[_POSIX_PATH_MAX]; FILE *fpout, *fpin; BODY *tattach; BODY *p = a; + int rc = 0; a = a->parts; if (!a || a->type != TYPEAPPLICATION || !a->subtype || @@ -885,7 +895,7 @@ void pgp_encrypted_handler (BODY *a, STA { if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"), s); - return; + return -1; } /* @@ -898,7 +908,7 @@ void pgp_encrypted_handler (BODY *a, STA { if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: could not create temporary file! --]\n"), s); - return; + return -1; } if (s->flags & M_DISPLAY) crypt_current_time (s, "PGP"); @@ -910,7 +920,7 @@ void pgp_encrypted_handler (BODY *a, STA fpin = s->fpin; s->fpin = fpout; - mutt_body_handler (tattach, s); + rc = mutt_body_handler (tattach, s); s->fpin = fpin; /* @@ -938,10 +948,13 @@ void pgp_encrypted_handler (BODY *a, STA mutt_error _("Could not decrypt PGP message"); /* void the passphrase, even if it's not necessarily the problem */ pgp_void_passphrase (); + rc = -1; } fclose (fpout); mutt_unlink(tempfile); + + return rc; } /* ---------------------------------------------------------------------------- Index: pgp.h =================================================================== RCS file: /home/roessler/cvs/mutt/pgp.h,v retrieving revision 3.6 diff -u -p -r3.6 pgp.h --- pgp.h 17 Jun 2004 20:36:13 -0000 3.6 +++ pgp.h 10 Aug 2005 17:25:12 -0000 @@ -52,8 +52,8 @@ pgp_key_t pgp_getkeybystr (char *, short char *pgp_findKeys (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc); void pgp_forget_passphrase (void); -void pgp_application_pgp_handler (BODY *, STATE *); -void pgp_encrypted_handler (BODY *, STATE *); +int pgp_application_pgp_handler (BODY *, STATE *); +int pgp_encrypted_handler (BODY *, STATE *); void pgp_extract_keys_from_attachment_list (FILE * fp, int tag, BODY * top); void pgp_void_passphrase (void); int pgp_valid_passphrase (void); Index: protos.h =================================================================== RCS file: /home/roessler/cvs/mutt/protos.h,v retrieving revision 3.33 diff -u -p -r3.33 protos.h --- protos.h 7 Aug 2005 16:45:35 -0000 3.33 +++ protos.h 10 Aug 2005 17:25:13 -0000 @@ -161,7 +161,7 @@ void mutt_allow_interrupt (int); void mutt_attach_init (BODY *); void mutt_block_signals (void); void mutt_block_signals_system (void); -void mutt_body_handler (BODY *, STATE *); +int mutt_body_handler (BODY *, STATE *); int mutt_bounce_message (FILE *fp, HEADER *, ADDRESS *); void mutt_break_thread (HEADER *); void mutt_buffy (char *, size_t); Index: smime.c =================================================================== RCS file: /home/roessler/cvs/mutt/smime.c,v retrieving revision 3.39 diff -u -p -r3.39 smime.c --- smime.c 24 Jul 2005 14:23:25 -0000 3.39 +++ smime.c 10 Aug 2005 17:25:14 -0000 @@ -1929,11 +1929,9 @@ bail: } -void smime_application_smime_handler (BODY *m, STATE *s) +int smime_application_smime_handler (BODY *m, STATE *s) { - - smime_handle_entity (m, s, NULL); - + return smime_handle_entity (m, s, NULL) ? 0 : -1; } int smime_send_menu (HEADER *msg, int *redraw) Index: smime.h =================================================================== RCS file: /home/roessler/cvs/mutt/smime.h,v retrieving revision 3.10 diff -u -p -r3.10 smime.h --- smime.h 17 Jun 2004 20:36:13 -0000 3.10 +++ smime.h 10 Aug 2005 17:25:14 -0000 @@ -31,7 +31,7 @@ int smime_valid_passphrase (void); int smime_decrypt_mime (FILE *, FILE **, BODY *, BODY **); -void smime_application_smime_handler (BODY *, STATE *); +int smime_application_smime_handler (BODY *, STATE *); BODY* smime_sign_message (BODY *);
Attachment:
pgp4kLE5PcU5a.pgp
Description: PGP signature