ooops, make it compile again.
[apps/madmutt.git] / smime.c
diff --git a/smime.c b/smime.c
index ae7a995..3db7185 100644 (file)
--- a/smime.c
+++ b/smime.c
 # include "config.h"
 #endif
 
+#include <lib-lib/mem.h>
+#include <lib-lib/str.h>
+#include <lib-lib/macros.h>
+#include <lib-lib/file.h>
+
+#include <lib-mime/mime.h>
+
 #include "mutt.h"
 #include "enter.h"
 #include "handler.h"
 #include "mutt_curses.h"
 #include "mutt_menu.h"
-#include "smime.h"
-#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>
@@ -81,10 +83,19 @@ static char SmimeIntermediateToUse[_POSIX_PATH_MAX];
 
 
 /*
- *     Queries and passphrase handling.
+ * Create a format string to be used with scanf.
+ * To use it, write, for instance, MUTT_FORMAT(HUGE_STRING).
+ * 
+ * See K&R 2nd ed, p. 231 for an explanation.
  */
+#define _MUTT_FORMAT_2(a,b)    "%" a  b
+#define _MUTT_FORMAT_1(a, b)   _MUTT_FORMAT_2(#a, b)
+#define MUTT_FORMAT(a)         _MUTT_FORMAT_1(a, "s")
 
 
+/*
+ *     Queries and passphrase handling.
+ */
 
 
 /* these are copies from pgp.c */
@@ -92,7 +103,7 @@ static char SmimeIntermediateToUse[_POSIX_PATH_MAX];
 
 void smime_void_passphrase (void)
 {
-  memset (SmimePass, 0, sizeof (SmimePass));
+  p_clear(SmimePass, sizeof(SmimePass));
   SmimeExptime = 0;
 }
 
