From 0dc071a974023baf8c695bd0b36a25f804e5243a Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 14 Jan 2021 12:03:58 +0200 Subject: [PATCH] lib-storage: Split off mailbox_list_vname_prepare() This also slightly changes the code logic. mailbox_list_escape_name() is now called also for INBOX, but that doesn't actually matter. --- src/lib-storage/mailbox-list.c | 65 +++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index c33764ab68..77fba01086 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -562,20 +562,50 @@ static char *mailbox_list_convert_sep(const char *storage_name, char src, char d return ret; } +static void +mailbox_list_vname_prepare(struct mailbox_list *list, const char **_vname) +{ + struct mail_namespace *ns = list->ns; + const char *vname = *_vname; + + if (strcasecmp(vname, "INBOX") == 0 && + (list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) { + /* INBOX is case sensitive. Normalize it into "INBOX". */ + vname = "INBOX"; + } else if (ns->prefix_len > 0) { + /* skip namespace prefix, except if this is INBOX */ + if (strncmp(ns->prefix, vname, ns->prefix_len) == 0) + vname += ns->prefix_len; + else if (strncmp(ns->prefix, vname, ns->prefix_len-1) == 0 && + strlen(vname) == ns->prefix_len-1 && + ns->prefix[ns->prefix_len-1] == mail_namespace_get_sep(ns)) { + /* trying to access the namespace prefix itself */ + vname = ""; + } else { + /* we're converting a nonexistent mailbox name, + such as a LIST pattern. */ + } + } + if (*vname == '\0' && ns->type == MAIL_NAMESPACE_TYPE_SHARED && + (ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0 && + !list->mail_set->mail_shared_explicit_inbox) { + /* opening shared/$user. it's the same as INBOX. */ + vname = "INBOX"; + } + *_vname = vname; +} + const char *mailbox_list_default_get_storage_name(struct mailbox_list *list, const char *vname) { struct mail_namespace *ns = list->ns; - size_t prefix_len = strlen(ns->prefix); const char *storage_name = vname; string_t *str; char list_sep, ns_sep, *ret; - if (strcasecmp(storage_name, "INBOX") == 0 && - (ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) - storage_name = "INBOX"; - else if (list->set.storage_name_escape_char != '\0') { - storage_name = mailbox_list_escape_name_params(vname, + mailbox_list_vname_prepare(list, &storage_name); + if (list->set.storage_name_escape_char != '\0') { + storage_name = mailbox_list_escape_name_params(storage_name, ns->prefix, mail_namespace_get_sep(list->ns), mailbox_list_get_hierarchy_sep(list), @@ -583,22 +613,6 @@ const char *mailbox_list_default_get_storage_name(struct mailbox_list *list, list->set.maildir_name); } - if (prefix_len > 0 && (strcmp(storage_name, "INBOX") != 0 || - (ns->flags & NAMESPACE_FLAG_INBOX_USER) == 0)) { - /* skip namespace prefix, except if this is INBOX */ - if (strncmp(ns->prefix, storage_name, prefix_len) == 0) - storage_name += prefix_len; - else if (strncmp(ns->prefix, storage_name, prefix_len-1) == 0 && - strlen(storage_name) == prefix_len-1 && - ns->prefix[prefix_len-1] == mail_namespace_get_sep(ns)) { - /* trying to access the namespace prefix itself */ - storage_name = ""; - } else { - /* we're converting a nonexistent mailbox name, - such as a LIST pattern. */ - } - } - if (!list->set.utf8) { /* UTF-8 -> mUTF-7 conversion */ str = t_str_new(strlen(storage_name)*2); @@ -610,13 +624,6 @@ const char *mailbox_list_default_get_storage_name(struct mailbox_list *list, list_sep = mailbox_list_get_hierarchy_sep(list); ns_sep = mail_namespace_get_sep(ns); - if (*storage_name == '\0' && ns->type == MAIL_NAMESPACE_TYPE_SHARED && - (ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0 && - !list->mail_set->mail_shared_explicit_inbox) { - /* opening shared/$user. it's the same as INBOX. */ - storage_name = "INBOX"; - } - if (list_sep != ns_sep && list->set.storage_name_escape_char == '\0') { if (ns->type == MAIL_NAMESPACE_TYPE_SHARED && (ns->flags & NAMESPACE_FLAG_AUTOCREATED) == 0) { -- 2.47.3