changeset 22865:700827777c0b

imap: When running standalone, delay initializing namespaces until PREAUTH is sent Most importantly this makes the code paths similar for standalone and non-standalone clients, which is needed by the following commits.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 15 Feb 2018 18:13:20 +0200
parents 4e340516a8ce
children e8bb571b38b4
files src/imap/main.c
diffstat 1 files changed, 16 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/main.c	Mon Feb 19 14:44:04 2018 +0200
+++ b/src/imap/main.c	Thu Feb 15 18:13:20 2018 +0200
@@ -229,14 +229,6 @@
 		client_continue_pending_input(client);
 }
 
-static void
-client_add_input(struct client *client, const unsigned char *client_input,
-		 size_t client_input_size)
-{
-	client_add_input_capability(client, client_input, client_input_size);
-	client_add_input_finalize(client);
-}
-
 int client_create_from_input(const struct mail_storage_service_input *input,
 			     int fd_in, int fd_out,
 			     struct client **client_r, const char **error_r)
@@ -292,15 +284,17 @@
 				     &client, &error) < 0)
 		i_fatal("%s", error);
 
-	/* TODO: the following could make use of
-	   client_add_input_{capability,finalize} */
 	input_base64 = getenv("CLIENT_INPUT");
 	if (input_base64 == NULL)
-		client_add_input(client, NULL, 0);
+		client_add_input_capability(client, NULL, 0);
 	else {
 		const buffer_t *input_buf = t_base64_decode_str(input_base64);
-		client_add_input(client, input_buf->data, input_buf->used);
+		client_add_input_capability(client, input_buf->data, input_buf->used);
 	}
+
+	if (mail_namespaces_init(client->user, &error) < 0)
+		i_fatal("%s", error);
+	client_add_input_finalize(client);
 	/* client may be destroyed now */
 }
 
@@ -395,7 +389,15 @@
 	};
 	struct master_login_settings login_set;
 	enum master_service_flags service_flags = 0;
-	enum mail_storage_service_flags storage_service_flags = 0;
+	enum mail_storage_service_flags storage_service_flags =
+		/*
+		 * We include MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES so
+		 * that the mail_user initialization is fast and we can
+		 * quickly send back the OK response to LOGIN/AUTHENTICATE.
+		 * Otherwise we risk a very slow namespace initialization to
+		 * cause client timeouts on login.
+		 */
+		MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES;
 	const char *username = NULL, *auth_socket_path = "auth-master";
 	int c;
 
@@ -416,16 +418,7 @@
 	} else {
 		service_flags |= MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN;
 		storage_service_flags |=
-			MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT |
-			MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES;
-
-		/*
-		 * We include MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES so
-		 * that the mail_user initialization is fast and we can
-		 * quickly send back the OK response to LOGIN/AUTHENTICATE.
-		 * Otherwise we risk a very slow namespace initialization to
-		 * cause client timeouts on login.
-		 */
+			MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
 	}
 
 	master_service = master_service_init("imap", service_flags,