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