@@ -146,7 +157,7 @@ static const char *_mutt_fmt_smime_command (char *dest,
         char buf1[LONG_STRING], buf2[LONG_STRING];
         struct stat sb;
 
-        strfcpy (path, NONULL (SmimeCALocation), sizeof (path));
+        m_strcpy(path, sizeof(path), NONULL(SmimeCALocation));
         mutt_expand_path (path, sizeof (path));
         mutt_quote_filename (buf1, sizeof (buf1), path);
 
@@ -265,7 +276,7 @@ static pid_t smime_invoke (FILE ** smimein, FILE ** smimeout,
   struct smime_command_context cctx;
   char cmd[HUGE_STRING];
 
-  memset (&cctx, 0, sizeof (cctx));
+  p_clear(&cctx, 1);
 
   if (!format || !*format)
     return (pid_t) - 1;
@@ -303,7 +314,7 @@ static void smime_entry (char *s, size_t l, MUTTMENU * menu, int num)
 {
   smime_id *Table = (smime_id *) menu->data;
   smime_id this = Table[num];
-  char *truststate;
+  const char *truststate;
 
   switch (this.trust) {
   case 't':
@@ -374,7 +385,7 @@ char *smime_ask_for_key (char *prompt, char *mailbox, short public)
   }
   fclose (index);
 
-  FOREVER {
+  for (;;) {
     *qry = 0;
     if (mutt_get_field (prompt, qry, sizeof (qry), 0))
       return NULL;
@@ -389,7 +400,7 @@ char *smime_ask_for_key (char *prompt, char *mailbox, short public)
     }
     /* Read Entries */
     cur = 0;
-    Table = mem_calloc (cert_num, sizeof (smime_id));
+    Table = p_new(smime_id, cert_num);
     while (!feof (index)) {
       numFields =
         fscanf (index, MUTT_FORMAT (STRING) " %x.%i " MUTT_FORMAT (STRING),
@@ -408,8 +419,8 @@ char *smime_ask_for_key (char *prompt, char *mailbox, short public)
 
       Table[cur].hash = hash;
       Table[cur].suffix = hash_suffix;
-      strncpy (Table[cur].email, fields[0], sizeof (Table[cur].email));
-      strncpy (Table[cur].nick, fields[2], sizeof (Table[cur].nick));
+      m_strcpy(Table[cur].email, sizeof(Table[cur].email), fields[0]);
+      m_strcpy(Table[cur].nick,  sizeof(Table[cur].nick),  fields[2]);
       Table[cur].trust = *fields[4];
       Table[cur].public = public;
 
@@ -455,14 +466,14 @@ char *smime_ask_for_key (char *prompt, char *mailbox, short public)
       }
     }
     if (hash) {
-      fname = mem_malloc (13); /* Hash + '.' + Suffix + \0 */
+      fname = p_new(char, 13); /* Hash + '.' + Suffix + \0 */
       sprintf (fname, "%.8x.%i", Table[cur].hash, Table[cur].suffix);
     }
     else
       fname = NULL;
 
     mutt_menuDestroy (&menu);
-    mem_free (&Table);
+    p_delete(&Table);
     set_option (OPTNEEDREDRAW);
 
     if (fname)
@@ -488,8 +499,8 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public,
   if (!mailbox && !query)
     return (NULL);
 
-  addr_len = mailbox ? str_len (mailbox) : 0;
-  query_len = query ? str_len (query) : 0;
+  addr_len = mailbox ? m_strlen(mailbox) : 0;
+  query_len = query ? m_strlen(query) : 0;
 
   *key = '\0';
 
@@ -511,7 +522,7 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public,
     }
 
     while (fgets (buf, sizeof (buf) - 1, fp) != NULL)
-      if (mailbox && !(str_ncasecmp (mailbox, buf, addr_len))) {
+      if (mailbox && !(m_strncasecmp(mailbox, buf, addr_len))) {
         numFields = sscanf (buf,
                             MUTT_FORMAT (STRING) " " MUTT_FORMAT (STRING) " "
                             MUTT_FORMAT (STRING) " " MUTT_FORMAT (STRING) " "
@@ -551,7 +562,7 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public,
             continue;
           }
           else if (choice == M_YES) {
-            strfcpy (key, fields[1], sizeof (key));
+            m_strcpy(key, sizeof(key), fields[1]);
             ask = 0;
             break;
           }
@@ -559,7 +570,7 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public,
         else {
           if (public)
             key_trust_level = *fields[4];
-          strfcpy (key, fields[1], sizeof (key));
+          m_strcpy(key, sizeof(key), fields[1]);
         }
         found = 1;
       }
@@ -573,15 +584,15 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public,
 
         /* query = label: return certificate. */
         if (numFields >= 3 &&
-            !(str_ncasecmp (query, fields[2], query_len))) {
+            !(m_strncasecmp(query, fields[2], query_len))) {
           ask = 0;
-          strfcpy (key, fields[1], sizeof (key));
+          m_strcpy(key, sizeof(key), fields[1]);
         }
         /* query = certificate: return intermediate certificate. */
         else if (numFields >= 4 &&
-                 !(str_ncasecmp (query, fields[1], query_len))) {
+                 !(m_strncasecmp(query, fields[1], query_len))) {
           ask = 0;
-          strfcpy (key, fields[3], sizeof (key));
+          m_strcpy(key, sizeof(key), fields[3]);
         }
       }
 
@@ -621,8 +632,8 @@ char *smime_get_field_from_db (char *mailbox, char *query, short public,
 
   }
 
-  /* Note: str_dup ("") returns NULL. */
-  return str_dup (key);
+  /* Note: m_strdup("") returns NULL. */
+  return m_strdup(key);
 }
 
 
@@ -648,8 +659,8 @@ void _smime_getkeys (char *mailbox)
   if (k) {
     /* the key used last time. */
     if (*SmimeKeyToUse &&
-        !str_casecmp (k, SmimeKeyToUse + str_len (SmimeKeys) + 1)) {
-      mem_free (&k);
+        !m_strcasecmp(k, SmimeKeyToUse + m_strlen(SmimeKeys) + 1)) {
+      p_delete(&k);
       return;
     }
     else
@@ -661,16 +672,16 @@ void _smime_getkeys (char *mailbox)
     snprintf (SmimeCertToUse, sizeof (SmimeCertToUse), "%s/%s",
               NONULL (SmimeCertificates), k);
 
-    if (str_casecmp (k, SmimeDefaultKey))
+    if (m_strcasecmp(k, SmimeDefaultKey))
       smime_void_passphrase ();
 
-    mem_free (&k);
+    p_delete(&k);
     return;
   }
 
   if (*SmimeKeyToUse) {
-    if (!str_casecmp (SmimeDefaultKey,
-                          SmimeKeyToUse + str_len (SmimeKeys) + 1))
+    if (!m_strcasecmp(SmimeDefaultKey,
+                          SmimeKeyToUse + m_strlen(SmimeKeys) + 1))
       return;
 
     smime_void_passphrase ();
@@ -685,7 +696,7 @@ void _smime_getkeys (char *mailbox)
 
 void smime_getkeys (ENVELOPE * env)
 {
-  ADDRESS *t;
+  address_t *t;
   int found = 0;
 
   if (option (OPTSDEFAULTDECRYPTKEY) && SmimeDefaultKey && *SmimeDefaultKey) {
@@ -710,7 +721,7 @@ void smime_getkeys (ENVELOPE * env)
     }
   if (!found && (t = mutt_default_from ())) {
     _smime_getkeys (t->mailbox);
-    rfc822_free_address (&t);
+    address_delete (&t);
   }
 }
 
@@ -718,14 +729,14 @@ void smime_getkeys (ENVELOPE * env)
  * It returns NULL if any of the keys can not be found.
  */
 
-char *smime_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc)
+char *smime_findKeys (address_t * to, address_t * cc, address_t * bcc)
 {
   char *keyID, *keylist = NULL;
   size_t keylist_size = 0;
   size_t keylist_used = 0;
-  ADDRESS *tmp = NULL, *addr = NULL;
-  ADDRESS **last = &tmp;
-  ADDRESS *p, *q;
+  address_t *tmp = NULL, *addr = NULL;
+  address_t **last = &tmp;
+  address_t *p, *q;
   int i;
 
   const char *fqdn = mutt_fqdn (1);
@@ -745,7 +756,7 @@ char *smime_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc)
       abort ();
     }
 
-    *last = rfc822_cpy_adr (p);
+    *last = address_list_dup (p);
     while (*last)
       last = &((*last)->next);
   }
