From: Timo Sirainen Date: Sat, 28 Oct 2023 20:03:08 +0000 (+0300) Subject: lib-storage, listescape: Replace listescape_char with mailbox_list_storage_escape_cha... X-Git-Tag: 2.4.1~1230 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=38aa4c7f45e91ef4bec13756e87c6e6fd93352bd;p=thirdparty%2Fdovecot%2Fcore.git lib-storage, listescape: Replace listescape_char with mailbox_list_storage_escape_char setting This commit removes the listescape plugin entirely. --- diff --git a/configure.ac b/configure.ac index eb4b810a37..da00162048 100644 --- a/configure.ac +++ b/configure.ac @@ -888,7 +888,6 @@ src/plugins/fts-flatcurve/Makefile src/plugins/fts-solr/Makefile src/plugins/last-login/Makefile src/plugins/lazy-expunge/Makefile -src/plugins/listescape/Makefile src/plugins/mail-log/Makefile src/plugins/mail-lua/Makefile src/plugins/notify/Makefile diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 43c181be51..f7eb55b158 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -195,7 +195,7 @@ imapc_list_remote_to_storage_name(struct imapc_mailbox_list *list, return mailbox_list_escape_name_params(remote_name, "", list->root_sep, mailbox_list_get_hierarchy_sep(&list->list), - list->list.set.storage_name_escape_char, ""); + list->list.mail_set->mailbox_list_storage_escape_char[0], ""); } static const char * @@ -210,9 +210,9 @@ const char * imapc_list_storage_to_remote_name(struct imapc_mailbox_list *list, const char *storage_name) { - return mailbox_list_unescape_name_params(storage_name, "", list->root_sep, - mailbox_list_get_hierarchy_sep(&list->list), - list->list.set.storage_name_escape_char); + return mailbox_list_unescape_name_params(storage_name, "", + list->root_sep, mailbox_list_get_hierarchy_sep(&list->list), + list->list.mail_set->mailbox_list_storage_escape_char[0]); } static struct mailbox_node * @@ -433,17 +433,18 @@ static struct mailbox_list *imapc_list_get_fs(struct imapc_mailbox_list *list) } else if (list->index_list == NULL && !list->index_list_failed) { mailbox_list_settings_init_defaults(&list_set); list_set.root_dir = dir; - /* Filesystem needs to be able to store any kind of a mailbox - name. */ - list_set.storage_name_escape_char = - IMAPC_LIST_FS_NAME_ESCAPE_CHAR; - struct settings_instance *set_instance = mail_storage_service_user_get_settings_instance( list->list.ns->user->service_user); list->index_list_set_instance = settings_instance_dup(set_instance); mail_storage_2nd_settings_reset(list->index_list_set_instance, "*/"); + /* Filesystem needs to be able to store any kind of a mailbox + name. */ + settings_override(list->index_list_set_instance, + "*/mailbox_list_storage_escape_char", + IMAPC_LIST_FS_NAME_ESCAPE_CHAR, + SETTINGS_OVERRIDE_TYPE_CODE); settings_override(list->index_list_set_instance, "*/mailbox_list_layout", MAILBOX_LIST_NAME_MAILDIRPLUSPLUS, @@ -490,9 +491,8 @@ imapc_list_storage_to_fs_name(struct imapc_mailbox_list *list, remote_name = imapc_list_storage_to_remote_name(list, storage_name); return mailbox_list_escape_name_params(remote_name, "", - list->root_sep, - mailbox_list_get_hierarchy_sep(fs_list), - fs_list->set.storage_name_escape_char, ""); + list->root_sep, mailbox_list_get_hierarchy_sep(fs_list), + fs_list->mail_set->mailbox_list_storage_escape_char[0], ""); } static const char * @@ -508,7 +508,7 @@ imapc_list_fs_to_storage_name(struct imapc_mailbox_list *list, remote_name = mailbox_list_unescape_name_params(fs_name, "", list->root_sep, mailbox_list_get_hierarchy_sep(fs_list), - fs_list->set.storage_name_escape_char); + fs_list->mail_set->mailbox_list_storage_escape_char[0]); return imapc_list_remote_to_storage_name(list, remote_name); } diff --git a/src/lib-storage/index/imapc/imapc-settings.c b/src/lib-storage/index/imapc/imapc-settings.c index 0d50b14e4b..3667642d24 100644 --- a/src/lib-storage/index/imapc/imapc-settings.c +++ b/src/lib-storage/index/imapc/imapc-settings.c @@ -68,6 +68,7 @@ static const struct setting_keyvalue imapc_default_filter_settings_keyvalue[] = /* We want to have all imapc mailboxes accessible, so escape them if necessary. */ { "layout_imapc/mailbox_list_visible_escape_char", "~" }, + { "layout_imapc/mailbox_list_storage_escape_char", "%%" }, { NULL, NULL } }; diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index 0725efa3be..ce84a71338 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -513,14 +513,6 @@ void imapc_storage_client_unregister_untagged(struct imapc_storage_client *clien i_unreached(); } -static void -imapc_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED, - struct mailbox_list_settings *set, - const struct mail_storage_settings *mail_set ATTR_UNUSED) -{ - set->storage_name_escape_char = IMAPC_LIST_STORAGE_NAME_ESCAPE_CHAR; -} - static struct mailbox * imapc_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list, const char *vname, enum mailbox_flags flags) @@ -1370,7 +1362,7 @@ struct mail_storage imapc_storage = { imapc_storage_create, imapc_storage_destroy, NULL, - imapc_storage_get_list_settings, + NULL, NULL, imapc_mailbox_alloc, NULL, diff --git a/src/lib-storage/index/imapc/imapc-storage.h b/src/lib-storage/index/imapc/imapc-storage.h index ba8a35a72a..e0b1ddfdea 100644 --- a/src/lib-storage/index/imapc/imapc-storage.h +++ b/src/lib-storage/index/imapc/imapc-storage.h @@ -6,10 +6,8 @@ #include "imapc-client.h" #define IMAPC_STORAGE_NAME "imapc" -/* storage_name separator */ -#define IMAPC_LIST_STORAGE_NAME_ESCAPE_CHAR '%' /* fs_name separator */ -#define IMAPC_LIST_FS_NAME_ESCAPE_CHAR '%' +#define IMAPC_LIST_FS_NAME_ESCAPE_CHAR "%" struct imap_arg; struct imapc_untagged_reply; diff --git a/src/lib-storage/list/mailbox-list-index-backend.c b/src/lib-storage/list/mailbox-list-index-backend.c index 80dd7eeb51..f648b4fad6 100644 --- a/src/lib-storage/list/mailbox-list-index-backend.c +++ b/src/lib-storage/list/mailbox-list-index-backend.c @@ -13,7 +13,6 @@ #include #define GLOBAL_TEMP_PREFIX ".temp." -#define MAILBOX_LIST_INDEX_DEFAULT_ESCAPE_CHAR '^' struct index_mailbox_list { struct mailbox_list list; @@ -39,7 +38,6 @@ static struct mailbox_list *index_list_alloc(void) list = p_new(pool, struct index_mailbox_list, 1); list->list = index_mailbox_list; list->list.pool = pool; - list->list.set.storage_name_escape_char = MAILBOX_LIST_INDEX_DEFAULT_ESCAPE_CHAR; list->temp_prefix = p_strconcat(pool, GLOBAL_TEMP_PREFIX, my_hostname, ".", my_pid, ".", NULL); @@ -68,7 +66,7 @@ static char index_list_get_hierarchy_sep(struct mailbox_list *list) if (sep == '\0') sep = MAILBOX_LIST_INDEX_HIERARCHY_SEP; - if (sep == list->set.storage_name_escape_char) { + if (sep == list->mail_set->mailbox_list_storage_escape_char[0]) { /* Separator conflicts with the escape character. Use something else. */ if (sep != MAILBOX_LIST_INDEX_HIERARCHY_SEP) diff --git a/src/lib-storage/list/mailbox-list-index-iter.c b/src/lib-storage/list/mailbox-list-index-iter.c index 066b1136a7..cb1e1f80e0 100644 --- a/src/lib-storage/list/mailbox-list-index-iter.c +++ b/src/lib-storage/list/mailbox-list-index-iter.c @@ -72,7 +72,7 @@ mailbox_list_get_escaped_mailbox_name(struct mailbox_list *list, string_t *escaped_name) { const char escape_chars[] = { - list->set.storage_name_escape_char, + list->mail_set->mailbox_list_storage_escape_char[0], mailbox_list_get_hierarchy_sep(list), '\0' }; diff --git a/src/lib-storage/list/mailbox-list-index-sync.c b/src/lib-storage/list/mailbox-list-index-sync.c index 06afe6529d..580e39a087 100644 --- a/src/lib-storage/list/mailbox-list-index-sync.c +++ b/src/lib-storage/list/mailbox-list-index-sync.c @@ -61,7 +61,8 @@ mailbox_list_index_node_add(struct mailbox_list_index_sync_context *ctx, { struct mailbox_list_index_node *node; char *dup_name; - mailbox_list_name_unescape(&name, ctx->list->set.storage_name_escape_char); + mailbox_list_name_unescape(&name, + ctx->list->mail_set->mailbox_list_storage_escape_char[0]); node = p_new(ctx->ilist->mailbox_pool, struct mailbox_list_index_node, 1); diff --git a/src/lib-storage/list/mailbox-list-index.c b/src/lib-storage/list/mailbox-list-index.c index 47d4631328..cc080f1fa9 100644 --- a/src/lib-storage/list/mailbox-list-index.c +++ b/src/lib-storage/list/mailbox-list-index.c @@ -122,7 +122,8 @@ mailbox_list_index_node_find_sibling(const struct mailbox_list *list, struct mailbox_list_index_node *node, const char *name) { - mailbox_list_name_unescape(&name, list->set.storage_name_escape_char); + mailbox_list_name_unescape(&name, + list->mail_set->mailbox_list_storage_escape_char[0]); while (node != NULL) { if (strcmp(node->raw_name, name) == 0) @@ -535,10 +536,10 @@ mailbox_name_hdr_encode(struct mailbox_list *list, const char *storage_name, }; const char **name_parts = (const char **)p_strsplit(unsafe_data_stack_pool, storage_name, sep); - if (list->set.storage_name_escape_char != '\0') { + if (list->mail_set->mailbox_list_storage_escape_char[0] != '\0') { for (unsigned int i = 0; name_parts[i] != NULL; i++) { mailbox_list_name_unescape(&name_parts[i], - list->set.storage_name_escape_char); + list->mail_set->mailbox_list_storage_escape_char[0]); } } @@ -559,7 +560,7 @@ mailbox_name_hdr_decode_storage_name(struct mailbox_list *list, size_t name_hdr_size) { const char list_sep = mailbox_list_get_hierarchy_sep(list); - const char escape_char = list->set.storage_name_escape_char; + const char escape_char = list->mail_set->mailbox_list_storage_escape_char[0]; string_t *storage_name = t_str_new(name_hdr_size); while (name_hdr_size > 0) { const unsigned char *p = memchr(name_hdr, '\0', name_hdr_size); diff --git a/src/lib-storage/mail-storage-settings.c b/src/lib-storage/mail-storage-settings.c index 780bbf85c8..223530f6ef 100644 --- a/src/lib-storage/mail-storage-settings.c +++ b/src/lib-storage/mail-storage-settings.c @@ -86,6 +86,7 @@ static const struct setting_define mail_storage_setting_defines[] = { DEF(BOOL_HIDDEN, mailbox_list_drop_noselect), DEF(BOOL_HIDDEN, mailbox_list_validate_fs_names), DEF(STR, mailbox_list_visible_escape_char), + DEF(STR, mailbox_list_storage_escape_char), DEF(STR_HIDDEN, mailbox_root_directory_name), DEF(STR_HIDDEN, mailbox_subscriptions_filename), DEF(STR, mail_index_path), @@ -161,6 +162,7 @@ const struct mail_storage_settings mail_storage_default_settings = { .mailbox_list_drop_noselect = TRUE, .mailbox_list_validate_fs_names = TRUE, .mailbox_list_visible_escape_char = "", + .mailbox_list_storage_escape_char = "", .mailbox_root_directory_name = "", .mailbox_subscriptions_filename = "subscriptions", .mail_index_path = "", @@ -182,11 +184,17 @@ const struct mail_storage_settings mail_storage_default_settings = { .plugin_envs = ARRAY_INIT, }; +static const struct setting_keyvalue mail_storage_default_filter_settings_keyvalue[] = { + { "layout_index/mailbox_list_storage_escape_char", "^" }, + { NULL, NULL } +}; + const struct setting_parser_info mail_storage_setting_parser_info = { .name = "mail_storage", .defines = mail_storage_setting_defines, .defaults = &mail_storage_default_settings, + .default_filter_settings = mail_storage_default_filter_settings_keyvalue, .struct_size = sizeof(struct mail_storage_settings), .pool_offset1 = 1 + offsetof(struct mail_storage_settings, pool), @@ -780,6 +788,11 @@ mail_storage_settings_ext_check(struct event *event, void *_set, pool_t pool, *error_r = "mailbox_list_visible_escape_char value must be a single character"; return FALSE; } + if (set->mailbox_list_storage_escape_char != set_value_unknown && + strlen(set->mailbox_list_storage_escape_char) > 1) { + *error_r = "mailbox_list_storage_escape_char value must be a single character"; + return FALSE; + } if (!mail_storage_settings_check_namespaces(event, set, error_r)) return FALSE; @@ -1029,6 +1042,7 @@ static const size_t mail_storage_2nd_reset_offsets[] = { OFFSET(mailbox_list_index_prefix), OFFSET(mailbox_list_iter_from_index_dir), OFFSET(mailbox_list_visible_escape_char), + OFFSET(mailbox_list_storage_escape_char), OFFSET(mailbox_root_directory_name), OFFSET(mailbox_subscriptions_filename), OFFSET(mail_index_path), diff --git a/src/lib-storage/mail-storage-settings.h b/src/lib-storage/mail-storage-settings.h index aca2ebb8a3..61f5490ab6 100644 --- a/src/lib-storage/mail-storage-settings.h +++ b/src/lib-storage/mail-storage-settings.h @@ -65,6 +65,7 @@ struct mail_storage_settings { bool mailbox_list_drop_noselect; bool mailbox_list_validate_fs_names; const char *mailbox_list_visible_escape_char; + const char *mailbox_list_storage_escape_char; const char *mailbox_root_directory_name; const char *mailbox_subscriptions_filename; const char *mail_index_path; diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 2aef6f71df..8492dff5dd 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -77,6 +77,7 @@ void mail_storage_init(void) i_array_init(&mail_storage_classes, 8); mail_storage_register_all(); mailbox_list_register_all(); + settings_info_register(&mail_storage_setting_parser_info); } void mail_storage_deinit(void) @@ -1461,7 +1462,7 @@ static int mailbox_verify_name_int(struct mailbox *box) (without escaping) because it would end up becoming a hierarchy separator. */ if (ns_sep != list_sep && - box->list->set.storage_name_escape_char == '\0' && + box->list->mail_set->mailbox_list_storage_escape_char[0] == '\0' && strchr(vname, list_sep) != NULL) { mail_storage_set_error(box->storage, MAIL_ERROR_PARAMS, t_strdup_printf( "Character not allowed in mailbox name: '%c'", list_sep)); diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index ea346673af..44780e7f35 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -158,8 +158,6 @@ int mailbox_list_create(struct event *event, struct mail_namespace *ns, list->set.index_control_use_maildir_name = set->index_control_use_maildir_name; - if (set->storage_name_escape_char != '\0') - list->set.storage_name_escape_char = set->storage_name_escape_char; list->set.utf8 = set->utf8; if (list->v.init != NULL) { @@ -458,13 +456,13 @@ mailbox_list_vname_prepare(struct mailbox_list *list, const char **_vname) vname += ns->prefix_len; if (strcmp(vname, "INBOX") == 0 && (list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0 && - list->set.storage_name_escape_char != '\0') { + list->mail_set->mailbox_list_storage_escape_char[0] != '\0') { /* prefix/INBOX - this is troublesome, because it ends up conflicting with the INBOX name. Handle this in a bit kludgy way by escaping the initial "I" character. */ *_vname = t_strdup_printf("%c49NBOX", - list->set.storage_name_escape_char); + list->mail_set->mailbox_list_storage_escape_char[0]); return TRUE; } } else if (strncmp(ns->prefix, vname, ns->prefix_len-1) == 0 && @@ -506,12 +504,12 @@ mailbox_list_default_get_storage_name_part(struct mailbox_list *list, mailbox_list_name_unescape(&storage_name, list->mail_set->mailbox_list_visible_escape_char[0]); } - if (list->set.storage_name_escape_char != '\0') { + if (list->mail_set->mailbox_list_storage_escape_char[0] != '\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->mail_set->mailbox_list_storage_escape_char[0], list->set.maildir_name); } return storage_name; @@ -529,7 +527,7 @@ const char *mailbox_list_default_get_storage_name(struct mailbox_list *list, if (list->ns->type == MAIL_NAMESPACE_TYPE_SHARED && (list->ns->flags & NAMESPACE_FLAG_AUTOCREATED) == 0 && list_sep != ns_sep && - list->set.storage_name_escape_char == '\0') { + list->mail_set->mailbox_list_storage_escape_char[0] == '\0') { /* Accessing shared namespace root. This is just the initial lookup that ends up as parameter to shared_storage_get_namespace(). That then finds/creates the @@ -651,11 +649,11 @@ mailbox_list_default_get_vname_part(struct mailbox_list *list, '\0' }; - if (list->set.storage_name_escape_char != '\0') { + if (list->mail_set->mailbox_list_storage_escape_char[0] != '\0') { vname = mailbox_list_unescape_name_params(vname, list->ns->prefix, '\0', '\0', /* no separator conversion */ - list->set.storage_name_escape_char); + list->mail_set->mailbox_list_storage_escape_char[0]); } if (!list->set.utf8) { diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index 414cc5c02e..17fb50f2aa 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -131,14 +131,6 @@ struct mailbox_list_settings { "mail" and a selectable mailbox "mail/foo". */ const char *maildir_name; - /* Used for escaping the mailbox name in storage (storage_name). If the - UTF-8 vname has characters that can't reversibly (or safely) be - converted to storage_name and back, encode the problematic parts - using . The storage_name_escape_char - itself also has to be encoded the same way. For example - { vname="A/B.C%D", storage_name_escape_char='%', namespace_sep='/', - storage_sep='.' } -> storage_name="A.B%2eC%25D". */ - char storage_name_escape_char; /* Use UTF-8 mailbox names on filesystem instead of mUTF-7 */ bool utf8:1; /* Use maildir_name also for index/control directories. This should diff --git a/src/lib-storage/test-mailbox-list.c b/src/lib-storage/test-mailbox-list.c index 31e59e3a6b..511c3a11e5 100644 --- a/src/lib-storage/test-mailbox-list.c +++ b/src/lib-storage/test-mailbox-list.c @@ -269,9 +269,10 @@ test_maibox_list_name_init(struct mailbox_list *list, const struct test_mailbox_list_name *test, bool mutf7) { - static char vname_escape_char[2]; + static char vname_escape_char[2], storage_escape_char[2]; static struct mail_storage_settings mail_set = { .mailbox_list_visible_escape_char = vname_escape_char, + .mailbox_list_storage_escape_char = storage_escape_char, }; list->mail_set = &mail_set; @@ -283,8 +284,7 @@ test_maibox_list_name_init(struct mailbox_list *list, list_hierarchy_sep = test->list_sep; list->set.utf8 = !mutf7; vname_escape_char[0] = test->vname_escape_char; - list->set.storage_name_escape_char = - test->storage_name_escape_char; + storage_escape_char[0] = test->storage_name_escape_char; list->set.maildir_name = test->maildir_name == NULL ? "" : test->maildir_name; } diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 5dfef37c8e..5c7fd0ea1e 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -20,7 +20,6 @@ SUBDIRS = \ fts \ last-login \ lazy-expunge \ - listescape \ notify \ notify-status \ push-notification \ diff --git a/src/plugins/listescape/Makefile.am b/src/plugins/listescape/Makefile.am deleted file mode 100644 index fa614a303e..0000000000 --- a/src/plugins/listescape/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -AM_CPPFLAGS = \ - -I$(top_srcdir)/src/lib \ - -I$(top_srcdir)/src/lib-mail \ - -I$(top_srcdir)/src/lib-imap \ - -I$(top_srcdir)/src/lib-index \ - -I$(top_srcdir)/src/lib-storage - -NOPLUGIN_LDFLAGS = -lib20_listescape_plugin_la_LDFLAGS = -module -avoid-version - -module_LTLIBRARIES = \ - lib20_listescape_plugin.la - -lib20_listescape_plugin_la_SOURCES = \ - listescape-plugin.c - -noinst_HEADERS = \ - listescape-plugin.h diff --git a/src/plugins/listescape/listescape-plugin.c b/src/plugins/listescape/listescape-plugin.c deleted file mode 100644 index 89fb1f97d3..0000000000 --- a/src/plugins/listescape/listescape-plugin.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2007-2018 Dovecot authors, see the included COPYING file */ - -#include "lib.h" -#include "mail-storage-hooks.h" -#include "mailbox-list-private.h" -#include "listescape-plugin.h" - -#define DEFAULT_ESCAPE_CHAR '\\' - -const char *listescape_plugin_version = DOVECOT_ABI_VERSION; - -static void listescape_mailbox_list_created(struct mailbox_list *list) -{ - const char *env; - - if (list->set.storage_name_escape_char == '\0') { - env = mail_user_plugin_getenv(list->ns->user, "listescape_char"); - list->set.storage_name_escape_char = - env != NULL && *env != '\0' ? - env[0] : DEFAULT_ESCAPE_CHAR; - } -} - -static struct mail_storage_hooks listescape_mail_storage_hooks = { - .mailbox_list_created = listescape_mailbox_list_created -}; - -void listescape_plugin_init(struct module *module) -{ - mail_storage_hooks_add(module, &listescape_mail_storage_hooks); -} - -void listescape_plugin_deinit(void) -{ - mail_storage_hooks_remove(&listescape_mail_storage_hooks); -} diff --git a/src/plugins/listescape/listescape-plugin.h b/src/plugins/listescape/listescape-plugin.h deleted file mode 100644 index f8ff4fc5ae..0000000000 --- a/src/plugins/listescape/listescape-plugin.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef LISTESCAPE_PLUGIN_H -#define LISTESCAPE_PLUGIN_H - -void listescape_plugin_init(struct module *module); -void listescape_plugin_deinit(void); - -#endif