From: Timo Sirainen Date: Thu, 15 Feb 2018 16:13:20 +0000 (+0200) Subject: imap: When running standalone, delay initializing namespaces until PREAUTH is sent X-Git-Tag: 2.2.35~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aeb142d4223fa15c4d1bd226c4dccebda450da84;p=thirdparty%2Fdovecot%2Fcore.git 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. --- diff --git a/src/imap/main.c b/src/imap/main.c index ad4890be97..e62e2360ea 100644 --- a/src/imap/main.c +++ b/src/imap/main.c @@ -229,14 +229,6 @@ client_add_input_finalize(struct client *client) 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 @@ static void main_stdio_run(const char *username) &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 @@ int main(int argc, char *argv[]) }; 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 @@ int main(int argc, char *argv[]) } 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,