X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=pgp.c;h=53ff14baa8d13e06b20ad2315e8b8f4b04343440;hp=5e886dbf5d0ee47eb6cd410fc4e5f7eeafa230b3;hb=e5f7fde48e226cefc14f3b3b2f1039d530c73ab1;hpb=a8477ebaa09990b3688164cbe5cf661c4189541d diff --git a/pgp.c b/pgp.c index 5e886db..53ff14b 100644 --- a/pgp.c +++ b/pgp.c @@ -22,10 +22,14 @@ #endif #include "mutt.h" +#include "enter.h" +#include "ascii.h" +#include "handler.h" #include "mutt_curses.h" #include "pgp.h" #include "mime.h" #include "copy.h" +#include "attach.h" #include "lib/mem.h" #include "lib/intl.h" @@ -151,7 +155,7 @@ static int pgp_copy_checksig (FILE * fpin, FILE * fpout) fputs (line, fpout); fputc ('\n', fpout); } - FREE (&line); + mem_free (&line); } else { debug_print (2, ("No pattern.\n")); @@ -221,9 +225,10 @@ static void pgp_copy_clearsigned (FILE * fpin, STATE * s, char *charset) /* 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 c; int clearsign = 0, rv, rc; long start_pos = 0; long bytes, last_pos, offset; @@ -231,7 +236,7 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) char outfile[_POSIX_PATH_MAX]; char tmpfname[_POSIX_PATH_MAX]; FILE *pgpout = NULL, *pgpin = NULL, *pgperr = NULL; - FILE *tmpfp; + FILE *tmpfp = NULL; pid_t thepid; short maybe_goodsig = 1; @@ -283,7 +288,7 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) mutt_mktemp (tmpfname); if ((tmpfp = safe_fopen (tmpfname, "w+")) == NULL) { mutt_perror (tmpfname); - return; + return (-1); } fputs (buf, tmpfp); @@ -312,7 +317,7 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) mutt_mktemp (outfile); if ((pgpout = safe_fopen (outfile, "w+")) == NULL) { mutt_perror (tmpfname); - return; + return (-1); } if ((thepid = pgp_invoke_decode (&pgpin, NULL, &pgperr, -1, @@ -349,26 +354,30 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) if (s->flags & M_DISPLAY) { if (rc == 0) have_any_sigs = 1; -/* - * Sig is bad if - * gpg_good_sign-pattern did not match || pgp_decode_command returned not 0 - * Sig _is_ correct if - * gpg_good_sign="" && pgp_decode_command returned 0 - */ + + /* + * Sig is bad if + * gpg_good_sign-pattern did not match || pgp_decode_command returned not 0 + * Sig _is_ correct if + * gpg_good_sign="" && pgp_decode_command returned 0 + */ if (rc == -1 || rv) maybe_goodsig = 0; state_attach_puts (_("[-- End of PGP output --]\n\n"), s); } } - } - /* treat empty result as sign of failure */ - if (pgpout !=NULL) - if (! ftell(pgpout)) { - mutt_error _("Could not decrypt PGP message"); - goto out; + /* treat empty result as sign of failure */ + rewind (pgpout); + if ((c = fgetc (pgpout)) == EOF) { + mutt_error _("Could not decrypt PGP message"); + pgp_void_passphrase (); + rc = -1; + goto out; } + ungetc (c, pgpout); + } /* * Now, copy cleartext to the screen. NOTE - we expect that PGP @@ -423,6 +432,8 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) } } + rc = 0; + out: m->goodsig = (maybe_goodsig && have_any_sigs); @@ -439,8 +450,10 @@ out: 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, @@ -771,8 +784,11 @@ BODY *pgp_decrypt_part (BODY * a, STATE * s, FILE * fpout, BODY * p) fflush (fpout); rewind (fpout); - if (fgetc (fpout) == EOF) + if (fgetc (fpout) == EOF) { + mutt_error (_("Decryption failed.")); + pgp_void_passphrase (); return NULL; + } rewind (fpout); @@ -824,12 +840,13 @@ int pgp_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, BODY ** cur) 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 || @@ -839,7 +856,7 @@ void pgp_encrypted_handler (BODY * a, STATE * s) if (s->flags & M_DISPLAY) state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"), s); - return; + return (-1); } /* @@ -853,7 +870,7 @@ void pgp_encrypted_handler (BODY * a, STATE * s) state_attach_puts (_ ("[-- Error: could not create temporary file! --]\n"), s); - return; + return (-1); } if (s->flags & M_DISPLAY) @@ -867,7 +884,7 @@ void pgp_encrypted_handler (BODY * a, STATE * s) fpin = s->fpin; s->fpin = fpout; - mutt_body_handler (tattach, s); + rc = mutt_body_handler (tattach, s); s->fpin = fpin; /* @@ -888,11 +905,16 @@ void pgp_encrypted_handler (BODY * a, STATE * s) mutt_free_body (&tattach); /* clear 'Invoking...' message, since there's no error */ mutt_message _("PGP message successfully decrypted."); - } else + } else { mutt_error _("Could not decrypt PGP message"); + pgp_void_passphrase (); + rc = -1; + } fclose (fpout); mutt_unlink (tempfile); + + return (rc); } /* ---------------------------------------------------------------------------- @@ -1100,7 +1122,7 @@ char *pgp_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc) k_info = pgp_getkeybystr (keyID, KEYFLAG_CANENCRYPT, PGP_PUBRING); } else if (r == -1) { - FREE (&keylist); + mem_free (&keylist); rfc822_free_address (&tmp); rfc822_free_address (&addr); return NULL; @@ -1117,7 +1139,7 @@ char *pgp_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc) if ((key = pgp_ask_for_key (buf, q->mailbox, KEYFLAG_CANENCRYPT, PGP_PUBRING)) == NULL) { - FREE (&keylist); + mem_free (&keylist); rfc822_free_address (&tmp); rfc822_free_address (&addr); return NULL; @@ -1130,7 +1152,7 @@ char *pgp_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc) bypass_selection: keylist_size += str_len (keyID) + 4; - safe_realloc (&keylist, keylist_size); + mem_realloc (&keylist, keylist_size); sprintf (keylist + keylist_used, "%s0x%s", keylist_used ? " " : "", /* __SPRINTF_CHECKED__ */ keyID); keylist_used = str_len (keylist);