From 03e925f4268bebb716a1dfef64ab450cb98cd36d Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 19 Mar 2010 15:35:11 +0200 Subject: [PATCH] Check that namespace's alias_for points to a namespace with compatible storage. --HG-- branch : HEAD --- src/lib-storage/mail-namespace.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/lib-storage/mail-namespace.c b/src/lib-storage/mail-namespace.c index 85c4718944..732b80a13b 100644 --- a/src/lib-storage/mail-namespace.c +++ b/src/lib-storage/mail-namespace.c @@ -137,6 +137,29 @@ namespace_add(struct mail_user *user, return 0; } +static bool namespace_is_valid_alias_storage(struct mail_namespace *ns, + const char **error_r) +{ + if (strcmp(ns->storage->name, ns->alias_for->storage->name) != 0) { + *error_r = t_strdup_printf( + "Namespace %s can't have alias_for=%s " + "to a different storage type (%s vs %s)", + ns->prefix, ns->alias_for->prefix, + ns->storage->name, ns->alias_for->storage->name); + return FALSE; + } + + if ((ns->storage->class_flags & MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT) != 0 && + ns->storage != ns->alias_for->storage) { + *error_r = t_strdup_printf( + "Namespace %s can't have alias_for=%s " + "to a different storage (different root dirs)", + ns->prefix, ns->alias_for->prefix); + return FALSE; + } + return TRUE; +} + static int namespace_set_alias_for(struct mail_namespace *ns, struct mail_namespace *all_namespaces, @@ -155,6 +178,9 @@ namespace_set_alias_for(struct mail_namespace *ns, ns->set->alias_for); return -1; } + if (!namespace_is_valid_alias_storage(ns, error_r)) + return -1; + ns->alias_chain_next = ns->alias_for->alias_chain_next; ns->alias_for->alias_chain_next = ns; } -- 2.47.3