mail-namespace.c revision de83c1e095ba081ef80f630bcd933e5e28aff94b
b9f30617c2c96d54acbc4f85ed17b939c4f28916Timo Sirainen/* Copyright (c) 2005-2012 Dovecot authors, see the included COPYING file */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenvoid mail_namespace_add_storage(struct mail_namespace *ns,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* currently we support only a single storage */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenvoid mail_namespace_finish_list_init(struct mail_namespace *ns,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void mail_namespace_free(struct mail_namespace *ns)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (ns->owner != ns->user && ns->owner != NULL)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct mail_namespace_settings *unexpanded_ns_set,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct mail_namespace **ns_p, const char **error_r)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (strncmp(ns_set->type, "private", 7) == 0) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen } else if (strncmp(ns_set->type, "shared", 6) == 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen else if (strncmp(ns_set->type, "public", 6) == 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = t_strdup_printf("Unknown namespace type: %s",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = t_strdup_printf("Invalid list setting value: %s",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen i_debug("Namespace %s: type=%s, prefix=%s, sep=%s, "
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen "inbox=%s, hidden=%s, list=%s, subscriptions=%s "
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen "location=%s",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ns_set->separator == NULL ? "" : ns_set->separator,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ns_set->subscriptions ? "yes" : "no", ns_set->location);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* dynamic shared namespace. the above check catches wrong
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen mixed %% usage, but still allows for specifying a shared
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen namespace to an explicit location without any %% */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ns->flags |= NAMESPACE_FLAG_NOQUOTA | NAMESPACE_FLAG_NOACL;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (mail_storage_create(ns, driver, 0, &error) < 0) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = t_strdup_printf("Namespace '%s': %s",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic bool namespace_is_valid_alias_storage(struct mail_namespace *ns,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char **error_r)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (strcmp(ns->storage->name, ns->alias_for->storage->name) != 0) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen "Namespace %s can't have alias_for=%s "
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen "to a different storage type (%s vs %s)",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ns->storage->name, ns->alias_for->storage->name);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if ((ns->storage->class_flags & MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT) != 0 &&
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen "Namespace %s can't have alias_for=%s "
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen "to a different storage (different root dirs)",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainennamespace_set_alias_for(struct mail_namespace *ns,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char **error_r)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ns->alias_for = mail_namespace_find_prefix(all_namespaces,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = t_strdup_printf("Invalid namespace alias_for: %s",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = t_strdup_printf("Chained namespace alias_for: %s",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (!namespace_is_valid_alias_storage(ns, error_r))
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen ns->alias_chain_next = ns->alias_for->alias_chain_next;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainennamespaces_check(struct mail_namespace *namespaces, const char **error_r)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen unsigned int subscriptions_count = 0;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen for (ns = namespaces; ns != NULL; ns = ns->next) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (mail_namespace_find_prefix(ns->next, ns->prefix) != NULL) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen "Duplicate namespace prefix: \"%s\"",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (namespace_set_alias_for(ns, namespaces, error_r) < 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if ((ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
return FALSE;
NAMESPACE_FLAG_LIST_CHILDREN)) != 0 &&
return FALSE;
NAMESPACE_FLAG_LIST_CHILDREN)) != 0 &&
return FALSE;
NAMESPACE_FLAG_LIST_CHILDREN)) != 0) {
return FALSE;
return FALSE;
return FALSE;
if (subscriptions_count == 0) {
return FALSE;
return TRUE;
count = 0;
for (i = 0; i < count; i++) {
T_BEGIN {
} T_END;
const char **error_r)
T_BEGIN {
} T_END;
return ns;
void *context)
struct mail_storage *
return TRUE;
return TRUE;
return TRUE;
return FALSE;
static struct mail_namespace *
unsigned int best_len = 0;
bool inbox;
return ns;
return best;
return best;
static struct mail_namespace *
return ns;
struct mail_namespace *
return ns;
struct mail_namespace *
const char **mailbox)
const char *storage_name;
return ns;
struct mail_namespace *
const char *mailbox)
struct mail_namespace *
const char *mailbox)
struct mail_namespace *
const char *mailbox)
struct mail_namespace *
return namespaces;
struct mail_namespace *
const char *prefix)
return ns;
return NULL;
struct mail_namespace *
const char *prefix)
return ns;
return NULL;