]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Add userdb_module_interface.preinit() with new API
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 17 Jan 2024 23:56:43 +0000 (18:56 -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/userdb.c
src/auth/userdb.h

index 00a22b831b31ae90bb88636725a1fce87fa9741e..e5fe1e6a86fcdf04927da4dff8b7e711d21f06ef 100644 (file)
@@ -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;
index 18e901bb10dabbf74d4b58e6b23019f34600921e..610b9cc4f46af4296988b0e23504e6452cbdbc62 100644 (file)
@@ -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);
index dfc637fd12298de45c8c49371b59d245953e10f5..3343595722f644dc72e56cdd66127c80bd6106d5 100644 (file)
@@ -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);