@@ -766,21 +777,21 @@ char *smime_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc)
     }
     if (!keyID) {
       mutt_message (_("No (valid) certificate found for %s."), q->mailbox);
-      mem_free (&keylist);
-      rfc822_free_address (&tmp);
-      rfc822_free_address (&addr);
+      p_delete(&keylist);
+      address_delete (&tmp);
+      address_delete (&addr);
       return NULL;
     }
 
-    keylist_size += str_len (keyID) + 2;
-    mem_realloc (&keylist, keylist_size);
+    keylist_size += m_strlen(keyID) + 2;
+    p_realloc(&keylist, keylist_size);
     sprintf (keylist + keylist_used, "%s\n", keyID);    /* __SPRINTF_CHECKED__ */
-    keylist_used = str_len (keylist);
+    keylist_used = m_strlen(keylist);
 
-    rfc822_free_address (&addr);
+    address_delete (&addr);
 
   }
-  rfc822_free_address (&tmp);
+  address_delete (&tmp);
   return (keylist);
 }
 
@@ -832,8 +843,8 @@ static int smime_handle_cert_email (char *certificate, char *mailbox,
 
 
   while ((fgets (email, sizeof (email), fpout))) {
-    *(email + str_len (email) - 1) = '\0';
-    if (str_ncasecmp (email, mailbox, str_len (mailbox)) == 0)
+    *(email + m_strlen(email) - 1) = '\0';
+    if (m_strncasecmp(email, mailbox, m_strlen(mailbox)) == 0)
       ret = 1;
 
     ret = ret < 0 ? 0 : ret;
@@ -854,14 +865,13 @@ static int smime_handle_cert_email (char *certificate, char *mailbox,
 
   if (copy && buffer && num) {
     (*num) = count;
-    *buffer = mem_calloc (sizeof (char *), count);
+    *buffer = p_new(char *, count);
     count = 0;
 
     rewind (fpout);
     while ((fgets (email, sizeof (email), fpout))) {
-      *(email + str_len (email) - 1) = '\0';
-      (*buffer)[count] = mem_calloc (1, str_len (email) + 1);
-      strncpy ((*buffer)[count], email, str_len (email));
+      *(email + m_strlen(email) - 1) = '\0';
+      (*buffer)[count] = p_dupstr(email, m_strlen(email));
       count++;
     }
   }
@@ -977,7 +987,7 @@ static char *smime_extract_certificate (char *infile)
   fclose (fpout);
   fclose (fperr);
 
-  return str_dup (certfile);
+  return m_strdup(certfile);
 }
 
 static char *smime_extract_signer_certificate (char *infile)
@@ -1039,7 +1049,7 @@ static char *smime_extract_signer_certificate (char *infile)
   fclose (fpout);
   fclose (fperr);
 
-  return str_dup (certfile);
+  return m_strdup(certfile);
 }
 
 
@@ -1091,7 +1101,7 @@ void smime_invoke_import (char *infile, char *mailbox)
     mutt_wait_filter (thepid);
 
     mutt_unlink (certfile);
-    mem_free (&certfile);
+    p_delete(&certfile);
   }
 
   fflush (fpout);
@@ -1150,7 +1160,7 @@ int smime_verify_sender (HEADER * h)
       else
         retval = 0;
       mutt_unlink (certfile);
