]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added mailbox_list_[un]escape_name_params()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 14 Jan 2016 16:47:40 +0000 (18:47 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 14 Jan 2016 16:47:40 +0000 (18:47 +0200)
This allows calling the mailbox_list_[un]escape_name() with wanted parameters
instead of taking them from mailbox_list.

src/lib-storage/mailbox-list-private.h
src/lib-storage/mailbox-list.c

index 260477e268062a9185704abcd249fa05b65be0d6..30b61a82a6c3134260b368bde0d24290c5aa3913 100644 (file)
@@ -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,
index c80033b873f4094e06d3d1928046a61949deaa16..001667a1e9ca14cea707c3101abcc88b1277b82b 100644 (file)
@@ -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)
 {