Mercurial > dovecot > core-2.2
changeset 21806:4108cd284c71
lib-storage: Add and use default mailbox iterator
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.
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Sat, 25 Feb 2017 23:34:03 +0200 |
parents | c2f3d956dfb0 |
children | 949ab17b9294 |
files | 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 |
diffstat | 7 files changed, 21 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-list.c Tue Mar 21 13:14:41 2017 +0200 +++ b/src/lib-storage/index/imapc/imapc-list.c Sat Feb 25 23:34:03 2017 +0200 @@ -725,7 +725,7 @@ 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 &&
--- a/src/lib-storage/list/mailbox-list-fs-iter.c Tue Mar 21 13:14:41 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-fs-iter.c Sat Feb 25 23:34:03 2017 +0200 @@ -795,7 +795,9 @@ 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 &&
--- a/src/lib-storage/list/mailbox-list-index-iter.c Tue Mar 21 13:14:41 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-index-iter.c Sat Feb 25 23:34:03 2017 +0200 @@ -53,6 +53,7 @@ /* 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_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)
--- a/src/lib-storage/list/mailbox-list-iter.c Tue Mar 21 13:14:41 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-iter.c Sat Feb 25 23:34:03 2017 +0200 @@ -973,25 +973,25 @@ 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 @@ 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;
--- a/src/lib-storage/list/mailbox-list-maildir-iter.c Tue Mar 21 13:14:41 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-maildir-iter.c Sat Feb 25 23:34:03 2017 +0200 @@ -499,7 +499,7 @@ 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 &&
--- a/src/lib-storage/list/mailbox-list-subscriptions.c Tue Mar 21 13:14:41 2017 +0200 +++ b/src/lib-storage/list/mailbox-list-subscriptions.c Sat Feb 25 23:34:03 2017 +0200 @@ -263,7 +263,7 @@ 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 |
--- a/src/lib-storage/mailbox-list-private.h Tue Mar 21 13:14:41 2017 +0200 +++ b/src/lib-storage/mailbox-list-private.h Sat Feb 25 23:34:03 2017 +0200 @@ -211,6 +211,8 @@ 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,