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,