]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Do not include the root node in list if it's the namespace prefix
authorSiavash Tavakoli <siavash.tavakoli@open-xchange.com>
Mon, 22 Nov 2021 16:04:11 +0000 (16:04 +0000)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 25 Nov 2021 12:29:05 +0000 (12:29 +0000)
Otherwise namespace prefix is added to the mailbox tree as a separate
node. Fixes duplicated shared namespace root in mailbox list.

src/lib-storage/index/imapc/imapc-list.c

index 2517776d40d338496cad965dd76b927dc9166c21..a9e03ecf02fdb3f37a52e5d7e0d15e46828b4737 100644 (file)
@@ -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 &&