]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Fix mailbox name escape/unescape ordering
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 14 Jan 2021 15:27:03 +0000 (17:27 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 3 Feb 2021 09:04:22 +0000 (09:04 +0000)
This fixes some cases like not properly escaping '/' in storage_name if it
was also the namespace separator. This also allows using the same character
for both vname_escape_char and storage_name_escape_char.

src/lib-storage/mailbox-list.c
src/lib-storage/test-mailbox-list.c

index dc28970443bc823bdafca58a28370901bc98d6ae..c6ec9587ce9b227e0a05722a91859e53eff2b44e 100644 (file)
@@ -578,15 +578,6 @@ mailbox_list_default_get_storage_name_part(struct mailbox_list *list,
        const char *storage_name = vname_part;
        string_t *str;
 
-       if (list->set.storage_name_escape_char != '\0') {
-               storage_name = mailbox_list_escape_name_params(storage_name,
-                               list->ns->prefix,
-                               '\0', /* no separator conversion */
-                               mailbox_list_get_hierarchy_sep(list),
-                               list->set.storage_name_escape_char,
-                               list->set.maildir_name);
-       }
-
        if (!list->set.utf8) {
                /* UTF-8 -> mUTF-7 conversion */
                str = t_str_new(strlen(storage_name)*2);
@@ -599,6 +590,14 @@ mailbox_list_default_get_storage_name_part(struct mailbox_list *list,
                mailbox_list_name_unescape(&storage_name,
                                           list->set.vname_escape_char);
        }
+       if (list->set.storage_name_escape_char != '\0') {
+               storage_name = mailbox_list_escape_name_params(storage_name,
+                               list->ns->prefix,
+                               '\0', /* no separator conversion */
+                               mailbox_list_get_hierarchy_sep(list),
+                               list->set.storage_name_escape_char,
+                               list->set.maildir_name);
+       }
        return storage_name;
 }
 
@@ -734,6 +733,13 @@ mailbox_list_default_get_vname_part(struct mailbox_list *list,
                '\0'
        };
 
+       if (list->set.storage_name_escape_char != '\0') {
+               vname = mailbox_list_unescape_name_params(vname,
+                               list->ns->prefix,
+                               '\0', '\0', /* no separator conversion */
+                               list->set.storage_name_escape_char);
+       }
+
        if (!list->set.utf8) {
                /* mUTF-7 -> UTF-8 conversion */
                string_t *str = t_str_new(strlen(vname));
@@ -752,13 +758,6 @@ mailbox_list_default_get_vname_part(struct mailbox_list *list,
                mailbox_list_name_escape(vname, escape_chars, str);
                vname = str_c(str);
        }
-
-       if (list->set.storage_name_escape_char != '\0') {
-               vname = mailbox_list_unescape_name_params(vname,
-                               list->ns->prefix,
-                               '\0', '\0', /* no separator conversion */
-                               list->set.storage_name_escape_char);
-       }
        return vname;
 }
 
index 8ccce99461e8bbf2263a1e9402808a7cf957e770..c2a64288da3df2ad124d45a0857141714a352998 100644 (file)
@@ -368,15 +368,25 @@ static void test_mailbox_list_get_names(void)
                  .ns_sep = '|', .list_sep = '.',
                  .storage_name_escape_char = '+',
                  .vname_escape_char = '%' },
+               { .vname = "%7c|child.",
+                 .storage_name = "|.child%2e",
+                 .ns_sep = '|', .list_sep = '.',
+                 .storage_name_escape_char = '%',
+                 .vname_escape_char = '%' },
                { .vname = "%2f/child",
                  .storage_name = "/.child",
                  .ns_sep = '/', .list_sep = '.',
                  .vname_escape_char = '%' },
                { .vname = "%2f/child.",
-                 .storage_name = "/.child+2e",
+                 .storage_name = "+2f.child+2e",
                  .ns_sep = '/', .list_sep = '.',
                  .storage_name_escape_char = '+',
                  .vname_escape_char = '%' },
+               { .vname = "%2f/child.",
+                 .storage_name = "%2f.child%2e",
+                 .ns_sep = '/', .list_sep = '.',
+                 .storage_name_escape_char = '%',
+                 .vname_escape_char = '%' },
                { .vname = "%25escaped+",
                  .storage_name = "%escaped+2b",
                  .ns_sep = '/', .list_sep = '.',