]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: auth-request - Move SASL mechanism initialization to auth_request_init()
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 17 Mar 2023 02:19:24 +0000 (03:19 +0100)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 9 Oct 2025 08:41:22 +0000 (08:41 +0000)
src/auth/auth-request-fields.c
src/auth/auth-request-handler.c
src/auth/auth-request.c
src/auth/auth-request.h
src/auth/test-auth-request-fields.c
src/auth/test-mech.c

index 8dbb8c9b0e7757c2f50275d525341e6f92050d41..e332e0349daa8d317acd134a9eb9751e4ad7012d 100644 (file)
 #include "sasl-server-protected.h" // FIXME: remove
 #include "auth-request.h"
 
-void auth_request_fields_init(struct auth_request *request)
+void auth_request_fields_alloc(struct auth_request *request)
 {
        request->fields.extra_fields = auth_fields_init(request->pool);
+       /* Default to "insecure" until it's changed later */
+       event_add_str(request->event, "transport", "insecure");
+}
+
+void auth_request_fields_init(struct auth_request *request)
+{
        if (request->mech != NULL) {
                request->fields.mech_name = request->mech->mech_name;
                event_add_str(request->event, "mechanism",
                              request->mech->mech_name);
        }
-       /* Default to "insecure" until it's changed later */
-       event_add_str(request->event, "transport", "insecure");
 }
 
 static void
