]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-urlauth: imap-urlauth-login - Send server-to-client VERSION line.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 22 Feb 2023 02:26:27 +0000 (03:26 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 24 Mar 2023 07:14:54 +0000 (07:14 +0000)
src/imap-urlauth/imap-urlauth-login.c
src/lib-imap-urlauth/imap-urlauth-connection.c

index e917a5b8d3d76c41348b06bca7ac28fe4773ea1a..04cbaf23fb42748db7813e3b2bd1bd7b7d5d51fb 100644 (file)
@@ -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,
index 89bcc7b5ce8dc71c520241cec3ae3d30f2953f77..fde5b08b1f9e47e8e6dba83868d851e215aa036b 100644 (file)
@@ -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);
 }