]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: change mail_(always_|never_)cache_fields, to BOOLLIST.
authorsergey.kitov <sergey.kitov@open-xchange.com>
Wed, 13 Sep 2023 10:52:57 +0000 (13:52 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:39:59 +0000 (10:39 +0200)
src/lib-storage/index/index-storage.c
src/lib-storage/mail-storage-settings.c
src/lib-storage/mail-storage-settings.h

index 7d59292fbe3f4b77cf6928030f109588e0726a3f..fcef5f4c48d1907b0d44ace3ca40d3b8a5da368c 100644 (file)
@@ -22,6 +22,7 @@
 #include "index-attachment.h"
 #include "index-thread-private.h"
 #include "index-mailbox-size.h"
+#include "settings-parser.h"
 
 #include <time.h>
 #include <unistd.h>
@@ -33,7 +34,7 @@ struct index_storage_module index_storage_module =
        MODULE_CONTEXT_INIT(&mail_storage_module_register);
 
 static void set_cache_decisions(struct mailbox *box,
-                               const char *set, const char *fields,
+                               const char *set, const ARRAY_TYPE(const_string) *fields,
                                enum mail_cache_decision_type dec)
 {
        struct mail_cache *cache = box->cache;
@@ -41,10 +42,7 @@ static void set_cache_decisions(struct mailbox *box,
        const char *const *arr;
        unsigned int idx;
 
-       if (fields == NULL || *fields == '\0')
-               return;
-
-       for (arr = t_strsplit_spaces(fields, " ,"); *arr != NULL; arr++) {
+       for (arr = settings_boollist_get(fields); *arr != NULL; arr++) {
                const char *name = *arr;
 
                idx = mail_cache_register_lookup(cache, name);
@@ -89,21 +87,21 @@ static void index_cache_register_defaults(struct mailbox *box)
                                   MAIL_INDEX_CACHE_FIELD_COUNT,
                                   MAIL_CACHE_TRUNCATE_NAME_FAIL);
 
-       if (strcmp(set->mail_never_cache_fields, "*") == 0) {
+       if (str_array_find(settings_boollist_get(&set->mail_never_cache_fields), "*")) {
                /* all caching disabled for now */
                box->mail_cache_disabled = TRUE;
                return;
        }
 
        set_cache_decisions(box, "mail_cache_fields",
-                           set->mail_cache_fields,
+                           &set->mail_cache_fields,
                            MAIL_CACHE_DECISION_TEMP);
        set_cache_decisions(box, "mail_always_cache_fields",
-                           set->mail_always_cache_fields,
+                           &set->mail_always_cache_fields,
                            MAIL_CACHE_DECISION_YES |
                            MAIL_CACHE_DECISION_FORCED);
        set_cache_decisions(box, "mail_never_cache_fields",
-                           set->mail_never_cache_fields,
+                           &set->mail_never_cache_fields,
                            MAIL_CACHE_DECISION_NO |
                            MAIL_CACHE_DECISION_FORCED);
 }
index 2510d590ad8b11d4fb39b58314b9e847556f7f64..3244328bfda679e161637d0a5163024d4273dd76 100644 (file)
@@ -42,9 +42,9 @@ static const struct setting_define mail_storage_setting_defines[] = {
        { .type = SET_FILTER_NAME, .key = "mail_attribute",
          .required_setting = "dict", },
        DEF(UINT, mail_prefetch_count),
-       DEF(STR, mail_cache_fields),
-       DEF(STR, mail_always_cache_fields),
-       DEF(STR, mail_never_cache_fields),
+       DEF(BOOLLIST, mail_cache_fields),
+       DEF(BOOLLIST, mail_always_cache_fields),
+       DEF(BOOLLIST, mail_never_cache_fields),
        DEF(STR, mail_server_comment),
        DEF(STR, mail_server_admin),
        DEF(TIME_HIDDEN, mail_cache_unaccessed_field_drop),
@@ -123,9 +123,7 @@ const struct mail_storage_settings mail_storage_default_settings = {
        .mail_ext_attachment_min_size = 1024*128,
        .mail_attachment_detection_options = ARRAY_INIT,
        .mail_prefetch_count = 0,
-       .mail_cache_fields = "flags",
-       .mail_always_cache_fields = "",
-       .mail_never_cache_fields = "imap.envelope",
+       .mail_always_cache_fields = ARRAY_INIT,
        .mail_server_comment = "",
        .mail_server_admin = "",
        .mail_cache_min_mail_count = 0,
@@ -195,6 +193,8 @@ const struct mail_storage_settings mail_storage_default_settings = {
 
 static const struct setting_keyvalue mail_storage_default_settings_keyvalue[] = {
        { "layout_index/mailbox_list_storage_escape_char", "^" },
+       { "mail_cache_fields", "flags" },
+       { "mail_never_cache_fields", "imap.envelope" },
        { NULL, NULL }
 };
 
@@ -407,15 +407,15 @@ fix_base_path(struct mail_user_settings *set, pool_t pool, const char **str)
 }
 
 /* <settings checks> */
-static bool mail_cache_fields_parse(const char *key, const char *value,
+static bool mail_cache_fields_parse(const char *key,
+                                   const ARRAY_TYPE(const_string) *value,
                                    const char **error_r)
 {
        const char *const *arr;
+       bool has_asterisk = FALSE;
+       size_t fields_count = 0;
 
-       if (value == set_value_unknown)
-               return TRUE;
-
-       for (arr = t_strsplit_spaces(value, " ,"); *arr != NULL; arr++) {
+       for (arr = settings_boollist_get(value); *arr != NULL; arr++) {
                const char *name = *arr;
 
                if (str_begins_icase(name, "hdr.", &name) &&
@@ -424,7 +424,15 @@ static bool mail_cache_fields_parse(const char *key, const char *value,
                                "Invalid %s: %s is not a valid header name",
                                key, name);
                        return FALSE;
+               } else if (strcmp(name, "*") == 0) {
+                       has_asterisk = TRUE;
                }
+               fields_count++;
+       }
+       if (has_asterisk && fields_count > 1) {
+               *error_r = t_strdup_printf(
+                       "Invalid %s: has multiple values while having \"*\" set", key);
+               return FALSE;
        }
        return TRUE;
 }
@@ -754,13 +762,13 @@ mail_storage_settings_ext_check(struct event *event ATTR_UNUSED,
        }
 
        if (!mail_cache_fields_parse("mail_cache_fields",
-                                    set->mail_cache_fields, error_r))
+                                    &set->mail_cache_fields, error_r))
                return FALSE;
        if (!mail_cache_fields_parse("mail_always_cache_fields",
-                                    set->mail_always_cache_fields, error_r))
+                                    &set->mail_always_cache_fields, error_r))
                return FALSE;
        if (!mail_cache_fields_parse("mail_never_cache_fields",
-                                    set->mail_never_cache_fields, error_r))
+                                    &set->mail_never_cache_fields, error_r))
                return FALSE;
 
        if ((fname = strrchr(set->mailbox_list_index_prefix, '/')) == NULL)
index 1255efc950f93f767ee0e5364ae79078478695f4..4d3ec3b474921f9174a7a03be04dcf99e4609a75 100644 (file)
@@ -23,9 +23,9 @@ struct mail_storage_settings {
        const char *mail_ext_attachment_hash;
        uoff_t mail_ext_attachment_min_size;
        unsigned int mail_prefetch_count;
-       const char *mail_cache_fields;
-       const char *mail_always_cache_fields;
-       const char *mail_never_cache_fields;
+       ARRAY_TYPE(const_string) mail_cache_fields;
+       ARRAY_TYPE(const_string) mail_always_cache_fields;
+       ARRAY_TYPE(const_string) mail_never_cache_fields;
        const char *mail_server_comment;
        const char *mail_server_admin;
        unsigned int mail_cache_min_mail_count;