From: Siavash Tavakoli Date: Mon, 22 Nov 2021 16:04:11 +0000 (+0000) Subject: imapc: Do not include the root node in list if it's the namespace prefix X-Git-Tag: 2.3.18~112 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c36969fee5688e86f17405c325c0241f02d6ea3a;p=thirdparty%2Fdovecot%2Fcore.git imapc: Do not include the root node in list if it's the namespace prefix Otherwise namespace prefix is added to the mailbox tree as a separate node. Fixes duplicated shared namespace root in mailbox list. --- diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 2517776d40..a9e03ecf02 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -719,6 +719,20 @@ imapc_list_write_special_use(struct imapc_mailbox_list_iterate_context *ctx, } } +static bool +imapc_list_is_ns_root(struct imapc_mailbox_list_iterate_context *ctx, + struct mailbox_node *node) +{ + struct mailbox_node *root_node = ctx->ns_root; + + while (root_node != NULL) { + if (node == root_node) + return TRUE; + root_node = root_node->parent; + } + return FALSE; +} + static const struct mailbox_info * imapc_list_iter_next(struct mailbox_list_iterate_context *_ctx) { @@ -739,7 +753,8 @@ imapc_list_iter_next(struct mailbox_list_iterate_context *_ctx) node = mailbox_tree_iterate_next(ctx->iter, &vname); if (node == NULL) return mailbox_list_iter_default_next(_ctx); - } while ((node->flags & MAILBOX_MATCHED) == 0); + } while ((node->flags & MAILBOX_MATCHED) == 0 || + imapc_list_is_ns_root(ctx, node)); if (ctx->info.ns->prefix_len > 0 && strcasecmp(vname, "INBOX") != 0 &&