well this makes things fail for people ...
[apps/madmutt.git] / crypt.cpkg
index 819adae..203e685 100644 (file)
@@ -16,8 +16,7 @@
 #include <gpgme.h>
 
 #include <lib-mime/mime.h>
-#include <lib-ui/curses.h>
-#include <lib-ui/enter.h>
+#include <lib-ui/lib-ui.h>
 #include <lib-ui/menu.h>
 #include <lib-mx/mx.h>
 
@@ -197,7 +196,7 @@ static void convert_to_7bit (BODY * a)
         if (a->type == TYPEMULTIPART) {
             a->encoding = ENC7BIT;
             convert_to_7bit(a->parts);
-        } else if (a->type == TYPEMESSAGE && tok == MIME_DELIVERY_STATUS) {
+        } else if (a->type == TYPEMESSAGE && tok != MIME_DELIVERY_STATUS) {
             if (a->encoding != ENC7BIT)
                 mutt_message_to_7bit(a, NULL);
         } else if (a->encoding == ENC8BIT) {
@@ -219,7 +218,7 @@ static void print_utf8 (FILE * fp, const char *buf, ssize_t len)
     char *tstr;
 
     tstr = p_dupstr(buf, len);
-    mutt_convert_string(&tstr, "utf-8", MCharset.charset, M_ICONV_HOOK_FROM);
+    mutt_convert_string(&tstr, "utf-8", mod_cset.charset, M_ICONV_HOOK_FROM);
     fputs(tstr, fp);
     p_delete(&tstr);
 }
@@ -327,7 +326,7 @@ static gpgme_ctx_t create_gpgme_context(int for_smime)
     if (err) {
         mutt_error(_("error creating gpgme context: %s\n"),
                    gpgme_strerror(err));
-        sleep(2);
+        mutt_sleep(2);
         mutt_exit(1);
     }
     if (!for_smime)
@@ -336,7 +335,7 @@ static gpgme_ctx_t create_gpgme_context(int for_smime)
     err = gpgme_set_protocol(ctx, GPGME_PROTOCOL_CMS);
     if (err) {
         mutt_error(_("error enabling CMS protocol: %s\n"), gpgme_strerror(err));
-        sleep(2);
+        mutt_sleep(2);
         mutt_exit(1);
     }
     return ctx;
@@ -353,7 +352,7 @@ static gpgme_data_t create_gpgme_data(void)
     if (err) {
         mutt_error(_("error creating gpgme data object: %s\n"),
                    gpgme_strerror(err));
-        sleep(2);
+        mutt_sleep(2);
         mutt_exit(1);
     }
     return data;
