Move the event loop to evtloop.c, and wake up sleeping jobs every 10 seconds.
[apps/madmutt.git] / crypt.cpkg
index 797a4b6..203e685 100644 (file)
@@ -470,7 +470,7 @@ 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;
 
@@ -482,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);
@@ -508,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;
 }
 
 
@@ -1908,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. */
@@ -1931,7 +1933,7 @@ 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. */
@@ -1942,7 +1944,7 @@ int crypt_pgp_encrypted_handler (BODY * a, STATE * s)
     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);
@@ -1984,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 */
@@ -2002,7 +2004,7 @@ int crypt_smime_application_smime_handler (BODY * a, STATE * s)
     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);
@@ -2048,7 +2050,7 @@ int crypt_smime_application_smime_handler (BODY * a, STATE * s)
 
   m_fclose(&fpout);
   mutt_unlink (tempfile);
-  return (rc);
+  return rc;
 }
 
 
@@ -2286,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);
 }
 
 
@@ -2306,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. */
@@ -2332,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
@@ -2374,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
@@ -3400,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)
@@ -3422,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,
@@ -3436,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;
             }
 
@@ -3452,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);
@@ -3683,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;
@@ -3734,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) {
@@ -3759,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 
@@ -4024,7 +4031,7 @@ 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)