From: Timo Sirainen Date: Thu, 14 Jan 2021 14:23:24 +0000 (+0200) Subject: lib-storage: Use mailbox_list_settings.vname_escape_char also with utf8 storage names X-Git-Tag: 2.3.14.rc1~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9d41e00eda8b4714487da1d3fec8e238c3edf2b5;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Use mailbox_list_settings.vname_escape_char also with utf8 storage names mailbox_list_default_get_storage_name() was already unescaping with utf8, so mailbox_list_default_get_vname() should also be escaping with utf8. --- diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index f025c7ea59..03f42d74a6 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -725,6 +725,18 @@ mailbox_list_storage_name_prepare(struct mailbox_list *list, return FALSE; } +static void +mailbox_list_name_escape(const char *vname, const char *escape_chars, + string_t *dest) +{ + for (unsigned int i = 0; vname[i] != '\0'; i++) { + if (strchr(escape_chars, vname[i]) != NULL) + str_printfa(dest, "%c%02x", escape_chars[0], vname[i]); + else + str_append_c(dest, vname[i]); + } +} + static const char * mailbox_list_default_get_vname_part(struct mailbox_list *list, const char *storage_name_part) @@ -748,6 +760,10 @@ mailbox_list_default_get_vname_part(struct mailbox_list *list, can't be accessible, so just return it as the original mUTF7 name. */ } + } else if (list->set.vname_escape_char != '\0') { + string_t *str = t_str_new(strlen(vname)); + mailbox_list_name_escape(vname, escape_chars, str); + vname = str_c(str); } if (list->set.storage_name_escape_char != '\0') { diff --git a/src/lib-storage/test-mailbox-list.c b/src/lib-storage/test-mailbox-list.c index 035d3033bc..bd5d61cf61 100644 --- a/src/lib-storage/test-mailbox-list.c +++ b/src/lib-storage/test-mailbox-list.c @@ -381,6 +381,11 @@ static void test_mailbox_list_get_names(void) .ns_sep = '/', .list_sep = '.', .storage_name_escape_char = '+', .vname_escape_char = '%' }, + { .vname = "%25escaped+", + .storage_name = "%escaped+2b", + .ns_sep = '/', .list_sep = '.', + .storage_name_escape_char = '+', + .vname_escape_char = '%' }, { .vname = "x%2666-y", .storage_name = "x&66-y", .flags = TEST_FLAG_NO_UTF8,