]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mailbox_list_index - List prefix/INBOX if it necessary
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 13 Dec 2017 23:39:32 +0000 (01:39 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 14 Dec 2017 19:05:23 +0000 (21:05 +0200)
src/lib-storage/list/mailbox-list-index-iter.c
src/lib-storage/list/mailbox-list-index.h

index c9afc7a8f9aaa3f64cddbc709eef6302e1920eca..49cd9418df34b62e98ebdacfe68a4678450a4912 100644 (file)
@@ -90,13 +90,18 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx)
        if (strcmp(ctx->info.vname, "INBOX") != 0) {
                /* non-INBOX */
                ctx->info.vname = p_strdup(ctx->info_pool, ctx->info.vname);
-       } else {
+       } else if (!ctx->prefix_inbox_list) {
                /* listing INBOX itself */
                ctx->info.vname = "INBOX";
                if (mail_namespace_is_inbox_noinferiors(ctx->info.ns)) {
                        ctx->info.flags &= ~(MAILBOX_CHILDREN|MAILBOX_NOCHILDREN);
                        ctx->info.flags |= MAILBOX_NOINFERIORS;
                }
+       } else {
+               /* listing INBOX/INBOX */
+               ctx->info.vname = p_strconcat(ctx->info_pool,
+                       ctx->ctx.list->ns->prefix, "INBOX", NULL);
+               ctx->info.flags |= MAILBOX_NONEXISTENT;
        }
        if ((node->flags & MAILBOX_LIST_INDEX_FLAG_NONEXISTENT) != 0)
                ctx->info.flags |= MAILBOX_NONEXISTENT;
@@ -126,6 +131,14 @@ mailbox_list_index_update_next(struct mailbox_list_index_iterate_context *ctx,
 {
        struct mailbox_list_index_node *node = ctx->next_node;
 
+       if (!ctx->prefix_inbox_list && ctx->ctx.list->ns->prefix_len > 0 &&
+           strcmp(node->name, "INBOX") == 0 && node->parent == NULL &&
+           node->children != NULL) {
+               /* prefix/INBOX has children */
+               ctx->prefix_inbox_list = TRUE;
+               return;
+       }
+
        if (node->children != NULL && follow_children) {
                ctx->parent_len = str_len(ctx->path);
                ctx->next_node = node->children;
index 9dc1c486c22d3d1fae06b3c0508e5cf5cecb3792..e4b042ab215c3069cdccc99f5e52a2586099efc0 100644 (file)
@@ -138,6 +138,7 @@ struct mailbox_list_index_iterate_context {
        struct mailbox_list_index_node *next_node;
 
        unsigned int failed:1;
+       unsigned int prefix_inbox_list:1;
 };
 
 extern MODULE_CONTEXT_DEFINE(mailbox_list_index_module,