X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=pgp.c;h=fccf7a9c3bd6feab6651bd99423d13231c5ba6e3;hp=7bf892c79c76ec33ce55ee4e559f1335f6d46cf2;hb=7480539010bab6905c944b11b036492a1a625994;hpb=25bf57d598476b329536fa3f748cc0c529fef6bd diff --git a/pgp.c b/pgp.c index 7bf892c..fccf7a9 100644 --- a/pgp.c +++ b/pgp.c @@ -30,6 +30,7 @@ #include "lib/mem.h" #include "lib/intl.h" #include "lib/str.h" +#include "lib/debug.h" #include #include @@ -57,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) @@ -139,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; @@ -156,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,11 +195,11 @@ static void pgp_copy_clearsigned (FILE * fpin, STATE * s, char *charset) continue; } - if (safe_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") == 0) + if (mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") == 0) break; if (armor_header) { - char *p = mutt_skip_whitespace (buf); + char *p = str_skip_initws (buf); if (*p == '\0') armor_header = 0; @@ -253,21 +251,21 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) break; offset = ftell (s->fpin); - bytes -= (offset - last_pos); /* don't rely on safe_strlen(buf) */ + bytes -= (offset - last_pos); /* don't rely on mutt_strlen(buf) */ last_pos = offset; if (safe_strncmp ("-----BEGIN PGP ", buf, 15) == 0) { clearsign = 0; start_pos = last_pos; - if (safe_strcmp ("MESSAGE-----\n", buf + 15) == 0) + if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0) needpass = 1; - else if (safe_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) { + else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) { clearsign = 1; needpass = 0; } else if (!option (OPTDONTHANDLEPGPKEYS) && - safe_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0) { + mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0) { needpass = 0; pgp_keyblock = 1; } @@ -291,16 +289,16 @@ void pgp_application_pgp_handler (BODY * m, STATE * s) fputs (buf, tmpfp); while (bytes > 0 && fgets (buf, sizeof (buf) - 1, s->fpin) != NULL) { offset = ftell (s->fpin); - bytes -= (offset - last_pos); /* don't rely on safe_strlen(buf) */ + bytes -= (offset - last_pos); /* don't rely on mutt_strlen(buf) */ last_pos = offset; fputs (buf, tmpfp); if ((needpass - && safe_strcmp ("-----END PGP MESSAGE-----\n", buf) == 0) + && mutt_strcmp ("-----END PGP MESSAGE-----\n", buf) == 0) || (!needpass - && (safe_strcmp ("-----END PGP SIGNATURE-----\n", buf) == 0 - || safe_strcmp ("-----END PGP PUBLIC KEY BLOCK-----\n", + && (mutt_strcmp ("-----END PGP SIGNATURE-----\n", buf) == 0 + || mutt_strcmp ("-----END PGP PUBLIC KEY BLOCK-----\n", buf) == 0))) break; } @@ -360,12 +358,17 @@ 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 (pgpout !=NULL) + if (! ftell(pgpout)) { + mutt_error _("Could not decrypt PGP message"); + goto out; + } /* * Now, copy cleartext to the screen. NOTE - we expect that PGP @@ -401,22 +404,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 */ @@ -426,8 +423,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"), @@ -466,11 +473,11 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b, while (fgets (buf, sizeof (buf), tfp)) { if (safe_strncmp ("-----BEGIN PGP ", buf, 15) == 0) { - if (safe_strcmp ("MESSAGE-----\n", buf + 15) == 0) + if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0) enc = 1; - else if (safe_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) + else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0) sgn = 1; - else if (safe_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0) + else if (mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0) key = 1; } } @@ -561,9 +568,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); @@ -573,7 +578,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; } @@ -695,6 +700,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) { @@ -741,21 +747,23 @@ BODY *pgp_decrypt_part (BODY * a, STATE * s, FILE * fpout, BODY * p) * read_mime_header has a hard time parsing the message. */ while (fgets (buf, sizeof (buf) - 1, pgpout) != NULL) { - len = safe_strlen (buf); + len = mutt_strlen (buf); if (len > 1 && buf[len - 2] == '\r') strcpy (buf + len - 2, "\n"); /* __STRCPY_CHECKED__ */ fputs (buf, fpout); } 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); @@ -878,7 +886,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); @@ -939,9 +950,9 @@ BODY *pgp_sign_message (BODY * a) * recommended for future releases of PGP. */ while (fgets (buffer, sizeof (buffer) - 1, pgpout) != NULL) { - if (safe_strcmp ("-----BEGIN PGP MESSAGE-----\n", buffer) == 0) + if (mutt_strcmp ("-----BEGIN PGP MESSAGE-----\n", buffer) == 0) fputs ("-----BEGIN PGP SIGNATURE-----\n", fp); - else if (safe_strcmp ("-----END PGP MESSAGE-----\n", buffer) == 0) + else if (mutt_strcmp ("-----END PGP MESSAGE-----\n", buffer) == 0) fputs ("-----END PGP SIGNATURE-----\n", fp); else fputs (buffer, fp); @@ -1010,7 +1021,7 @@ static short is_numerical_keyid (const char *s) /* or should we require the "0x"? */ if (strncmp (s, "0x", 2) == 0) s += 2; - if (safe_strlen (s) % 8) + if (mutt_strlen (s) % 8) return 0; while (*s) if (strchr ("0123456789ABCDEFabcdef", *s++) == NULL) @@ -1118,11 +1129,11 @@ char *pgp_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc) keyID = pgp_keyid (key); bypass_selection: - keylist_size += safe_strlen (keyID) + 4; + keylist_size += mutt_strlen (keyID) + 4; safe_realloc (&keylist, keylist_size); sprintf (keylist + keylist_used, "%s0x%s", keylist_used ? " " : "", /* __SPRINTF_CHECKED__ */ keyID); - keylist_used = safe_strlen (keylist); + keylist_used = mutt_strlen (keylist); pgp_free_key (&key); rfc822_free_address (&addr); @@ -1218,6 +1229,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); } @@ -1384,6 +1397,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; }