push username, homedir and tmpdir in lua too.
[apps/madmutt.git] / lib-crypt / crypt-gpgme.c
index 5be0147..c0d4b7f 100644 (file)
  * please see the file GPL in the top level source directory.
  */
 
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include <lib-lib/lib-lib.h>
 
 #ifdef CRYPT_BACKEND_GPGME
 
-#include <lib-lib/mem.h>
-#include <lib-lib/str.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/macros.h>
-#include <lib-lib/file.h>
-#include <lib-lib/debug.h>
+#ifdef HAVE_LOCALE_H
+#  include <locale.h>
+#endif
+#ifdef HAVE_LANGINFO_D_T_FMT
+#  include <langinfo.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+#  include <sys/resource.h>
+#endif
+
+#include <gpgme.h>
 
 #include <lib-mime/mime.h>
 
 #include <lib-ui/enter.h>
 #include <lib-ui/menu.h>
 
-#include "mutt.h"
+#include "lib.h"
+#include "alias.h"
 #include <lib-crypt/crypt.h>
 #include "handler.h"
 #include "copy.h"
 #include "pager.h"
 #include "recvattach.h"
 #include "sort.h"
-
-
-#include <sys/wait.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <ctype.h>
-
-#include <gpgme.h>
-
-#ifdef HAVE_LOCALE_H
-#include <locale.h>
-#endif
-#ifdef HAVE_LANGINFO_D_T_FMT
-#include <langinfo.h>
-#endif
-
-#ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-
-#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
+#include "crypt-gpgme.h"
 
 /*
  * Helper macros.
@@ -109,7 +88,7 @@ typedef struct crypt_keyinfo {
 } crypt_key_t;
 
 typedef struct crypt_entry {
-  size_t num;
+  ssize_t num;
   crypt_key_t *key;
 } crypt_entry_t;
 
@@ -132,7 +111,7 @@ static int digit_or_letter (const unsigned char *s)
 
 /* Print the utf-8 encoded string BUF of length LEN bytes to stream
    FP. Convert the character set. */
-static void print_utf8 (FILE * fp, const char *buf, size_t len)
+static void print_utf8 (FILE * fp, const char *buf, ssize_t len)
 {
   char *tstr;
 
@@ -253,8 +232,8 @@ static int crypt_id_is_strong (crypt_key_t * key)
 {
   gpgme_validity_t val = GPGME_VALIDITY_UNKNOWN;
   gpgme_user_id_t uid = NULL;
-  unsigned int is_strong = 0;
-  unsigned int i = 0;
+  int is_strong = 0;
+  int i = 0;
 
   if ((key->flags & KEYFLAG_ISX509))
     return 1;
@@ -369,10 +348,9 @@ static gpgme_data_t body_to_data_object (BODY * a, int convert)
   int err = 0;
   gpgme_data_t data;
 
-  mutt_mktemp (tempfile);
-  fptmp = safe_fopen (tempfile, "w+");
+  fptmp = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
   if (!fptmp) {
-    mutt_perror (tempfile);
+    mutt_perror (_("Can't create temporary file"));
     return NULL;
   }
 
@@ -401,13 +379,11 @@ static gpgme_data_t body_to_data_object (BODY * a, int convert)
       buf[0] = c;
       gpgme_data_write (data, buf, 1);
     }
-    fclose (fptmp);
     gpgme_data_seek (data, 0, SEEK_SET);
-  }
-  else {
-    fclose (fptmp);
+  } else {
     err = gpgme_data_new_from_file (&data, tempfile, 1);
   }
