Skip to content

Commit

Permalink
lib-storage: Add and use default mailbox iterator
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
cmouse authored and GitLab committed Mar 23, 2017
1 parent fbcc3e1 commit 34b724d
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/lib-storage/index/imapc/imapc-list.c
Expand Up @@ -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 &&
Expand Down
4 changes: 3 additions & 1 deletion src/lib-storage/list/mailbox-list-fs-iter.c
Expand Up @@ -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 &&
Expand Down
3 changes: 2 additions & 1 deletion src/lib-storage/list/mailbox-list-index-iter.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down
25 changes: 11 additions & 14 deletions src/lib-storage/list/mailbox-list-iter.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/lib-storage/list/mailbox-list-maildir-iter.c
Expand Up @@ -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 &&
Expand Down
2 changes: 1 addition & 1 deletion src/lib-storage/list/mailbox-list-subscriptions.c
Expand Up @@ -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 |
Expand Down
2 changes: 2 additions & 0 deletions src/lib-storage/mailbox-list-private.h
Expand Up @@ -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,
Expand Down

0 comments on commit 34b724d

Please sign in to comment.