From 894509a0d8a635fa85e7c9dc14f11d43595e88eb Mon Sep 17 00:00:00 2001 From: Jameson Graef Rollins Date: Wed, 23 May 2012 18:43:50 +1700 Subject: [PATCH] [PATCH v3 6/6] cli: use new notmuch_crypto_get_context in mime-node.c --- 9f/0a133dafe1db69e050b778113eb5b92816d547 | 219 ++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 9f/0a133dafe1db69e050b778113eb5b92816d547 diff --git a/9f/0a133dafe1db69e050b778113eb5b92816d547 b/9f/0a133dafe1db69e050b778113eb5b92816d547 new file mode 100644 index 000000000..4f5db683a --- /dev/null +++ b/9f/0a133dafe1db69e050b778113eb5b92816d547 @@ -0,0 +1,219 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id B29A9431FD2 + for ; Tue, 22 May 2012 18:43:59 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -2.3 +X-Spam-Level: +X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id DL+aKTm-cN4e for ; + Tue, 22 May 2012 18:43:58 -0700 (PDT) +Received: from outgoing-mail.its.caltech.edu (outgoing-mail.its.caltech.edu + [131.215.239.19]) + by olra.theworths.org (Postfix) with ESMTP id C94AD431FB6 + for ; Tue, 22 May 2012 18:43:57 -0700 (PDT) +Received: from earth-doxen.imss.caltech.edu (localhost [127.0.0.1]) + by earth-doxen-postvirus (Postfix) with ESMTP id 806D466E0169 + for ; Tue, 22 May 2012 18:43:57 -0700 (PDT) +X-Spam-Scanned: at Caltech-IMSS on earth-doxen by amavisd-new +Received: from finestructure.net (gwave-125.ligo.caltech.edu + [131.215.114.125]) (Authenticated sender: jrollins) by earth-doxen-submit + (Postfix) with ESMTP id 67D1266E0172 for ; Tue, 22 + May 2012 18:43:55 -0700 (PDT) +Received: by finestructure.net (Postfix, from userid 1000) + id 41ADF1E7; Tue, 22 May 2012 18:43:54 -0700 (PDT) +From: Jameson Graef Rollins +To: Notmuch Mail +Subject: [PATCH v3 6/6] cli: use new notmuch_crypto_get_context in mime-node.c +Date: Tue, 22 May 2012 18:43:50 -0700 +Message-Id: <1337737430-21160-7-git-send-email-jrollins@finestructure.net> +X-Mailer: git-send-email 1.7.10 +In-Reply-To: <1337737430-21160-6-git-send-email-jrollins@finestructure.net> +References: <1337737430-21160-1-git-send-email-jrollins@finestructure.net> + <1337737430-21160-2-git-send-email-jrollins@finestructure.net> + <1337737430-21160-3-git-send-email-jrollins@finestructure.net> + <1337737430-21160-4-git-send-email-jrollins@finestructure.net> + <1337737430-21160-5-git-send-email-jrollins@finestructure.net> + <1337737430-21160-6-git-send-email-jrollins@finestructure.net> +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Wed, 23 May 2012 01:44:00 -0000 + +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 | 20 ++++++++++++++------ + notmuch-client.h | 3 ++- + notmuch-reply.c | 19 ------------------- + notmuch-show.c | 23 ----------------------- + 4 files changed, 16 insertions(+), 49 deletions(-) + +diff --git a/mime-node.c b/mime-node.c +index 73e28c5..857c84c 100644 +--- a/mime-node.c ++++ b/mime-node.c +@@ -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; ++ GMimeCryptoContext *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) { +diff --git a/notmuch-client.h b/notmuch-client.h +index db1c347..2434c4c 100644 +--- a/notmuch-client.h ++++ b/notmuch-client.h +@@ -354,7 +354,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: + * +diff --git a/notmuch-reply.c b/notmuch-reply.c +index e4f293f..aecd173 100644 +--- a/notmuch-reply.c ++++ b/notmuch-reply.c +@@ -710,25 +710,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; +diff --git a/notmuch-show.c b/notmuch-show.c +index 3c06792..8247f1d 100644 +--- a/notmuch-show.c ++++ b/notmuch-show.c +@@ -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; +-- +1.7.10 + -- 2.26.2