From: Timo Sirainen Date: Wed, 17 Jan 2024 23:56:43 +0000 (-0500) Subject: auth: Add userdb_module_interface.preinit() with new API X-Git-Tag: 2.4.1~1091 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c08bd52c3b1d269a3702b8b25acb06b1104f2e6d;p=thirdparty%2Fdovecot%2Fcore.git auth: Add userdb_module_interface.preinit() with new API --- diff --git a/src/auth/auth.c b/src/auth/auth.c index 00a22b831b..e5fe1e6a86 100644 --- a/src/auth/auth.c +++ b/src/auth/auth.c @@ -176,7 +176,7 @@ auth_userdb_preinit(struct auth *auth, const struct auth_userdb_settings *set) for (dest = &auth->userdbs; *dest != NULL; dest = &(*dest)->next) ; *dest = auth_userdb; - auth_userdb->userdb = userdb_preinit(auth->pool, set); + auth_userdb->userdb = userdb_preinit(auth->pool, event, set); /* make sure any %variables in default_fields exist in cache_key */ if (auth_userdb->userdb->default_cache_key != NULL) { struct auth_userdb_pre_settings *userdb_pre_set; diff --git a/src/auth/userdb.c b/src/auth/userdb.c index 18e901bb10..610b9cc4f4 100644 --- a/src/auth/userdb.c +++ b/src/auth/userdb.c @@ -105,11 +105,13 @@ gid_t userdb_parse_gid(struct auth_request *request, const char *str) } struct userdb_module * -userdb_preinit(pool_t pool, const struct auth_userdb_settings *set) +userdb_preinit(pool_t pool, struct event *event, + const struct auth_userdb_settings *set) { static unsigned int auth_userdb_id = 0; struct userdb_module_interface *iface; struct userdb_module *userdb; + const char *error; iface = userdb_interface_find(set->driver); if (iface == NULL || iface->lookup == NULL) { @@ -129,10 +131,18 @@ userdb_preinit(pool_t pool, const struct auth_userdb_settings *set) set->driver, set->args); } - if (iface->preinit_legacy == NULL) - userdb = p_new(pool, struct userdb_module, 1); - else - userdb = iface->preinit_legacy(pool, set->args); + if (iface->preinit != NULL) { + if (set->args[0] != '\0') + i_fatal("userdb %s: userdb_args must be empty", set->name); + if (iface->preinit(pool, event, &userdb, &error) < 0) + i_fatal("userdb %s: %s", set->name, error); + userdb->blocking = set->use_worker; + } else { + if (iface->preinit_legacy == NULL) + userdb = p_new(pool, struct userdb_module, 1); + else + userdb = iface->preinit_legacy(pool, set->args); + } userdb->id = ++auth_userdb_id; userdb->iface = iface; userdb->args = p_strdup(pool, set->args); diff --git a/src/auth/userdb.h b/src/auth/userdb.h index dfc637fd12..3343595722 100644 --- a/src/auth/userdb.h +++ b/src/auth/userdb.h @@ -48,6 +48,10 @@ struct userdb_iterate_context { struct userdb_module_interface { const char *name; + /* Create a new userdb_module based on the settings looked up via the + given event. */ + int (*preinit)(pool_t pool, struct event *event, + struct userdb_module **module_r, const char **error_r); struct userdb_module *(*preinit_legacy)(pool_t pool, const char *args); void (*init)(struct userdb_module *module); void (*deinit)(struct userdb_module *module); @@ -71,7 +75,8 @@ gid_t userdb_parse_gid(struct auth_request *request, const char *str) ATTR_NULL(1); struct userdb_module * -userdb_preinit(pool_t pool, const struct auth_userdb_settings *set); +userdb_preinit(pool_t pool, struct event *event, + const struct auth_userdb_settings *set); void userdb_init(struct userdb_module *userdb); void userdb_deinit(struct userdb_module *userdb);