Mercurial > dovecot > core-2.2
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;