@@ -471,11 +470,11 @@ static int data_object_to_stream(gpgme_data_t data, FILE *fp)
 static char *data_object_to_tempfile(gpgme_data_t data, FILE **ret_fp)
 {
     int err;
-    char tempfile[_POSIX_PATH_MAX];
+    char tempfile[_POSIX_PATH_MAX], buf[BUFSIZ];
     FILE *fp;
     ssize_t nread = 0;
 
-    fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+    fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL);
     if (!fp) {
         mutt_perror (_("Can't create temporary file"));
         return NULL;
@@ -483,24 +482,21 @@ static char *data_object_to_tempfile(gpgme_data_t data, FILE **ret_fp)
 
     err = ((gpgme_data_seek (data, 0, SEEK_SET) == -1)
            ? gpgme_error_from_errno (errno) : 0);
-    if (!err) {
-        char buf[4096];
+    if (err) {
+        mutt_perror(_("Can't create temporary file"));
+        goto error;
+    }
 
-        while ((nread = gpgme_data_read(data, buf, sizeof(buf)))) {
-            if (fwrite (buf, nread, 1, fp) != 1) {
-                mutt_perror (_("Can't create temporary file"));
-                m_fclose(&fp);
-                unlink (tempfile);
-                return NULL;
-            }
+    while ((nread = gpgme_data_read(data, buf, sizeof(buf)))) {
+        if (fwrite (buf, nread, 1, fp) != 1) {
+            mutt_perror (_("Can't create temporary file"));
+            goto error;
         }
     }
 
     if (nread == -1) {
         mutt_error (_("error reading data object: %s\n"), gpgme_strerror (err));
-        unlink (tempfile);
-        m_fclose(&fp);
-        return NULL;
+        goto error;
     }
     if (ret_fp) {
         rewind(fp);
@@ -509,6 +505,11 @@ static char *data_object_to_tempfile(gpgme_data_t data, FILE **ret_fp)
         m_fclose(&fp);
     }
     return m_strdup(tempfile);
+
+  error:
+    m_fclose(&fp);
+    unlink (tempfile);
+    return NULL;
 }
 
 
@@ -690,7 +691,7 @@ static void print_time(time_t t, STATE *s)
     char p[STRING];
 
     setlocale(LC_TIME, "");
-#ifdef HAVE_LANGINFO_D_T_FMT
+#ifdef D_T_FMT
     strftime(p, sizeof(p), nl_langinfo(D_T_FMT), localtime(&t));
 #else
     strftime(p, sizeof(p), "%c", localtime(&t));
@@ -1217,7 +1218,6 @@ static int crypt_verify_one(BODY *sigbdy, STATE *s, FILE *fp, int is_smime)
   state_attach_puts (_("[-- Begin signature information --]\n"), s);
 
   err = gpgme_op_verify (ctx, signature, message, NULL);
-  mutt_need_hard_redraw ();
   if (err) {
     char buf[200];
 
@@ -1580,7 +1580,7 @@ pgp_check_traditional_one_body(FILE *fp, BODY *b, int tagged_only)
   if (tagged_only && !b->tagged)
     return 0;
 
-  tempfd = m_tempfd(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  tempfd = m_tempfd(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL);
   if (mutt_decode_save_attachment (fp, b, tempfd, 0) != 0) {
     unlink (tempfile);
     return 0;
@@ -1658,7 +1658,7 @@ static void copy_clearsigned(gpgme_data_t data, STATE * s, char *charset)
   unlink (fname);
   p_delete(&fname);
 
-  fc = fgetconv_open (fp, charset, MCharset.charset, M_ICONV_HOOK_FROM);
+  fc = fgetconv_open (fp, charset, mod_cset.charset, M_ICONV_HOOK_FROM);
 
   for (complete = 1, armor_header = 1;
        fgetconvs (buf, sizeof (buf), fc) != NULL;
@@ -1874,7 +1874,7 @@ int crypt_pgp_application_pgp_handler(BODY *m, STATE *s)
         int c;
 
         rewind (pgpout);
-        fc = fgetconv_open (pgpout, "utf-8", MCharset.charset, 0);
+        fc = fgetconv_open (pgpout, "utf-8", mod_cset.charset, 0);
         while ((c = fgetconv (fc)) != EOF) {
           state_putc (c, s);
           if (c == '\n' && s->prefix)
@@ -1910,9 +1910,9 @@ int crypt_pgp_application_pgp_handler(BODY *m, STATE *s)
   if (needpass == -1) {
     state_attach_puts (_("[-- Error: could not find beginning"
                          " of PGP message! --]\n\n"), s);
-    return (-1);
+    return -1;
   }
-  return (err);
+  return err;
 }
 
 /* MIME handler for pgp/mime encrypted messages. */
@@ -1933,18 +1933,18 @@ int crypt_pgp_encrypted_handler (BODY * a, STATE * s)
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"),
                          s);
-    return (-1);
+    return -1;
   }
 
   /* Move forward to the application/pgp-encrypted body. */
   a = a->next;
 
-  fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL);
   if (!fpout) {
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: could not create temporary file! "
                            "--]\n"), s);
-    return (-1);
+    return -1;
   }
 
   tattach = decrypt_part (a, s, fpout, 0, &is_signed);
@@ -1986,7 +1986,7 @@ int crypt_pgp_encrypted_handler (BODY * a, STATE * s)
 
   m_fclose(&fpout);
   mutt_unlink (tempfile);
-  return (rc);
+  return rc;
 }
 
 /* Support for application/smime */
