From: sergey.kitov Date: Thu, 21 Sep 2023 08:43:27 +0000 (+0300) Subject: lib-storate & imap: change special_use to BOOLLIST. X-Git-Tag: 2.4.1~847 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=87b91b1d1a1f3533a6b456c5f57846c7de6e1101;p=thirdparty%2Fdovecot%2Fcore.git lib-storate & imap: change special_use to BOOLLIST. --- diff --git a/src/imap/cmd-copy.c b/src/imap/cmd-copy.c index ad0dc0cb9f..aecd43bb8f 100644 --- a/src/imap/cmd-copy.c +++ b/src/imap/cmd-copy.c @@ -11,6 +11,7 @@ #include "imap-storage-callbacks.h" #include "mail-storage.h" #include "time-util.h" +#include "settings-parser.h" #include @@ -64,8 +65,8 @@ static void copy_update_trashed(struct client *client, struct mailbox *box, const struct mailbox_settings *set; set = mailbox_get_settings(box); - if (set != NULL && set->special_use[0] != '\0' && - str_array_icase_find(t_strsplit_spaces(set->special_use, " "), + if (set != NULL && array_not_empty(&set->special_use) && + str_array_icase_find(settings_boollist_get(&set->special_use), "\\Trash")) client->trashed_count += count; } diff --git a/src/lib-storage/list/mailbox-list-iter.c b/src/lib-storage/list/mailbox-list-iter.c index b04da76e7e..eea9115aef 100644 --- a/src/lib-storage/list/mailbox-list-iter.c +++ b/src/lib-storage/list/mailbox-list-iter.c @@ -983,8 +983,8 @@ static bool autocreate_iter_autobox(struct mailbox_list_iterate_context *ctx, match = imap_match(ctx->glob, actx->new_info.vname); if (match == IMAP_MATCH_YES) { actx->new_info.special_use = - *autobox->set->special_use == '\0' ? NULL : - autobox->set->special_use; + array_is_empty(&autobox->set->special_use) ? NULL : + t_array_const_string_join(&autobox->set->special_use, " "); return TRUE; } if ((match & IMAP_MATCH_PARENT) != 0 && !autobox->child_listed) { @@ -1045,11 +1045,10 @@ mailbox_list_iter_next_call(struct mailbox_list_iterate_context *ctx) ctx->failed = TRUE; return NULL; } - if (*set->special_use != '\0') { + if (array_not_empty(&set->special_use)) { ctx->specialuse_info = *info; ctx->specialuse_info.special_use = - *set->special_use == '\0' ? NULL : - set->special_use; + t_array_const_string_join(&set->special_use, " "); info = &ctx->specialuse_info; } settings_free(set); diff --git a/src/lib-storage/mail-storage-settings.c b/src/lib-storage/mail-storage-settings.c index 44f5204224..83fd26071f 100644 --- a/src/lib-storage/mail-storage-settings.c +++ b/src/lib-storage/mail-storage-settings.c @@ -219,7 +219,7 @@ static const struct setting_define mailbox_setting_defines[] = { DEF(STR, name), { .type = SET_ENUM, .key = "mailbox_auto", .offset = offsetof(struct mailbox_settings, autocreate) } , - DEF(STR, special_use), + DEF(BOOLLIST, special_use), DEF(STR, comment), DEF(TIME, autoexpunge), DEF(UINT, autoexpunge_max_mails), @@ -232,7 +232,7 @@ const struct mailbox_settings mailbox_default_settings = { .autocreate = MAILBOX_SET_AUTO_NO":" MAILBOX_SET_AUTO_CREATE":" MAILBOX_SET_AUTO_SUBSCRIBE, - .special_use = "", + .special_use = ARRAY_INIT, .comment = "", .autoexpunge = 0, .autoexpunge_max_mails = 0 @@ -844,7 +844,7 @@ namespace_have_special_use_mailboxes(struct event *event, box_name, error); break; } - bool have_special_use = box_set->special_use[0] != '\0'; + bool have_special_use = array_not_empty(&box_set->special_use); settings_free(box_set); if (have_special_use) { ret = 1; @@ -908,12 +908,12 @@ static bool mailbox_special_use_exists(const char *name) } static void -mailbox_special_use_check(struct mailbox_settings *set, pool_t pool) +mailbox_special_use_check(struct mailbox_settings *set) { - const char *const *uses, *str; + const char *const *uses; unsigned int i; - uses = t_strsplit_spaces(set->special_use, " "); + uses = settings_boollist_get(&set->special_use); for (i = 0; uses[i] != NULL; i++) { if (!mailbox_special_use_exists(uses[i])) { i_warning("mailbox %s: special_use label %s is not an " @@ -921,13 +921,9 @@ mailbox_special_use_check(struct mailbox_settings *set, pool_t pool) set->name, uses[i]); } } - /* make sure there are no extra spaces */ - str = t_strarray_join(uses, " "); - if (strcmp(str, set->special_use) != 0) - set->special_use = p_strdup(pool, str); } -static bool mailbox_settings_check(void *_set, pool_t pool, +static bool mailbox_settings_check(void *_set, pool_t pool ATTR_UNUSED, const char **error_r) { struct mailbox_settings *set = _set; @@ -937,9 +933,7 @@ static bool mailbox_settings_check(void *_set, pool_t pool, set->name); return FALSE; } - if (*set->special_use != '\0') { - mailbox_special_use_check(set, pool); - } + mailbox_special_use_check(set); return TRUE; } diff --git a/src/lib-storage/mail-storage-settings.h b/src/lib-storage/mail-storage-settings.h index eb230a6da6..f5bb81169e 100644 --- a/src/lib-storage/mail-storage-settings.h +++ b/src/lib-storage/mail-storage-settings.h @@ -142,7 +142,7 @@ struct mailbox_settings { pool_t pool; const char *name; const char *autocreate; - const char *special_use; + ARRAY_TYPE(const_string) special_use; const char *comment; unsigned int autoexpunge; unsigned int autoexpunge_max_mails; diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 63a8514a3a..173c8173b5 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -1907,7 +1907,8 @@ bool mailbox_has_special_use(struct mailbox *box, const char *special_use) { if (box->set == NULL) return FALSE; - return str_contains_special_use(box->set->special_use, special_use); + return str_contains_special_use(t_array_const_string_join(&box->set->special_use, " "), + special_use); } static void mailbox_copy_cache_decisions_from_inbox(struct mailbox *box) diff --git a/src/lib-storage/mailbox-attribute-internal.c b/src/lib-storage/mailbox-attribute-internal.c index d5d02652d5..ce24b93419 100644 --- a/src/lib-storage/mailbox-attribute-internal.c +++ b/src/lib-storage/mailbox-attribute-internal.c @@ -1,6 +1,7 @@ /* Copyright (c) 2003-2018 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "array.h" #include "mail-storage-private.h" #include "mailbox-attribute-internal.h" @@ -17,10 +18,10 @@ mailbox_attribute_specialuse_get(struct mailbox *box, { const struct mailbox_settings *set = box->set; - if (set == NULL || *set->special_use == '\0') + if (set == NULL || array_is_empty(&set->special_use)) return 0; - value_r->value = set->special_use; + value_r->value = t_array_const_string_join(&set->special_use, " "); return 1; }