]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Add all matching mailbox settings_filter_names to mailbox events
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 22 Jan 2025 10:57:40 +0000 (12:57 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:16 +0000 (12:34 +0200)
src/lib-storage/mail-storage-settings.c
src/lib-storage/mail-storage-settings.h
src/lib-storage/mail-storage.c

index 4267196124929d95be5eee6d8edf0d734b475fcb..e7743c47f89b8ed3f0a7fd18853bea83b3cb23cb 100644 (file)
@@ -774,7 +774,7 @@ mail_storage_settings_ext_check(struct event *event ATTR_UNUSED,
 }
 
 static int
-namespace_parse_mailboxes(struct event *event,
+namespace_parse_mailboxes(struct event *event, pool_t pool,
                          struct mail_namespace_settings *ns,
                          const char **error_r)
 {
@@ -782,18 +782,18 @@ namespace_parse_mailboxes(struct event *event,
        const char *box_name, *error;
        int ret = 0;
 
-       if (!array_is_created(&ns->mailboxes))
+       if (array_is_empty(&ns->mailboxes))
                return 0;
 
+       p_array_init(&ns->parsed_mailbox_names, pool,
+                    array_count(&ns->mailboxes));
        event = event_create(event);
        event_add_str(event, SETTINGS_EVENT_NAMESPACE_NAME, ns->name);
        array_foreach_elem(&ns->mailboxes, box_name) {
                if (settings_get_filter(event,
                                        SETTINGS_EVENT_MAILBOX_NAME_WITHOUT_PREFIX,
                                        box_name,
-                                       &mailbox_setting_parser_info,
-                                       SETTINGS_GET_FLAG_NO_CHECK |
-                                       SETTINGS_GET_FLAG_FAKE_EXPAND,
+                                       &mailbox_setting_parser_info, 0,
                                        &box_set, &error) < 0) {
                        *error_r = t_strdup_printf(
                                "Failed to get mailbox %s: %s",
@@ -801,19 +801,19 @@ namespace_parse_mailboxes(struct event *event,
                        ret = -1;
                        break;
                }
+               const char *name_dup = p_strdup(pool, box_set->name);
+               array_push_back(&ns->parsed_mailbox_names, &name_dup);
                bool have_special_use = array_not_empty(&box_set->special_use);
                settings_free(box_set);
-               if (have_special_use) {
+               if (have_special_use)
                        ns->parsed_have_special_use_mailboxes = TRUE;
-                       break;
-               }
        }
        event_unref(&event);
        return ret;
 }
 
 static bool namespace_settings_ext_check(struct event *event,
-                                        void *_set, pool_t pool ATTR_UNUSED,
+                                        void *_set, pool_t pool,
                                         const char **error_r)
 {
        struct mail_namespace_settings *ns = _set;
@@ -830,7 +830,7 @@ static bool namespace_settings_ext_check(struct event *event,
                return FALSE;
        }
 
-       return namespace_parse_mailboxes(event, ns, error_r) == 0;
+       return namespace_parse_mailboxes(event, pool, ns, error_r) == 0;
 }
 
 static bool mailbox_special_use_exists(const char *name)
index a233a599b078ccf957760f1db8d86713153ff20a..919320792055aa42ce3802fbe8bed40170c1aa26 100644 (file)
@@ -129,7 +129,11 @@ struct mail_namespace_settings {
        bool disabled;
        unsigned int order;
 
+       /* List of mailbox filter names */
        ARRAY_TYPE(const_string) mailboxes;
+       /* mailbox_name of each mailbox. This is used for matching mailbox
+          settings for mailbox names. */
+       ARRAY_TYPE(const_string) parsed_mailbox_names;
        bool parsed_have_special_use_mailboxes;
 };
 
index 37a66a07865b576151a2070550e426df2170afcd..ace1a3e75ec1a1cb1089b6d0121be39846a61680 100644 (file)
@@ -17,6 +17,7 @@
 #include "eacces-error.h"
 #include "mkdir-parents.h"
 #include "time-util.h"
+#include "wildcard-match.h"
 #include "settings.h"
 #include "dsasl-client.h"
 #include "imap-date.h"
@@ -3454,12 +3455,39 @@ mailbox_get_name_without_prefix(struct mail_namespace *ns,
        return vname;
 }
 
+static void mailbox_settings_filters_add(struct event *event,
+                                        struct mailbox_list *list,
+                                        const char *vname)
+{
+       if (array_is_empty(&list->ns->set->mailboxes))
+               return;
+
+       const char *vname_without_prefix =
+               mailbox_get_name_without_prefix(list->ns, vname);
+       unsigned int i, count;
+       const char *const *mailbox_names =
+               array_get(&list->ns->set->parsed_mailbox_names, &count);
+
+       for (i = 0; i < count; i++) {
+               if (!wildcard_match(vname_without_prefix, mailbox_names[i]))
+                       continue;
+
+               const char *filter_name =
+                       array_idx_elem(&list->ns->set->mailboxes, i);
+               settings_event_add_list_filter_name(event,
+                       SETTINGS_EVENT_MAILBOX_NAME_WITHOUT_PREFIX,
+                       filter_name);
+       }
+}
+
 struct event *
 mail_storage_mailbox_create_event(struct event *parent,
                                  struct mailbox_list *list, const char *vname)
 {
        struct event *event = event_create(parent);
        event_add_category(event, &event_category_mailbox);
+
+       mailbox_settings_filters_add(event, list, vname);
        event_add_str(event, SETTINGS_EVENT_MAILBOX_NAME_WITH_PREFIX, vname);
        event_add_str(event, SETTINGS_EVENT_MAILBOX_NAME_WITHOUT_PREFIX,
                      mailbox_get_name_without_prefix(list->ns, vname));