]> 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)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 11 Jul 2017 06:35:57 +0000 (09:35 +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 185495ce7d5dbecfa4700db9e9ed7f07169ef92e..ed4904ec62f9064ae3efb003f90b9e20a4036f30 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 1800746e31e81416eebf524ee78169457c6b7232..d8d296dd8b37b403f0bdfe41378062c6f5d89e08 100644 (file)
@@ -367,7 +367,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) {
@@ -434,11 +436,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,
@@ -514,12 +517,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;
 }
 
@@ -537,7 +534,6 @@ struct mail_namespace *mail_namespaces_init_empty(struct mail_user *user)
        ns->user_set = user->set;
        ns->mail_set = mail_user_set_get_storage_set(user);
        i_array_init(&ns->all_storages, 2);
-       user->namespaces = ns;
        return ns;
 }
 
index d90ae5535d0aca298b61c81554401479e8153ebb..4635ffe0b576ee2081703196a4e6eab22f359f23 100644 (file)
@@ -319,6 +319,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;
                }