+  m_fclose(&fptmp);
   unlink (tempfile);
   if (err) {
     mutt_error (_("error allocating data object: %s\n"), gpgme_strerror (err));
@@ -476,12 +452,11 @@ static char *data_object_to_tempfile (gpgme_data_t data, FILE ** ret_fp)
   int err;
   char tempfile[_POSIX_PATH_MAX];
   FILE *fp;
-  size_t nread = 0;
+  ssize_t nread = 0;
 
-  mutt_mktemp (tempfile);
-  fp = safe_fopen (tempfile, "w+");
+  fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
   if (!fp) {
-    mutt_perror (tempfile);
+    mutt_perror (_("Can't create temporary file"));
     return NULL;
   }
 
@@ -492,8 +467,8 @@ static char *data_object_to_tempfile (gpgme_data_t data, FILE ** ret_fp)
 
     while ((nread = gpgme_data_read (data, buf, sizeof (buf)))) {
       if (fwrite (buf, nread, 1, fp) != 1) {
-        mutt_perror (tempfile);
-        fclose (fp);
+        mutt_perror (_("Can't create temporary file"));
+        m_fclose(&fp);
         unlink (tempfile);
         return NULL;
       }
@@ -502,11 +477,11 @@ static char *data_object_to_tempfile (gpgme_data_t data, FILE ** ret_fp)
   if (ret_fp)
     rewind (fp);
   else
-    fclose (fp);
+    m_fclose(&fp);
   if (nread == -1) {
     mutt_error (_("error reading data object: %s\n"), gpgme_strerror (err));
     unlink (tempfile);
-    fclose (fp);
+    m_fclose(&fp);
     return NULL;
   }
   if (ret_fp)
@@ -538,7 +513,7 @@ static gpgme_key_t *create_recipient_set (const char *keylist,
     do {
       while (*s == ' ')
         s++;
-      for (i = 0; *s && *s != ' ' && i < sizeof (buf) - 1;)
+      for (i = 0; *s && *s != ' ' && i < ssizeof(buf) - 1;)
         buf[i++] = *s++;
       buf[i] = 0;
       if (*buf) {
@@ -676,7 +651,7 @@ static char *encrypt_gpgme_object (gpgme_data_t plaintext, gpgme_key_t * rset,
    which must have been allocated by the caller with size BUFLEN.
    Returns 0 on success or -1 in case of an error.  The return string
    is truncted to BUFLEN - 1. */
-static int get_micalg (gpgme_ctx_t ctx, char *buf, size_t buflen)
+static int get_micalg (gpgme_ctx_t ctx, char *buf, ssize_t buflen)
 {
   gpgme_sign_result_t result = NULL;
   const char *algorithm_name = NULL;
@@ -760,34 +735,34 @@ static BODY *sign_message (BODY * a, int use_smime)
     return NULL;
   }
 
-  t = mutt_new_body ();
+  t = body_new();
   t->type = TYPEMULTIPART;
   t->subtype = m_strdup("signed");
   t->encoding = ENC7BIT;
   t->use_disp = 0;
   t->disposition = DISPINLINE;
 
-  mutt_generate_boundary (&t->parameter);
-  mutt_set_parameter ("protocol",
-                      use_smime ? "application/pkcs7-signature"
-                      : "application/pgp-signature", &t->parameter);
+  parameter_set_boundary(&t->parameter);
+  parameter_setval(&t->parameter, "protocol",
+                   use_smime ? "application/pkcs7-signature"
+                             : "application/pgp-signature");
   /* Get the micalg from gpgme.  Old gpgme versions don't support this
      for S/MIME so we assume sha-1 in this case. */
   if (!get_micalg (ctx, buf, sizeof buf))
-    mutt_set_parameter ("micalg", buf, &t->parameter);
+    parameter_setval(&t->parameter, "micalg", buf);
   else if (use_smime)
-    mutt_set_parameter ("micalg", "sha1", &t->parameter);
+    parameter_setval(&t->parameter, "micalg", "sha1");
   gpgme_release (ctx);
 
   t->parts = a;
   a = t;
 
-  t->parts->next = mutt_new_body ();
+  t->parts->next = body_new();
   t = t->parts->next;
   t->type = TYPEAPPLICATION;
   if (use_smime) {
     t->subtype = m_strdup("pkcs7-signature");
-    mutt_set_parameter ("name", "smime.p7s", &t->parameter);
+    parameter_setval(&t->parameter, "name", "smime.p7s");
     t->encoding = ENCBASE64;
     t->use_disp = 1;
     t->disposition = DISPATTACH;
@@ -847,22 +822,22 @@ BODY *pgp_gpgme_encrypt_message (BODY * a, char *keylist, int sign)
   if (!outfile)
     return NULL;
 
-  t = mutt_new_body ();
+  t = body_new();
   t->type = TYPEMULTIPART;
   t->subtype = m_strdup("encrypted");
   t->encoding = ENC7BIT;
   t->use_disp = 0;
   t->disposition = DISPINLINE;
 
-  mutt_generate_boundary (&t->parameter);
-  mutt_set_parameter ("protocol", "application/pgp-encrypted", &t->parameter);
+  parameter_set_boundary(&t->parameter);
+  parameter_setval(&t->parameter, "protocol", "application/pgp-encrypted");
 
-  t->parts = mutt_new_body ();
+  t->parts = body_new();
   t->parts->type = TYPEAPPLICATION;
   t->parts->subtype = m_strdup("pgp-encrypted");
   t->parts->encoding = ENC7BIT;
 
-  t->parts->next = mutt_new_body ();
+  t->parts->next = body_new();
   t->parts->next->type = TYPEAPPLICATION;
   t->parts->next->subtype = m_strdup("octet-stream");
   t->parts->next->encoding = ENC7BIT;
@@ -905,11 +880,11 @@ BODY *smime_gpgme_build_smime_entity (BODY * a, char *keylist)
   if (!outfile)
     return NULL;
 
-  t = mutt_new_body ();
+  t = body_new();
   t->type = TYPEAPPLICATION;
   t->subtype = m_strdup("pkcs7-mime");
-  mutt_set_parameter ("name", "smime.p7m", &t->parameter);
-  mutt_set_parameter ("smime-type", "enveloped-data", &t->parameter);
+  parameter_setval(&t->parameter, "name", "smime.p7m");
+  parameter_setval(&t->parameter, "smime-type", "enveloped-data");
   t->encoding = ENCBASE64;      /* The output of OpenSSL SHOULD be binary */
   t->use_disp = 1;
   t->disposition = DISPATTACH;
@@ -958,7 +933,7 @@ static int show_sig_summary (unsigned long sum,
   if ((sum & GPGME_SIGSUM_SIG_EXPIRED)) {
     gpgme_verify_result_t result;
     gpgme_signature_t sig;
-    unsigned int i;
+    int i;
 
     result = gpgme_op_verify_result (ctx);
 
@@ -991,7 +966,7 @@ static int show_sig_summary (unsigned long sum,
     const char *t0 = NULL, *t1 = NULL;
     gpgme_verify_result_t result;
     gpgme_signature_t sig;
-    unsigned int i;
+    int i;
 
     state_attach_puts (_("A system error occurred"), s);
 
@@ -1027,6 +1002,7 @@ static void show_fingerprint (gpgme_key_t key, STATE * state)
   int i, is_pgp;
   char *buf, *p;
   const char *prefix = _("Fingerprint: ");
+  ssize_t bufsize;
 
   if (!key)
     return;
@@ -1035,8 +1011,9 @@ static void show_fingerprint (gpgme_key_t key, STATE * state)
     return;
   is_pgp = (key->protocol == GPGME_PROTOCOL_OpenPGP);
 
-  buf = xmalloc(m_strlen(prefix) + m_strlen(s) * 4 + 2);
-  strcpy (buf, prefix);         /* __STRCPY_CHECKED__ */
+  bufsize = m_strlen(prefix) + m_strlen(s) * 4 + 2;
+  buf = p_new(char, bufsize);
+  m_strcpy(buf, bufsize, prefix);
   p = buf + m_strlen(buf);
   if (is_pgp && m_strlen(s) == 40) {     /* PGP v4 style formatted. */
     for (i = 0; *s && s[1] && s[2] && s[3] && s[4]; s += 4, i++) {
@@ -1284,18 +1261,17 @@ static int verify_one (BODY * sigbdy, STATE * s,
   if (!badsig) {
     gpgme_verify_result_t result;
     gpgme_sig_notation_t notation;
-    gpgme_signature_t signature;
+    gpgme_signature_t sig;
 
     result = gpgme_op_verify_result (ctx);
     if (result) {
-      for (signature = result->signatures; signature;
-           signature = signature->next) {
-        if (signature->notations) {
+      for (sig = result->signatures; sig; sig = sig->next) {
+        if (sig->notations) {
           state_attach_puts ("*** Begin Notation (signature by: ", s);
-          state_attach_puts (signature->fpr, s);
+          state_attach_puts (sig->fpr, s);
           state_attach_puts (") ***\n", s);
-          for (notation = signature->notations; notation;
-               notation = notation->next) {
+          for (notation = sig->notations; notation; notation = notation->next)
+          {
             if (notation->name) {
               state_attach_puts (notation->name, s);
               state_attach_puts ("=", s);
@@ -1317,7 +1293,6 @@ static int verify_one (BODY * sigbdy, STATE * s,
   gpgme_release (ctx);
 
   state_attach_puts (_("[-- End signature information --]\n\n"), s);
-  debug_print (1, ("returning %d.\n", badsig));
 
   return badsig ? 1 : anywarn ? 2 : 0;
 }
@@ -1347,7 +1322,7 @@ static BODY *decrypt_part (BODY * a, STATE * s, FILE * fpout, int is_smime,
 {
   struct stat info;
   BODY *tattach;
-  int err;
+  int err = 0;
   gpgme_ctx_t ctx;
   gpgme_data_t ciphertext, plaintext;
   int maybe_signed = 0;
@@ -1492,9 +1467,9 @@ int pgp_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, BODY ** cur)
 
   p_clear(&s, 1);
   s.fpin = fpin;
-  mutt_mktemp (tempfile);
-  if (!(*fpout = safe_fopen (tempfile, "w+"))) {
-    mutt_perror (tempfile);
+  *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  if (!*fpout) {
+    mutt_perror (_("Can't create temporary file"));
     return -1;
   }
   unlink (tempfile);
@@ -1518,7 +1493,7 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b,
   FILE *tmpfp = NULL;
   int is_signed;
   long saved_b_offset;
-  size_t saved_b_length;
+  ssize_t saved_b_length;
   int saved_b_type;
 
   if (!mutt_is_application_smime (b))
@@ -1537,9 +1512,9 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b,
   p_clear(&s, 1);
   s.fpin = fpin;
   fseeko (s.fpin, b->offset, 0);
-  mutt_mktemp (tempfile);
-  if (!(tmpfp = safe_fopen (tempfile, "w+"))) {
-    mutt_perror (tempfile);
+  tmpfp = m_tempfile (tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  if (!tmpfp) {
+    mutt_perror (_("Can't create temporary file"));
     return -1;
   }
   mutt_unlink (tempfile);
@@ -1554,9 +1529,9 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b,
   p_clear(&s, 1);
   s.fpin = tmpfp;
   s.fpout = 0;
-  mutt_mktemp (tempfile);
-  if (!(*fpout = safe_fopen (tempfile, "w+"))) {
-    mutt_perror (tempfile);
+  *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  if (!*fpout) {
+    mutt_perror (_("Can't create temporary file"));
     return -1;
   }
   mutt_unlink (tempfile);
@@ -1567,7 +1542,7 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b,
   b->type = saved_b_type;
   b->length = saved_b_length;
   b->offset = saved_b_offset;
-  fclose (tmpfp);
+  m_fclose(&tmpfp);
   rewind (*fpout);
   if (*cur && !is_signed && !(*cur)->parts
       && mutt_is_application_smime (*cur)) {
@@ -1589,9 +1564,9 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b,
     p_clear(&s, 1);
     s.fpin = *fpout;
     fseeko (s.fpin, bb->offset, 0);
-    mutt_mktemp (tempfile);
-    if (!(tmpfp = safe_fopen (tempfile, "w+"))) {
-      mutt_perror (tempfile);
+    tmpfp = m_tempfile (tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+    if (!tmpfp) {
+      mutt_perror (_("Can't create temporary file"));
       return -1;
     }
     mutt_unlink (tempfile);
@@ -1602,14 +1577,14 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b,
     bb->length = ftello (s.fpout);
     bb->offset = 0;
     rewind (tmpfp);
-    fclose (*fpout);
+    m_fclose(&*fpout);
 
     p_clear(&s, 1);
     s.fpin = tmpfp;
     s.fpout = 0;
-    mutt_mktemp (tempfile);
-    if (!(*fpout = safe_fopen (tempfile, "w+"))) {
-      mutt_perror (tempfile);
+    *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+    if (!*fpout) {
+      mutt_perror (_("Can't create temporary file"));
       return -1;
     }
     mutt_unlink (tempfile);
@@ -1620,9 +1595,9 @@ int smime_gpgme_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b,
     bb->type = saved_b_type;
     bb->length = saved_b_length;
     bb->offset = saved_b_offset;
-    fclose (tmpfp);
+    m_fclose(&tmpfp);
     rewind (*fpout);
-    mutt_free_body (cur);
+    body_list_wipe(cur);
     *cur = tmp_b;
   }
   return *cur ? 0 : -1;
@@ -1639,6 +1614,7 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b,
   char tempfile[_POSIX_PATH_MAX];
   char buf[HUGE_STRING];
   FILE *tfp;
+  int tempfd;
 
   short sgn = 0;
   short enc = 0;
@@ -1649,13 +1625,13 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b,
   if (tagged_only && !b->tagged)
     return 0;
 
-  mutt_mktemp (tempfile);
-  if (mutt_decode_save_attachment (fp, b, tempfile, 0, 0) != 0) {
+  tempfd = m_tempfd(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  if (mutt_decode_save_attachment (fp, b, tempfd, 0) != 0) {
     unlink (tempfile);
     return 0;
   }
 
-  if ((tfp = fopen (tempfile, "r")) == NULL) {
+  if ((tfp = fopen(tempfile, "r")) == NULL) {
     unlink (tempfile);
     return 0;
   }
@@ -1668,7 +1644,7 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b,
         sgn = 1;
     }
   }
-  safe_fclose (&tfp);
+  m_fclose(&tfp);
   unlink (tempfile);
 
   if (!enc && !sgn)
@@ -1676,10 +1652,9 @@ static int pgp_check_traditional_one_body (FILE * fp, BODY * b,
 
   /* fix the content type */
 
-  mutt_set_parameter ("format", "fixed", &b->parameter);
-  mutt_set_parameter ("x-action", enc ? "pgp-encrypted" : "pgp-signed",
-                      &b->parameter);
-
+  parameter_setval(&b->parameter, "format", "fixed");
+  parameter_setval(&b->parameter, "x-action",
+                   enc ? "pgp-encrypted" : "pgp-signed");
   return 1;
 }
 
@@ -1722,7 +1697,7 @@ static void copy_clearsigned (gpgme_data_t data, STATE * s, char *charset)
 {
   char buf[HUGE_STRING];
   short complete, armor_header;
-  FGETCONV *fc;
+  fgetconv_t *fc;
   char *fname;
   FILE *fp;
 
@@ -1762,7 +1737,7 @@ static void copy_clearsigned (gpgme_data_t data, STATE * s, char *charset)
   }
 
   fgetconv_close (&fc);
-  fclose (fp);
+  m_fclose(&fp);
 }
 
 
@@ -1785,8 +1760,6 @@ int pgp_gpgme_application_handler (BODY * m, STATE * s)
 
   char body_charset[STRING];    /* Only used for clearsigned messages. */
 
-  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
      here. */
@@ -1948,7 +1921,7 @@ int pgp_gpgme_application_handler (BODY * m, STATE * s)
         copy_clearsigned (armored_data, s, body_charset);
       }
       else if (pgpout) {
-        FGETCONV *fc;
+        fgetconv_t *fc;
         int c;
 
         rewind (pgpout);
@@ -1972,7 +1945,7 @@ int pgp_gpgme_application_handler (BODY * m, STATE * s)
       }
 
       if (pgpout) {
-        safe_fclose (&pgpout);
+        m_fclose(&pgpout);
       }
     }
     else {
@@ -1990,7 +1963,6 @@ int pgp_gpgme_application_handler (BODY * m, STATE * s)
                          " of PGP message! --]\n\n"), s);
     return (-1);
   }
-  debug_print (2, ("Leaving pgp_application_pgp handler\n"));
   return (err);
 }
 
@@ -2008,7 +1980,6 @@ int pgp_gpgme_encrypted_handler (BODY * a, STATE * s)
   int is_signed;
   int rc = 0;
 
-  debug_print (2, ("Entering pgp_encrypted handler\n"));
   a = a->parts;
   if (!a || a->type != TYPEAPPLICATION || !a->subtype
       || ascii_strcasecmp ("pgp-encrypted", a->subtype)
@@ -2023,8 +1994,8 @@ int pgp_gpgme_encrypted_handler (BODY * a, STATE * s)
   /* Move forward to the application/pgp-encrypted body. */
   a = a->next;
 
-  mutt_mktemp (tempfile);
-  if (!(fpout = safe_fopen (tempfile, "w+"))) {
+  fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  if (!fpout) {
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: could not create temporary file! "
                            "--]\n"), s);
@@ -2065,12 +2036,11 @@ int pgp_gpgme_encrypted_handler (BODY * a, STATE * s)
                          : _("[-- End of PGP/MIME encrypted data --]\n"), s);
     }
 
-    mutt_free_body (&tattach);
+    body_list_wipe(&tattach);
   }
 
-  fclose (fpout);
+  m_fclose(&fpout);
   mutt_unlink (tempfile);
-  debug_print (2, ("Leaving pgp_encrypted handler\n"));
   return (rc);
 }
 
@@ -2083,11 +2053,9 @@ int smime_gpgme_application_handler (BODY * a, STATE * s)
   int is_signed;
   int rc = 0;
 
-  debug_print (2, ("Entering smime_encrypted handler\n"));
-
   a->warnsig = 0;
-  mutt_mktemp (tempfile);
-  if (!(fpout = safe_fopen (tempfile, "w+"))) {
+  fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  if (!fpout) {
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: could not create temporary file! "
                            "--]\n"), s);
@@ -2132,12 +2100,11 @@ int smime_gpgme_application_handler (BODY * a, STATE * s)
                          _("[-- End of S/MIME encrypted data --]\n"), s);
     }
 
-    mutt_free_body (&tattach);
+    body_list_wipe(&tattach);
   }
 
-  fclose (fpout);
+  m_fclose(&fpout);
   mutt_unlink (tempfile);
-  debug_print (2, ("Leaving smime_encrypted handler\n"));
   return (rc);
 }
 
@@ -2157,14 +2124,11 @@ int smime_gpgme_application_handler (BODY * a, STATE * s)
  * %[...] date of key using strftime(3)
  */
 
-static const char *crypt_entry_fmt (char *dest,
-                                    size_t destlen,
-                                    char op,
-                                    const char *src,
-                                    const char *prefix,
-                                    const char *ifstring,
-                                    const char *elsestring,
-                                    unsigned long data, format_flag flags)
+static const char *
+crypt_entry_fmt (char *dest, ssize_t destlen, char op,
+                 const char *src, const char *prefix,
+                 const char *ifstr, const char *elstr,
+                 anytype data, format_flag flags)
 {
   char fmt[16];
   crypt_entry_t *entry;
@@ -2174,7 +2138,7 @@ static const char *crypt_entry_fmt (char *dest,
   const char *s = NULL;
   unsigned long val;
 
-  entry = (crypt_entry_t *) data;
+  entry = data.ptr;
   key = entry->key;
 
 /*    if (isupper ((unsigned char) op)) */
@@ -2187,10 +2151,10 @@ static const char *crypt_entry_fmt (char *dest,
   case '[':
     {
       const char *cp;
-      char buf2[SHORT_STRING], *p;
+      char buf2[STRING], *p;
       int do_locales;
       struct tm *tm;
-      size_t len;
+      ssize_t len;
 
       p = dest;
 
@@ -2305,7 +2269,7 @@ static const char *crypt_entry_fmt (char *dest,
       s = "x";
     else {
       gpgme_user_id_t uid = NULL;
-      unsigned int i = 0;
+      int i = 0;
 
       for (i = 0, uid = key->kobj->uids; uid && (i < key->idx);
            i++, uid = uid->next);
@@ -2345,15 +2309,14 @@ static const char *crypt_entry_fmt (char *dest,
     *dest = '\0';
   }
 
-  if (optional)
-    mutt_FormatString (dest, destlen, ifstring, mutt_attach_fmt, data, 0);
-  else if (flags & M_FORMAT_OPTIONAL)
-    mutt_FormatString (dest, destlen, elsestring, mutt_attach_fmt, data, 0);
-  return (src);
+  if (flags & M_FORMAT_OPTIONAL)
+    m_strformat(dest, destlen, 0, optional ? ifstr: elstr,
+                mutt_attach_fmt, data, 0);
+  return src;
 }
 
 /* Used by the display fucntion to format a line. */
-static void crypt_entry (char *s, size_t l, MUTTMENU * menu, int num)
+static void crypt_entry (char *s, ssize_t l, MUTTMENU * menu, int num)
 {
   crypt_key_t **key_table = (crypt_key_t **) menu->data;
   crypt_entry_t entry;
@@ -2361,8 +2324,8 @@ static void crypt_entry (char *s, size_t l, MUTTMENU * menu, int num)
   entry.key = key_table[num];
   entry.num = num + 1;
 
-  mutt_FormatString (s, l, NONULL (PgpEntryFormat), crypt_entry_fmt,
-                     (unsigned long) &entry, M_FORMAT_ARROWCURSOR);
+  m_strformat(s, l, COLS - SW, PgpEntryFormat, crypt_entry_fmt, &entry,
+              option(OPTARROWCURSOR) ? M_FORMAT_ARROWCURSOR : 0);
 }
 
 /* Compare two addresses and the keyid to be used for sorting. */
@@ -2532,7 +2495,7 @@ static const unsigned char *parse_dn_part (struct dn_array_s *array,
                                            const unsigned char *string)
 {
   const unsigned char *s, *s1;
-  size_t n;
+  ssize_t n;
   unsigned char *p;
 
   /* parse attributeType */
@@ -2554,7 +2517,7 @@ static const unsigned char *parse_dn_part (struct dn_array_s *array,
     if (!n || (n & 1))
       return NULL;              /* empty or odd number of digits */
     n /= 2;
-    p = xmalloc(n + 1);
+    p = p_new(unsigned char, n + 1);
     array->value = (char *) p;
     for (s1 = string; n; s1 += 2, n--)
       *p++ = xtoi_2 (s1);
@@ -2584,7 +2547,7 @@ static const unsigned char *parse_dn_part (struct dn_array_s *array,
         n++;
     }
 
-    p = xmalloc(n + 1);
+    p = p_new(unsigned char, n + 1);
     array->value = (char *) p;
     for (s = string; n; s++, n--) {
       if (*s == '\\') {
@@ -2611,7 +2574,7 @@ static const unsigned char *parse_dn_part (struct dn_array_s *array,
 static struct dn_array_s *parse_dn (const unsigned char *string)
 {
   struct dn_array_s *array;
-  size_t arrayidx, arraysize;
+  ssize_t arrayidx, arraysize;
   int i;
 
   arraysize = 7;                /* C,ST,L,O,OU,CN,email */
@@ -2738,7 +2701,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp)
   const char *s = NULL, *s2 = NULL;
   time_t tt = 0;
   struct tm *tm;
-  char shortbuf[SHORT_STRING];
+  char shortbuf[STRING];
   unsigned long aval = 0;
   const char *delim;
   int is_pgp = 0;
@@ -2962,10 +2925,9 @@ static void verify_key (crypt_key_t * key)
   gpgme_key_t k = NULL;
   int maxdepth = 100;
 
-  mutt_mktemp (tempfile);
-  if (!(fp = safe_fopen (tempfile, "w"))) {
+  fp = m_tempfile (tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  if (!fp) {
     mutt_perror (_("Can't create temporary file"));
-
     return;
   }
   mutt_message _("Collecting data...");
@@ -3007,7 +2969,7 @@ static void verify_key (crypt_key_t * key)
 leave:
   gpgme_key_release (k);
   gpgme_release (listctx);
-  fclose (fp);
+  m_fclose(&fp);
   mutt_clear_error ();
   snprintf (cmd, sizeof (cmd), _("Key ID: 0x%s"), crypt_keyid (key));
   mutt_do_pager (cmd, tempfile, 0, NULL);
@@ -3026,7 +2988,7 @@ static char *list_to_pattern (string_list_t * list)
   string_list_t *l;
   char *pattern, *p;
   const char *s;
-  size_t n;
+  ssize_t n;
 
   n = 0;
   for (l = list; l; l = l->next) {
@@ -3099,7 +3061,7 @@ static crypt_key_t *get_candidates (string_list_t * hints, unsigned int app,
        escaped pappert but simple strings passed in an array to the
        keylist_ext_start function. */
     string_list_t *l;
-    size_t n;
+    ssize_t n;
     char **patarr;
 
     for (l = hints, n = 0; l; l = l->next) {
@@ -3241,7 +3203,7 @@ static crypt_key_t *crypt_select_key (crypt_key_t * keys,
   crypt_key_t **key_table;
   MUTTMENU *menu;
   int i, done = 0;
-  char helpstr[SHORT_STRING], buf[LONG_STRING];
+  char helpstr[STRING], buf[LONG_STRING];
   crypt_key_t *k;
   int (*f) (const void *, const void *);
   int menu_to_use = 0;
@@ -3297,15 +3259,15 @@ static crypt_key_t *crypt_select_key (crypt_key_t * keys,
 
   helpstr[0] = 0;
   mutt_make_help (buf, sizeof (buf), _("Exit  "), menu_to_use, OP_EXIT);
-  strcat (helpstr, buf);        /* __STRCAT_CHECKED__ */
+  m_strcat(helpstr, sizeof(helpstr), buf);
   mutt_make_help (buf, sizeof (buf), _("Select  "), menu_to_use,
                   OP_GENERIC_SELECT_ENTRY);
-  strcat (helpstr, buf);        /* __STRCAT_CHECKED__ */
+  m_strcat(helpstr, sizeof(helpstr), buf);
   mutt_make_help (buf, sizeof (buf), _("Check key  "),
                   menu_to_use, OP_VERIFY_KEY);
-  strcat (helpstr, buf);        /* __STRCAT_CHECKED__ */
+  m_strcat(helpstr, sizeof(helpstr), buf);
   mutt_make_help (buf, sizeof (buf), _("Help"), menu_to_use, OP_HELP);
-  strcat (helpstr, buf);        /* __STRCAT_CHECKED__ */
+  m_strcat(helpstr, sizeof(helpstr), buf);
 
   menu = mutt_new_menu ();
   menu->max = i;
@@ -3369,7 +3331,7 @@ static crypt_key_t *crypt_select_key (crypt_key_t * keys,
         else {
           gpgme_validity_t val = GPGME_VALIDITY_UNKNOWN;
           gpgme_user_id_t uid = NULL;
-          unsigned int j = 0;
+          int j = 0;
 
           warn_s = "??";
 
@@ -3459,13 +3421,8 @@ static crypt_key_t *crypt_getkeybyaddr (address_t * a, short abilities,
   if (!keys)
     return NULL;
 
-  debug_print (5, ("looking for %s <%s>.\n", a->personal, a->mailbox));
-
   for (k = keys; k; k = k->next) {
-    debug_print (5, ("  looking at key: %s `%.15s'\n", crypt_keyid (k), k->uid));
-
     if (abilities && !(k->flags & abilities)) {
-      debug_print (5, ("  insufficient abilities: Has %x, want %x\n", k->flags, abilities));
       continue;
     }
 
@@ -3543,7 +3500,7 @@ static crypt_key_t *crypt_getkeybyaddr (address_t * a, short abilities,
 }
 
 
-static crypt_key_t *crypt_getkeybystr (char *p, short abilities,
+static crypt_key_t *crypt_getkeybystr (const char *p, short abilities,
                                        unsigned int app, int *forced_valid)
 {
   string_list_t *hints = NULL;
@@ -3569,7 +3526,6 @@ static crypt_key_t *crypt_getkeybystr (char *p, short abilities,
       continue;
 
     match = 0;
-    debug_print (5, ("matching \"%s\" against " "key %s, \"%s\":\n", p, crypt_keyid (k), k->uid));
 
     if (!*p || !m_strcasecmp(p, crypt_keyid (k))
         || (!m_strncasecmp(p, "0x", 2)
@@ -3580,8 +3536,6 @@ static crypt_key_t *crypt_getkeybystr (char *p, short abilities,
         || m_stristr(k->uid, p)) {
       crypt_key_t *tmp;
 
-      debug_print (5, ("match.\n"));
-
       *matches_endp = tmp = crypt_copy_key (k);
       matches_endp = &tmp->next;
     }
@@ -3609,7 +3563,7 @@ static crypt_key_t *crypt_ask_for_key (char *tag,
                                        unsigned int app, int *forced_valid)
 {
   crypt_key_t *key;
-  char resp[SHORT_STRING];
+  char resp[STRING];
   struct crypt_cache *l = NULL;
   int dummy;
 
@@ -3660,9 +3614,10 @@ static crypt_key_t *crypt_ask_for_key (char *tag,
 static char *find_keys (address_t * to, address_t * cc, address_t * bcc,
                         unsigned int app)
 {
-  char *keyID, *keylist = NULL, *t;
-  size_t keylist_size = 0;
-  size_t keylist_used = 0;
+  char *keylist = NULL, *t;
+  const char *keyID;
+  ssize_t keylist_size = 0;
+  ssize_t keylist_used = 0;
   address_t *tmp = NULL, *addr = NULL;
   address_t **last = &tmp;
   address_t *p, *q;
@@ -3694,10 +3649,8 @@ static char *find_keys (address_t * to, address_t * cc, address_t * bcc,
       last = &((*last)->next);
   }
 
-  if (fqdn)
-    rfc822_qualify (tmp, fqdn);
-
-  tmp = mutt_remove_duplicates (tmp);
+  rfc822_qualify(tmp, fqdn);
+  address_list_uniq(tmp);
 
   for (p = tmp; p; p = p->next) {
     char buf[LONG_STRING];
@@ -3715,18 +3668,12 @@ static char *find_keys (address_t * to, address_t * cc, address_t * bcc,
         /* check for e-mail address */
         if ((t = strchr (keyID, '@')) &&
             (addr = rfc822_parse_adrlist (NULL, keyID))) {
-          if (fqdn)
-            rfc822_qualify (addr, fqdn);
+          rfc822_qualify(addr, fqdn);
           q = addr;
         }
         else {
-#if 0
-          k_info = crypt_getkeybystr (keyID, KEYFLAG_CANENCRYPT,
-                                      *r_application, &forced_valid);
-#else
           k_info = crypt_getkeybystr (keyID, KEYFLAG_CANENCRYPT,
                                       app, &forced_valid);
-#endif
         }
       }
       else if (r == -1) {
@@ -3743,11 +3690,7 @@ static char *find_keys (address_t * to, address_t * cc, address_t * bcc,
       snprintf (buf, sizeof (buf), _("Enter keyID for %s: "), q->mailbox);
 
       if ((key = crypt_ask_for_key (buf, q->mailbox, KEYFLAG_CANENCRYPT,
-#if 0
-                                    *r_application,
-#else
                                     app,
-#endif
                                     &forced_valid)) == NULL) {
         p_delete(&keylist);
         address_list_wipe(&tmp);
@@ -3761,16 +3704,9 @@ static char *find_keys (address_t * to, address_t * cc, address_t * bcc,
     {
       const char *s = crypt_fpr (key);
 
-#if 0
-      if (key->flags & KEYFLAG_ISX509)
-        *r_application &= ~APPLICATION_PGP;
-      if (!(key->flags & KEYFLAG_ISX509))
-        *r_application &= ~APPLICATION_SMIME;
-#endif
-
       keylist_size += m_strlen(s) + 4 + 1;
       p_realloc(&keylist, keylist_size);
-      sprintf (keylist + keylist_used, "%s0x%s%s",      /* __SPRINTF_CHECKED__ */
+      sprintf (keylist + keylist_used, "%s0x%s%s",
                keylist_used ? " " : "", s, forced_valid ? "!" : "");
     }
     keylist_used = m_strlen(keylist);
@@ -3819,7 +3755,7 @@ void smime_gpgme_init (void)
 static int gpgme_send_menu (HEADER * msg, int *redraw, int is_smime)
 {
   crypt_key_t *p;
-  char input_signas[SHORT_STRING];
+  char input_signas[STRING];
   int choice;
 
   if (msg->security & APPLICATION_PGP)
@@ -3861,11 +3797,6 @@ static int gpgme_send_menu (HEADER * msg, int *redraw, int is_smime)
 
       msg->security |= (is_smime ? SMIMESIGN : PGPSIGN);
     }
-#if 0
-    else {
-      msg->security &= (is_smime ? ~SMIMESIGN : ~PGPSIGN);
-    }
-#endif
     *redraw = REDRAW_FULL;
     break;
 
@@ -3906,7 +3837,7 @@ int smime_gpgme_send_menu (HEADER * msg, int *redraw)
   return gpgme_send_menu (msg, redraw, 1);
 }
 
-static int verify_sender (HEADER * h, gpgme_protocol_t protocol)
+static int verify_sender (HEADER * h, gpgme_protocol_t protocol __attribute__((unused)))
 {
   address_t *sender = NULL;
   unsigned int ret = 1;
@@ -3933,7 +3864,7 @@ static int verify_sender (HEADER * h, gpgme_protocol_t protocol)
         if (1 && (uid->email[0] == '<')
             && (uid->email[uid_length - 1] == '>')
             && (uid_length == sender_length + 2)
-            && (!strncmp (uid->email + 1, sender->mailbox, sender_length)))
+            && (!m_strncmp (uid->email + 1, sender->mailbox, sender_length)))
           ret = 0;
       }
     }