changeset 22113:cc2b63af85c1

lib-storage: Fix mailbox_list_index=yes + ACLs + auto=subscribe mailboxes If the auto=subscribe mailbox didn't have a lookup ACL, it shouldn't have been listed. This didn't work properly, because ACL plugin initialized the autocreate_ctx only for the index iterator, while the autoboxes were listed using the backend iterator. Fixed by not creating index iterator at all when doing a passthrough iteration.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 29 May 2017 17:20:48 +0300
parents 40df5a1df6b1
children eaddde982df5
files src/lib-storage/list/mailbox-list-index-iter.c src/lib-storage/list/mailbox-list-index.h src/lib-storage/mailbox-list-private.h
diffstat 3 files changed, 24 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-index-iter.c	Mon May 29 16:44:44 2017 +0300
+++ b/src/lib-storage/list/mailbox-list-index-iter.c	Mon May 29 17:20:48 2017 +0300
@@ -41,6 +41,11 @@
 	pool_t pool;
 	char ns_sep = mail_namespace_get_sep(list->ns);
 
+	if (!iter_use_index(list, flags)) {
+		/* no indexing */
+		return ilist->module_ctx.super.iter_init(list, patterns, flags);
+	}
+
 	pool = pool_alloconly_create("mailbox list index iter", 2048);
 	ctx = p_new(pool, struct mailbox_list_index_iterate_context, 1);
 	ctx->ctx.pool = pool;
@@ -49,20 +54,14 @@
 	ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, ns_sep);
 	array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
 	ctx->info_pool = pool_alloconly_create("mailbox list index iter info", 128);
+	ctx->ctx.index_iteration = TRUE;
 
-	if (!iter_use_index(list, flags)) {
-		/* no indexing */
-		ctx->backend_ctx = ilist->module_ctx.super.
-			iter_init(list, patterns, flags);
-		mailbox_list_iter_init_autocreate(ctx->backend_ctx);
-	} else {
-		/* listing mailboxes from index */
-		ctx->info.ns = list->ns;
-		ctx->path = str_new(pool, 128);
-		ctx->next_node = ilist->mailbox_tree;
-		ctx->mailbox_pool = ilist->mailbox_pool;
-		pool_ref(ctx->mailbox_pool);
-	}
+	/* listing mailboxes from index */
+	ctx->info.ns = list->ns;
+	ctx->path = str_new(pool, 128);
+	ctx->next_node = ilist->mailbox_tree;
+	ctx->mailbox_pool = ilist->mailbox_pool;
+	pool_ref(ctx->mailbox_pool);
 	return &ctx->ctx;
 }
 
@@ -156,18 +155,17 @@
 const struct mailbox_info *
 mailbox_list_index_iter_next(struct mailbox_list_iterate_context *_ctx)
 {
+	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list);
+	if (!_ctx->index_iteration) {
+		/* index isn't being used */
+		return ilist->module_ctx.super.iter_next(_ctx);
+	}
+
 	struct mailbox_list_index_iterate_context *ctx =
 		(struct mailbox_list_index_iterate_context *)_ctx;
-	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list);
 	bool follow_children;
 	enum imap_match_result match;
 
-	if (ctx->backend_ctx != NULL) {
-		/* index isn't being used */
-		return mailbox_list_iter_autocreate_filter(ctx->backend_ctx,
-			ilist->module_ctx.super.iter_next(ctx->backend_ctx));
-	}
-
 	/* listing mailboxes from index */
 	while (ctx->next_node != NULL) {
 		mailbox_list_index_update_info(ctx);
@@ -191,16 +189,15 @@
 
 int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx)
 {
+	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list);
+	if (!_ctx->index_iteration)
+		return ilist->module_ctx.super.iter_deinit(_ctx);
+
 	struct mailbox_list_index_iterate_context *ctx =
 		(struct mailbox_list_index_iterate_context *)_ctx;
-	struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list);
 	int ret = ctx->failed ? -1 : 0;
 
-	if (ctx->backend_ctx != NULL)
-		ret = ilist->module_ctx.super.iter_deinit(ctx->backend_ctx);
-	else
-		pool_unref(&ctx->mailbox_pool);
-
+	pool_unref(&ctx->mailbox_pool);
 	pool_unref(&ctx->info_pool);
 	pool_unref(&_ctx->pool);
 	return ret;
--- a/src/lib-storage/list/mailbox-list-index.h	Mon May 29 16:44:44 2017 +0300
+++ b/src/lib-storage/list/mailbox-list-index.h	Mon May 29 17:20:48 2017 +0300
@@ -125,7 +125,6 @@
 
 struct mailbox_list_index_iterate_context {
 	struct mailbox_list_iterate_context ctx;
-	struct mailbox_list_iterate_context *backend_ctx;
 	pool_t mailbox_pool;
 
 	struct mailbox_info info;
--- a/src/lib-storage/mailbox-list-private.h	Mon May 29 16:44:44 2017 +0300
+++ b/src/lib-storage/mailbox-list-private.h	Mon May 29 17:20:48 2017 +0300
@@ -152,6 +152,7 @@
 	pool_t pool;
 	enum mailbox_list_iter_flags flags;
 	bool failed;
+	bool index_iteration;
 
 	struct imap_match_glob *glob;
 	struct mailbox_list_autocreate_iterate_context *autocreate_ctx;