From: Timo Sirainen Date: Mon, 12 Jul 2010 20:15:34 +0000 (+0100) Subject: lib-storage: Show "foo/" style replies only for IMAP LIST command. X-Git-Tag: 2.0.rc3~70 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9e3c348e665b90f1d5faa208f5b061436eaa5ff4;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Show "foo/" style replies only for IMAP LIST command. Internally those replies just mess up things. --- diff --git a/src/imap/cmd-list.c b/src/imap/cmd-list.c index 06739ad281..0dcce60cb3 100644 --- a/src/imap/cmd-list.c +++ b/src/imap/cmd-list.c @@ -932,6 +932,7 @@ bool cmd_list_full(struct client_command_context *cmd, bool lsub) /* non-extended LIST - return children flags always */ ctx->list_flags |= MAILBOX_LIST_ITER_RETURN_CHILDREN; } + ctx->list_flags |= MAILBOX_LIST_ITER_SHOW_EXISTING_PARENT; if (!IMAP_ARG_IS_EOL(args)) { client_send_command_error(cmd, "Extra arguments."); diff --git a/src/lib-storage/list/mailbox-list-fs-iter.c b/src/lib-storage/list/mailbox-list-fs-iter.c index e87867fefe..0db9642b33 100644 --- a/src/lib-storage/list/mailbox-list-fs-iter.c +++ b/src/lib-storage/list/mailbox-list-fs-iter.c @@ -517,6 +517,12 @@ list_file_subdir(struct fs_list_iterate_context *ctx, delayed_send = TRUE; } + if ((ctx->ctx.flags & MAILBOX_LIST_ITER_SHOW_EXISTING_PARENT) == 0) { + /* LIST "" foo/% - we don't want to see foo/ returned */ + delayed_send = FALSE; + match2 = IMAP_MATCH_CHILDREN; + } + if (scan_subdir) { real_path = t_strconcat(ctx->dir->real_path, "/", fname, NULL); ret = list_opendir(ctx, real_path, vpath, &dirp); diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index d7ebd7cdce..41320042a5 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -61,6 +61,10 @@ enum mailbox_name_status { enum mailbox_list_iter_flags { /* Ignore index file and ACLs (used by ACL plugin internally) */ MAILBOX_LIST_ITER_RAW_LIST = 0x000001, + /* When listing "foo/%" and "foo" is an existing mailbox + (maybe \noselect), have LIST also return "foo/" in the replies. + This is needed by IMAP, but messes up internal code. */ + MAILBOX_LIST_ITER_SHOW_EXISTING_PARENT = 0x000002, /* Don't list INBOX unless it actually exists */ MAILBOX_LIST_ITER_NO_AUTO_INBOX = 0x000004,