@@ -1999,12 +1999,12 @@ int crypt_smime_application_smime_handler (BODY * a, STATE * s)
   int rc = 0;
 
   a->warnsig = 0;
-  fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL);
   if (!fpout) {
     if (s->flags & M_DISPLAY)
       state_attach_puts (_("[-- Error: could not create temporary file! "
                            "--]\n"), s);
-    return (-1);
+    return -1;
   }
 
   tattach = decrypt_part (a, s, fpout, 1, &is_signed);
@@ -2050,7 +2050,7 @@ int crypt_smime_application_smime_handler (BODY * a, STATE * s)
 
   m_fclose(&fpout);
   mutt_unlink (tempfile);
-  return (rc);
+  return rc;
 }
 
 
@@ -2269,8 +2269,8 @@ static void crypt_entry (char *s, ssize_t l, MUTTMENU * menu, int num)
   entry.key = cryptkey_table[num];
   entry.num = num + 1;
 
-  m_strformat(s, l, COLS - SW, mod_crypt.pgp_entry_format, crypt_entry_fmt,
-              &entry, option(OPTARROWCURSOR) ? M_FORMAT_ARROWCURSOR : 0);
+  m_strformat(s, l, getmaxx(main_w), mod_crypt.pgp_entry_format,
+              crypt_entry_fmt, &entry, 0);
 }
 
 /* Compare two addresses and the keyid to be used for sorting. */
@@ -2288,8 +2288,7 @@ static int _crypt_compare_address (const void *a, const void *b)
 
 static int crypt_compare_address (const void *a, const void *b)
 {
-  return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_address (a, b)
-          : _crypt_compare_address (a, b));
+  return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_address(a, b);
 }
 
 
@@ -2308,8 +2307,7 @@ static int _crypt_compare_keyid (const void *a, const void *b)
 
 static int crypt_compare_keyid (const void *a, const void *b)
 {
-  return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_keyid (a, b)
-          : _crypt_compare_keyid (a, b));
+  return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_keyid(a, b);
 }
 
 /* Compare 2 creation dates and the addresses.  For sorting. */
