From c1a7f26aa6ac3070d6f8c6d356a952ac7f1fc934 Mon Sep 17 00:00:00 2001 From: Daniel Kahn Gillmor Date: Fri, 8 Jul 2016 11:27:15 +0200 Subject: [PATCH] [PATCH v4 04/16] Provide _notmuch_crypto_{set,get}_gpg_path --- db/848d19aee8f947494f4b3f431ec42f75315dbd | 255 ++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 db/848d19aee8f947494f4b3f431ec42f75315dbd diff --git a/db/848d19aee8f947494f4b3f431ec42f75315dbd b/db/848d19aee8f947494f4b3f431ec42f75315dbd new file mode 100644 index 000000000..d79c290bd --- /dev/null +++ b/db/848d19aee8f947494f4b3f431ec42f75315dbd @@ -0,0 +1,255 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by arlo.cworth.org (Postfix) with ESMTP id 4D4AE6DE09E2 + for ; Fri, 8 Jul 2016 03:14:03 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Spam-Flag: NO +X-Spam-Score: 0.045 +X-Spam-Level: +X-Spam-Status: No, score=0.045 tagged_above=-999 required=5 tests=[AWL=0.045] + autolearn=disabled +Received: from arlo.cworth.org ([127.0.0.1]) + by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id dGcy_W3zhuYE for ; + Fri, 8 Jul 2016 03:13:55 -0700 (PDT) +Received: from che.mayfirst.org (che.mayfirst.org [162.247.75.118]) + by arlo.cworth.org (Postfix) with ESMTP id 8A35F6DE0362 + for ; Fri, 8 Jul 2016 03:13:12 -0700 (PDT) +Received: from fifthhorseman.net (unknown [88.128.80.54]) + by che.mayfirst.org (Postfix) with ESMTPSA id C572CF99C + for ; Fri, 8 Jul 2016 06:13:11 -0400 (EDT) +Received: by fifthhorseman.net (Postfix, from userid 1000) + id 9174A20FAE; Fri, 8 Jul 2016 11:27:34 +0200 (CEST) +From: Daniel Kahn Gillmor +To: Notmuch Mail +Subject: [PATCH v4 04/16] Provide _notmuch_crypto_{set,get}_gpg_path +Date: Fri, 8 Jul 2016 11:27:15 +0200 +Message-Id: <1467970047-8013-5-git-send-email-dkg@fifthhorseman.net> +X-Mailer: git-send-email 2.8.1 +In-Reply-To: <1467970047-8013-1-git-send-email-dkg@fifthhorseman.net> +References: <1467970047-8013-1-git-send-email-dkg@fifthhorseman.net> +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.20 +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: Fri, 08 Jul 2016 10:14:03 -0000 + +Use functions to access the gpg_path for a _notmuch_crypto_t object. +This lets us return sensible defaults based on the state of the user's +machine. + +If the passed-in _notmuch_crypto_t is NULL, then just return the +system's default choice of gpg. +--- + notmuch-reply.c | 13 ++++++++++--- + notmuch-show.c | 12 ++++++++++-- + util/crypto.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- + util/crypto.h | 8 +++++++- + 4 files changed, 74 insertions(+), 9 deletions(-) + +diff --git a/notmuch-reply.c b/notmuch-reply.c +index 42aef47..d0b4a0d 100644 +--- a/notmuch-reply.c ++++ b/notmuch-reply.c +@@ -790,13 +790,15 @@ notmuch_reply_command (notmuch_config_t *config, int argc, char *argv[]) + .crypto = { + .verify = FALSE, + .decrypt = FALSE, +- .gpgpath = NULL ++ .gpg_path = NULL + } + }; + int format = FORMAT_DEFAULT; + int reply_all = TRUE; + struct sprinter *sp = NULL; +- ++ notmuch_status_t status; ++ const char *gpg_path = NULL; ++ + notmuch_opt_desc_t options[] = { + { NOTMUCH_OPT_KEYWORD, &format, "format", 'f', + (notmuch_keyword_t []){ { "default", FORMAT_DEFAULT }, +@@ -845,7 +847,12 @@ notmuch_reply_command (notmuch_config_t *config, int argc, char *argv[]) + return EXIT_FAILURE; + } + +- params.crypto.gpgpath = notmuch_config_get_crypto_gpg_path (config); ++ gpg_path = notmuch_config_get_crypto_gpg_path (config); ++ status = _notmuch_crypto_set_gpg_path (&(params.crypto), gpg_path); ++ if (status != NOTMUCH_STATUS_SUCCESS) { ++ fprintf (stderr, "Error: could not set gpg_path to '%s'.\n", gpg_path); ++ return EXIT_FAILURE; ++ } + + if (notmuch_database_open (notmuch_config_get_database_path (config), + NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much)) +diff --git a/notmuch-show.c b/notmuch-show.c +index 8ebf4ff..60411d0 100644 +--- a/notmuch-show.c ++++ b/notmuch-show.c +@@ -1006,13 +1006,15 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[]) + .crypto = { + .verify = FALSE, + .decrypt = FALSE, +- .gpgpath = NULL ++ .gpg_path = NULL + }, + .include_html = FALSE + }; + int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED; + int exclude = EXCLUDE_TRUE; + int entire_thread = ENTIRE_THREAD_DEFAULT; ++ notmuch_status_t status; ++ const char *gpg_path = NULL; + + notmuch_opt_desc_t options[] = { + { NOTMUCH_OPT_KEYWORD, &format_sel, "format", 'f', +@@ -1130,7 +1132,13 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[]) + return EXIT_FAILURE; + } + +- params.crypto.gpgpath = notmuch_config_get_crypto_gpg_path (config); ++ ++ gpg_path = notmuch_config_get_crypto_gpg_path (config); ++ status = _notmuch_crypto_set_gpg_path (&(params.crypto), gpg_path); ++ if (status != NOTMUCH_STATUS_SUCCESS) { ++ fprintf (stderr, "Error: could not set gpg_path to '%s'.\n", gpg_path); ++ return EXIT_FAILURE; ++ } + + if (notmuch_database_open (notmuch_config_get_database_path (config), + NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much)) +diff --git a/util/crypto.c b/util/crypto.c +index cce5cbc..9766c2c 100644 +--- a/util/crypto.c ++++ b/util/crypto.c +@@ -21,7 +21,9 @@ + + #include "notmuch.h" + #include "crypto.h" ++#include "search-path.h" + #include ++#include + + #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0])) + +@@ -38,7 +40,7 @@ get_gpg_context (_notmuch_crypto_t *crypto, GMimeCryptoContext **ctx) + } + + /* TODO: GMimePasswordRequestFunc */ +- crypto->gpgctx = g_mime_gpg_context_new (NULL, crypto->gpgpath ? crypto->gpgpath : "gpg"); ++ crypto->gpgctx = g_mime_gpg_context_new (NULL, _notmuch_crypto_get_gpg_path (crypto)); + if (! crypto->gpgctx) { + return NOTMUCH_STATUS_FAILED_CRYPTO_CONTEXT_CREATION; + } +@@ -51,7 +53,7 @@ get_gpg_context (_notmuch_crypto_t *crypto, GMimeCryptoContext **ctx) + } + + /* Create or pass on a PKCS7 context (GMime 2.6) */ +-static notmuch_status_t ++static notmuch_status_t + get_pkcs7_context (_notmuch_crypto_t *crypto, GMimeCryptoContext **ctx) + { + if (ctx == NULL || crypto == NULL) +@@ -76,7 +78,7 @@ get_pkcs7_context (_notmuch_crypto_t *crypto, GMimeCryptoContext **ctx) + } + static const struct { + const char *protocol; +- notmuch_status_t (*get_context) (_notmuch_crypto_t *crypto, GMimeCryptoContext **ctx); ++ notmuch_status_t (*get_context)(_notmuch_crypto_t *crypto, GMimeCryptoContext **ctx); + } protocols[] = { + { + .protocol = "application/pgp-signature", +@@ -120,6 +122,45 @@ _notmuch_crypto_get_gmime_ctx_for_protocol (_notmuch_crypto_t *crypto, + return NOTMUCH_STATUS_UNKNOWN_CRYPTO_PROTOCOL; + } + ++const char * ++_notmuch_crypto_get_gpg_path (const _notmuch_crypto_t *crypto) ++{ ++ if (crypto && crypto->gpg_path) ++ return crypto->gpg_path; ++ ++ if (test_for_executable ("gpg2")) return "gpg2"; ++ if (test_for_executable ("gpg")) return "gpg"; ++ return NULL; ++} ++ ++notmuch_status_t ++_notmuch_crypto_set_gpg_path (_notmuch_crypto_t *crypto, const char *gpg_path) ++{ ++ /* return success if this matches what is already configured */ ++ if ((! gpg_path && ! crypto->gpg_path) || ++ (gpg_path && crypto->gpg_path && 0 == strcmp (gpg_path, crypto->gpg_path))) ++ return NOTMUCH_STATUS_SUCCESS; ++ ++ if (! gpg_path && ! test_for_executable (gpg_path)) ++ return NOTMUCH_STATUS_FILE_ERROR; ++ ++ /* clear any existing gpgctx, since things are changing */ ++ if (crypto->gpgctx) { ++ g_object_unref (crypto->gpgctx); ++ crypto->gpgctx = NULL; ++ } ++ ++ if (crypto->gpg_path) { ++ talloc_free (crypto->gpg_path); ++ crypto->gpg_path = NULL; ++ } ++ ++ if (gpg_path) ++ crypto->gpg_path = talloc_strdup (NULL, gpg_path); ++ ++ return NOTMUCH_STATUS_SUCCESS; ++} ++ + void + _notmuch_crypto_cleanup (_notmuch_crypto_t *crypto) + { +@@ -132,4 +173,7 @@ _notmuch_crypto_cleanup (_notmuch_crypto_t *crypto) + g_object_unref (crypto->pkcs7ctx); + crypto->pkcs7ctx = NULL; + } ++ ++ talloc_free (crypto->gpg_path); ++ crypto->gpg_path = NULL; + } +diff --git a/util/crypto.h b/util/crypto.h +index 7cb0a39..70fc8ef 100644 +--- a/util/crypto.h ++++ b/util/crypto.h +@@ -11,7 +11,7 @@ typedef struct _notmuch_crypto { + GMimeCryptoContext* pkcs7ctx; + notmuch_bool_t verify; + notmuch_bool_t decrypt; +- const char *gpgpath; ++ char *gpg_path; + } _notmuch_crypto_t; + + +@@ -20,6 +20,12 @@ _notmuch_crypto_get_gmime_ctx_for_protocol (_notmuch_crypto_t *crypto, + const char *protocol, + GMimeCryptoContext **ctx); + ++notmuch_status_t ++_notmuch_crypto_set_gpg_path (_notmuch_crypto_t *crypto, const char *gpg_path); ++ ++const char * ++_notmuch_crypto_get_gpg_path (const _notmuch_crypto_t *crypto); ++ + void + _notmuch_crypto_cleanup (_notmuch_crypto_t *crypto); + +-- +2.8.1 + -- 2.26.2