]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-auth-client: auth-client - Move request removal decision to auth_client_request_s...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 3 Nov 2023 00:57:38 +0000 (01:57 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Nov 2023 10:49:10 +0000 (10:49 +0000)
src/lib-auth-client/auth-client-connection.c
src/lib-auth-client/auth-client-private.h
src/lib-auth-client/auth-client-request.c

index 7761578719f1daa433dd3a3a7ab7eef2f4bd93af..6f854987d566806efb7cff1fcbe8671727f169b6 100644 (file)
@@ -220,7 +220,7 @@ static void auth_client_connection_handshake_ready(struct connection *_conn)
 
 static int
 auth_server_lookup_request(struct auth_client_connection *conn,
-                          const char *id_arg, bool remove,
+                          const char *id_arg, bool server_finished,
                           struct auth_client_request **request_r)
 {
        struct auth_client_request *request;
@@ -238,8 +238,13 @@ auth_server_lookup_request(struct auth_client_connection *conn,
                        "Authentication server sent unknown id %u", id);
                return 0;
        }
-       if (remove || auth_client_request_is_aborted(request))
-               auth_client_connection_remove_request(request->conn, request);
+       if (request->server_finished) {
+               e_error(conn->conn.event,
+                       "Authentication server sent finished id %u", id);
+               return 0;
+       }
+       if (server_finished)
+               request->server_finished = TRUE;
 
        *request_r = request;
        return 1;
@@ -255,7 +260,7 @@ auth_server_input_ok(struct auth_client_connection *conn,
        ret = auth_server_lookup_request(conn, args[0], TRUE, &request);
        if (ret <= 0)
                return ret;
-       auth_client_request_server_input(request, AUTH_REQUEST_STATUS_OK,
+       auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_OK,
                                         args + 1);
        return 0;
 }
@@ -276,7 +281,7 @@ auth_server_input_cont(struct auth_client_connection *conn,
        ret = auth_server_lookup_request(conn, args[0], FALSE, &request);
        if (ret <= 0)
                return ret;
-       auth_client_request_server_input(request, AUTH_REQUEST_STATUS_CONTINUE,
+       auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_CONTINUE,
                                         args + 1);
        return 0;
 }
@@ -291,7 +296,7 @@ auth_server_input_fail(struct auth_client_connection *conn,
        ret = auth_server_lookup_request(conn, args[0], TRUE, &request);
        if (ret <= 0)
                return ret;
-       auth_client_request_server_input(request, AUTH_REQUEST_STATUS_FAIL,
+       auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_FAIL,
                                         args + 1);
        return 0;
 }
@@ -386,7 +391,7 @@ auth_client_connection_remove_requests(struct auth_client_connection *conn,
                                oldest = created;
                }
 
-               auth_client_request_server_input(request,
+               auth_client_request_server_input(&request,
                        AUTH_REQUEST_STATUS_INTERNAL_FAIL,
                        temp_failure_args);
        }
index e8fcfa87f3bb71bd604554bb4a65b68dd9765021..d5c99e2fc364f6d3aa0d3ee47b537cead375041d 100644 (file)
@@ -19,6 +19,7 @@ struct auth_client_request {
        auth_request_callback_t *callback;
        void *context;
 
+       bool server_finished:1;
        bool removed:1;
 };
 
@@ -68,7 +69,7 @@ extern struct event_category event_category_auth_client;
 bool auth_client_request_is_aborted(struct auth_client_request *request);
 time_t auth_client_request_get_create_time(struct auth_client_request *request);
 
-void auth_client_request_server_input(struct auth_client_request *request,
+void auth_client_request_server_input(struct auth_client_request **_request,
                                      enum auth_request_status status,
                                      const char *const *args);
 
index d74b4a78108193563134b7d303ed2d506dfb10c9..472e3c05ea9c98a9717b2811fd45ec072354cc9c 100644 (file)
@@ -343,16 +343,18 @@ void auth_client_request_continue(struct auth_client_request *request,
        }
 }
 
-void auth_client_request_server_input(struct auth_client_request *request,
+void auth_client_request_server_input(struct auth_client_request **_request,
                                      enum auth_request_status status,
                                      const char *const *args)
 {
+       struct auth_client_request *request = *_request;
        const char *const *tmp, *base64_data = NULL;
        struct event_passthrough *e;
 
        if (auth_client_request_is_aborted(request)) {
                /* aborted already */
-               return;
+               auth_client_request_free(_request);
+               return TRUE;
        }
 
        switch (status) {
@@ -402,7 +404,7 @@ void auth_client_request_server_input(struct auth_client_request *request,
 
        call_callback(request, status, base64_data, args);
        if (status != AUTH_REQUEST_STATUS_CONTINUE)
-               auth_client_request_free(&request);
+               auth_client_request_free(_request);
 }
 
 void auth_client_send_cancel(struct auth_client *client, unsigned int id)