]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fixes to handling non-empty imapc namespace prefix.
authorTimo Sirainen <tss@iki.fi>
Mon, 12 Sep 2011 09:41:09 +0000 (12:41 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 12 Sep 2011 09:41:09 +0000 (12:41 +0300)
src/lib-storage/index/imapc/imapc-list.c
src/lib-storage/index/imapc/imapc-storage.c

index 7cefc0c21c65ac4566766b33f237d3373ec14646..ab71dbf648e0e34508ca4da8fc3a941c05519759 100644 (file)
@@ -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;
index 6727abced9ea8a92d422b210e2788ac6fc974e05..adb04a3a4bfc929c98aacd4ca5abc273d0b02717 100644 (file)
@@ -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;