-      mem_free (&certfile);
+      p_delete(&certfile);
     }
     else
       mutt_any_key_to_continue (_("no certfile"));
@@ -1241,7 +1251,7 @@ BODY *smime_build_smime_entity (BODY * a, char *certlist)
 
   *certfile = '\0';
   while (1) {
-    int off = str_len (certfile);
+    int off = m_strlen(certfile);
 
     while (*++cert_end && *cert_end != '\n');
     if (!*cert_end)
@@ -1304,14 +1314,14 @@ BODY *smime_build_smime_entity (BODY * a, char *certlist)
 
   t = mutt_new_body ();
   t->type = TYPEAPPLICATION;
-  t->subtype = str_dup ("x-pkcs7-mime");
+  t->subtype = m_strdup("x-pkcs7-mime");
   mutt_set_parameter ("name", "smime.p7m", &t->parameter);
   mutt_set_parameter ("smime-type", "enveloped-data", &t->parameter);
   t->encoding = ENCBASE64;      /* The output of OpenSSL SHOULD be binary */
   t->use_disp = 1;
   t->disposition = DISPATTACH;
-  t->d_filename = str_dup ("smime.p7m");
-  t->filename = str_dup (tempfile);
+  t->d_filename = m_strdup("smime.p7m");
+  t->filename = m_strdup(tempfile);
   t->unlink = 1;                /*delete after sending the message */
   t->parts = 0;
   t->next = 0;
@@ -1420,7 +1430,7 @@ BODY *smime_sign_message (BODY * a)
 
   t = mutt_new_body ();
   t->type = TYPEMULTIPART;
-  t->subtype = str_dup ("signed");
+  t->subtype = m_strdup("signed");
   t->encoding = ENC7BIT;
   t->use_disp = 0;
   t->disposition = DISPINLINE;
@@ -1437,9 +1447,9 @@ BODY *smime_sign_message (BODY * a)
   t->parts->next = mutt_new_body ();
   t = t->parts->next;
   t->type = TYPEAPPLICATION;
-  t->subtype = str_dup ("x-pkcs7-signature");
-  t->filename = str_dup (signedfile);
-  t->d_filename = str_dup ("smime.p7s");
+  t->subtype = m_strdup("x-pkcs7-signature");
+  t->filename = m_strdup(signedfile);
+  t->d_filename = m_strdup("smime.p7s");
   t->use_disp = 1;
   t->disposition = DISPATTACH;
   t->encoding = ENCBASE64;
@@ -1523,7 +1533,7 @@ int smime_verify_one (BODY * sigbdy, STATE * s, const char *tempfile)
 
   mutt_decode_attachment (sigbdy, s);
 
-  sigbdy->length = ftell (s->fpout);
+  sigbdy->length = ftello (s->fpout);
   sigbdy->offset = 0;
   fclose (s->fpout);
 
@@ -1564,10 +1574,10 @@ int smime_verify_one (BODY * sigbdy, STATE * s, const char *tempfile)
       rewind (smimeerr);
 
       line = mutt_read_line (line, &linelen, smimeerr, &lineno);
-      if (linelen && !str_casecmp (line, "verification successful"))
+      if (linelen && !m_strcasecmp(line, "verification successful"))
         badsig = 0;
 
-      mem_free (&line);
+      p_delete(&line);
     }
   }
 
@@ -1646,7 +1656,7 @@ static BODY *smime_handle_entity (BODY * m, STATE * s, FILE * outFile)
     return NULL;
   }
 
-  fseek (s->fpin, m->offset, 0);
+  fseeko (s->fpin, m->offset, 0);
   last_pos = m->offset;
 
   mutt_copy_bytes (s->fpin, tmpfp, m->length);
