X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=pgp.c;h=a2ad01948a61d4f7aa3621e8158f9eda619548da;hp=444eefd7a707f3fb3ff97b3b8022d3d5709f8710;hb=fe23f004535336d4d6103eada14a59173c212edb;hpb=841934011451205d8295ac955486f06c317fdf15 diff --git a/pgp.c b/pgp.c index 444eefd..a2ad019 100644 --- a/pgp.c +++ b/pgp.c @@ -27,6 +27,11 @@ #include "mime.h" #include "copy.h" +#include "lib/mem.h" +#include "lib/intl.h" +#include "lib/str.h" +#include "lib/debug.h" + #include #include #include @@ -53,7 +58,7 @@ #include "mutt_menu.h" -char PgpPass[STRING]; +char PgpPass[LONG_STRING]; time_t PgpExptime = 0; /* when does the cached passphrase expire? */ void pgp_void_passphrase (void) @@ -135,14 +140,11 @@ static int pgp_copy_checksig (FILE * fpin, FILE * fpout) while ((line = mutt_read_line (line, &linelen, fpin, &lineno)) != NULL) { if (regexec (PgpGoodSign.rx, line, 0, NULL, 0) == 0) { - dprint (2, (debugfile, "pgp_copy_checksig: \"%s\" matches regexp.\n", - line)); + debug_print (2, ("\"%s\" matches regexp.\n", line)); rv = 0; } else - dprint (2, - (debugfile, - "pgp_copy_checksig: \"%s\" doesn't match regexp.\n", line)); + debug_print (2, ("\"%s\" doesn't match regexp.\n", line)); if (strncmp (line, "[GNUPG:] ", 9) == 0) continue; @@ -152,7 +154,7 @@ static int pgp_copy_checksig (FILE * fpin, FILE * fpout) FREE (&line); } else { - dprint (2, (debugfile, "pgp_copy_checksig: No pattern.\n")); + debug_print (2, ("No pattern.\n")); mutt_copy_stream (fpin, fpout); rv = 1; } @@ -197,7 +199,7 @@ static void pgp_copy_clearsigned (FILE * fpin, STATE * s, char *charset) break; if (armor_header) { - char *p = mutt_skip_whitespace (buf); + char *p = str_skip_initws (buf); if (*p == '\0') armor_header = 0; @@ -252,7 +254,7 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) bytes -= (offset - last_pos); /* don't rely on mutt_strlen(buf) */ last_pos = offset; - if (mutt_strncmp ("-----BEGIN PGP ", buf, 15) == 0) { + if (safe_strncmp ("-----BEGIN PGP ", buf, 15) == 0) { clearsign = 0; start_pos = last_pos; @@ -356,12 +358,16 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) if (rc == -1 || rv) maybe_goodsig = 0; - state_putc ('\n', s); state_attach_puts (_("[-- End of PGP output --]\n\n"), s); } } } + /* treat empty result as sign of failure */ + if (! ftell(pgpout)) { + mutt_error _("Could not decrypt PGP message"); + goto out; + } /* * Now, copy cleartext to the screen. NOTE - we expect that PGP @@ -397,22 +403,16 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) if (s->flags & M_DISPLAY) { state_putc ('\n', s); - if (needpass) + if (needpass) { state_attach_puts (_("[-- END PGP MESSAGE --]\n"), s); + mutt_message _("PGP message successfully decrypted."); + } else if (pgp_keyblock) state_attach_puts (_("[-- END PGP PUBLIC KEY BLOCK --]\n"), s); else state_attach_puts (_("[-- END PGP SIGNED MESSAGE --]\n"), s); } - if (tmpfp) { - safe_fclose (&tmpfp); - mutt_unlink (tmpfname); - } - if (pgpout) { - safe_fclose (&pgpout); - mutt_unlink (outfile); - } } else { /* XXX - we may wish to recode here */ @@ -422,8 +422,18 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) } } +out: m->goodsig = (maybe_goodsig && have_any_sigs); + if (tmpfp) { + safe_fclose (&tmpfp); + mutt_unlink (tmpfname); + } + if (pgpout) { + safe_fclose (&pgpout); + mutt_unlink (outfile); + } + if (needpass == -1) { state_attach_puts (_ ("[-- Error: could not find beginning of PGP message! --]\n\n"), @@ -461,7 +471,7 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b, } while (fgets (buf, sizeof (buf), tfp)) { - if (mutt_strncmp ("-----BEGIN PGP ", buf, 15) == 0) { + if (safe_strncmp ("-----BEGIN PGP ", buf, 15) == 0) { if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0) enc = 1; else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) @@ -557,9 +567,7 @@ int pgp_verify_one (BODY * sigbdy, STATE * s, const char *tempfile) if ((rv = mutt_wait_filter (thepid))) badsig = -1; - dprint (1, - (debugfile, "pgp_verify_one: mutt_wait_filter returned %d.\n", - rv)); + debug_print (1, ("mutt_wait_filter returned %d.\n", rv)); } safe_fclose (&pgperr); @@ -569,7 +577,7 @@ int pgp_verify_one (BODY * sigbdy, STATE * s, const char *tempfile) mutt_unlink (sigfile); mutt_unlink (pgperrfile); - dprint (1, (debugfile, "pgp_verify_one: returning %d.\n", badsig)); + debug_print (1, ("returning %d.\n", badsig)); return badsig; } @@ -691,6 +699,7 @@ BODY *pgp_decrypt_part (BODY * a, STATE * s, FILE * fpout, BODY * p) char pgperrfile[_POSIX_PATH_MAX]; char pgptmpfile[_POSIX_PATH_MAX]; pid_t thepid; + int rv; mutt_mktemp (pgperrfile); if ((pgperr = safe_fopen (pgperrfile, "w+")) == NULL) { @@ -744,14 +753,16 @@ BODY *pgp_decrypt_part (BODY * a, STATE * s, FILE * fpout, BODY * p) } fclose (pgpout); - mutt_wait_filter (thepid); + rv = mutt_wait_filter (thepid); mutt_unlink (pgptmpfile); if (s->flags & M_DISPLAY) { fflush (pgperr); rewind (pgperr); - if (pgp_copy_checksig (pgperr, s->fpout) == 0 && p) + if (pgp_copy_checksig (pgperr, s->fpout) == 0 && !rv && p) p->goodsig = 1; + else + p->goodsig = 0; state_attach_puts (_("[-- End of PGP output --]\n\n"), s); } fclose (pgperr); @@ -874,7 +885,10 @@ 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 + mutt_error _("Could not decrypt PGP message"); fclose (fpout); mutt_unlink (tempfile); @@ -917,7 +931,7 @@ BODY *pgp_sign_message (BODY * a) if ((thepid = pgp_invoke_sign (&pgpin, &pgpout, &pgperr, -1, -1, -1, signedfile)) == -1) { - mutt_perror _("Can't open PGP subprocess!"); + mutt_perror (_("Can't open PGP subprocess!")); fclose (fp); unlink (sigfile); @@ -1214,6 +1228,8 @@ BODY *pgp_encrypt_message (BODY * a, char *keylist, int sign) if (empty) { /* fatal error while trying to encrypt message */ + if (sign) + pgp_void_passphrase (); /* just in case */ unlink (tempfile); return (NULL); } @@ -1337,7 +1353,7 @@ BODY *pgp_traditional_encryptsign (BODY * a, int flags, char *keylist) if ((thepid = pgp_invoke_traditional (&pgpin, NULL, NULL, -1, fileno (pgpout), fileno (pgperr), pgpinfile, keylist, flags)) == -1) { - mutt_perror _("Can't invoke PGP"); + mutt_perror (_("Can't invoke PGP")); fclose (pgpout); fclose (pgperr); @@ -1380,6 +1396,8 @@ BODY *pgp_traditional_encryptsign (BODY * a, int flags, char *keylist) mutt_any_key_to_continue (NULL); if (empty) { + if (flags & SIGN) + pgp_void_passphrase (); /* just in case */ unlink (pgpoutfile); return NULL; } @@ -1457,7 +1475,7 @@ int pgp_send_menu (HEADER * msg, int *redraw) pgp_ask_for_key (_("Sign as: "), NULL, KEYFLAG_CANSIGN, PGP_PUBRING))) { snprintf (input_signas, sizeof (input_signas), "0x%s", pgp_keyid (p)); - mutt_str_replace (&PgpSignAs, input_signas); + str_replace (&PgpSignAs, input_signas); pgp_free_key (&p); msg->security |= SIGN;