]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-config.c
mime-node: handle decrypt_result more safely
[notmuch] / notmuch-config.c
index cdb4088d1535e1d04a54f6ebb877f8812dfb755f..1cba2661d99d54276b0c6b6c5c2ee9954eb94359 100644 (file)
@@ -104,15 +104,25 @@ static const char search_config_comment[] =
 static const char crypto_config_comment[] =
     " Cryptography related configuration\n"
     "\n"
-    " The following option is supported here:\n"
+#if (GMIME_MAJOR_VERSION < 3)
+    " The following *deprecated* option is currently supported:\n"
     "\n"
     "\tgpg_path\n"
-    "\t\tbinary name or full path to invoke gpg.\n";
+    "\t\tbinary name or full path to invoke gpg.\n"
+    "\t\tNOTE: In a future build, this option will be ignored.\n"
+#else
+    " The following old option is now ignored:\n"
+    "\n"
+    "\tgpgpath\n"
+    "\t\tThis option was used by older builds of notmuch to choose\n"
+    "\t\tthe version of gpg to use.\n"
+#endif
+    "\t\tSetting $PATH is a better approach.\n";
 
 struct _notmuch_config {
     char *filename;
     GKeyFile *key_file;
-    notmuch_bool_t is_new;
+    bool is_new;
 
     char *database_path;
     char *crypto_gpg_path;
@@ -124,7 +134,7 @@ struct _notmuch_config {
     size_t new_tags_length;
     const char **new_ignore;
     size_t new_ignore_length;
-    notmuch_bool_t maildir_synchronize_flags;
+    bool maildir_synchronize_flags;
     const char **search_exclude_tags;
     size_t search_exclude_tags_length;
 };
@@ -202,8 +212,8 @@ get_username_from_passwd_file (void *ctx)
     return name;
 }
 
