]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Use mailbox_list_settings.vname_escape_char also with utf8 storage names
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 14 Jan 2021 14:23:24 +0000 (16:23 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 3 Feb 2021 09:04:22 +0000 (09:04 +0000)
mailbox_list_default_get_storage_name() was already unescaping with utf8,
so mailbox_list_default_get_vname() should also be escaping with utf8.

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

index f025c7ea5949cc26055af423604837768cdd8cc2..03f42d74a6bdb6b58ea44813831d5196e2b45ec4 100644 (file)
@@ -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') {
index 035d3033bc5b1ab18cc54e9b03ee9d8aab8894b7..bd5d61cf61fcea59d8d676de1691691756a2948b 100644 (file)
@@ -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,