From c883e632bf0a3692fa4ca7aa77604e0e60820295 Mon Sep 17 00:00:00 2001 From: David Bremner Date: Tue, 9 Dec 2014 21:01:11 +0100 Subject: [PATCH] CLI: make gpg binary used by libgmime configurable. Previously we set up a way for the top level notmuch command to choose which gpg binary was invoked by libgmime. In this commit we add the (mostly boilerplate) code to allow the notmuch-config command to read and write this path, and use it in the appropriate struct. Update tests for new default variable --- doc/man1/notmuch-config.rst | 8 ++++++++ notmuch-client.h | 7 +++++++ notmuch-config.c | 35 ++++++++++++++++++++++++++++++++++- notmuch-reply.c | 2 ++ notmuch-show.c | 2 ++ test/T030-config.sh | 1 + test/T040-setup.sh | 3 ++- 7 files changed, 56 insertions(+), 2 deletions(-) diff --git a/doc/man1/notmuch-config.rst b/doc/man1/notmuch-config.rst index 2676a86c..40c12721 100644 --- a/doc/man1/notmuch-config.rst +++ b/doc/man1/notmuch-config.rst @@ -125,6 +125,14 @@ The available configuration items are described below. Default: ``true``. + **crypto.gpg_path** + + Name (or full path) of gpg binary to use in verification and + decryption of PGP/MIME messages. + + Default: ``gpg``. + + ENVIRONMENT =========== diff --git a/notmuch-client.h b/notmuch-client.h index c25c4ea8..fb3021cc 100644 --- a/notmuch-client.h +++ b/notmuch-client.h @@ -278,6 +278,13 @@ void notmuch_config_set_database_path (notmuch_config_t *config, const char *database_path); +const char * +notmuch_config_get_crypto_gpg_path (notmuch_config_t *config); + +void +notmuch_config_set_crypto_gpg_path (notmuch_config_t *config, + const char *gpg_path); + const char * notmuch_config_get_user_name (notmuch_config_t *config); diff --git a/notmuch-config.c b/notmuch-config.c index a564bcae..2d5c297b 100644 --- a/notmuch-config.c +++ b/notmuch-config.c @@ -101,12 +101,21 @@ static const char search_config_comment[] = "\t\tsearch results by default. Using an excluded tag in a\n" "\t\tquery will override that exclusion.\n"; +static const char crypto_config_comment[] = + " Cryptography related configuration\n" + "\n" + " The following option is supported here:\n" + "\n" + "\tgpg_path\n" + "\t\tbinary name or full path to invoke gpg.\n"; + struct _notmuch_config { char *filename; GKeyFile *key_file; notmuch_bool_t is_new; char *database_path; + char *crypto_gpg_path; char *user_name; char *user_primary_email; const char **user_other_email; @@ -244,6 +253,7 @@ notmuch_config_open (void *ctx, int file_had_user_group; int file_had_maildir_group; int file_had_search_group; + int file_had_crypto_group; notmuch_config_t *config = talloc (ctx, notmuch_config_t); if (config == NULL) { @@ -277,6 +287,7 @@ notmuch_config_open (void *ctx, config->maildir_synchronize_flags = TRUE; config->search_exclude_tags = NULL; config->search_exclude_tags_length = 0; + config->crypto_gpg_path = NULL; if (! g_key_file_load_from_file (config->key_file, config->filename, @@ -326,7 +337,7 @@ notmuch_config_open (void *ctx, file_had_user_group = g_key_file_has_group (config->key_file, "user"); file_had_maildir_group = g_key_file_has_group (config->key_file, "maildir"); file_had_search_group = g_key_file_has_group (config->key_file, "search"); - + file_had_crypto_group = g_key_file_has_group (config->key_file, "crypto"); if (notmuch_config_get_database_path (config) == NULL) { char *path = getenv ("MAILDIR"); @@ -406,6 +417,10 @@ notmuch_config_open (void *ctx, g_error_free (error); } + if (notmuch_config_get_crypto_gpg_path (config) == NULL) { + notmuch_config_set_crypto_gpg_path (config, "gpg"); + } + /* Whenever we know of configuration sections that don't appear in * the configuration file, we add some comments to help the user * understand what can be done. */ @@ -433,6 +448,10 @@ notmuch_config_open (void *ctx, g_key_file_set_comment (config->key_file, "search", NULL, search_config_comment, NULL); + if (! file_had_crypto_group) + g_key_file_set_comment (config->key_file, "crypto", NULL, + crypto_config_comment, NULL); + return config; } @@ -690,6 +709,20 @@ notmuch_config_set_search_exclude_tags (notmuch_config_t *config, &(config->search_exclude_tags)); } +const char * +notmuch_config_get_crypto_gpg_path (notmuch_config_t *config) +{ + return _config_get (config, &config->crypto_gpg_path, "crypto", "gpg_path"); +} + +void +notmuch_config_set_crypto_gpg_path (notmuch_config_t *config, + const char *gpg_path) +{ + _config_set (config, &config->crypto_gpg_path, "crypto", "gpg_path", gpg_path); +} + + /* Given a configuration item of the form . return the * component group and key. If any error occurs, print a message on * stderr and return 1. Otherwise, return 0. diff --git a/notmuch-reply.c b/notmuch-reply.c index e18370f8..d51fdfc3 100644 --- a/notmuch-reply.c +++ b/notmuch-reply.c @@ -822,6 +822,8 @@ notmuch_reply_command (notmuch_config_t *config, int argc, char *argv[]) return EXIT_FAILURE; } + params.crypto.gpgpath = notmuch_config_get_crypto_gpg_path (config); + if (notmuch_database_open (notmuch_config_get_database_path (config), NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much)) return EXIT_FAILURE; diff --git a/notmuch-show.c b/notmuch-show.c index d292f29f..43bf71c8 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -1204,6 +1204,8 @@ notmuch_show_command (notmuch_config_t *config, int argc, char *argv[]) return EXIT_FAILURE; } + params.crypto.gpgpath = notmuch_config_get_crypto_gpg_path (config); + if (notmuch_database_open (notmuch_config_get_database_path (config), NOTMUCH_DATABASE_MODE_READ_ONLY, ¬much)) return EXIT_FAILURE; diff --git a/test/T030-config.sh b/test/T030-config.sh index ca4cf330..7d14a85f 100755 --- a/test/T030-config.sh +++ b/test/T030-config.sh @@ -54,6 +54,7 @@ new.tags=unread;inbox; new.ignore= search.exclude_tags= maildir.synchronize_flags=true +crypto.gpg_path=gpg foo.string=this is another string value foo.list=this;is another;list value;" diff --git a/test/T040-setup.sh b/test/T040-setup.sh index b1972e70..0e9f279a 100755 --- a/test/T040-setup.sh +++ b/test/T040-setup.sh @@ -28,6 +28,7 @@ user.other_email=another.suite@example.com; new.tags=foo;bar; new.ignore= search.exclude_tags=baz; -maildir.synchronize_flags=true" +maildir.synchronize_flags=true +crypto.gpg_path=gpg" test_done -- 2.26.2