]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storate & imap: change special_use to BOOLLIST.
authorsergey.kitov <sergey.kitov@open-xchange.com>
Thu, 21 Sep 2023 08:43:27 +0000 (11:43 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:13 +0000 (12:34 +0200)
src/imap/cmd-copy.c
src/lib-storage/list/mailbox-list-iter.c
src/lib-storage/mail-storage-settings.c
src/lib-storage/mail-storage-settings.h
src/lib-storage/mail-storage.c
src/lib-storage/mailbox-attribute-internal.c

index ad0dc0cb9f251efcda3bafd340cf357ea0b5b7ab..aecd43bb8f0feb693dad03e8b2b3758629ffa575 100644 (file)
@@ -11,6 +11,7 @@
 #include "imap-storage-callbacks.h"
 #include "mail-storage.h"
 #include "time-util.h"
+#include "settings-parser.h"
 
 #include <time.h>
 
@@ -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;
 }
index b04da76e7e0025d07f18abf95373b1d1463a9f97..eea9115aef2d3b238b8425dd0c82c8d8119ae068 100644 (file)
@@ -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);
index 44f5204224ddfa08e4d15f0de99e918c34f5441d..83fd26071fb70cc7a940d4d1c677d1e4df794674 100644 (file)
@@ -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;
 }
 
index eb230a6da64eb75cfddef8f2bc36afc2446b3b09..f5bb81169e55af4cb3d4b898c4c731c980e95b90 100644 (file)
@@ -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;
index 63a8514a3a4f01e75d08218cc0e82539dc0b1f8d..173c8173b577941c1ea87efe280d3e569d47a03e 100644 (file)
@@ -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)
index d5d02652d598d88b4370caf57b5c6835f12a4341..ce24b9341909f35a0b1260bb8622852ef6f2ba32 100644 (file)
@@ -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;
 }