CLI: make gpg binary used by libgmime configurable.
authorDavid Bremner <david@tethera.net>
Tue, 9 Dec 2014 20:01:11 +0000 (21:01 +0100)
committerDavid Bremner <david@tethera.net>
Wed, 11 Mar 2015 07:04:00 +0000 (08:04 +0100)
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
notmuch-client.h
notmuch-config.c
notmuch-reply.c
notmuch-show.c
test/T030-config.sh
test/T040-setup.sh

index 2676a86cb0073d407aca5a3d641fbd53512eb25d..40c12721d2918773feff77c2ce1094f99f43a9cd 100644 (file)
@@ -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
 ===========
 
index c25c4ea888445a11636e849a9a692b9765a445c4..fb3021cc37c1aec68a9b2b193b1cea9c011cd200 100644 (file)
@@ -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);
 
index a564bcae362f6b0b9304ade15e580faa67f84437..2d5c297b7f5f2996b89c6e7c9502df90a06c93d6 100644 (file)
@@ -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 <group>.<key> return the
  * component group and key. If any error occurs, print a message on
  * stderr and return 1. Otherwise, return 0.
index e18370f8579107a84be9e2e515e8f3bfb05ed7d2..d51fdfc360dd58edc1e5358433663273188aa8a9 100644 (file)
@@ -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, &notmuch))
        return EXIT_FAILURE;
index d292f29fe0591ee74fb60ae4a94e1b46d098793a..43bf71c8c8924e80c28f08469d2615642cba44b4 100644 (file)
@@ -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, &notmuch))
        return EXIT_FAILURE;
index ca4cf330eb57c2f9b014cb02acd1e42d2a64ac3e..7d14a85f9b4696ccfc88ea584b3f3240341e58e9 100755 (executable)
@@ -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;"
 
index b1972e70c3b151e897275d303abc2f7bedfbe56d..0e9f279a6e714c6359261bb6d44d38d6442e68c8 100755 (executable)
@@ -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