From: sergey.kitov Date: Wed, 13 Sep 2023 10:52:57 +0000 (+0300) Subject: lib-storage: change mail_(always_|never_)cache_fields, to BOOLLIST. X-Git-Tag: 2.4.0~588 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e46c87f7cdb73be5b44fcfb1b60a6854668cceff;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: change mail_(always_|never_)cache_fields, to BOOLLIST. --- diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 7d59292fbe..fcef5f4c48 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -22,6 +22,7 @@ #include "index-attachment.h" #include "index-thread-private.h" #include "index-mailbox-size.h" +#include "settings-parser.h" #include #include @@ -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); } diff --git a/src/lib-storage/mail-storage-settings.c b/src/lib-storage/mail-storage-settings.c index 2510d590ad..3244328bfd 100644 --- a/src/lib-storage/mail-storage-settings.c +++ b/src/lib-storage/mail-storage-settings.c @@ -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) } /* */ -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) diff --git a/src/lib-storage/mail-storage-settings.h b/src/lib-storage/mail-storage-settings.h index 1255efc950..4d3ec3b474 100644 --- a/src/lib-storage/mail-storage-settings.h +++ b/src/lib-storage/mail-storage-settings.h @@ -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;