From: Stephan Bosch Date: Wed, 22 Feb 2023 02:26:27 +0000 (+0100) Subject: imap-urlauth: imap-urlauth-login - Send server-to-client VERSION line. X-Git-Tag: 2.4.0~2880 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef874062529aa2af89ddea143e1aaca78580906f;p=thirdparty%2Fdovecot%2Fcore.git imap-urlauth: imap-urlauth-login - Send server-to-client VERSION line. --- diff --git a/src/imap-urlauth/imap-urlauth-login.c b/src/imap-urlauth/imap-urlauth-login.c index e917a5b8d3..04cbaf23fb 100644 --- a/src/imap-urlauth/imap-urlauth-login.c +++ b/src/imap-urlauth/imap-urlauth-login.c @@ -153,6 +153,21 @@ static void imap_urlauth_client_create client->io = io_add_istream(client->input, client_input, client); } +static void imap_urlauth_client_notify_auth_ready(struct client *client) +{ + string_t *version; + + version = t_str_new(128); + str_append(version, "VERSION\timap-urlauth"); + str_printfa(version, "\t%u", IMAP_URLAUTH_PROTOCOL_MAJOR_VERSION); + str_printfa(version, "\t%u", IMAP_URLAUTH_PROTOCOL_MINOR_VERSION); + str_append(version, "\n"); + + client_send_raw(client, str_c(version)); + + client->banner_sent = TRUE; +} + static void imap_urlauth_login_preinit(void) { login_set_roots = imap_urlauth_login_setting_roots; @@ -170,6 +185,7 @@ static void imap_urlauth_login_deinit(void) static struct client_vfuncs imap_urlauth_vfuncs = { .alloc = imap_urlauth_client_alloc, .create = imap_urlauth_client_create, + .notify_auth_ready = imap_urlauth_client_notify_auth_ready, .input = imap_urlauth_client_input, .auth_result = imap_urlauth_client_auth_result, .send_raw_data = client_common_send_raw_data, diff --git a/src/lib-imap-urlauth/imap-urlauth-connection.c b/src/lib-imap-urlauth/imap-urlauth-connection.c index 89bcc7b5ce..fde5b08b1f 100644 --- a/src/lib-imap-urlauth/imap-urlauth-connection.c +++ b/src/lib-imap-urlauth/imap-urlauth-connection.c @@ -852,6 +852,20 @@ static int imap_urlauth_input_next(struct imap_urlauth_connection *conn) const char *response; int ret; + if (!conn->conn.version_received) { + if ((response = i_stream_next_line(conn->conn.input)) == NULL) + return 0; + + if (connection_handshake_args_default( + &conn->conn, t_strsplit_tabescaped(response)) < 0) { + imap_urlauth_connection_fail(conn); + return -1; + } + if (imap_urlauth_authenticate(conn) < 0) + return -1; + return 1; + } + switch (conn->state) { case IMAP_URLAUTH_STATE_CONNECTING: break; @@ -983,9 +997,6 @@ imap_urlauth_connection_connected(struct connection *_conn, bool success) /* Cannot get here unless UNIX socket connect() was successful */ i_assert(success); - if (imap_urlauth_authenticate(conn) < 0) - return; - imap_urlauth_start_response_timeout(conn); }