]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: passdb/userdb-lua - Pass arguments to init script
authorAki Tuomi <aki.tuomi@open-xchange.com>
Tue, 9 May 2023 07:57:08 +0000 (10:57 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 19 May 2023 09:25:44 +0000 (09:25 +0000)
src/auth/passdb-lua.c
src/auth/userdb-lua.c

index 4c676aca25aef8b6a63cad2d81f67a60ec1a2cbc..62ef187b1326de9cbd514acd7f1db61959b7f30c 100644 (file)
@@ -12,6 +12,7 @@ struct dlua_passdb_module {
        struct passdb_module module;
        struct dlua_script *script;
        const char *file;
+       const char *const *arguments;
        bool has_password_verify;
 };
 
@@ -113,10 +114,13 @@ passdb_lua_preinit(pool_t pool, const char *args)
 
        module = p_new(pool, struct dlua_passdb_module, 1);
        const char *const *fields = t_strsplit_spaces(args, " ");
+       ARRAY_TYPE(const_string) arguments;
+       t_array_init(&arguments, 8);
+
        while(*fields != NULL) {
                const char *key, *value;
                if (!t_split_key_value_eq(*fields, &key, &value)) {
-                       i_fatal("Unsupported parameter %s", *fields);
+                       /* pass */
                } else if (strcmp(key, "file") == 0) {
                         module->file = p_strdup(pool, value);
                } else if (strcmp(key, "blocking") == 0) {
@@ -136,9 +140,13 @@ passdb_lua_preinit(pool_t pool, const char *args)
                                 cache_key = NULL;
                } else if (strcmp(key, "scheme") == 0) {
                        scheme = p_strdup(pool, value);
-               } else {
-                       i_fatal("Unsupported parameter %s", *fields);
                }
+
+               /* Catch arguments for lua initialization */
+               const char **argument = array_append_space(&arguments);
+               *argument = p_strdup(pool, key);
+               argument = array_append_space(&arguments);
+               *argument = p_strdup(pool, value);
                fields++;
        }
 
@@ -149,6 +157,10 @@ passdb_lua_preinit(pool_t pool, const char *args)
        module->module.default_cache_key =
                auth_cache_parse_key(pool, cache_key);
        module->module.default_pass_scheme = scheme;
+       if (array_count(&arguments) > 0) {
+               array_append_zero(&arguments);
+               module->arguments = array_front(&arguments);
+       }
        return &module->module;
 }
 
@@ -164,6 +176,7 @@ static void passdb_lua_init(struct passdb_module *_module)
        const struct auth_lua_script_parameters params = {
                .script = module->script,
                .stype = AUTH_LUA_SCRIPT_TYPE_PASSDB,
+               .arguments = module->arguments,
        };
        if (auth_lua_script_init(&params, &error) < 0)
                i_fatal("passdb-lua: initialization failed: %s", error);
index 5546c94b66df14d9fa97516f05db0a73fa65232b..774aacfa04c3c9c27e9b64a91756855a00802117 100644 (file)
@@ -12,6 +12,7 @@ struct dlua_userdb_module {
        struct userdb_module module;
        struct dlua_script *script;
        const char *file;
+       const char *const *arguments;
 };
 
 static void userdb_lua_lookup(struct auth_request *auth_request,
@@ -38,10 +39,13 @@ userdb_lua_preinit(pool_t pool, const char *args)
 
        module = p_new(pool, struct dlua_userdb_module, 1);
        const char *const *fields = t_strsplit_spaces(args, " ");
+       ARRAY_TYPE(const_string) arguments;
+       t_array_init(&arguments, 8);
+
        while(*fields != NULL) {
                const char *key, *value;
                if (!t_split_key_value_eq(*fields, &key, &value)) {
-                       i_fatal("Unsupported parameter %s", *fields);
+                       /* pass */
                } else if (strcmp(key, "file") == 0) {
                         module->file = p_strdup(pool, value);
                } else if (strcmp(key, "blocking") == 0) {
@@ -59,9 +63,13 @@ userdb_lua_preinit(pool_t pool, const char *args)
                                 cache_key = value;
                         else /* explicitly disable auth caching for lua */
                                 cache_key = NULL;
-               } else {
-                       i_fatal("Unsupported parameter %s", *fields);
                }
+
+               /* Catch arguments for lua initialization */
+               const char **argument = array_append_space(&arguments);
+               *argument = key;
+               argument = array_append_space(&arguments);
+               *argument = value;
                fields++;
        }
 
@@ -73,6 +81,10 @@ userdb_lua_preinit(pool_t pool, const char *args)
                module->module.default_cache_key =
                        auth_cache_parse_key(pool, cache_key);
        }
+       if (array_count(&arguments) > 0) {
+               array_append_zero(&arguments);
+               module->arguments = array_front(&arguments);
+       }
        return &module->module;
 }
 
@@ -88,6 +100,7 @@ static void userdb_lua_init(struct userdb_module *_module)
        const struct auth_lua_script_parameters params = {
                .script = module->script,
                .stype = AUTH_LUA_SCRIPT_TYPE_USERDB,
+               .arguments = module->arguments,
        };
        if (auth_lua_script_init(&params, &error) < 0)
                i_fatal("userdb-lua: initialization failed: %s", error);