@@ -2334,8 +2332,7 @@ static int _crypt_compare_date (const void *a, const void *b)
 
 static int crypt_compare_date (const void *a, const void *b)
 {
-  return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_date (a, b)
-          : _crypt_compare_date (a, b));
+  return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_date(a, b);
 }
 
 /* Compare two trust values, the key length, the creation dates. the
@@ -2376,13 +2373,12 @@ static int _crypt_compare_trust (const void *a, const void *b)
 
   if ((r = m_strcasecmp((*s)->uid, (*t)->uid)))
     return r > 0;
-  return (m_strcasecmp(crypt_keyid ((*s)), crypt_keyid ((*t)))) > 0;
+  return m_strcasecmp(crypt_keyid(*s), crypt_keyid(*t)) > 0;
 }
 
 static int crypt_compare_trust (const void *a, const void *b)
 {
-  return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_trust (a, b)
-          : _crypt_compare_trust (a, b));
+  return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_trust(a, b);
 }
 
 /* Print the X.500 Distinguished Name part KEY from the array of parts
@@ -2680,7 +2676,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp)
     tt = key->subkeys->timestamp;
 
     tm = localtime (&tt);
-#ifdef HAVE_LANGINFO_D_T_FMT
+#ifdef D_T_FMT
     strftime (shortbuf, sizeof shortbuf, nl_langinfo (D_T_FMT), tm);
 #else
     strftime (shortbuf, sizeof shortbuf, "%c", tm);
@@ -2692,7 +2688,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp)
     tt = key->subkeys->expires;
 
     tm = localtime (&tt);
-#ifdef HAVE_LANGINFO_D_T_FMT
+#ifdef D_T_FMT
     strftime (shortbuf, sizeof shortbuf, nl_langinfo (D_T_FMT), tm);
 #else
     strftime (shortbuf, sizeof shortbuf, "%c", tm);
@@ -2803,7 +2799,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp)
         tt = subkey->timestamp;
 
         tm = localtime (&tt);
-#ifdef HAVE_LANGINFO_D_T_FMT
+#ifdef D_T_FMT
         strftime (shortbuf, sizeof shortbuf, nl_langinfo (D_T_FMT), tm);
 #else
         strftime (shortbuf, sizeof shortbuf, "%c", tm);
@@ -2815,7 +2811,7 @@ static void print_key_info (gpgme_key_t key, FILE * fp)
         tt = subkey->expires;
 
         tm = localtime (&tt);
-#ifdef HAVE_LANGINFO_D_T_FMT
+#ifdef D_T_FMT
         strftime (shortbuf, sizeof shortbuf, nl_langinfo (D_T_FMT), tm);
 #else
         strftime (shortbuf, sizeof shortbuf, "%c", tm);
@@ -2870,7 +2866,7 @@ static void verify_key (cryptkey_t * key)
   gpgme_key_t k = NULL;
   int maxdepth = 100;
 
-  fp = m_tempfile (tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+  fp = m_tempfile (tempfile, sizeof(tempfile), NONULL(mod_core.tmpdir), NULL);
   if (!fp) {
     mutt_perror (_("Can't create temporary file"));
     return;
@@ -3036,7 +3032,7 @@ static cryptkey_t *crypt_select_key (cryptkey_t * keys,
   cryptkey_t **cryptkey_table;
   MUTTMENU *menu;
   int i, done = 0;
-  char helpstr[STRING], buf[LONG_STRING];
+  char buf[LONG_STRING];
   cryptkey_t *k;
   int (*f) (const void *, const void *);
   int menu_to_use = 0;
@@ -3090,23 +3086,10 @@ static cryptkey_t *crypt_select_key (cryptkey_t * keys,
   else if (app & APPLICATION_SMIME)
       menu_to_use = MENU_KEY_SELECT_SMIME;
 
-  helpstr[0] = 0;
-  mutt_make_help (buf, sizeof (buf), _("Exit  "), menu_to_use, OP_EXIT);
-  m_strcat(helpstr, sizeof(helpstr), buf);
-  mutt_make_help (buf, sizeof (buf), _("Select  "), menu_to_use,
-                  OP_GENERIC_SELECT_ENTRY);
-  m_strcat(helpstr, sizeof(helpstr), buf);
-  mutt_make_help (buf, sizeof (buf), _("Check key  "),
-                  menu_to_use, OP_VERIFY_KEY);
-  m_strcat(helpstr, sizeof(helpstr), buf);
-  mutt_make_help (buf, sizeof (buf), _("Help"), menu_to_use, OP_HELP);
-  m_strcat(helpstr, sizeof(helpstr), buf);
-
   menu = mutt_new_menu ();
   menu->max = i;
   menu->make_entry = crypt_entry;
   menu->menu = menu_to_use;
-  menu->help = helpstr;
   menu->data = cryptkey_table;
 
   {
@@ -3415,6 +3398,23 @@ crypt_ask_for_key(const char *tag, int abilities, int app, int *forced_valid)
     }
 }
 
+static char *crypt_hook(address_t *adr)
+{
+    char *res = NULL;
+    lua_State *L = luaM_getruntime();
+    lua_getglobal(L, "mod_core");             /* push mod_core        1 */
+    lua_getfield(L, -1, "crypt_hook");        /* push folder_hook()   2 */
+    if (lua_isfunction(L, -1)) {
+        lua_pushstring(L, adr->mailbox);
+        if (!lua_pcall(L, 1, 1, 0)) {
+            res = m_strdup(lua_tostring(L, -1));
+        }
+        lua_pop(L, 1);
+    }
+    lua_pop(L, 2);
+    return res;
+}
+
 /* This routine attempts to find the keyids of the recipients of a
    message.  It returns NULL if any of the keys can not be found.  */
 static char *find_keys(ENVELOPE *env, unsigned int app)
