From: Timo Sirainen Date: Fri, 19 Mar 2010 13:35:11 +0000 (+0200) Subject: Check that namespace's alias_for points to a namespace with compatible storage. X-Git-Tag: 2.0.beta4~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=03e925f4268bebb716a1dfef64ab450cb98cd36d;p=thirdparty%2Fdovecot%2Fcore.git Check that namespace's alias_for points to a namespace with compatible storage. --HG-- branch : HEAD --- 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; }