]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Fix "nodelay" field to work again
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 8 Jun 2023 07:22:13 +0000 (10:22 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 9 Oct 2023 17:18:21 +0000 (17:18 +0000)
Broken by 31633d676642b83305b8d46da495d9bb4e2d1ff8

src/auth/auth-request-handler.c
src/auth/auth-request.c
src/auth/auth-request.h
src/auth/test-mech.c

index a885a78612a949b21f7625a759ba6565f514011f..4f190cc35a968fbf13db5dba812cd2c9d3870cda 100644 (file)
@@ -231,7 +231,9 @@ auth_request_handle_failure(struct auth_request *request, const char *reply)
        if (request->set->policy_report_after_auth)
                auth_policy_report(request);
 
-       if (auth_fields_exists(request->fields.extra_fields, "nodelay")) {
+       e_debug(request->event, "handling failure, nodelay=%d",
+               (int) request->failure_nodelay);
+       if (request->failure_nodelay) {
                /* passdb specifically requested not to delay the reply. */
                handler->callback(reply, handler->conn);
                auth_request_unref(&request);
index 87b704907a88950c7601359c8751193f5b4ac197..a40158cfc57412846ec32f62454a7f8973ec96c0 100644 (file)
@@ -1772,6 +1772,11 @@ void auth_request_set_field(struct auth_request *request,
                                               &request->fields.remote_ip);
        } else if (strcmp(name, "fail") == 0) {
                request->failed = TRUE;
+       } else if (strcmp(name, "nodelay") == 0) {
+               /* don't delay replying to client of the failure */
+               request->failure_nodelay = TRUE;
+               auth_fields_add(request->fields.extra_fields, name, value, 0);
+               return;
        } else if (strcmp(name, "delay_until") == 0) {
                time_t timestamp;
                unsigned int extra_secs = 0;
index 6322724066227561542a760b572c2db8e3fb5e7e..a394112893ae2e17bfa9f8fdb0771de8c0d0dea3 100644 (file)
@@ -213,6 +213,10 @@ struct auth_request {
        bool stats_sent:1;
        bool policy_refusal:1;
        bool policy_processed:1;
+       /* "nodelay" passdb extra field: Disable delay if auth fails. This
+          needs to be tracked outside regular extra fields, because they get
+          rolled back on passdb failure. */
+       bool failure_nodelay:1;
 
        bool event_finished_sent:1;
 
index 9f45afae94c04396bb80fe53f335ae349e561ed1..d6150a1cd1ec032f9b40d058ff8112d26a14d8d3 100644 (file)
@@ -147,7 +147,7 @@ static void test_mech_prepare_request(struct auth_request **request_r,
        request->userdb = auth->userdbs;
        handler->refcount = 1;
 
-       auth_fields_add(request->fields.extra_fields, "nodelay", "", 0);
+       request->failure_nodelay = TRUE;
        auth_request_ref(request);
        auth_request_state_count[AUTH_REQUEST_STATE_NEW] = 1;