]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Fix mailbox_list_index=yes + ACLs + auto=subscribe mailboxes
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 29 May 2017 14:20:48 +0000 (17:20 +0300)
committerGitLab <gitlab@git.dovecot.net>
Tue, 30 May 2017 07:00:34 +0000 (10:00 +0300)
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.

src/lib-storage/list/mailbox-list-index-iter.c
src/lib-storage/list/mailbox-list-index.h
src/lib-storage/mailbox-list-private.h

index ec05c4f6b5003918b7589ccc73d1d7bc6c126790..2887c17f22e60286834f00c29a9704659692557f 100644 (file)
@@ -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;
index 02dc4828b49b979f130246a1f47c53d3f51df463..35a7a3c130eefae4133b9d6ee88ad84fbda63884 100644 (file)
@@ -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;
index 0d84fa3de8c333d374607303dd1dde8f565f19bb..7680fdb208accea2bfd53c3f67d8d89cb802333d 100644 (file)
@@ -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;