Rocco Rutte:
[apps/madmutt.git] / pgp.c
diff --git a/pgp.c b/pgp.c
index 444eefd..a2ad019 100644 (file)
--- a/pgp.c
+++ b/pgp.c
 #include "mime.h"
 #include "copy.h"
 
+#include "lib/mem.h"
+#include "lib/intl.h"
+#include "lib/str.h"
+#include "lib/debug.h"
+
 #include <sys/wait.h>
 #include <string.h>
 #include <stdlib.h>
@@ -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;