dovecot-2.1: Moved mailbox {} settings inside namespace {} and n...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Dec 6 23:53:50 EET 2011
details: http://hg.dovecot.org/dovecot-2.1/rev/867f06516121
changeset: 13801:867f06516121
user: Timo Sirainen <tss at iki.fi>
date: Tue Dec 06 23:53:44 2011 +0200
description:
Moved mailbox {} settings inside namespace {} and no longer require ns prefix in name.
This allows specifying mailboxes more easily with per-user namespace
prefixes.
diffstat:
src/lib-storage/mail-namespace.h | 2 +-
src/lib-storage/mail-storage-settings.c | 108 +++++++++++++++-------------
src/lib-storage/mail-storage-settings.h | 2 +-
src/lib-storage/mail-storage.c | 17 ++++-
src/lib-storage/mailbox-list-iter.c | 46 ++++++++---
src/plugins/autocreate/autocreate-plugin.c | 34 ++++++--
6 files changed, 129 insertions(+), 80 deletions(-)
diffs (truncated from 355 to 300 lines):
diff -r 85f33815c5e7 -r 867f06516121 src/lib-storage/mail-namespace.h
--- a/src/lib-storage/mail-namespace.h Tue Dec 06 23:51:09 2011 +0200
+++ b/src/lib-storage/mail-namespace.h Tue Dec 06 23:53:44 2011 +0200
@@ -66,7 +66,7 @@
/* FIXME: we should support multiple storages in one namespace */
struct mail_storage *storage;
- const struct mail_namespace_settings *set, *unexpanded_set;
+ struct mail_namespace_settings *set, *unexpanded_set;
const struct mail_storage_settings *mail_set;
unsigned int destroyed:1;
diff -r 85f33815c5e7 -r 867f06516121 src/lib-storage/mail-storage-settings.c
--- a/src/lib-storage/mail-storage-settings.c Tue Dec 06 23:51:09 2011 +0200
+++ b/src/lib-storage/mail-storage-settings.c Tue Dec 06 23:53:44 2011 +0200
@@ -96,55 +96,6 @@
#undef DEF
#define DEF(type, name) \
- { type, #name, offsetof(struct mail_namespace_settings, name), NULL }
-
-static const struct setting_define mail_namespace_setting_defines[] = {
- DEF(SET_STR, name),
- DEF(SET_ENUM, type),
- DEF(SET_STR, separator),
- DEF(SET_STR_VARS, prefix),
- DEF(SET_STR_VARS, location),
- { SET_ALIAS, "mail", 0, NULL },
- { SET_ALIAS, "mail_location", 0, NULL },
- DEF(SET_STR_VARS, alias_for),
-
- DEF(SET_BOOL, inbox),
- DEF(SET_BOOL, hidden),
- DEF(SET_ENUM, list),
- DEF(SET_BOOL, subscriptions),
-
- SETTING_DEFINE_LIST_END
-};
-
-const struct mail_namespace_settings mail_namespace_default_settings = {
- .name = "",
- .type = "private:shared:public",
- .separator = "",
- .prefix = "",
- .location = "",
- .alias_for = NULL,
-
- .inbox = FALSE,
- .hidden = FALSE,
- .list = "yes:no:children",
- .subscriptions = TRUE
-};
-
-const struct setting_parser_info mail_namespace_setting_parser_info = {
- .defines = mail_namespace_setting_defines,
- .defaults = &mail_namespace_default_settings,
-
- .type_offset = offsetof(struct mail_namespace_settings, name),
- .struct_size = sizeof(struct mail_namespace_settings),
-
- .parent_offset = offsetof(struct mail_namespace_settings, user_set),
- .parent = &mail_user_setting_parser_info,
-
- .check_func = namespace_settings_check
-};
-
-#undef DEF
-#define DEF(type, name) \
{ type, #name, offsetof(struct mailbox_settings, name), NULL }
static const struct setting_define mailbox_setting_defines[] = {
@@ -179,6 +130,63 @@
#undef DEF
#undef DEFLIST_UNIQUE
#define DEF(type, name) \
+ { type, #name, offsetof(struct mail_namespace_settings, name), NULL }
+#define DEFLIST_UNIQUE(field, name, defines) \
+ { SET_DEFLIST_UNIQUE, name, \
+ offsetof(struct mail_namespace_settings, field), defines }
+
+static const struct setting_define mail_namespace_setting_defines[] = {
+ DEF(SET_STR, name),
+ DEF(SET_ENUM, type),
+ DEF(SET_STR, separator),
+ DEF(SET_STR_VARS, prefix),
+ DEF(SET_STR_VARS, location),
+ { SET_ALIAS, "mail", 0, NULL },
+ { SET_ALIAS, "mail_location", 0, NULL },
+ DEF(SET_STR_VARS, alias_for),
+
+ DEF(SET_BOOL, inbox),
+ DEF(SET_BOOL, hidden),
+ DEF(SET_ENUM, list),
+ DEF(SET_BOOL, subscriptions),
+
+ DEFLIST_UNIQUE(mailboxes, "mailbox", &mailbox_setting_parser_info),
+
+ SETTING_DEFINE_LIST_END
+};
+
+const struct mail_namespace_settings mail_namespace_default_settings = {
+ .name = "",
+ .type = "private:shared:public",
+ .separator = "",
+ .prefix = "",
+ .location = "",
+ .alias_for = NULL,
+
+ .inbox = FALSE,
+ .hidden = FALSE,
+ .list = "yes:no:children",
+ .subscriptions = TRUE,
+
+ .mailboxes = ARRAY_INIT
+};
+
+const struct setting_parser_info mail_namespace_setting_parser_info = {
+ .defines = mail_namespace_setting_defines,
+ .defaults = &mail_namespace_default_settings,
+
+ .type_offset = offsetof(struct mail_namespace_settings, name),
+ .struct_size = sizeof(struct mail_namespace_settings),
+
+ .parent_offset = offsetof(struct mail_namespace_settings, user_set),
+ .parent = &mail_user_setting_parser_info,
+
+ .check_func = namespace_settings_check
+};
+
+#undef DEF
+#undef DEFLIST_UNIQUE
+#define DEF(type, name) \
{ type, #name, offsetof(struct mail_user_settings, name), NULL }
#define DEFLIST_UNIQUE(field, name, defines) \
{ SET_DEFLIST_UNIQUE, name, \
@@ -208,7 +216,6 @@
DEF(SET_STR, mail_log_prefix),
DEFLIST_UNIQUE(namespaces, "namespace", &mail_namespace_setting_parser_info),
- DEFLIST_UNIQUE(mailboxes, "mailbox", &mailbox_setting_parser_info),
{ SET_STRLIST, "plugin", offsetof(struct mail_user_settings, plugin_envs), NULL },
SETTING_DEFINE_LIST_END
@@ -238,7 +245,6 @@
.mail_log_prefix = "%s(%u): ",
.namespaces = ARRAY_INIT,
- .mailboxes = ARRAY_INIT,
.plugin_envs = ARRAY_INIT
};
diff -r 85f33815c5e7 -r 867f06516121 src/lib-storage/mail-storage-settings.h
--- a/src/lib-storage/mail-storage-settings.h Tue Dec 06 23:51:09 2011 +0200
+++ b/src/lib-storage/mail-storage-settings.h Tue Dec 06 23:53:44 2011 +0200
@@ -52,6 +52,7 @@
const char *list;
bool subscriptions;
+ ARRAY_DEFINE(mailboxes, struct mailbox_settings *);
struct mail_user_settings *user_set;
};
@@ -88,7 +89,6 @@
const char *mail_log_prefix;
ARRAY_DEFINE(namespaces, struct mail_namespace_settings *);
- ARRAY_DEFINE(mailboxes, struct mailbox_settings *);
ARRAY_DEFINE(plugin_envs, const char *);
};
diff -r 85f33815c5e7 -r 867f06516121 src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c Tue Dec 06 23:51:09 2011 +0200
+++ b/src/lib-storage/mail-storage.c Tue Dec 06 23:53:44 2011 +0200
@@ -606,11 +606,24 @@
mailbox_settings_find(struct mail_user *user, const char *vname)
{
struct mailbox_settings *const *box_set;
+ struct mail_namespace *ns;
- if (!array_is_created(&user->set->mailboxes))
+ ns = mail_namespace_find(user->namespaces, vname);
+ if (ns == NULL)
+ return NULL;
+ if (!array_is_created(&ns->set->mailboxes))
return NULL;
- array_foreach(&user->set->mailboxes, box_set) {
+ if (ns->prefix_len > 0 &&
+ strncmp(ns->prefix, vname, ns->prefix_len-1) == 0) {
+ if (vname[ns->prefix_len-1] == mail_namespace_get_sep(ns))
+ vname += ns->prefix_len;
+ else if (vname[ns->prefix_len-1] == '\0') {
+ /* namespace prefix itself */
+ vname = "";
+ }
+ }
+ array_foreach(&ns->set->mailboxes, box_set) {
if (strcmp((*box_set)->name, vname) == 0)
return *box_set;
}
diff -r 85f33815c5e7 -r 867f06516121 src/lib-storage/mailbox-list-iter.c
--- a/src/lib-storage/mailbox-list-iter.c Tue Dec 06 23:51:09 2011 +0200
+++ b/src/lib-storage/mailbox-list-iter.c Tue Dec 06 23:53:44 2011 +0200
@@ -73,19 +73,39 @@
return ns->list->v.subscriptions_refresh(ns->list, list);
}
+static struct mailbox_settings *
+mailbox_settings_add_ns_prefix(pool_t pool, struct mail_namespace *ns,
+ struct mailbox_settings *in_set)
+{
+ struct mailbox_settings *out_set;
+
+ if (ns->prefix_len == 0 || strcasecmp(in_set->name, "INBOX") == 0)
+ return in_set;
+
+ out_set = p_new(pool, struct mailbox_settings, 1);
+ *out_set = *in_set;
+ if (*in_set->name == '\0') {
+ /* namespace prefix itself */
+ out_set->name = p_strndup(pool, ns->prefix, ns->prefix_len-1);
+ } else {
+ out_set->name =
+ p_strconcat(pool, ns->prefix, in_set->name, NULL);
+ }
+ return out_set;
+}
+
static void
mailbox_list_iter_init_autocreate(struct mailbox_list_iterate_context *ctx)
{
- struct mail_user *user = ctx->list->ns->user;
+ struct mail_namespace *ns = ctx->list->ns;
struct mailbox_list_autocreate_iterate_context *actx;
- struct mailbox_settings *const *box_sets;
- struct mail_namespace *ns;
+ struct mailbox_settings *const *box_sets, *set;
struct autocreate_box *autobox;
unsigned int i, count;
- if (!array_is_created(&user->set->mailboxes))
+ if (!array_is_created(&ns->set->mailboxes))
return;
- box_sets = array_get(&user->set->mailboxes, &count);
+ box_sets = array_get(&ns->set->mailboxes, &count);
if (count == 0)
return;
@@ -100,19 +120,17 @@
if (strcmp(box_sets[i]->autocreate, MAILBOX_SET_AUTO_NO) == 0)
continue;
- ns = mail_namespace_find(user->namespaces, box_sets[i]->name);
- if (ns != ctx->list->ns)
- continue;
+ set = mailbox_settings_add_ns_prefix(ctx->pool,
+ ns, box_sets[i]);
/* autocreate mailbox belongs to listed namespace */
- array_append(&actx->all_ns_box_sets, &box_sets[i], 1);
+ array_append(&actx->all_ns_box_sets, &set, 1);
if ((ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) == 0 ||
- strcmp(box_sets[i]->autocreate,
- MAILBOX_SET_AUTO_SUBSCRIBE) == 0) {
- array_append(&actx->box_sets, &box_sets[i], 1);
+ strcmp(set->autocreate, MAILBOX_SET_AUTO_SUBSCRIBE) == 0) {
+ array_append(&actx->box_sets, &set, 1);
autobox = array_append_space(&actx->boxes);
- autobox->name = box_sets[i]->name;
- autobox->set = box_sets[i];
+ autobox->name = set->name;
+ autobox->set = set;
}
}
}
diff -r 85f33815c5e7 -r 867f06516121 src/plugins/autocreate/autocreate-plugin.c
--- a/src/plugins/autocreate/autocreate-plugin.c Tue Dec 06 23:51:09 2011 +0200
+++ b/src/plugins/autocreate/autocreate-plugin.c Tue Dec 06 23:53:44 2011 +0200
@@ -7,15 +7,16 @@
#include "array.h"
#include "unichar.h"
#include "mail-user.h"
+#include "mail-namespace.h"
#include "mail-storage-hooks.h"
#include "autocreate-plugin.h"
static struct mailbox_settings *
-mailbox_settings_find(struct mail_user *user, const char *vname)
+mailbox_settings_find(struct mail_namespace *ns, const char *vname)
{
struct mailbox_settings *const *box_set;
- array_foreach(&user->set->mailboxes, box_set) {
+ array_foreach(&ns->set->mailboxes, box_set) {
if (strcmp((*box_set)->name, vname) == 0)
return *box_set;
}
@@ -25,6 +26,7 @@
static void
add_autobox(struct mail_user *user, const char *vname, bool subscriptions)
More information about the dovecot-cvs
mailing list