From: Timo Sirainen Date: Mon, 29 May 2017 14:20:48 +0000 (+0300) Subject: lib-storage: Fix mailbox_list_index=yes + ACLs + auto=subscribe mailboxes X-Git-Tag: 2.3.0.rc1~1553 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f8a67af9b7bde79c186e6b82ea200d7fcf85571b;p=thirdparty%2Fdovecot%2Fcore.git 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. --- diff --git a/src/lib-storage/list/mailbox-list-index-iter.c b/src/lib-storage/list/mailbox-list-index-iter.c index ec05c4f6b5..2887c17f22 100644 --- a/src/lib-storage/list/mailbox-list-index-iter.c +++ b/src/lib-storage/list/mailbox-list-index-iter.c @@ -41,6 +41,11 @@ mailbox_list_index_iter_init(struct mailbox_list *list, 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 @@ mailbox_list_index_iter_init(struct mailbox_list *list, 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 @@ iter_subscriptions_ok(struct mailbox_list_index_iterate_context *ctx) 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 @@ mailbox_list_index_iter_next(struct mailbox_list_iterate_context *_ctx) 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; diff --git a/src/lib-storage/list/mailbox-list-index.h b/src/lib-storage/list/mailbox-list-index.h index 02dc4828b4..35a7a3c130 100644 --- a/src/lib-storage/list/mailbox-list-index.h +++ b/src/lib-storage/list/mailbox-list-index.h @@ -125,7 +125,6 @@ struct mailbox_list_index { 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; diff --git a/src/lib-storage/mailbox-list-private.h b/src/lib-storage/mailbox-list-private.h index 0d84fa3de8..7680fdb208 100644 --- a/src/lib-storage/mailbox-list-private.h +++ b/src/lib-storage/mailbox-list-private.h @@ -152,6 +152,7 @@ struct mailbox_list_iterate_context { 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;