]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Add passdb_module_interface.preinit() with new API
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 17 Jan 2024 23:55:17 +0000 (18:55 -0500)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:11 +0000 (12:34 +0200)
src/auth/auth.c
src/auth/passdb.c
src/auth/passdb.h
src/auth/test-mock.c

index b51c6d138ddfd8ee1bcf19b9d258975e993cf5bb..00a22b831b31ae90bb88636725a1fce87fa9741e 100644 (file)
@@ -119,7 +119,7 @@ auth_passdb_preinit(struct auth *auth, const struct auth_passdb_settings *set,
        for (dest = passdbs; *dest != NULL; dest = &(*dest)->next) ;
        *dest = auth_passdb;
 
-       auth_passdb->passdb = passdb_preinit(auth->pool, set);
+       auth_passdb->passdb = passdb_preinit(auth->pool, event, set);
        /* make sure any %variables in default_fields exist in cache_key */
        if (auth_passdb->passdb->default_cache_key != NULL) {
                struct auth_passdb_pre_settings *passdb_pre_set;
index 32d214a623aca3ed6a31c8fe237d839f2b47c578..cf54b0a447c6b88a12a51b803e3fd44aebc70008 100644 (file)
@@ -171,11 +171,13 @@ void passdb_handle_credentials(enum passdb_result result,
 }
 
 struct passdb_module *
-passdb_preinit(pool_t pool, const struct auth_passdb_settings *set)
+passdb_preinit(pool_t pool, struct event *event,
+              const struct auth_passdb_settings *set)
 {
        static unsigned int auth_passdb_id = 0;
        struct passdb_module_interface *iface;
        struct passdb_module *passdb;
+       const char *error;
 
        iface = passdb_interface_find(set->driver);
        if (iface == NULL || iface->verify_plain == NULL) {
@@ -195,10 +197,20 @@ passdb_preinit(pool_t pool, const struct auth_passdb_settings *set)
                        set->driver, set->args);
        }
 
-       if (iface->preinit_legacy == NULL)
-               passdb = p_new(pool, struct passdb_module, 1);
-       else
-               passdb = iface->preinit_legacy(pool, set->args);
+       if (iface->preinit != NULL) {
+               if (set->args[0] != '\0')
+                       i_fatal("passdb %s: passdb_args must be empty", set->name);
+               if (iface->preinit(pool, event, &passdb, &error) < 0)
+                       i_fatal("passdb %s: %s", set->name, error);
+               passdb->default_pass_scheme =
+                       set->default_password_scheme;
+               passdb->blocking = set->use_worker;
+       } else {
+               if (iface->preinit_legacy == NULL)
+                       passdb = p_new(pool, struct passdb_module, 1);
+               else
+                       passdb = iface->preinit_legacy(pool, set->args);
+       }
        passdb->id = ++auth_passdb_id;
        passdb->iface = *iface;
        passdb->args = p_strdup(pool, set->args);
index 256fd8b5e9c4636cdbe4ac7081a75e62ba880f7b..a2b48ecaa56d5d555d8ccdee2348a140f2a57e12 100644 (file)
@@ -8,6 +8,7 @@
 
 struct auth_request;
 struct auth_passdb_settings;
+struct passdb_module;
 
 enum passdb_result {
        PASSDB_RESULT_INTERNAL_FAILURE = -1,
@@ -36,6 +37,10 @@ typedef void set_credentials_callback_t(bool success,
 struct passdb_module_interface {
        const char *name;
 
+       /* Create a new passdb_module based on the settings looked up via the
+          given event. */
+       int (*preinit)(pool_t pool, struct event *event,
+                      struct passdb_module **module_r, const char **error_r);
        struct passdb_module *(*preinit_legacy)(pool_t pool, const char *args);
        void (*init)(struct passdb_module *module);
        void (*deinit)(struct passdb_module *module);
@@ -96,7 +101,8 @@ void passdb_handle_credentials(enum passdb_result result,
                                struct auth_request *auth_request);
 
 struct passdb_module *
-passdb_preinit(pool_t pool, const struct auth_passdb_settings *set);
+passdb_preinit(pool_t pool, struct event *event,
+              const struct auth_passdb_settings *set);
 void passdb_init(struct passdb_module *passdb);
 void passdb_deinit(struct passdb_module *passdb);
 
index 226a7e350ccaa16b47d0db68b448cfa8f85c3790..86d5bdc96915fe1217a9c8596322ecad104bc2fd 100644 (file)
@@ -81,7 +81,9 @@ void passdb_mock_mod_init(void)
                .deny = FALSE,
                .master = FALSE,
        };
-       mock_passdb_mod = passdb_preinit(mock_pool, &set);
+       struct event *event = event_create(NULL);
+       mock_passdb_mod = passdb_preinit(mock_pool, event, &set);
+       event_unref(&event);
        passdb_init(mock_passdb_mod);
 }