]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Support passdb-specific auth_settings
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 11 Jan 2024 16:09:13 +0000 (11:09 -0500)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
src/auth/auth-request.c
src/auth/auth-request.h
src/auth/auth.c
src/auth/auth.h
src/auth/test-mech.c

index 6e7cb1910ede8f921359d2d157dc00d0c26d9893..5c0e578ccae5fdaa73ec4dbee8b78bbd893361b2 100644 (file)
@@ -139,6 +139,7 @@ auth_request_post_alloc_init(struct auth_request *request,
        request->last_access = ioloop_time;
        request->session_pid = (pid_t)-1;
        request->set = global_auth_settings;
+       request->protocol_set = global_auth_settings;
        request->event = event_create(parent_event);
        auth_request_fields_init(request);
 
@@ -208,6 +209,7 @@ void auth_request_init(struct auth_request *request)
 
        auth = auth_request_get_auth(request);
        request->set = auth->protocol_set;
+       request->protocol_set = auth->protocol_set;
        request->passdb = auth->passdbs;
        request->userdb = auth->userdbs;
 }
@@ -674,6 +676,9 @@ void auth_request_passdb_lookup_begin(struct auth_request *request)
 
        request->passdb_cache_result = AUTH_REQUEST_CACHE_NONE;
 
+       /* use passdb-specific settings during the passdb lookup */
+       request->set = request->passdb->auth_set;
+
        event = event_create(request->event);
        event_add_str(event, "passdb", request->passdb->set->name);
        event_add_str(event, "passdb_id", dec2str(request->passdb->passdb->id));
@@ -711,6 +716,9 @@ void auth_request_passdb_lookup_end(struct auth_request *request,
        e_debug(e->event(), "Finished passdb lookup");
        event_unref(&event);
        array_pop_back(&request->authdb_event);
+
+       /* restore protocol-specific settings */
+       request->set = request->protocol_set;
 }
 
 void auth_request_userdb_lookup_begin(struct auth_request *request)
index 3c27797edb4661f751024e0335f53b2bbf073325..ad2e41eb9a3b6c9d2c49212592b5e08e1c04ca50 100644 (file)
@@ -129,6 +129,10 @@ struct auth_request {
        enum passdb_result passdb_result;
 
        const struct mech_module *mech;
+       /* Protocol-specific settings */
+       const struct auth_settings *protocol_set;
+       /* Currently active settings. May be the same as protocol_set, but
+          changes to passdb and userdb specific settings. */
        const struct auth_settings *set;
         struct auth_passdb *passdb;
         struct auth_userdb *userdb;
index 4422600ce393cf7c777784dfea6053e4526f6c34..7fc8f2047af902419e77d01b38735edea03c43eb 100644 (file)
@@ -83,7 +83,19 @@ auth_passdb_preinit(struct auth *auth, const struct auth_passdb_settings *set,
 {
        struct auth_passdb *auth_passdb, **dest;
 
+       /* Lookup passdb-specific auth_settings */
+       struct event *event = event_create(auth_event);
+       event_add_str(event, "protocol", auth->protocol);
+       event_add_str(event, "passdb", set->name);
+       event_set_ptr(event, SETTINGS_EVENT_FILTER_NAME,
+                     p_strconcat(event_get_pool(event), "passdb_",
+                                 set->driver, NULL));
+
        auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
+       auth_passdb->auth_set =
+               settings_get_or_fatal(event, &auth_setting_parser_info);
+       event_unref(&event);
+
        auth_passdb->set = set;
        auth_passdb->skip = auth_passdb_skip_parse(set->skip);
        auth_passdb->result_success =
@@ -128,6 +140,12 @@ auth_passdb_preinit(struct auth *auth, const struct auth_passdb_settings *set,
        }
 }
 
+static void auth_passdb_deinit(struct auth_passdb *passdb)
+{
+       settings_free(passdb->auth_set);
+       passdb_deinit(passdb->passdb);
+}
+
 static void
 auth_userdb_preinit(struct auth *auth, const struct auth_userdb_settings *set)
 {
@@ -359,9 +377,9 @@ static void auth_deinit(struct auth *auth)
        struct auth_userdb *userdb;
 
        for (passdb = auth->masterdbs; passdb != NULL; passdb = passdb->next)
-               passdb_deinit(passdb->passdb);
+               auth_passdb_deinit(passdb);
        for (passdb = auth->passdbs; passdb != NULL; passdb = passdb->next)
-               passdb_deinit(passdb->passdb);
+               auth_passdb_deinit(passdb);
        for (userdb = auth->userdbs; userdb != NULL; userdb = userdb->next)
                userdb_deinit(userdb->userdb);
 
index 7c8256dedf8aa72309f4fe77f283c6937d252b66..33af106901e0c9d984cfb1e1760b6b29c4d00687 100644 (file)
@@ -32,6 +32,7 @@ enum auth_db_rule {
 struct auth_passdb {
        struct auth_passdb *next;
 
+       const struct auth_settings *auth_set;
        const struct auth_passdb_settings *set;
        struct passdb_module *passdb;
 
index bd78d0f2310610c23b9ab28441d3d2614f7d446f..c6947994f061788fba5e127ecfaa2e567aa81f69 100644 (file)
@@ -95,6 +95,7 @@ static void test_mech_prepare_request(struct auth_request **request_r,
        request->mech_password = NULL;
        request->state = AUTH_REQUEST_STATE_NEW;
        request->set = global_auth_settings;
+       request->protocol_set = global_auth_settings;
        request->connect_uid = running_test;
        request->passdb = auth->passdbs;
        request->userdb = auth->userdbs;