]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Changed mail storage initialization.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 2 May 2016 14:00:22 +0000 (17:00 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 2 May 2016 14:03:12 +0000 (17:03 +0300)
Most importantly require mail_namespaces_init_finish() after
mail_storage_create(). This was needed so that
mail_namespaces_created/added hook would always have the ns->list set, which
is required for several of the hooks to work (e.g. mailbox list index)

src/lib-storage/index/raw/raw-storage.c
src/lib-storage/mail-namespace.c
src/lib-storage/mail-user.c

index c70500d0506ddaece519e85f288849ff90fcae75..3e833a6ed22107798213c138c3394bd617bfaded 100644 (file)
@@ -47,6 +47,8 @@ raw_storage_create_from_set(const struct setting_parser_info *set_info,
 
        if (mail_storage_create(ns, "raw", 0, &error) < 0)
                i_fatal("Couldn't create internal raw storage: %s", error);
+       if (mail_namespaces_init_finish(ns, &error) < 0)
+               i_fatal("Couldn't create internal raw namespace: %s", error);
        return user;
 }
 
index 88c0ce606fdf969dae5c785bb26df4486f3b5e90..a8ac2c6c1d30c666498f39ce08a3493e8a2e47c0 100644 (file)
@@ -341,7 +341,9 @@ int mail_namespaces_init_finish(struct mail_namespace *namespaces,
                ns->next = namespaces;
                namespaces = ns;
        }
-       if (!namespaces_check(namespaces, error_r)) {
+       if (namespaces->user->autocreated) {
+               /* e.g. raw user - don't check namespaces' validity */
+       } else if (!namespaces_check(namespaces, error_r)) {
                *error_r = t_strconcat("namespace configuration error: ",
                                       *error_r, NULL);
                while (namespaces != NULL) {
@@ -401,11 +403,12 @@ int mail_namespaces_init(struct mail_user *user, const char **error_r)
                }
        }
 
-       if (namespaces != NULL)
-               return mail_namespaces_init_finish(namespaces, error_r);
-
-       /* no namespaces defined, create a default one */
-       return mail_namespaces_init_location(user, NULL, error_r);
+       if (namespaces == NULL) {
+               /* no namespaces defined, create a default one */
+               if (mail_namespaces_init_location(user, NULL, error_r) < 0)
+                       return -1;
+       }
+       return mail_namespaces_init_finish(namespaces, error_r);
 }
 
 int mail_namespaces_init_location(struct mail_user *user, const char *location,
@@ -489,12 +492,6 @@ int mail_namespaces_init_location(struct mail_user *user, const char *location,
                mail_namespace_free(ns);
                return -1;
        }
-       user->namespaces = ns;
-
-       T_BEGIN {
-               hook_mail_namespaces_added(ns);
-               hook_mail_namespaces_created(ns);
-       } T_END;
        return 0;
 }
 
@@ -511,7 +508,6 @@ struct mail_namespace *mail_namespaces_init_empty(struct mail_user *user)
                NAMESPACE_FLAG_LIST_PREFIX | NAMESPACE_FLAG_SUBSCRIPTIONS;
        ns->mail_set = mail_user_set_get_storage_set(user);
        i_array_init(&ns->all_storages, 2);
-       user->namespaces = ns;
        return ns;
 }
 
index ca7cd96b68f6ee053c618ff66098862251e98404..139283f7d1d49a28b86b44a08ff7be9fc0ad658e 100644 (file)
@@ -288,6 +288,7 @@ void mail_user_add_namespace(struct mail_user *user,
 
                tmp = &user->namespaces;
                for (; *tmp != NULL; tmp = &(*tmp)->next) {
+                       i_assert(*tmp != ns);
                        if (strlen(ns->prefix) < strlen((*tmp)->prefix))
                                break;
                }