cli: use new notmuch_crypto_get_context in mime-node.c
authorJameson Graef Rollins <jrollins@finestructure.net>
Sat, 26 May 2012 18:45:46 +0000 (11:45 -0700)
committerDavid Bremner <bremner@debian.org>
Sun, 10 Jun 2012 23:09:42 +0000 (20:09 -0300)
This has the affect of lazily creating the crypto contexts only when
needed.  This removes code duplication from notmuch-show and
notmuch-reply, and should speed up these functions considerably if the
crypto flags are provided but the messages don't have any
cryptographic parts.

mime-node.c
notmuch-client.h
notmuch-reply.c
notmuch-show.c

index 73e28c572e3cb89bea78580a96d6d052e9b7d3b9..97e8b480271210db3489f74c3b17e10a139407f4 100644 (file)
@@ -150,6 +150,7 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part)
 {
     mime_node_t *node = talloc_zero (parent, mime_node_t);
     GError *err = NULL;
+    notmuch_crypto_context_t *cryptoctx = NULL;
 
     /* Set basic node properties */
     node->part = part;
@@ -182,8 +183,15 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part)
        return NULL;
     }
 
+    if ((GMIME_IS_MULTIPART_ENCRYPTED (part) && node->ctx->crypto->decrypt)
+       || (GMIME_IS_MULTIPART_SIGNED (part) && node->ctx->crypto->verify)) {
+       GMimeContentType *content_type = g_mime_object_get_content_type (part);
+       const char *protocol = g_mime_content_type_get_parameter (content_type, "protocol");
+       cryptoctx = notmuch_crypto_get_context (node->ctx->crypto, protocol);
+    }
+
     /* Handle PGP/MIME parts */
-    if (GMIME_IS_MULTIPART_ENCRYPTED (part) && node->ctx->crypto->decrypt) {
+    if (GMIME_IS_MULTIPART_ENCRYPTED (part) && node->ctx->crypto->decrypt && cryptoctx) {
        if (node->nchildren != 2) {
            /* this violates RFC 3156 section 4, so we won't bother with it. */
            fprintf (stderr, "Error: %d part(s) for a multipart/encrypted "
@@ -196,10 +204,10 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part)
 #ifdef GMIME_ATLEAST_26
            GMimeDecryptResult *decrypt_result = NULL;
            node->decrypted_child = g_mime_multipart_encrypted_decrypt
-               (encrypteddata, node->ctx->crypto->gpgctx, &decrypt_result, &err);
+               (encrypteddata, cryptoctx, &decrypt_result, &err);
 #else
            node->decrypted_child = g_mime_multipart_encrypted_decrypt
-               (encrypteddata, node->ctx->crypto->gpgctx, &err);
+               (encrypteddata, cryptoctx, &err);
 #endif
            if (node->decrypted_child) {
                node->decrypt_success = node->verify_attempted = TRUE;
@@ -217,7 +225,7 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part)
                         (err ? err->message : "no error explanation given"));
            }
        }
-    } else if (GMIME_IS_MULTIPART_SIGNED (part) && node->ctx->crypto->verify) {
+    } else if (GMIME_IS_MULTIPART_SIGNED (part) && node->ctx->crypto->verify && cryptoctx) {
        if (node->nchildren != 2) {
            /* this violates RFC 3156 section 5, so we won't bother with it. */
            fprintf (stderr, "Error: %d part(s) for a multipart/signed message "
@@ -226,7 +234,7 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part)
        } else {
 #ifdef GMIME_ATLEAST_26
            node->sig_list = g_mime_multipart_signed_verify
-               (GMIME_MULTIPART_SIGNED (part), node->ctx->crypto->gpgctx, &err);
+               (GMIME_MULTIPART_SIGNED (part), cryptoctx, &err);
            node->verify_attempted = TRUE;
 
            if (!node->sig_list)
@@ -242,7 +250,7 @@ _mime_node_create (mime_node_t *parent, GMimeObject *part)
             * In GMime 2.6, they're both non-const, so we'll be able
             * to clean up this asymmetry. */
            GMimeSignatureValidity *sig_validity = g_mime_multipart_signed_verify
-               (GMIME_MULTIPART_SIGNED (part), node->ctx->crypto->gpgctx, &err);
+               (GMIME_MULTIPART_SIGNED (part), cryptoctx, &err);
            node->verify_attempted = TRUE;
            node->sig_validity = sig_validity;
            if (sig_validity) {
index 0f29a83afff6dcec3e705ac5fac09b86be82dd17..9b63eae68cc577d94c832482d035be27b00dd829 100644 (file)
@@ -353,7 +353,8 @@ struct mime_node {
 /* Construct a new MIME node pointing to the root message part of
  * message. If crypto->verify is true, signed child parts will be
  * verified. If crypto->decrypt is true, encrypted child parts will be
- * decrypted.
+ * decrypted.  If crypto->gpgctx is NULL, it will be lazily
+ * initialized.
  *
  * Return value:
  *
index 1ab3db946e846346e51e0f02b3b3ee8756c6ba36..3a038ed75a06c0a4f76a847f344fec4c94641d53 100644 (file)
@@ -741,25 +741,6 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
     else
        reply_format_func = notmuch_reply_format_default;
 
-    if (params.crypto.decrypt) {
-#ifdef GMIME_ATLEAST_26
-       /* TODO: GMimePasswordRequestFunc */
-       params.crypto.gpgctx = g_mime_gpg_context_new (NULL, "gpg");
-#else
-       GMimeSession* session = g_object_new (g_mime_session_get_type(), NULL);
-       params.crypto.gpgctx = g_mime_gpg_context_new (session, "gpg");
-#endif
-       if (params.crypto.gpgctx) {
-           g_mime_gpg_context_set_always_trust ((GMimeGpgContext*) params.crypto.gpgctx, FALSE);
-       } else {
-           params.crypto.decrypt = FALSE;
-           fprintf (stderr, "Failed to construct gpg context.\n");
-       }
-#ifndef GMIME_ATLEAST_26
-       g_object_unref (session);
-#endif
-    }
-
     config = notmuch_config_open (ctx, NULL, NULL);
     if (config == NULL)
        return 1;
index 3c0679244afc641ac08b0ff38734fd8086a6e557..8247f1d52c6c34d3bb1a3370c2531d26f88170f3 100644 (file)
@@ -1056,29 +1056,6 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
        break;
     }
 
-    if (params.crypto.decrypt || params.crypto.verify) {
-#ifdef GMIME_ATLEAST_26
-       /* TODO: GMimePasswordRequestFunc */
-       params.crypto.gpgctx = g_mime_gpg_context_new (NULL, "gpg");
-#else
-       GMimeSession* session = g_object_new (g_mime_session_get_type(), NULL);
-       params.crypto.gpgctx = g_mime_gpg_context_new (session, "gpg");
-#endif
-       if (params.crypto.gpgctx) {
-           g_mime_gpg_context_set_always_trust ((GMimeGpgContext*) params.crypto.gpgctx, FALSE);
-       } else {
-           /* If we fail to create the gpgctx set the verify and
-            * decrypt flags to FALSE so we don't try to do any
-            * further verification or decryption */
-           params.crypto.verify = FALSE;
-           params.crypto.decrypt = FALSE;
-           fprintf (stderr, "Failed to construct gpg context.\n");
-       }
-#ifndef GMIME_ATLEAST_26
-       g_object_unref (session);
-#endif
-    }
-
     config = notmuch_config_open (ctx, NULL, NULL);
     if (config == NULL)
        return 1;