This commit removes the listescape plugin entirely.
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
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 *
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 *
} 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,
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 *
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);
}
/* 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 }
};
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)
imapc_storage_create,
imapc_storage_destroy,
NULL,
- imapc_storage_get_list_settings,
+ NULL,
NULL,
imapc_mailbox_alloc,
NULL,
#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;
#include <stdio.h>
#define GLOBAL_TEMP_PREFIX ".temp."
-#define MAILBOX_LIST_INDEX_DEFAULT_ESCAPE_CHAR '^'
struct index_mailbox_list {
struct mailbox_list list;
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);
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)
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'
};
{
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);
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)
};
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]);
}
}
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);
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),
.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 = "",
.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),
*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;
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),
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;
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)
(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));
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) {
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 &&
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;
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
'\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) {
"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 <storage_name_escape_char><hex>. 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
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;
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;
}
fts \
last-login \
lazy-expunge \
- listescape \
notify \
notify-status \
push-notification \
+++ /dev/null
-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
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-#ifndef LISTESCAPE_PLUGIN_H
-#define LISTESCAPE_PLUGIN_H
-
-void listescape_plugin_init(struct module *module);
-void listescape_plugin_deinit(void);
-
-#endif