]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Add and use default mailbox iterator
authorAki Tuomi <aki.tuomi@dovecot.fi>
Sat, 25 Feb 2017 21:34:03 +0000 (23:34 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 27 Mar 2017 09:52:41 +0000 (12:52 +0300)
The idea is to allow mail plugins to see also the non-existent
autoboxes by feeding them thru the iterator.

Fixes problem where autocreated boxes are not seen by ACL
plugin.

src/lib-storage/index/imapc/imapc-list.c
src/lib-storage/list/mailbox-list-fs-iter.c
src/lib-storage/list/mailbox-list-index-iter.c
src/lib-storage/list/mailbox-list-iter.c
src/lib-storage/list/mailbox-list-maildir-iter.c
src/lib-storage/list/mailbox-list-subscriptions.c
src/lib-storage/mailbox-list-private.h

index 82094504fc1f74be700d4814df6bd16442a945e4..ac999d83f14868b5a019b06adb138a9e6f326a01 100644 (file)
@@ -725,7 +725,7 @@ imapc_list_iter_next(struct mailbox_list_iterate_context *_ctx)
        do {
                node = mailbox_tree_iterate_next(ctx->iter, &vname);
                if (node == NULL)
-                       return NULL;
+                       return mailbox_list_iter_default_next(_ctx);
        } while ((node->flags & MAILBOX_MATCHED) == 0);
 
        if (ctx->info.ns->prefix_len > 0 &&
index d3c931016ab156cae732bba906669aed23b945ca..347405af2a60d379a82477a13da987c252ae2201 100644 (file)
@@ -795,7 +795,9 @@ fs_list_iter_next(struct mailbox_list_iterate_context *_ctx)
                ret = fs_list_next(ctx);
        } T_END;
 
-       if (ret <= 0)
+       if (ret == 0)
+               return mailbox_list_iter_default_next(_ctx);
+       else if (ret < 0)
                return NULL;
 
        if (_ctx->list->ns->type == MAIL_NAMESPACE_TYPE_SHARED &&
index 6293722861c673105e6a810456ad78425e051c0b..c1a0d7d2d6efb3ed2faa1b2100bfeee3fccee711 100644 (file)
@@ -53,6 +53,7 @@ mailbox_list_index_iter_init(struct mailbox_list *list,
                /* 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;
@@ -183,7 +184,7 @@ mailbox_list_index_iter_next(struct mailbox_list_iterate_context *_ctx)
                }
                mailbox_list_index_update_next(ctx, follow_children);
        }
-       return NULL;
+       return mailbox_list_iter_default_next(_ctx);
 }
 
 int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx)
index d6a3dcdf4c23e0c940d6f477c9abdcfa224a7eab..89aaa51fb31bfafc25679fb295d8fe2cafc45b51 100644 (file)
@@ -973,25 +973,25 @@ mailbox_list_iter_next_call(struct mailbox_list_iterate_context *ctx)
                        info = &ctx->specialuse_info;
                }
        }
+
+       if (info != NULL && ctx->autocreate_ctx != NULL) {
+               ctx->autocreate_ctx->new_info = *info;
+               return autocreate_iter_existing(ctx);
+       }
+
        return info;
 }
 
-static const struct mailbox_info *
-autocreate_iter_next(struct mailbox_list_iterate_context *ctx)
+const struct mailbox_info *
+mailbox_list_iter_default_next(struct mailbox_list_iterate_context *ctx)
 {
        struct mailbox_list_autocreate_iterate_context *actx =
                ctx->autocreate_ctx;
-       const struct mailbox_info *info;
        const struct autocreate_box *autoboxes, *autobox;
        unsigned int count;
 
-       if (actx->idx == 0) {
-               info = mailbox_list_iter_next_call(ctx);
-               if (info != NULL) {
-                       actx->new_info = *info;
-                       return autocreate_iter_existing(ctx);
-               }
-       }
+       if (actx == NULL)
+               return NULL;
 
        /* list missing mailboxes */
        autoboxes = array_get(&actx->boxes, &count);
@@ -1028,10 +1028,7 @@ mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx)
                return NULL;
        do {
                T_BEGIN {
-                       if (ctx->autocreate_ctx != NULL)
-                               info = autocreate_iter_next(ctx);
-                       else
-                               info = mailbox_list_iter_next_call(ctx);
+                       info = mailbox_list_iter_next_call(ctx);
                } T_END;
        } while (info != NULL && !special_use_selection(ctx, info));
        return info;
index 1b5555a1e3d926135efd3f3eb38b0196460a47bd..83cdddeaec3d05f0d986be69f86d98b5a46082c2 100644 (file)
@@ -499,7 +499,7 @@ maildir_list_iter_next(struct mailbox_list_iterate_context *_ctx)
 
        node = mailbox_tree_iterate_next(ctx->tree_iter, &ctx->info.vname);
        if (node == NULL)
-               return NULL;
+               return mailbox_list_iter_default_next(_ctx);
 
        ctx->info.flags = node->flags;
        if ((_ctx->flags & MAILBOX_LIST_ITER_RETURN_SUBSCRIBED) != 0 &&
index b0a8a37b8e00e32f98087fedfb7daa0ad0da04b5..ed7e8a533a01e10843d4d6f324c2e23fcb9fd9cd 100644 (file)
@@ -263,7 +263,7 @@ mailbox_list_subscriptions_iter_next(struct mailbox_list_iterate_context *_ctx)
 
        node = mailbox_tree_iterate_next(ctx->iter, &vname);
        if (node == NULL)
-               return NULL;
+               return mailbox_list_iter_default_next(_ctx);
 
        ctx->info.vname = vname;
        subs_flags = node->flags & (MAILBOX_SUBSCRIBED |
index 215f68b582d0432735aa7c2e0d85bc6c907bbc59..ff578756dc1d7328c8f9ba32829466b6bb93416e 100644 (file)
@@ -211,6 +211,8 @@ void mailbox_list_iter_update(struct mailbox_list_iter_update_context *ctx,
 int mailbox_list_iter_subscriptions_refresh(struct mailbox_list *list);
 void
 mailbox_list_iter_init_autocreate(struct mailbox_list_iterate_context *ctx);
+const struct mailbox_info *
+mailbox_list_iter_default_next(struct mailbox_list_iterate_context *ctx);
 
 enum mailbox_list_file_type mailbox_list_get_file_type(const struct dirent *d);
 int mailbox_list_dirent_is_alias_symlink(struct mailbox_list *list,