-static notmuch_bool_t
-get_config_from_file (notmuch_config_t *config, notmuch_bool_t create_new)
+static bool
+get_config_from_file (notmuch_config_t *config, bool create_new)
 {
     #define BUF_SIZE 4096
     char *config_str = NULL;
@@ -211,28 +221,27 @@ get_config_from_file (notmuch_config_t *config, notmuch_bool_t create_new)
     int config_bufsize = BUF_SIZE;
     size_t len;
     GError *error = NULL;
-    notmuch_bool_t ret = FALSE;
+    bool ret = false;
 
     FILE *fp = fopen(config->filename, "r");
     if (fp == NULL) {
-       /* If create_new is true, then the caller is prepared for a
-        * default configuration file in the case of FILE NOT FOUND.
-        */
-       if (create_new) {
-           config->is_new = TRUE;
-           ret = TRUE;
-           goto out;
-       } else if (errno == ENOENT) {
-           fprintf (stderr, "Configuration file %s not found.\n"
-                    "Try running 'notmuch setup' to create a configuration.\n",
-                    config->filename);
-           goto out;
+       if (errno == ENOENT) {
+           /* If create_new is true, then the caller is prepared for a
+            * default configuration file in the case of FILE NOT FOUND.
+            */
+           if (create_new) {
+               config->is_new = true;
+               ret = true;
+           } else {
+               fprintf (stderr, "Configuration file %s not found.\n"
+                        "Try running 'notmuch setup' to create a configuration.\n",
+                        config->filename);
+           }
        } else {
-           fprintf (stderr, "Error opening config file '%s': %s\n"
-                    "Try running 'notmuch setup' to create a configuration.\n",
+           fprintf (stderr, "Error opening config file '%s': %s\n",
                     config->filename, strerror(errno));
-           goto out;
        }
+       goto out;
     }
 
     config_str = talloc_zero_array (config, char, config_bufsize);
@@ -262,7 +271,7 @@ get_config_from_file (notmuch_config_t *config, notmuch_bool_t create_new)
 
     if (g_key_file_load_from_data (config->key_file, config_str, config_len,
                                   G_KEY_FILE_KEEP_COMMENTS, &error)) {
-       ret = TRUE;
+       ret = true;
        goto out;
     }
 
@@ -322,7 +331,7 @@ out:
 notmuch_config_t *
 notmuch_config_open (void *ctx,
                     const char *filename,
-                    notmuch_bool_t create_new)
+                    notmuch_config_mode_t config_mode)
 {
     GError *error = NULL;
     size_t tmp;
@@ -334,7 +343,7 @@ notmuch_config_open (void *ctx,
     int file_had_search_group;
     int file_had_crypto_group;
 
-    notmuch_config_t *config = talloc (ctx, notmuch_config_t);
+    notmuch_config_t *config = talloc_zero (ctx, notmuch_config_t);
     if (config == NULL) {
        fprintf (stderr, "Out of memory.\n");
        return NULL;
@@ -342,6 +351,9 @@ notmuch_config_open (void *ctx,
     
     talloc_set_destructor (config, notmuch_config_destructor);
 
+    /* non-zero defaults */
+    config->maildir_synchronize_flags = true;
+
     if (filename) {
        config->filename = talloc_strdup (config, filename);
     } else if ((notmuch_config_env = getenv ("NOTMUCH_CONFIG"))) {
@@ -353,24 +365,13 @@ notmuch_config_open (void *ctx,
 
     config->key_file = g_key_file_new ();
 
-    config->is_new = FALSE;
-    config->database_path = NULL;
-    config->user_name = NULL;
-    config->user_primary_email = NULL;
-    config->user_other_email = NULL;
-    config->user_other_email_length = 0;
-    config->new_tags = NULL;
-    config->new_tags_length = 0;
-    config->new_ignore = NULL;
-    config->new_ignore_length = 0;
-    config->maildir_synchronize_flags = TRUE;
-    config->search_exclude_tags = NULL;
-    config->search_exclude_tags_length = 0;
-    config->crypto_gpg_path = NULL;
-
-    if (! get_config_from_file (config, create_new)) {
-       talloc_free (config);
-       return NULL;
+    if (config_mode & NOTMUCH_CONFIG_OPEN) {
+       bool create_new = (config_mode & NOTMUCH_CONFIG_CREATE) != 0;
+
+       if (! get_config_from_file (config, create_new)) {
+           talloc_free (config);
+           return NULL;
+       }
     }
 
     /* Whenever we know of configuration sections that don't appear in
@@ -465,14 +466,16 @@ notmuch_config_open (void *ctx,
        g_key_file_get_boolean (config->key_file,
                                "maildir", "synchronize_flags", &error);
     if (error) {
-       notmuch_config_set_maildir_synchronize_flags (config, TRUE);
+       notmuch_config_set_maildir_synchronize_flags (config, true);
        g_error_free (error);
     }
 
+#if (GMIME_MAJOR_VERSION < 3)
     if (notmuch_config_get_crypto_gpg_path (config) == NULL) {
        notmuch_config_set_crypto_gpg_path (config, "gpg");
     }
-    
+#endif
+
     /* 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. */
@@ -576,7 +579,7 @@ notmuch_config_save (notmuch_config_t *config)
     return 0;
 }
 
-notmuch_bool_t
+bool
 notmuch_config_is_new (notmuch_config_t *config)
 {
     return config->is_new;
@@ -643,11 +646,11 @@ _config_get_list (notmuch_config_t *config,
 
 static void
 _config_set_list (notmuch_config_t *config,
-                 const char *group, const char *name,
+                 const char *group, const char *key,
                  const char *list[],
                  size_t length, const char ***config_var )
 {
-    g_key_file_set_string_list (config->key_file, group, name, list, length);
+    g_key_file_set_string_list (config->key_file, group, key, list, length);
 
     /* drop the cached value */
     talloc_free (*config_var);
@@ -761,6 +764,7 @@ notmuch_config_set_search_exclude_tags (notmuch_config_t *config,
                      &(config->search_exclude_tags));
 }
 
+#if (GMIME_MAJOR_VERSION < 3)
 const char *
 notmuch_config_get_crypto_gpg_path (notmuch_config_t *config)
 {
@@ -773,6 +777,7 @@ notmuch_config_set_crypto_gpg_path (notmuch_config_t *config,
 {
     _config_set (config, &config->crypto_gpg_path, "crypto", "gpg_path", gpg_path);
 }
+#endif
 
 
 /* Given a configuration item of the form <group>.<key> return the
@@ -803,7 +808,20 @@ _item_split (char *item, char **group, char **key)
 }
 
 #define BUILT_WITH_PREFIX "built_with."
-#define QUERY_PREFIX "query."
+
+static bool
+_stored_in_db (const char *item)
+{
+    const char * db_configs[] = {
+       "index.try_decrypt",
+    };
+    if (STRNCMP_LITERAL (item, "query.") == 0)
+       return true;
+    for (size_t i = 0; i < ARRAY_SIZE (db_configs); i++)
+       if (strcmp (item, db_configs[i]) == 0)
+           return true;
+    return false;
+}
 
 static int
 _print_db_config(notmuch_config_t *config, const char *name)
@@ -852,7 +870,7 @@ notmuch_config_command_get (notmuch_config_t *config, char *item)
     } else if (STRNCMP_LITERAL (item, BUILT_WITH_PREFIX) == 0) {
        printf ("%s\n",
                notmuch_built_with (item + strlen (BUILT_WITH_PREFIX)) ? "true" : "false");
-    } else if (STRNCMP_LITERAL (item, QUERY_PREFIX) == 0) {
+    } else if (_stored_in_db (item)) {
        return _print_db_config (config, item);
     } else {
        char **value;
@@ -923,7 +941,7 @@ notmuch_config_command_set (notmuch_config_t *config, char *item, int argc, char
        return 1;
     }
 
-    if (STRNCMP_LITERAL (item, QUERY_PREFIX) == 0) {
+    if (_stored_in_db (item)) {
        return _set_db_config (config, item, argc, argv);
     }
 
@@ -1081,7 +1099,7 @@ notmuch_config_command (notmuch_config_t *config, int argc, char *argv[])
 
 }
 
-notmuch_bool_t
+bool
 notmuch_config_get_maildir_synchronize_flags (notmuch_config_t *config)
 {
     return config->maildir_synchronize_flags;
@@ -1089,7 +1107,7 @@ notmuch_config_get_maildir_synchronize_flags (notmuch_config_t *config)
 
 void
 notmuch_config_set_maildir_synchronize_flags (notmuch_config_t *config,
-                                             notmuch_bool_t synchronize_flags)
+                                             bool synchronize_flags)
 {
     g_key_file_set_boolean (config->key_file,
                            "maildir", "synchronize_flags", synchronize_flags);