dovecot-2.1: imapc: Added imapc_list_prefix setting to limit wha...

dovecot at dovecot.org dovecot at dovecot.org
Fri Apr 20 22:27:12 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/03f44d61d582
changeset: 14459:03f44d61d582
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Apr 20 22:27:01 2012 +0300
description:
imapc: Added imapc_list_prefix setting to limit what mailboxes are accessed.

diffstat:

 src/lib-storage/index/imapc/imapc-list.c     |  49 +++++++++++++++++++++++++--
 src/lib-storage/index/imapc/imapc-settings.c |   2 +
 src/lib-storage/index/imapc/imapc-settings.h |   1 +
 3 files changed, 47 insertions(+), 5 deletions(-)

diffs (124 lines):

diff -r d27b743c9921 -r 03f44d61d582 src/lib-storage/index/imapc/imapc-list.c
--- a/src/lib-storage/index/imapc/imapc-list.c	Fri Apr 20 19:09:55 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-list.c	Fri Apr 20 22:27:01 2012 +0300
@@ -92,7 +92,7 @@
 
 	T_BEGIN {
 		const char *vname =
-			mailbox_list_default_get_vname(&list->list, name);
+			mailbox_list_get_vname(&list->list, name);
 
 		if ((info_flags & MAILBOX_NONEXISTENT) != 0)
 			node = mailbox_tree_lookup(tree, vname);
@@ -191,6 +191,37 @@
 	return list->sep;
 }
 
+static const char *
+imapc_list_get_storage_name(struct mailbox_list *_list, const char *vname)
+{
+	struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
+	const char *prefix = list->storage->set->imapc_list_prefix;
+	const char *storage_name;
+
+	storage_name = mailbox_list_default_get_storage_name(_list, vname);
+	if (*prefix != '\0') {
+		storage_name = t_strdup_printf("%s%c%s", prefix, list->sep,
+					       storage_name);
+	}
+	return storage_name;
+}
+
+static const char *
+imapc_list_get_vname(struct mailbox_list *_list, const char *storage_name)
+{
+	struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list;
+	const char *prefix = list->storage->set->imapc_list_prefix;
+	unsigned int prefix_len;
+
+	if (*prefix != '\0') {
+		prefix_len = strlen(prefix);
+		i_assert(strncmp(prefix, storage_name, prefix_len) == 0 &&
+			 storage_name[prefix_len] == list->sep);
+		storage_name += prefix_len+1;
+	}
+	return mailbox_list_default_get_vname(_list, storage_name);
+}
+
 static struct mailbox_list *imapc_list_get_fs(struct imapc_mailbox_list *list)
 {
 	struct mailbox_list_settings list_set;
@@ -313,14 +344,22 @@
 {
 	struct imapc_command *cmd;
 	struct imapc_simple_context ctx;
+	const char *pattern;
 
 	i_assert(list->sep != '\0');
 
 	if (list->refreshed_mailboxes)
 		return 0;
 
+	if (*list->storage->set->imapc_list_prefix == '\0')
+		pattern = "*";
+	else {
+		pattern = t_strdup_printf("%s%c*",
+			list->storage->set->imapc_list_prefix, list->sep);
+	}
+
 	cmd = imapc_list_simple_context_init(&ctx, list);
-	imapc_command_send(cmd, "LIST \"\" *");
+	imapc_command_sendf(cmd, "LIST \"\" %s", pattern);
 	mailbox_tree_deinit(&list->mailboxes);
 	list->mailboxes = mailbox_tree_init(list->sep);
 
@@ -611,7 +650,7 @@
 
 	i_assert(list->sep != '\0');
 
-	vname = mailbox_list_default_get_vname(_list, name);
+	vname = mailbox_list_get_vname(_list, name);
 	if (!list->refreshed_mailboxes) {
 		node = mailbox_tree_lookup(list->mailboxes, vname);
 		if (node != NULL)
@@ -646,8 +685,8 @@
 		imapc_is_valid_existing_name,
 		imapc_is_valid_create_name,
 		imapc_list_get_hierarchy_sep,
-		mailbox_list_default_get_vname,
-		mailbox_list_default_get_storage_name,
+		imapc_list_get_vname,
+		imapc_list_get_storage_name,
 		imapc_list_get_path,
 		imapc_list_get_temp_prefix,
 		imapc_list_join_refpattern,
diff -r d27b743c9921 -r 03f44d61d582 src/lib-storage/index/imapc/imapc-settings.c
--- a/src/lib-storage/index/imapc/imapc-settings.c	Fri Apr 20 19:09:55 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-settings.c	Fri Apr 20 22:27:01 2012 +0300
@@ -27,6 +27,7 @@
 
 	DEF(SET_STR, imapc_features),
 	DEF(SET_STR, imapc_rawlog_dir),
+	DEF(SET_STR, imapc_list_prefix),
 	DEF(SET_STR, ssl_crypto_device),
 
 	SETTING_DEFINE_LIST_END
@@ -46,6 +47,7 @@
 
 	.imapc_features = "",
 	.imapc_rawlog_dir = "",
+	.imapc_list_prefix = "",
 	.ssl_crypto_device = ""
 };
 
diff -r d27b743c9921 -r 03f44d61d582 src/lib-storage/index/imapc/imapc-settings.h
--- a/src/lib-storage/index/imapc/imapc-settings.h	Fri Apr 20 19:09:55 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-settings.h	Fri Apr 20 22:27:01 2012 +0300
@@ -22,6 +22,7 @@
 
 	const char *imapc_features;
 	const char *imapc_rawlog_dir;
+	const char *imapc_list_prefix;
 	const char *ssl_crypto_device;
 
 	enum imapc_features parsed_features;


More information about the dovecot-cvs mailing list