index 47d3010977104fc2a35e6c1dc45e415ce6d6ea80..90c3a56d1239ffa86308ea582ff495e229794b13 100644 (file)
@@ -607,9 +607,8 @@ auth_request_handler_find_mech(struct auth_request_handler *handler,
 int auth_request_handler_auth_begin(struct auth_request_handler *handler,
                                    const char *const *args)
 {
-       const struct sasl_server_mech_def *mech;
        struct auth_request *request;
-       const char *name, *arg, *initial_resp;
+       const char *mech_name, *name, *arg, *initial_resp;
        void *initial_resp_data;
        unsigned int id;
        buffer_t *buf;
@@ -624,11 +623,9 @@ int auth_request_handler_auth_begin(struct auth_request_handler *handler,
                        "sent broken AUTH request", handler->client_pid);
                return -1;
        }
+       mech_name = args[1];
 
-       if (auth_request_handler_find_mech(handler, args[1], &mech) < 0)
-               return -1;
-
-       request = auth_request_new(mech, handler->conn->conn.event);
+       request = auth_request_new(handler->conn->event);
        request->handler = handler;
        request->connect_uid = handler->connect_uid;
        request->client_pid = handler->client_pid;
@@ -681,7 +678,12 @@ int auth_request_handler_auth_begin(struct auth_request_handler *handler,
                auth_request_unref(&request);
                return -1;
        }
-       auth_request_init(request);
+
+       const struct sasl_server_mech_def *mech;
+
+       if (auth_request_handler_find_mech(handler, mech_name, &mech) < 0)
+               return -1;
+       auth_request_init_sasl(request, mech);
 
        request->to_abort = timeout_add(MASTER_AUTH_SERVER_TIMEOUT_SECS * 1000,
                                        auth_request_timeout, request);
index ed3a483ff8b9520582663d512358a977537a9ad1..9a894948780db9914cfe185fc9573502e879d996 100644 (file)
@@ -136,7 +136,7 @@ auth_request_post_alloc_init(struct auth_request *request,
        request->set = global_auth_settings;
        request->protocol_set = global_auth_settings;
        request->event = event_create(parent_event);
-       auth_request_fields_init(request);
+       auth_request_fields_alloc(request);
 
        level = request->set->verbose ? LOG_TYPE_INFO : LOG_TYPE_WARNING;
        event_set_min_log_level(request->event, level);
@@ -149,9 +149,7 @@ auth_request_post_alloc_init(struct auth_request *request,
        p_array_init(&request->authdb_event, request->pool, 2);
 }
 
-struct auth_request *
-auth_request_new(const struct sasl_server_mech_def *mech,
-                struct event *parent_event)
+struct auth_request *auth_request_new(struct event *parent_event)
 {
        struct auth_request *request;
        pool_t pool;
@@ -159,20 +157,8 @@ auth_request_new(const struct sasl_server_mech_def *mech,
        pool = pool_alloconly_create(MEMPOOL_GROWING"auth_request", 1024);
        request = p_new(pool, struct auth_request, 1);
        request->pool = pool;
-       request->mech = mech;
-       auth_request_post_alloc_init(request, parent_event);
-
-       enum log_type level =
-               (request->set->verbose ? LOG_TYPE_INFO : LOG_TYPE_WARNING);
-       const char *prefix = t_strconcat(
-               t_str_lcase(request->mech->mech_name), ": ", NULL);
-
-       request->mech_event = event_create(request->event);
-       event_set_min_log_level(request->mech_event, level);
-       event_set_append_log_prefix(request->mech_event, prefix);
-
-       auth_sasl_request_init(request, mech);
 
+       auth_request_post_alloc_init(request, parent_event);
        return request;
 }
 
@@ -214,6 +200,23 @@ void auth_request_init(struct auth_request *request)
        request->protocol_set = auth->protocol_set;
        request->passdb = auth->passdbs;
        request->userdb = auth->userdbs;
+
+       auth_request_fields_init(request);
+}
+
+void auth_request_init_sasl(struct auth_request *request,
+                           const struct sasl_server_mech_def *mech)
+{
+       request->mech = mech;
+
+       const char *prefix = t_strconcat(
+               t_str_lcase(request->mech->mech_name), ": ", NULL);
+
+       request->mech_event = event_create(request->event);
+       event_set_append_log_prefix(request->mech_event, prefix);
+
+       auth_sasl_request_init(request, mech);
+       auth_request_init(request);
 }
 
 struct auth *auth_request_get_auth(struct auth_request *request)
index cbef305000661459206e0043240e0559aa1a38d9..42a7434a6580af0cc34fd2d627d5f646f9d98b6f 100644 (file)
@@ -257,11 +257,13 @@ typedef void auth_request_proxy_cb_t(bool success, struct auth_request *);
 
 extern unsigned int auth_request_state_count[AUTH_REQUEST_STATE_MAX];
 
-struct auth_request *
-auth_request_new(const struct sasl_server_mech_def *mech,
-                struct event *parent_event);
+struct auth_request *auth_request_new(struct event *parent_event);
 struct auth_request *auth_request_new_dummy(struct event *parent_event);
+
 void auth_request_init(struct auth_request *request);
+void auth_request_init_sasl(struct auth_request *request,
+                           const struct sasl_server_mech_def *mech);
+
 struct auth *auth_request_get_auth(struct auth_request *request);
 
 void auth_request_set_state(struct auth_request *request,
@@ -434,6 +436,8 @@ struct event_passthrough *
 auth_request_finished_event(struct auth_request *request, struct event *event);
 void auth_request_log_finished(struct auth_request *request);
 void auth_request_master_user_login_finish(struct auth_request *request);
+
+void auth_request_fields_alloc(struct auth_request *request);
 void auth_request_fields_init(struct auth_request *request);
 
 void auth_request_passdb_lookup_begin(struct auth_request *request);
index 7fccb15692a7978b54d3df93ea02ff423554a7c4..25096d280f105321589fa90e0fc10737cb4124a5 100644 (file)
@@ -56,6 +56,7 @@ test_auth_request_init(const struct sasl_server_mech_def *mech)
        request->set = global_auth_settings;
        request->refcount = 1;
        p_array_init(&request->authdb_event, pool, 1);
+       auth_request_fields_alloc(request);
        auth_request_fields_init(request);
 
        /* fill out fields that are always exported */
index 358bb8ccca02f801bdcb3ee4385856d93e69dfc1..b1b29084c20b55cdd439cea5151e4695960ca647 100644 (file)
@@ -89,9 +89,7 @@ static void test_mech_prepare_request(struct auth_request **request_r,
                                      unsigned int running_test,
                                      const struct test_case *test_case)
 {
-       struct auth *auth = auth_default_protocol();
-
-       struct auth_request *request = auth_request_new(mech,  NULL);
+       struct auth_request *request = auth_request_new(NULL);
        struct auth_settings *new_set =
                p_memdup(request->pool, global_auth_settings,
                         sizeof(*global_auth_settings));
@@ -100,14 +98,16 @@ static void test_mech_prepare_request(struct auth_request **request_r,
        request->handler = handler;
        request->id = running_test+1;
        request->mech_password = NULL;
+       request->fields.protocol = "service";
        request->state = AUTH_REQUEST_STATE_NEW;
+       request->mech = mech;
        request->set = new_set;
        request->protocol_set = global_auth_settings;
        request->connect_uid = running_test;
-       request->passdb = auth->passdbs;
-       request->userdb = auth->userdbs;
        handler->refcount = 1;
 
+       auth_request_init_sasl(request, mech);
+
        request->failure_nodelay = TRUE;
        auth_request_state_count[AUTH_REQUEST_STATE_NEW] = 1;