changeset 22305:91b8f2b6ebcb

lib-storage: Changed mail storage initialization. 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)
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 02 May 2016 17:00:22 +0300
parents e181b398eac9
children 8459df27194b
files src/lib-storage/index/raw/raw-storage.c src/lib-storage/mail-namespace.c src/lib-storage/mail-user.c
diffstat 3 files changed, 12 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/raw/raw-storage.c	Mon Jul 03 21:08:02 2017 +0300
+++ b/src/lib-storage/index/raw/raw-storage.c	Mon May 02 17:00:22 2016 +0300
@@ -47,6 +47,8 @@
 
 	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;
 }
 
--- a/src/lib-storage/mail-namespace.c	Mon Jul 03 21:08:02 2017 +0300
+++ b/src/lib-storage/mail-namespace.c	Mon May 02 17:00:22 2016 +0300
@@ -367,7 +367,9 @@
 		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 @@
 		}
 	}
 
-	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 @@
 		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 @@
 	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;
 }
 
--- a/src/lib-storage/mail-user.c	Mon Jul 03 21:08:02 2017 +0300
+++ b/src/lib-storage/mail-user.c	Mon May 02 17:00:22 2016 +0300
@@ -319,6 +319,7 @@
 
 		tmp = &user->namespaces;
 		for (; *tmp != NULL; tmp = &(*tmp)->next) {
+			i_assert(*tmp != ns);
 			if (strlen(ns->prefix) < strlen((*tmp)->prefix))
 				break;
 		}