]> granicus.if.org Git - neomutt/commitdiff
Fix attachment check_traditional and extract_keys operations. (see #3728)
authorKevin McCarthy <kevin@8t8.us>
Fri, 11 Aug 2017 01:18:26 +0000 (18:18 -0700)
committerRichard Russon <rich@flatcap.org>
Fri, 1 Sep 2017 12:44:58 +0000 (13:44 +0100)
Add helpers and iterate over the actx->idx instead of the BODY structure.

ncrypt/crypt_gpgme.c
ncrypt/crypt_gpgme.h
ncrypt/crypt_mod.h
ncrypt/crypt_mod_pgp_classic.c
ncrypt/crypt_mod_pgp_gpgme.c
ncrypt/cryptglue.c
ncrypt/ncrypt.h
ncrypt/pgp.c
recvattach.c

index c7e879864303c289cce6f65fe9a1e51fcd4d50cd..e08cb15c849519551ba798ab376c206a9ad170d5 100644 (file)
@@ -2281,7 +2281,7 @@ static int line_compare(const char *a, size_t n, const char *b)
 /*
  * Implementation of `pgp_check_traditional'.
  */
-static int pgp_check_traditional_one_body(FILE *fp, struct Body *b, int tagged_only)
+static int pgp_check_traditional_one_body(FILE *fp, struct Body *b)
 {
   char tempfile[_POSIX_PATH_MAX];
   char buf[HUGE_STRING];
@@ -2293,9 +2293,6 @@ static int pgp_check_traditional_one_body(FILE *fp, struct Body *b, int tagged_o
   if (b->type != TYPETEXT)
     return 0;
 
-  if (tagged_only && !b->tagged)
-    return 0;
-
   mutt_mktemp(tempfile, sizeof(tempfile));
   if (mutt_decode_save_attachment(fp, b, tempfile, 0, 0) != 0)
   {
@@ -2339,21 +2336,24 @@ static int pgp_check_traditional_one_body(FILE *fp, struct Body *b, int tagged_o
   return 1;
 }
 
-int pgp_gpgme_check_traditional(FILE *fp, struct Body *b, int tagged_only)
+int pgp_gpgme_check_traditional(FILE *fp, struct Body *b, int just_one)
 {
   int rv = 0;
   int r;
   for (; b; b = b->next)
   {
-    if (is_multipart(b))
-      rv = (pgp_gpgme_check_traditional(fp, b->parts, tagged_only) || rv);
+    if (!just_one && is_multipart(b))
+      rv = (pgp_gpgme_check_traditional(fp, b->parts, 0) || rv);
     else if (b->type == TYPETEXT)
     {
       if ((r = mutt_is_application_pgp(b)))
         rv = (rv || r);
       else
-        rv = (pgp_check_traditional_one_body(fp, b, tagged_only) || rv);
+        rv = (pgp_check_traditional_one_body(fp, b) || rv);
     }
+
+    if (just_one)
+      break;
   }
   return rv;
 }
index 9faabf105244a54a949b6699b0d22862da2bf756..3b5c32296d23d64b831935541949c9dd0bf20e5e 100644 (file)
@@ -42,7 +42,7 @@ struct Body *smime_gpgme_build_smime_entity(struct Body *a, char *keylist);
 int pgp_gpgme_decrypt_mime(FILE *fpin, FILE **fpout, struct Body *b, struct Body **cur);
 int smime_gpgme_decrypt_mime(FILE *fpin, FILE **fpout, struct Body *b, struct Body **cur);
 
-int pgp_gpgme_check_traditional(FILE *fp, struct Body *b, int tagged_only);
+int pgp_gpgme_check_traditional (FILE *fp, struct Body *b, int just_one);
 void pgp_gpgme_invoke_import(const char *fname);
 
 int pgp_gpgme_application_handler(struct Body *m, struct State *s);
index c9133290b09c586d840b5f612bb3e5ec8d832eba..26bd2cc170fc903a9977f3d594237213428bcf0e 100644 (file)
@@ -44,7 +44,7 @@ typedef int (*crypt_func_application_handler_t)(struct Body *m, struct State *s)
 typedef int (*crypt_func_encrypted_handler_t)(struct Body *m, struct State *s);
 
 typedef void (*crypt_func_pgp_invoke_getkeys_t)(struct Address *addr);
-typedef int (*crypt_func_pgp_check_traditional_t)(FILE *fp, struct Body *b, int tagged_only);
+typedef int (*crypt_func_pgp_check_traditional_t) (FILE *fp, struct Body *b, int just_one);
 typedef struct Body *(*crypt_func_pgp_traditional_encryptsign_t)(struct Body *a, int flags, char *keylist);
 typedef struct Body *(*crypt_func_pgp_make_key_attachment_t)(char *tempf);
 typedef char *(*crypt_func_findkeys_t)(struct Address *adrlist, int oppenc_mode);
index cd04688b47423aa63a06600c2e396ae602aec5ae..0ff1cee1e43d6ce6a6a0347456781ecd8749274e 100644 (file)
@@ -87,9 +87,9 @@ static struct Body *crypt_mod_pgp_make_key_attachment(char *tempf)
   return pgp_make_key_attachment(tempf);
 }
 
-static int crypt_mod_pgp_check_traditional(FILE *fp, struct Body *b, int tagged_only)
+static int crypt_mod_pgp_check_traditional(FILE *fp, struct Body *b, int just_one)
 {
-  return pgp_check_traditional(fp, b, tagged_only);
+  return pgp_check_traditional(fp, b, just_one);
 }
 
 static struct Body *crypt_mod_pgp_traditional_encryptsign(struct Body *a,
index bd805539e57a9ae5514bc41a73dc3eb06d312f9d..0045747e650440c81ed05e92684f6f296f23efbc 100644 (file)
@@ -66,9 +66,9 @@ static int crypt_mod_pgp_encrypted_handler(struct Body *m, struct State *s)
   return pgp_gpgme_encrypted_handler(m, s);
 }
 
-static int crypt_mod_pgp_check_traditional(FILE *fp, struct Body *b, int tagged_only)
+static int crypt_mod_pgp_check_traditional(FILE *fp, struct Body *b, int just_one)
 {
-  return pgp_gpgme_check_traditional(fp, b, tagged_only);
+  return pgp_gpgme_check_traditional(fp, b, just_one);
 }
 
 static void crypt_mod_pgp_invoke_import(const char *fname)
index 19bc64deb998105df83470f03f5c9507fe00f78f..1381087071b264eb19be027e27d7f54d30cdcdac 100644 (file)
@@ -189,10 +189,10 @@ void crypt_pgp_invoke_getkeys(struct Address *addr)
 /**
  * crypt_pgp_check_traditional - Check for a traditional PGP message in body B
  */
-int crypt_pgp_check_traditional(FILE *fp, struct Body *b, int tagged_only)
+int crypt_pgp_check_traditional(FILE *fp, struct Body *b, int just_one)
 {
   if (CRYPT_MOD_CALL_CHECK(PGP, pgp_check_traditional))
-    return (CRYPT_MOD_CALL(PGP, pgp_check_traditional))(fp, b, tagged_only);
+    return (CRYPT_MOD_CALL(PGP, pgp_check_traditional))(fp, b, just_one);
 
   return 0;
 }
index 0eb1fc75b22928fb2e995c099fb66a487fbaa087..2815811af82ca9521ad61f89885f9e2daff24d13 100644 (file)
@@ -126,7 +126,7 @@ int crypt_pgp_decrypt_mime(FILE *a, FILE **b, struct Body *c, struct Body **d);
 int crypt_pgp_application_pgp_handler(struct Body *m, struct State *s);
 int crypt_pgp_encrypted_handler(struct Body *a, struct State *s);
 void crypt_pgp_invoke_getkeys(struct Address *addr);
-int crypt_pgp_check_traditional(FILE *fp, struct Body *b, int tagged_only);
+int crypt_pgp_check_traditional (FILE *fp, struct Body *b, int just_one);
 struct Body *crypt_pgp_make_key_attachment(char *tempf);
 int crypt_pgp_send_menu(struct Header *msg);
 void crypt_pgp_extract_keys_from_attachment_list(FILE *fp, int tag, struct Body *top);
index b111ecb9f2ab29348e32fe2fc7dd3720627a6bc2..8dd89a04796ce68d597a9bd6b231881628c3d622 100644 (file)
@@ -620,7 +620,7 @@ out:
   return rc;
 }
 
-static int pgp_check_traditional_one_body(FILE *fp, struct Body *b, int tagged_only)
+static int pgp_check_traditional_one_body(FILE *fp, struct Body *b)
 {
   char tempfile[_POSIX_PATH_MAX];
   char buf[HUGE_STRING];
@@ -633,9 +633,6 @@ static int pgp_check_traditional_one_body(FILE *fp, struct Body *b, int tagged_o
   if (b->type != TYPETEXT)
     return 0;
 
-  if (tagged_only && !b->tagged)
-    return 0;
-
   mutt_mktemp(tempfile, sizeof(tempfile));
   if (mutt_decode_save_attachment(fp, b, tempfile, 0, 0) != 0)
   {
@@ -680,21 +677,24 @@ static int pgp_check_traditional_one_body(FILE *fp, struct Body *b, int tagged_o
   return 1;
 }
 
-int pgp_check_traditional(FILE *fp, struct Body *b, int tagged_only)
+int pgp_check_traditional(FILE *fp, struct Body *b, int just_one)
 {
   int rv = 0;
   int r;
   for (; b; b = b->next)
   {
-    if (is_multipart(b))
-      rv = pgp_check_traditional(fp, b->parts, tagged_only) || rv;
+    if (!just_one && is_multipart(b))
+      rv = pgp_check_traditional(fp, b->parts, 0) || rv;
     else if (b->type == TYPETEXT)
     {
       if ((r = mutt_is_application_pgp(b)))
         rv = rv || r;
       else
-        rv = pgp_check_traditional_one_body(fp, b, tagged_only) || rv;
+        rv = pgp_check_traditional_one_body(fp, b) || rv;
     }
+
+    if (just_one)
+      break;
   }
 
   return rv;
index 8a3d67bb477f4f8615a944680ae69fe35638e831..9fca1b2014f765661f891e45760a409803e86b1e 100644 (file)
@@ -818,6 +818,37 @@ void mutt_print_attachment_list(struct AttachCtx *actx, FILE *fp, int tag, struc
     print_attachment_list(actx, fp, tag, top, &state);
 }
 
+static void recvattach_extract_pgp_keys(struct AttachCtx *actx, struct Menu *menu)
+{
+  int i;
+
+  if (!menu->tagprefix)
+    crypt_pgp_extract_keys_from_attachment_list(CURATTACH->fp, 0, CURATTACH->content);
+  else
+  {
+    for (i = 0; i < actx->idxlen; i++)
+      if (actx->idx[i]->content->tagged)
+        crypt_pgp_extract_keys_from_attachment_list(actx->idx[i]->fp, 0,
+                                                    actx->idx[i]->content);
+  }
+}
+
+static int recvattach_pgp_check_traditional(struct AttachCtx *actx, struct Menu *menu)
+{
+  int i, rv = 0;
+
+  if (!menu->tagprefix)
+    rv = crypt_pgp_check_traditional(CURATTACH->fp, CURATTACH->content, 1);
+  else
+  {
+    for (i = 0; i < actx->idxlen; i++)
+      if (actx->idx[i]->content->tagged)
+        rv = rv || crypt_pgp_check_traditional(actx->idx[i]->fp, actx->idx[i]->content, 1);
+  }
+
+  return rv;
+}
+
 int mutt_attach_display_loop(struct Menu *menu, int op, struct Header *hdr,
                              struct AttachCtx *actx, int recv)
 {
@@ -1130,16 +1161,13 @@ void mutt_view_attachments(struct Header *hdr)
       case OP_EXTRACT_KEYS:
         if ((WithCrypto & APPLICATION_PGP))
         {
-          crypt_pgp_extract_keys_from_attachment_list(
-              fp, menu->tagprefix, menu->tagprefix ? cur : CURATTACH->content);
+          recvattach_extract_pgp_keys(actx, menu);
           menu->redraw = REDRAW_FULL;
         }
         break;
 
       case OP_CHECK_TRADITIONAL:
-        if ((WithCrypto & APPLICATION_PGP) &&
-            crypt_pgp_check_traditional(fp, menu->tagprefix ? cur : CURATTACH->content,
-                                        menu->tagprefix))
+        if ((WithCrypto & APPLICATION_PGP) && recvattach_pgp_check_traditional(actx, menu))
         {
           hdr->security = crypt_query(cur);
           menu->redraw = REDRAW_FULL;