]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Split off mailbox_list_vname_prepare()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 14 Jan 2021 10:03:58 +0000 (12:03 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 3 Feb 2021 09:04:22 +0000 (09:04 +0000)
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

index c33764ab681c8c4a08c317121015e491df67d142..77fba01086009c8c0c11af541ae7767694a37506 100644 (file)
@@ -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) {