From: Timo Sirainen Date: Mon, 12 Sep 2011 09:41:09 +0000 (+0300) Subject: imapc: Fixes to handling non-empty imapc namespace prefix. X-Git-Tag: 2.1.alpha2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2dc23f3416724163cc5d7162c577a8ed9f985fed;p=thirdparty%2Fdovecot%2Fcore.git imapc: Fixes to handling non-empty imapc namespace prefix. --- diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 7cefc0c21c..ab71dbf648 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -14,6 +14,8 @@ struct imapc_mailbox_list_iterate_context { struct mailbox_list_iterate_context ctx; struct mailbox_tree_context *tree; + struct mailbox_node *ns_root; + struct mailbox_tree_iterate_context *iter; struct mailbox_info info; }; @@ -321,6 +323,7 @@ imapc_list_iter_init(struct mailbox_list *_list, const char *const *patterns, struct imapc_mailbox_list *list = (struct imapc_mailbox_list *)_list; struct mailbox_list_iterate_context *_ctx; struct imapc_mailbox_list_iterate_context *ctx; + const char *ns_root_name; char sep; int ret = 0; @@ -353,6 +356,13 @@ imapc_list_iter_init(struct mailbox_list *_list, const char *const *patterns, ctx->tree = mailbox_tree_init(sep); imapc_list_build_match_tree(ctx); + + if (list->list.ns->prefix_len > 0) { + ns_root_name = t_strndup(_list->ns->prefix, + _list->ns->prefix_len - 1); + ctx->ns_root = mailbox_tree_lookup(ctx->tree, ns_root_name); + } + ctx->iter = mailbox_tree_iterate_init(ctx->tree, NULL, 0); if (ret < 0) ctx->ctx.failed = TRUE; @@ -373,9 +383,11 @@ imapc_list_iter_next(struct mailbox_list_iterate_context *_ctx) if ((_ctx->flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) return mailbox_list_subscriptions_iter_next(_ctx); - node = mailbox_tree_iterate_next(ctx->iter, &name); - if (node == NULL) - return NULL; + do { + node = mailbox_tree_iterate_next(ctx->iter, &name); + if (node == NULL) + return NULL; + } while (node == ctx->ns_root); ctx->info.name = name; ctx->info.flags = node->flags; diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index 6727abced9..adb04a3a4b 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -378,6 +378,16 @@ static int imapc_mailbox_open(struct mailbox *box) examine = (box->flags & MAILBOX_FLAG_READONLY) != 0 && (box->flags & MAILBOX_FLAG_DROP_RECENT) == 0; + if (*box->name == '\0' && + (box->list->ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0) { + /* trying to open INBOX as the namespace prefix. + Don't allow this. */ + mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND, + "Mailbox isn't selectable"); + mailbox_close(box); + return -1; + } + mbox->opening = TRUE; ctx.mbox = mbox; ctx.ret = -2;