From: Timo Sirainen Date: Wed, 17 Jan 2024 23:55:17 +0000 (-0500) Subject: auth: Add passdb_module_interface.preinit() with new API X-Git-Tag: 2.4.1~1092 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=94f43aa02e0a7a31c798b14161950288d96f7f68;p=thirdparty%2Fdovecot%2Fcore.git auth: Add passdb_module_interface.preinit() with new API --- diff --git a/src/auth/auth.c b/src/auth/auth.c index b51c6d138d..00a22b831b 100644 --- a/src/auth/auth.c +++ b/src/auth/auth.c @@ -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; diff --git a/src/auth/passdb.c b/src/auth/passdb.c index 32d214a623..cf54b0a447 100644 --- a/src/auth/passdb.c +++ b/src/auth/passdb.c @@ -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); diff --git a/src/auth/passdb.h b/src/auth/passdb.h index 256fd8b5e9..a2b48ecaa5 100644 --- a/src/auth/passdb.h +++ b/src/auth/passdb.h @@ -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); diff --git a/src/auth/test-mock.c b/src/auth/test-mock.c index 226a7e350c..86d5bdc969 100644 --- a/src/auth/test-mock.c +++ b/src/auth/test-mock.c @@ -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); }