Rocco Rutte:
[apps/madmutt.git] / crypt-gpgme.c
index e53b6ee..b9b7613 100644 (file)
@@ -30,6 +30,7 @@
 #include "lib/mem.h"
 #include "lib/intl.h"
 #include "lib/str.h"
+#include "lib/debug.h"
 
 #include <sys/wait.h>
 #include <string.h>
@@ -112,10 +113,10 @@ static gpgme_key_t signature_key = NULL;
  * General helper functions.
  */
 
-/* return true when S pints to a didgit or letter. */
+/* return true when S points to a didgit or letter. */
 static int digit_or_letter (const unsigned char *s)
 {
-  return ((*s >= '0' && *s < '9')
+  return ((*s >= '0' && *s <= '9')
           || (*s >= 'A' && *s <= 'Z')
           || (*s >= 'a' && *s <= 'z'));
 }
@@ -294,11 +295,11 @@ static int crypt_id_matches_addr (ADDRESS * addr, ADDRESS * u_addr,
     rv |= CRYPT_KV_STRONGID;
 
   if (addr->mailbox && u_addr->mailbox
-      && mutt_strcasecmp (addr->mailbox, u_addr->mailbox) == 0)
+      && safe_strcasecmp (addr->mailbox, u_addr->mailbox) == 0)
     rv |= CRYPT_KV_ADDR;
 
   if (addr->personal && u_addr->personal
-      && mutt_strcasecmp (addr->personal, u_addr->personal) == 0)
+      && safe_strcasecmp (addr->personal, u_addr->personal) == 0)
     rv |= CRYPT_KV_STRING;
 
   return rv;
@@ -318,7 +319,7 @@ static gpgme_ctx_t create_gpgme_context (int for_smime)
 
   err = gpgme_new (&ctx);
   if (err) {
-    mutt_error ("error creating gpgme context: %s\n", gpgme_strerror (err));
+    mutt_error (_("error creating gpgme context: %s\n"), gpgme_strerror (err));
     sleep (2);
     mutt_exit (1);
   }
@@ -326,7 +327,7 @@ static gpgme_ctx_t create_gpgme_context (int for_smime)
   if (for_smime) {
     err = gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
     if (err) {
-      mutt_error ("error enabling CMS protocol: %s\n", gpgme_strerror (err));
+      mutt_error (_("error enabling CMS protocol: %s\n"), gpgme_strerror (err));
       sleep (2);
       mutt_exit (1);
     }
@@ -344,7 +345,7 @@ static gpgme_data_t create_gpgme_data (void)
 
   err = gpgme_data_new (&data);
   if (err) {
-    mutt_error ("error creating gpgme data object: %s\n",
+    mutt_error (_("error creating gpgme data object: %s\n"),
                 gpgme_strerror (err));
     sleep (2);
     mutt_exit (1);
@@ -403,7 +404,7 @@ static gpgme_data_t body_to_data_object (BODY * a, int convert)
   }
   unlink (tempfile);
   if (err) {
-    mutt_error ("error allocating data object: %s\n", gpgme_strerror (err));
+    mutt_error (_("error allocating data object: %s\n"), gpgme_strerror (err));
     return NULL;
   }
 
@@ -420,7 +421,7 @@ static gpgme_data_t file_to_data_object (FILE * fp, long offset, long length)
 
   err = gpgme_data_new_from_filepart (&data, NULL, fp, offset, length);
   if (err) {
-    mutt_error ("error allocating data object: %s\n", gpgme_strerror (err));
+    mutt_error (_("error allocating data object: %s\n"), gpgme_strerror (err));
     return NULL;
   }
 
@@ -437,7 +438,7 @@ static int data_object_to_stream (gpgme_data_t data, FILE * fp)
   err = ((gpgme_data_seek (data, 0, SEEK_SET) == -1)
          ? gpgme_error_from_errno (errno) : 0);
   if (err) {
-    mutt_error ("error rewinding data object: %s\n", gpgme_strerror (err));
+    mutt_error (_("error rewinding data object: %s\n"), gpgme_strerror (err));
     return -1;
   }
 
@@ -455,7 +456,7 @@ static int data_object_to_stream (gpgme_data_t data, FILE * fp)
     }
   }
   if (nread == -1) {
-    mutt_error ("error reading data object: %s\n", strerror (errno));
+    mutt_error (_("error reading data object: %s\n"), strerror (errno));
     return -1;
   }
   return 0;
