830a9c18a0749270046905672daf2f66c7e32d56Eugen Kuksa/* Copyright (c) 2007-2018 Dovecot authors, see the included COPYING file */
830a9c18a0749270046905672daf2f66c7e32d56Eugen Kuksa
830a9c18a0749270046905672daf2f66c7e32d56Eugen Kuksa/* FIXME: this plugin is only for backwards compatibility. log a warning in
554e4d0dd1f4e02034b3b142c8ea100a9f6a1fdcEugen Kuksa v2.2 about this and in later versions remove completely */
554e4d0dd1f4e02034b3b142c8ea100a9f6a1fdcEugen Kuksa
554e4d0dd1f4e02034b3b142c8ea100a9f6a1fdcEugen Kuksa#include "lib.h"
2dd343358095286426c3ba8f6803572ee4c0a00aEugen Kuksa#include "array.h"
2dd343358095286426c3ba8f6803572ee4c0a00aEugen Kuksa#include "unichar.h"
2dd343358095286426c3ba8f6803572ee4c0a00aEugen Kuksa#include "mail-user.h"
2dd343358095286426c3ba8f6803572ee4c0a00aEugen Kuksa#include "mail-namespace.h"
2dd343358095286426c3ba8f6803572ee4c0a00aEugen Kuksa#include "mail-storage-hooks.h"
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa#include "autocreate-plugin.h"
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksastatic struct mailbox_settings *
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksamailbox_settings_find(struct mail_namespace *ns, const char *vname)
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa{
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa struct mailbox_settings *const *box_set;
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa array_foreach(&ns->set->mailboxes, box_set) {
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa if (strcmp((*box_set)->name, vname) == 0)
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa return *box_set;
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa }
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa return NULL;
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa}
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksastatic void
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksaadd_autobox(struct mail_user *user, const char *vname, bool subscriptions)
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa{
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa struct mail_namespace *ns;
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa struct mailbox_settings *set;
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa struct mail_namespace_settings tmp_ns_set;
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa if (!uni_utf8_str_is_valid(vname)) {
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa i_error("autocreate: Mailbox name isn't valid UTF-8: %s",
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa vname);
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa return;
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa }
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa ns = mail_namespace_find(user->namespaces, vname);
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa if ((ns->flags & NAMESPACE_FLAG_UNUSABLE) != 0) {
80af46b05711efde86eae411ee0c11c70433527dEugen Kuksa i_error("autocreate: No namespace found for mailbox: %s",
2dd343358095286426c3ba8f6803572ee4c0a00aEugen Kuksa vname);
830a9c18a0749270046905672daf2f66c7e32d56Eugen Kuksa return;
}
if (array_is_created(&ns->set->mailboxes))
tmp_ns_set.mailboxes = ns->set->mailboxes;
else {
p_array_init(&tmp_ns_set.mailboxes, user->pool, 16);
/* work around ns->set being a const pointer. pretty ugly, but
this plugin is deprecated anyway. */
memcpy((void *)&ns->set->mailboxes.arr, &tmp_ns_set.mailboxes.arr,
sizeof(ns->set->mailboxes.arr));
}
if (strncmp(vname, ns->prefix, ns->prefix_len) == 0)
vname += ns->prefix_len;
set = mailbox_settings_find(ns, vname);
if (set == NULL) {
set = p_new(user->pool, struct mailbox_settings, 1);
set->name = p_strdup(user->pool, vname);
set->autocreate = MAILBOX_SET_AUTO_NO;
set->special_use = "";
array_append(&tmp_ns_set.mailboxes, &set, 1);
}
if (subscriptions)
set->autocreate = MAILBOX_SET_AUTO_SUBSCRIBE;
else if (strcmp(set->autocreate, MAILBOX_SET_AUTO_SUBSCRIBE) != 0)
set->autocreate = MAILBOX_SET_AUTO_CREATE;
}
static void
read_autobox_settings(struct mail_user *user, const char *env_name_base,
bool subscriptions)
{
const char *value;
char env_name[13+MAX_INT_STRLEN+1];
unsigned int i = 1;
value = mail_user_plugin_getenv(user, env_name_base);
while (value != NULL) {
add_autobox(user, value, subscriptions);
if (i_snprintf(env_name, sizeof(env_name), "%s%u",
env_name_base, ++i) < 0)
i_unreached();
value = mail_user_plugin_getenv(user, env_name);
}
}
static void
autocreate_mail_namespaces_created(struct mail_namespace *namespaces)
{
read_autobox_settings(namespaces->user, "autocreate", FALSE);
read_autobox_settings(namespaces->user, "autosubscribe", TRUE);
}
static struct mail_storage_hooks autocreate_mail_storage_hooks = {
.mail_namespaces_created = autocreate_mail_namespaces_created
};
void autocreate_plugin_init(struct module *module)
{
i_warning("autocreate plugin is deprecated, use mailbox { auto } setting instead");
mail_storage_hooks_add(module, &autocreate_mail_storage_hooks);
}
void autocreate_plugin_deinit(void)
{
mail_storage_hooks_remove(&autocreate_mail_storage_hooks);
}