From: Timo Sirainen Date: Thu, 14 Jan 2016 16:47:40 +0000 (+0200) Subject: lib-storage: Added mailbox_list_[un]escape_name_params() X-Git-Tag: 2.2.22.rc1~361 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4e2101473cfd7ce960fc49b3ce097c3f89ec2ad;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added mailbox_list_[un]escape_name_params() This allows calling the mailbox_list_[un]escape_name() with wanted parameters instead of taking them from mailbox_list. --- diff --git a/src/lib-storage/mailbox-list-private.h b/src/lib-storage/mailbox-list-private.h index 260477e268..30b61a82a6 100644 --- a/src/lib-storage/mailbox-list-private.h +++ b/src/lib-storage/mailbox-list-private.h @@ -178,7 +178,15 @@ int mailbox_list_settings_parse(struct mail_user *user, const char *data, const char * mailbox_list_escape_name(struct mailbox_list *list, const char *vname); const char * +mailbox_list_escape_name_params(const char *vname, const char *ns_prefix, + char ns_sep, char list_sep, char escape_char, + const char *maildir_name); +const char * mailbox_list_unescape_name(struct mailbox_list *list, const char *src); +const char * +mailbox_list_unescape_name_params(const char *src, const char *ns_prefix, + char ns_sep, char list_sep, char escape_char); + const char *mailbox_list_default_get_storage_name(struct mailbox_list *list, const char *vname); const char *mailbox_list_default_get_vname(struct mailbox_list *list, diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index c80033b873..001667a1e9 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -427,23 +427,23 @@ static bool need_escape_dirstart(const char *vname, const char *maildir_name) } const char * -mailbox_list_escape_name(struct mailbox_list *list, const char *vname) +mailbox_list_escape_name_params(const char *vname, const char *ns_prefix, + char ns_sep, char list_sep, char escape_char, + const char *maildir_name) { - char ns_sep = mail_namespace_get_sep(list->ns); - char list_sep = mailbox_list_get_hierarchy_sep(list); + unsigned int ns_prefix_len = strlen(ns_prefix); string_t *escaped_name = t_str_new(64); char dirstart = TRUE; /* no escaping of namespace prefix */ - if (strncmp(list->ns->prefix, vname, list->ns->prefix_len) == 0) { - str_append_n(escaped_name, vname, list->ns->prefix_len); - vname += list->ns->prefix_len; + if (strncmp(ns_prefix, vname, ns_prefix_len) == 0) { + str_append_n(escaped_name, vname, ns_prefix_len); + vname += ns_prefix_len; } /* escape the mailbox name */ if (*vname == '~') { - str_printfa(escaped_name, "%c%02x", - list->set.escape_char, *vname); + str_printfa(escaped_name, "%c%02x", escape_char, *vname); vname++; dirstart = FALSE; } @@ -451,12 +451,12 @@ mailbox_list_escape_name(struct mailbox_list *list, const char *vname) if (*vname == ns_sep) str_append_c(escaped_name, list_sep); else if (*vname == list_sep || - *vname == list->set.escape_char || + *vname == escape_char || *vname == '/' || (dirstart && - need_escape_dirstart(vname, list->set.maildir_name))) { + need_escape_dirstart(vname, maildir_name))) { str_printfa(escaped_name, "%c%02x", - list->set.escape_char, *vname); + escape_char, *vname); } else { str_append_c(escaped_name, *vname); } @@ -465,6 +465,15 @@ mailbox_list_escape_name(struct mailbox_list *list, const char *vname) return str_c(escaped_name); } +const char * +mailbox_list_escape_name(struct mailbox_list *list, const char *vname) +{ + return mailbox_list_escape_name_params(vname, list->ns->prefix, + mail_namespace_get_sep(list->ns), + mailbox_list_get_hierarchy_sep(list), + list->set.escape_char, list->set.maildir_name); +} + static int mailbox_list_unescape_broken_chars(struct mailbox_list *list, char *name) { @@ -595,20 +604,20 @@ const char *mailbox_list_get_storage_name(struct mailbox_list *list, } const char * -mailbox_list_unescape_name(struct mailbox_list *list, const char *src) +mailbox_list_unescape_name_params(const char *src, const char *ns_prefix, + char ns_sep, char list_sep, char escape_char) { - char ns_sep = mail_namespace_get_sep(list->ns); - char list_sep = mailbox_list_get_hierarchy_sep(list); + unsigned int ns_prefix_len = strlen(ns_prefix); string_t *dest = t_str_new(strlen(src)); unsigned int num; - if (strncmp(src, list->ns->prefix, list->ns->prefix_len) == 0) { - str_append_n(dest, src, list->ns->prefix_len); - src += list->ns->prefix_len; + if (strncmp(src, ns_prefix, ns_prefix_len) == 0) { + str_append_n(dest, src, ns_prefix_len); + src += ns_prefix_len; } for (; *src != '\0'; src++) { - if (*src == list->set.escape_char && + if (*src == escape_char && i_isxdigit(src[1]) && i_isxdigit(src[2])) { if (src[1] >= '0' && src[1] <= '9') num = src[1] - '0'; @@ -630,6 +639,15 @@ mailbox_list_unescape_name(struct mailbox_list *list, const char *src) return str_c(dest); } +const char * +mailbox_list_unescape_name(struct mailbox_list *list, const char *src) +{ + return mailbox_list_unescape_name_params(src, list->ns->prefix, + mail_namespace_get_sep(list->ns), + mailbox_list_get_hierarchy_sep(list), + list->set.escape_char); +} + static void mailbox_list_escape_broken_chars(struct mailbox_list *list, string_t *str) {