From 73364f0f2b02bdc87f5a37fcc2f3d07f6860c25d Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 14 Jan 2021 17:27:03 +0200 Subject: [PATCH] lib-storage: Fix mailbox name escape/unescape ordering 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 | 31 ++++++++++++++--------------- src/lib-storage/test-mailbox-list.c | 12 ++++++++++- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index dc28970443..c6ec9587ce 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -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; } diff --git a/src/lib-storage/test-mailbox-list.c b/src/lib-storage/test-mailbox-list.c index 8ccce99461..c2a64288da 100644 --- a/src/lib-storage/test-mailbox-list.c +++ b/src/lib-storage/test-mailbox-list.c @@ -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 = '.', -- 2.47.3