@@ -3437,10 +3437,10 @@ static char *find_keys(ENVELOPE *env, unsigned int app)
     while ((addr = address_list_pop(&lst))) {
         char buf[STRING];
         int forced_valid = 0;
-        const char *keyID;
+        char *keyID;
         cryptkey_t *key = NULL;
 
-        if ((keyID = mutt_crypt_hook(addr))) {
+        if ((keyID = crypt_hook(addr))) {
             int r;
 
             snprintf(buf, sizeof(buf), _("Use keyID = \"%s\" for %s?"), keyID,
@@ -3451,6 +3451,7 @@ static char *find_keys(ENVELOPE *env, unsigned int app)
                 address_list_wipe(&lst);
                 address_list_wipe(&addr);
                 buffer_delete(&keylist);
+                p_delete(&keyID);
                 return NULL;
             }
 
@@ -3467,6 +3468,7 @@ static char *find_keys(ENVELOPE *env, unsigned int app)
                 }
             }
         }
+        p_delete(&keyID);
 
         if (!key) {
             key = crypt_getkeybyaddr(addr, KEYFLAG_CANENCRYPT, app, &forced_valid);
@@ -3698,16 +3700,6 @@ void crypt_pgp_extract_keys_from_attachment_list(FILE * fp, int tag, BODY * top)
     }
 }
 
-void crypt_invoke_message (int type)
-{
-    if (type & APPLICATION_PGP) {
-        mutt_message _("Invoking PGP...");
-    }
-    else if (type & APPLICATION_SMIME) {
-        mutt_message _("Invoking S/MIME...");
-    }
-}
-
 int mutt_protect (HEADER * msg, char *keylist)
 {
   BODY *pbody = NULL, *tmp_pbody = NULL;
@@ -3749,7 +3741,7 @@ int mutt_protect (HEADER * msg, char *keylist)
       if (!(tmp_pbody = crypt_smime_build_smime_entity (tmp_smime_pbody,
                                                         keylist))) {
         /* signed ? free it! */
-        return (-1);
+        return -1;
       }
       /* free tmp_body if messages was signed AND encrypted ... */
       if (tmp_smime_pbody != msg->content && tmp_smime_pbody != tmp_pbody) {
@@ -3774,7 +3766,7 @@ int mutt_protect (HEADER * msg, char *keylist)
           body_list_wipe(&tmp_pgp_pbody->next);
         }
 
-        return (-1);
+        return -1;
       }
 
       /* destroy temporary signature envelope when doing retainable 
@@ -4039,7 +4031,47 @@ int mutt_signed_handler(BODY *a, STATE *s)
   if (s->flags & M_DISPLAY && sigcnt)
     state_attach_puts (_("\n[-- End of signed data --]\n"), s);
 
-  return (rc);
+  return rc;
+}
+
+static int _mutt_check_traditional_pgp (HEADER * h, int *redraw)
+{
+  MESSAGE *msg;
+  int rv = 0;
+
+  h->security |= PGP_TRADITIONAL_CHECKED;
+
+  mutt_parse_mime_message (Context, h);
+  if ((msg = mx_open_message (Context, h->msgno)) == NULL)
+    return 0;
+  if (crypt_pgp_check_traditional (msg->fp, h->content, 0)) {
+    h->security = crypt_query (h->content);
+    *redraw |= REDRAW_FULL;
+    rv = 1;
+  }
+
+  h->security |= PGP_TRADITIONAL_CHECKED;
+  mx_close_message (&msg);
+  return rv;
+}
+
+int mutt_check_traditional_pgp (HEADER * h, int *redraw)
+{
+  int i;
+  int rv = 0;
+
+  if (h && !(h->security & PGP_TRADITIONAL_CHECKED))
+    rv = _mutt_check_traditional_pgp (h, redraw);
+  else {
+    for (i = 0; i < Context->vcount; i++)
+      if (Context->hdrs[Context->v2r[i]]->tagged &&
+          !(Context->hdrs[Context->v2r[i]]->
+            security & PGP_TRADITIONAL_CHECKED))
+        rv =
+          _mutt_check_traditional_pgp (Context->hdrs[Context->v2r[i]], redraw)
+          || rv;
+  }
+  return rv;
 }
 
 /* vim:set ft=c: */