}
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)
{
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",
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;
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)
#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"
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));