From: Timo Sirainen Date: Wed, 22 Jan 2025 10:57:40 +0000 (+0200) Subject: lib-storage: Add all matching mailbox settings_filter_names to mailbox events X-Git-Tag: 2.4.1~263 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0bd8fbfdff1494698a56c7557dae2698c075620e;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add all matching mailbox settings_filter_names to mailbox events --- diff --git a/src/lib-storage/mail-storage-settings.c b/src/lib-storage/mail-storage-settings.c index 4267196124..e7743c47f8 100644 --- a/src/lib-storage/mail-storage-settings.c +++ b/src/lib-storage/mail-storage-settings.c @@ -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) diff --git a/src/lib-storage/mail-storage-settings.h b/src/lib-storage/mail-storage-settings.h index a233a599b0..9193207920 100644 --- a/src/lib-storage/mail-storage-settings.h +++ b/src/lib-storage/mail-storage-settings.h @@ -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; }; diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 37a66a0786..ace1a3e75e 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -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));