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