@@ -1727,7 +1737,7 @@ static BODY *smime_handle_entity (BODY * m, STATE * s, FILE * outFile)
       }
     }
     while (fgets (buf, sizeof (buf) - 1, smimeout) != NULL) {
-      len = str_len (buf);
+      len = m_strlen(buf);
       if (len > 1 && buf[len - 2] == '\r') {
         buf[len - 2] = '\n';
         buf[len - 1] = '\0';
@@ -1778,9 +1788,9 @@ static BODY *smime_handle_entity (BODY * m, STATE * s, FILE * outFile)
     rewind (smimeerr);
 
     line = mutt_read_line (line, &linelen, smimeerr, &lineno);
-    if (linelen && !str_casecmp (line, "verification successful"))
+    if (linelen && !m_strcasecmp(line, "verification successful"))
       m->goodsig = 1;
-    mem_free (&line);
+    p_delete(&line);
   }
   else {
     m->goodsig = p->goodsig;
@@ -1813,9 +1823,9 @@ int smime_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, BODY ** cur)
   if (b->parts)
     return -1;
 
-  memset (&s, 0, sizeof (s));
+  p_clear(&s, 1);
   s.fpin = fpin;
-  fseek (s.fpin, b->offset, 0);
+  fseeko (s.fpin, b->offset, 0);
 
   mutt_mktemp (tempfile);
   if ((tmpfp = safe_fopen (tempfile, "w+")) == NULL) {
@@ -1827,7 +1837,7 @@ int smime_decrypt_mime (FILE * fpin, FILE ** fpout, BODY * b, BODY ** cur)
   s.fpout = tmpfp;
   mutt_decode_attachment (b, &s);
   fflush (tmpfp);
-  b->length = ftell (s.fpout);
+  b->length = ftello (s.fpout);
   b->offset = 0;
   rewind (tmpfp);
   s.fpin = tmpfp;
@@ -1883,37 +1893,65 @@ int smime_send_menu (HEADER * msg, int *redraw)
     break;
 
   case 3:                      /* encrypt (w)ith */
-    msg->security |= ENCRYPT;
-    switch (mutt_multi_choice (_("1: DES, 2: Triple-DES, 3: RC2-40,"
-                                 " 4: RC2-64, 5: RC2-128, 6: AES128,"
-                                 " 7: AES192, 8: AES256, or (f)orget it? "),
-                               _("12345678f"))) {
-    case 1:
-      str_replace (&SmimeCryptAlg, "des");
-      break;
-    case 2:
-      str_replace (&SmimeCryptAlg, "des3");
-      break;
-    case 3:
-      str_replace (&SmimeCryptAlg, "rc2-40");
-      break;
-    case 4:
-      str_replace (&SmimeCryptAlg, "rc2-64");
-      break;
-    case 5:
-      str_replace (&SmimeCryptAlg, "rc2-128");
-      break;
-    case 6:
-      str_replace (&SmimeCryptAlg, "aes128");
-      break;
-    case 7:
-      str_replace (&SmimeCryptAlg, "aes192");
-      break;
-    case 8:
-      str_replace (&SmimeCryptAlg, "aes256");
-      break;
-    case 9: /* forget it */
-      break;
+    {
+      int choice = 0;
+      msg->security |= ENCRYPT;
+
+      do {
+        /* I use "dra" because "123" is recognized anyway */
+        switch (mutt_multi_choice (_("Choose algorithm family:"
+                                     " 1: DES, 2: RC2, 3: AES,"
+                                     " or (c)lear? "), _("drac"))) {
+          case 1:
+            switch (choice = mutt_multi_choice (_("1: DES, 2: Triple-DES "),
+                                                _("dt"))) {
+              case 1:
+                m_strreplace(&SmimeCryptAlg, "des");
+                break;
+              case 2:
+                m_strreplace(&SmimeCryptAlg, "des3");
+                break;
+            }
+            break;
+
+          case 2:
+            switch (choice = mutt_multi_choice (_("1: RC2-40, 2: RC2-64, 3: RC2-128 "),
+                                                _("468"))) {
+              case 1:
+                m_strreplace(&SmimeCryptAlg, "rc2-40");
+                break;
+              case 2:
+                m_strreplace(&SmimeCryptAlg, "rc2-64");
+                break;
+              case 3:
+                m_strreplace(&SmimeCryptAlg, "rc2-128");
+                break;
+            }
+            break;
+
+          case 3:
+            switch (choice = mutt_multi_choice (_("1: AES128, 2: AES192, 3: AES256 "),
+                                                _("895"))) {
+              case 1:
+                m_strreplace(&SmimeCryptAlg, "aes128");
+                break;
+              case 2:
+                m_strreplace(&SmimeCryptAlg, "aes192");
+                break;
+              case 3:
+                m_strreplace(&SmimeCryptAlg, "aes256");
+                break;
+            }
+            break;
+
+          case 4: /* (c)lear */
+            p_delete(&SmimeCryptAlg);
+            /* fallback */
+          case -1: /* Ctrl-G or Enter */
+            choice = 0;
+            break;
+        }
+      } while (choice == -1);
     }
     break;
 
@@ -1931,7 +1969,7 @@ int smime_send_menu (HEADER * msg, int *redraw)
   case 4:                      /* sign (a)s */
 
     if ((p = smime_ask_for_key (_("Sign as: "), NULL, 0))) {
-      str_replace (&SmimeDefaultKey, p);
+      m_strreplace(&SmimeDefaultKey, p);
 
       msg->security |= SIGN;