dovecot-2.1: imap: Fixed LIST handling with reference parameter.

dovecot at dovecot.org dovecot at dovecot.org
Tue Jul 31 18:35:03 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/fac6b994e869
changeset: 14639:fac6b994e869
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jul 31 18:34:53 2012 +0300
description:
imap: Fixed LIST handling with reference parameter.
For example "LIST shared/ %" failed to list shared/user namespace prefix.

diffstat:

 src/imap/cmd-list.c |  28 +++++++++++++++-------------
 1 files changed, 15 insertions(+), 13 deletions(-)

diffs (72 lines):

diff -r ec5c630012cd -r fac6b994e869 src/imap/cmd-list.c
--- a/src/imap/cmd-list.c	Tue Jul 31 18:33:45 2012 +0300
+++ b/src/imap/cmd-list.c	Tue Jul 31 18:34:53 2012 +0300
@@ -236,17 +236,22 @@
 	enum imap_match_result match;
 	const char *ns_prefix, *p;
 	bool inboxcase;
+	unsigned int skip_len;
+
+	skip_len = strlen(ctx->ref);
+	if (strncmp(ctx->ns->prefix, ctx->ref, skip_len) != 0)
+		skip_len = 0;
 
 	inboxcase = strncasecmp(ctx->ns->prefix, "INBOX", 5) == 0 &&
 		ctx->ns->prefix[5] == mail_namespace_get_sep(ctx->ns);
 	glob = imap_match_init_multiple(pool_datastack_create(),
 					ctx->patterns, inboxcase,
 					mail_namespace_get_sep(ctx->ns));
-	ns_prefix = ctx->ns->prefix;
+	ns_prefix = ctx->ns->prefix + skip_len;
 	match = imap_match(glob, ns_prefix);
 	if (match == IMAP_MATCH_YES) {
-		return !ctx->cur_ns_skip_trailing_sep ? ns_prefix :
-			t_strndup(ns_prefix, strlen(ns_prefix)-1);
+		return !ctx->cur_ns_skip_trailing_sep ? ctx->ns->prefix :
+			t_strndup(ctx->ns->prefix, strlen(ctx->ns->prefix)-1);
 	}
 
 	while ((match & IMAP_MATCH_PARENT) != 0) {
@@ -256,7 +261,8 @@
 		match = imap_match(glob, ns_prefix);
 	}
 	i_assert(match == IMAP_MATCH_YES);
-	return ns_prefix;
+	return t_strconcat(t_strndup(ctx->ns->prefix, skip_len),
+			   ns_prefix, NULL);
 }
 
 static void list_reply_append_ns_sep_param(string_t *str, char sep)
@@ -510,18 +516,14 @@
 skip_namespace_prefix(const char **prefix, const char **pattern,
 		      bool inbox_check, char sep)
 {
-	size_t pattern_len, prefix_len;
+	size_t pattern_len, prefix_len, min_len;
 	bool match;
 
 	prefix_len = strlen(*prefix);
 	pattern_len = strlen(*pattern);
+	min_len = I_MIN(prefix_len, pattern_len);
 
-	if (pattern_len < prefix_len) {
-		/* eg. namespace prefix = "INBOX.", pattern = "INBOX" */
-		return;
-	}
-
-	match = strncmp(*prefix, *pattern, prefix_len) == 0;
+	match = strncmp(*prefix, *pattern, min_len) == 0;
 	if (!match && inbox_check) {
 		/* try INBOX check. */
 		match = prefix_len >= 5 &&
@@ -533,8 +535,8 @@
 	}
 
 	if (match) {
-		*prefix += prefix_len;
-		*pattern += prefix_len;
+		*prefix += min_len;
+		*pattern += min_len;
 	}
 }
 


More information about the dovecot-cvs mailing list