@@ -497,7 +498,7 @@ static char *data_object_to_tempfile (gpgme_data_t data, FILE ** ret_fp)
   else
     fclose (fp);
   if (nread == -1) {
-    mutt_error ("error reading data object: %s\n", gpgme_strerror (err));
+    mutt_error (_("error reading data object: %s\n"), gpgme_strerror (err));
     unlink (tempfile);
     fclose (fp);
     return NULL;
@@ -553,7 +554,7 @@ static gpgme_key_t *create_recipient_set (const char *keylist,
           rset[rset_n++] = key;
         }
         else {
-          mutt_error ("error adding recipient `%s': %s\n",
+          mutt_error (_("error adding recipient `%s': %s\n"),
                       buf, gpgme_strerror (err));
           FREE (&rset);
           return NULL;
@@ -599,7 +600,7 @@ static int set_signer (gpgme_ctx_t ctx, int for_smime)
     gpgme_key_release (key);
     gpgme_key_release (key2);
     gpgme_release (listctx);
-    mutt_error (_("ambiguous specfication of secret key `%s'\n"), signid);
+    mutt_error (_("ambiguous specification of secret key `%s'\n"), signid);
     return -1;
   }
   gpgme_op_keylist_end (listctx);
@@ -650,7 +651,7 @@ static char *encrypt_gpgme_object (gpgme_data_t plaintext, gpgme_key_t * rset,
                             plaintext, ciphertext);
   mutt_need_hard_redraw ();
   if (err) {
-    mutt_error ("error encrypting data: %s\n", gpgme_strerror (err));
+    mutt_error (_("error encrypting data: %s\n"), gpgme_strerror (err));
     gpgme_data_release (ciphertext);
     gpgme_release (ctx);
     return NULL;
@@ -743,7 +744,7 @@ static BODY *sign_message (BODY * a, int use_smime)
   if (err) {
     gpgme_data_release (signature);
     gpgme_release (ctx);
-    mutt_error ("error signing data: %s\n", gpgme_strerror (err));
+    mutt_error (_("error signing data: %s\n"), gpgme_strerror (err));
     return NULL;
   }
 
@@ -987,7 +988,7 @@ static int show_sig_summary (unsigned long sum,
     gpgme_signature_t sig;
     unsigned int i;
 
-    state_attach_puts (_("A system error occured"), s);
+    state_attach_puts (_("A system error occurred"), s);
 
     /* Try to figure out some more detailed system error information. */
     result = gpgme_op_verify_result (ctx);
@@ -1002,7 +1003,7 @@ static int show_sig_summary (unsigned long sum,
       state_attach_puts (": ", s);
       if (t0)
         state_attach_puts (t0, s);
-      if (t1 && !(t0 && !strcmp (t0, t1))) {
+      if (t1 && !(t0 && !mutt_strcmp (t0, t1))) {
         if (t0)
           state_attach_puts (",", s);
         state_attach_puts (t1, s);
@@ -1237,7 +1238,7 @@ static int verify_one (BODY * sigbdy, STATE * s,
   err = gpgme_data_new_from_file (&message, tempfile, 1);
   if (err) {
     gpgme_data_release (signature);
-    mutt_error ("error allocating data object: %s\n", gpgme_strerror (err));
+    mutt_error (_("error allocating data object: %s\n"), gpgme_strerror (err));
     return -1;
   }
   ctx = create_gpgme_context (is_smime);
@@ -1311,7 +1312,7 @@ static int verify_one (BODY * sigbdy, STATE * s,
   gpgme_release (ctx);
 
   state_attach_puts (_("[-- End signature information --]\n\n"), s);
-  dprint (1, (debugfile, "verify_one: returning %d.\n", badsig));
+  debug_print (1, ("returning %d.\n", badsig));
 
   return badsig ? 1 : anywarn ? 2 : 0;
 }
@@ -1655,7 +1656,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)) {
+    if (!safe_strncmp ("-----BEGIN PGP ", buf, 15)) {
       if (!mutt_strcmp ("MESSAGE-----\n", buf + 15))
         enc = 1;
       else if (!mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15))
@@ -1778,7 +1779,7 @@ void pgp_gpgme_application_handler (BODY * m, STATE * s)
 
   char body_charset[STRING];    /* Only used for clearsigned messages. */
 
-  dprint (2, (debugfile, "Entering pgp_application_pgp handler\n"));
+  debug_print (2, ("Entering pgp_application_pgp handler\n"));
 
   /* For clearsigned messages we won't be able to get a character set
      but we know that this may only be text thus we assume Latin-1
@@ -1797,7 +1798,7 @@ void pgp_gpgme_application_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)) {
+    if (!safe_strncmp ("-----BEGIN PGP ", buf, 15)) {
       clearsign = 0;
       start_pos = last_pos;
 
@@ -1983,7 +1984,7 @@ void pgp_gpgme_application_handler (BODY * m, STATE * s)
                          " of PGP message! --]\n\n"), s);
     return;
   }
-  dprint (2, (debugfile, "Leaving pgp_application_pgp handler\n"));
+  debug_print (2, ("Leaving pgp_application_pgp handler\n"));
 }
 
 /* 
@@ -1999,7 +2000,7 @@ void pgp_gpgme_encrypted_handler (BODY * a, STATE * s)
   BODY *orig_body = a;
   int is_signed;
 
-  dprint (2, (debugfile, "Entering pgp_encrypted handler\n"));
+  debug_print (2, ("Entering pgp_encrypted handler\n"));
   a = a->parts;
   if (!a || a->type != TYPEAPPLICATION || !a->subtype
       || ascii_strcasecmp ("pgp-encrypted", a->subtype)
@@ -2064,7 +2065,7 @@ void pgp_gpgme_encrypted_handler (BODY * a, STATE * s)
 
   fclose (fpout);
   mutt_unlink (tempfile);
-  dprint (2, (debugfile, "Leaving pgp_encrypted handler\n"));
+  debug_print (2, ("Leaving pgp_encrypted handler\n"));
 }
 
 /* Support for application/smime */
@@ -2076,7 +2077,7 @@ void smime_gpgme_application_handler (BODY * a, STATE * s)
   int is_signed;
 
 
-  dprint (2, (debugfile, "Entering smime_encrypted handler\n"));
+  debug_print (2, ("Entering smime_encrypted handler\n"));
 
   a->warnsig = 0;
   mutt_mktemp (tempfile);
@@ -2133,7 +2134,7 @@ void smime_gpgme_application_handler (BODY * a, STATE * s)
 
   fclose (fpout);
   mutt_unlink (tempfile);
-  dprint (2, (debugfile, "Leaving smime_encrypted handler\n"));
+  debug_print (2, ("Leaving smime_encrypted handler\n"));
 }
 
 
@@ -2367,10 +2368,10 @@ static int _crypt_compare_address (const void *a, const void *b)
   crypt_key_t **t = (crypt_key_t **) b;
   int r;
 
-  if ((r = mutt_strcasecmp ((*s)->uid, (*t)->uid)))
+  if ((r = safe_strcasecmp ((*s)->uid, (*t)->uid)))
     return r > 0;
   else
-    return mutt_strcasecmp (crypt_keyid (*s), crypt_keyid (*t)) > 0;
+    return safe_strcasecmp (crypt_keyid (*s), crypt_keyid (*t)) > 0;
 }
 
 static int crypt_compare_address (const void *a, const void *b)
@@ -2387,10 +2388,10 @@ static int _crypt_compare_keyid (const void *a, const void *b)
   crypt_key_t **t = (crypt_key_t **) b;
   int r;
 
-  if ((r = mutt_strcasecmp (crypt_keyid (*s), crypt_keyid (*t))))
+  if ((r = safe_strcasecmp (crypt_keyid (*s), crypt_keyid (*t))))
     return r > 0;
   else
-    return mutt_strcasecmp ((*s)->uid, (*t)->uid) > 0;
+    return safe_strcasecmp ((*s)->uid, (*t)->uid) > 0;
 }
 
 static int crypt_compare_keyid (const void *a, const void *b)
@@ -2416,7 +2417,7 @@ static int _crypt_compare_date (const void *a, const void *b)
   if (ts < tt)
     return 0;
 
-  return mutt_strcasecmp ((*s)->uid, (*t)->uid) > 0;
+  return safe_strcasecmp ((*s)->uid, (*t)->uid) > 0;
 }
 
 static int crypt_compare_date (const void *a, const void *b)
@@ -2461,9 +2462,9 @@ static int _crypt_compare_trust (const void *a, const void *b)
   if (ts < tt)
     return 0;
 
-  if ((r = mutt_strcasecmp ((*s)->uid, (*t)->uid)))
+  if ((r = safe_strcasecmp ((*s)->uid, (*t)->uid)))
     return r > 0;
-  return (mutt_strcasecmp (crypt_keyid ((*s)), crypt_keyid ((*t)))) > 0;
+  return (safe_strcasecmp (crypt_keyid ((*s)), crypt_keyid ((*t)))) > 0;
 }
 
 static int crypt_compare_trust (const void *a, const void *b)
@@ -2479,7 +2480,7 @@ static int print_dn_part (FILE * fp, struct dn_array_s *dn, const char *key)
   int any = 0;
 
   for (; dn->key; dn++) {
-    if (!strcmp (dn->key, key)) {
+    if (!mutt_strcmp (dn->key, key)) {
       if (any)
         fputs (" + ", fp);
       print_utf8 (fp, dn->value, mutt_strlen (dn->value));
@@ -2505,7 +2506,7 @@ static void print_dn_parts (FILE * fp, struct dn_array_s *dn)
   /* now print the rest without any specific ordering */
   for (; dn->key; dn++) {
     for (i = 0; stdpart[i]; i++) {
-      if (!strcmp (dn->key, stdpart[i]))
+      if (!mutt_strcmp (dn->key, stdpart[i]))
         break;
     }
     if (!stdpart[i]) {
@@ -2960,7 +2961,7 @@ static void verify_key (crypt_key_t * key)
 
   mutt_mktemp (tempfile);
   if (!(fp = safe_fopen (tempfile, "w"))) {
-    mutt_perror _("Can't create temporary file");
+    mutt_perror (_("Can't create temporary file"));
 
     return;
   }
@@ -2979,7 +2980,7 @@ static void verify_key (crypt_key_t * key)
 
   k = key->kobj;
   gpgme_key_ref (k);
-  while ((s = k->chain_id) && k->subkeys && strcmp (s, k->subkeys->fpr)) {
+  while ((s = k->chain_id) && k->subkeys && mutt_strcmp (s, k->subkeys->fpr)) {
     putc ('\n', fp);
     err = gpgme_op_keylist_start (listctx, s, 0);
     gpgme_key_release (k);
@@ -3081,7 +3082,7 @@ static crypt_key_t *get_candidates (LIST * hints, unsigned int app,
 
   err = gpgme_new (&ctx);
   if (err) {
-    mutt_error ("gpgme_new failed: %s", gpgme_strerror (err));
+    mutt_error (_("gpgme_new failed: %s"), gpgme_strerror (err));
     FREE (&pattern);
     return NULL;
   }
@@ -3116,7 +3117,7 @@ static crypt_key_t *get_candidates (LIST * hints, unsigned int app,
       FREE (&patarr[n]);
     FREE (&patarr);
     if (err) {
-      mutt_error ("gpgme_op_keylist_start failed: %s", gpgme_strerror (err));
+      mutt_error (_("gpgme_op_keylist_start failed: %s"), gpgme_strerror (err));
       gpgme_release (ctx);
       FREE (&pattern);
       return NULL;
@@ -3161,7 +3162,7 @@ static crypt_key_t *get_candidates (LIST * hints, unsigned int app,
       }
     }
     if (gpg_err_code (err) != GPG_ERR_EOF)
-      mutt_error ("gpgme_op_keylist_next failed: %s", gpgme_strerror (err));
+      mutt_error (_("gpgme_op_keylist_next failed: %s"), gpgme_strerror (err));
     gpgme_op_keylist_end (ctx);
   no_pgphints:
     ;
@@ -3172,7 +3173,7 @@ static crypt_key_t *get_candidates (LIST * hints, unsigned int app,
     gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
     err = gpgme_op_keylist_start (ctx, pattern, 0);
     if (err) {
-      mutt_error ("gpgme_op_keylist_start failed: %s", gpgme_strerror (err));
+      mutt_error (_("gpgme_op_keylist_start failed: %s"), gpgme_strerror (err));
       gpgme_release (ctx);
       FREE (&pattern);
       return NULL;
@@ -3197,7 +3198,7 @@ static crypt_key_t *get_candidates (LIST * hints, unsigned int app,
       }
     }
     if (gpg_err_code (err) != GPG_ERR_EOF)
-      mutt_error ("gpgme_op_keylist_next failed: %s", gpgme_strerror (err));
+      mutt_error (_("gpgme_op_keylist_next failed: %s"), gpgme_strerror (err));
     gpgme_op_keylist_end (ctx);
   }
 
@@ -3455,16 +3456,13 @@ static crypt_key_t *crypt_getkeybyaddr (ADDRESS * a, short abilities,
   if (!keys)
     return NULL;
 
-  dprint (5, (debugfile, "crypt_getkeybyaddr: looking for %s <%s>.",
-              a->personal, a->mailbox));
+  debug_print (5, ("looking for %s <%s>.\n", a->personal, a->mailbox));
 
   for (k = keys; k; k = k->next) {
-    dprint (5, (debugfile, "  looking at key: %s `%.15s'\n",
-                crypt_keyid (k), k->uid));
+    debug_print (5, ("  looking at key: %s `%.15s'\n", crypt_keyid (k), k->uid));
 
     if (abilities && !(k->flags & abilities)) {
-      dprint (5, (debugfile, "  insufficient abilities: Has %x, want %x\n",
-                  k->flags, abilities));
+      debug_print (5, ("  insufficient abilities: Has %x, want %x\n", k->flags, abilities));
       continue;
     }
 
@@ -3568,19 +3566,18 @@ static crypt_key_t *crypt_getkeybystr (char *p, short abilities,
       continue;
 
     match = 0;
-    dprint (5, (debugfile, "crypt_getkeybystr: matching \"%s\" against "
-                "key %s, \"%s\": ", p, crypt_keyid (k), k->uid));
+    debug_print (5, ("matching \"%s\" against " "key %s, \"%s\":\n", p, crypt_keyid (k), k->uid));
 
-    if (!*p || !mutt_strcasecmp (p, crypt_keyid (k))
-        || (!mutt_strncasecmp (p, "0x", 2)
-            && !mutt_strcasecmp (p + 2, crypt_keyid (k)))
+    if (!*p || !safe_strcasecmp (p, crypt_keyid (k))
+        || (!safe_strncasecmp (p, "0x", 2)
+            && !safe_strcasecmp (p + 2, crypt_keyid (k)))
         || (option (OPTPGPLONGIDS)
-            && !mutt_strncasecmp (p, "0x", 2)
-            && !mutt_strcasecmp (p + 2, crypt_keyid (k) + 8))
-        || mutt_stristr (k->uid, p)) {
+            && !safe_strncasecmp (p, "0x", 2)
+            && !safe_strcasecmp (p + 2, crypt_keyid (k) + 8))
+        || str_isstr (k->uid, p)) {
       crypt_key_t *tmp;
 
-      dprint (5, (debugfile, "match.\n"));
+      debug_print (5, ("match.\n"));
 
       *matches_endp = tmp = crypt_copy_key (k);
       matches_endp = &tmp->next;
@@ -3623,7 +3620,7 @@ static crypt_key_t *crypt_ask_for_key (char *tag,
   if (whatfor) {
 
     for (l = id_defaults; l; l = l->next)
-      if (!mutt_strcasecmp (whatfor, l->what)) {
+      if (!safe_strcasecmp (whatfor, l->what)) {
         strfcpy (resp, NONULL (l->dflt), sizeof (resp));
         break;
       }
@@ -3637,7 +3634,7 @@ static crypt_key_t *crypt_ask_for_key (char *tag,
 
     if (whatfor) {
       if (l)
-        mutt_str_replace (&l->dflt, resp);
+        str_replace (&l->dflt, resp);
       else {
         l = safe_malloc (sizeof (struct crypt_cache));
         l->next = id_defaults;
@@ -3830,21 +3827,23 @@ static int gpgme_send_menu (HEADER * msg, int *redraw, int is_smime)
   if (is_smime)
     choice =
       mutt_multi_choice (_
-                         ("S/MIME (e)ncrypt, (s)ign, sign (a)s, (b)oth, (t)oggle or (f)orget it?"),
-                         _("esabtf"));
+                         ("S/MIME (e)ncrypt, (s)ign, sign (a)s, (b)oth, (p)gp or (c)lear?"),
+                         _("esabpfc"));
   else
     choice =
       mutt_multi_choice (_
-                         ("PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (t)oggle or (f)orget it?"),
-                         _("esabtf"));
+                         ("PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, s/(m)ime or (c)lear?"),
+                         _("esabmfc"));
 
   switch (choice) {
   case 1:                      /* (e)ncrypt */
     msg->security |= (is_smime ? SMIMEENCRYPT : PGPENCRYPT);
+    msg->security &= ~(is_smime ? SMIMESIGN : PGPSIGN);
     break;
 
   case 2:                      /* (s)ign */
     msg->security |= (is_smime ? SMIMESIGN : PGPSIGN);
+    msg->security &= ~(is_smime ? SMIMEENCRYPT : PGPENCRYPT);
     break;
 
   case 3:                      /* sign (a)s */
@@ -3853,15 +3852,17 @@ static int gpgme_send_menu (HEADER * msg, int *redraw, int is_smime)
                                 is_smime ? APPLICATION_SMIME :
                                 APPLICATION_PGP, NULL))) {
       snprintf (input_signas, sizeof (input_signas), "0x%s", crypt_keyid (p));
-      mutt_str_replace (is_smime ? &SmimeDefaultKey : &PgpSignAs,
+      str_replace (is_smime ? &SmimeDefaultKey : &PgpSignAs,
                         input_signas);
       crypt_free_key (&p);
 
       msg->security |= (is_smime ? SMIMESIGN : PGPSIGN);
     }
+#if 0
     else {
       msg->security &= (is_smime ? ~SMIMESIGN : ~PGPSIGN);
     }
+#endif
     *redraw = REDRAW_FULL;
     break;
 
@@ -3870,16 +3871,16 @@ static int gpgme_send_menu (HEADER * msg, int *redraw, int is_smime)
       (is_smime ? (SMIMEENCRYPT | SMIMESIGN) : (PGPENCRYPT | PGPSIGN));
     break;
 
-  case 5:                      /* (t)oggle */
+  case 5:                      /* (p)gp or s/(m)ime */
     is_smime = !is_smime;
     break;
 
-  case 6:                      /* (f)orget it */
+  case 6:                      /* (c)lear */
     msg->security = 0;
     break;
   }
 
-  if (choice == 6);
+  if (choice == 6 || choice == 7);
   else if (is_smime) {
     msg->security &= ~APPLICATION_PGP;
     msg->security |= APPLICATION_SMIME;