]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth|lib-lua: Replace auth_lua_config with newly added lua_settings
authorMarkus Valentin <markus.valentin@open-xchange.com>
Fri, 15 Mar 2024 08:43:26 +0000 (09:43 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:39:58 +0000 (10:39 +0200)
This adds lua_settings setting. This allows to pass a key-value table to the
lua script_init() call.

This replaces the auth_lua_config which was previously used with
passdb-lua and userdb-lua to pass parameters to it.

src/auth/db-lua.c
src/auth/db-lua.h
src/auth/passdb-lua.c
src/auth/userdb-lua.c
src/lib-lua/dlua-script.c
src/lib-lua/dlua-script.h

index 88c05958b0945896e775d8ecb6d7f17aa7bbc501..b7e211b07f2cb5ac4171495a575ca27e1d43ff6f 100644 (file)
 #include "auth-request-var-expand.h"
 #include "settings.h"
 
-#define AUTH_LUA_PASSDB_INIT "auth_passdb_init"
 #define AUTH_LUA_PASSDB_LOOKUP "auth_passdb_lookup"
 #define AUTH_LUA_PASSDB_GET_CACHE_KEY "auth_passdb_get_cache_key"
-#define AUTH_LUA_USERDB_INIT "auth_userdb_init"
 #define AUTH_LUA_USERDB_LOOKUP "auth_userdb_lookup"
 #define AUTH_LUA_USERDB_ITERATE "auth_userdb_iterate"
 #define AUTH_LUA_USERDB_GET_CACHE_KEY "auth_userdb_get_cache_key"
@@ -48,15 +46,10 @@ struct auth_lua_userdb_iterate_context {
 static const struct setting_define auth_lua_setting_defines[] = {
        { .type = SET_FILTER_NAME, .key = "passdb_lua", },
        { .type = SET_FILTER_NAME, .key = "userdb_lua", },
-       DEF(STRLIST, auth_lua_config),
 
        SETTING_DEFINE_LIST_END
 };
 
-static const struct auth_lua_settings auth_lua_default_settings = {
-       .auth_lua_config = ARRAY_INIT,
-};
-
 static const struct setting_keyvalue auth_lua_default_settings_keyvalue[] = {
        { "passdb_lua/passdb_use_worker", "yes"},
        { "userdb_lua/userdb_use_worker", "yes"},
@@ -67,7 +60,6 @@ const struct setting_parser_info auth_lua_setting_parser_info = {
        .name = "auth_lua",
 
        .defines = auth_lua_setting_defines,
-       .defaults = &auth_lua_default_settings,
        .default_settings = auth_lua_default_settings_keyvalue,
 
        .struct_size = sizeof(struct auth_lua_settings),
@@ -548,56 +540,6 @@ auth_lua_script_get_default_cache_key(const struct auth_lua_script_parameters *p
        return 0;
 }
 
-int auth_lua_script_auth_db_init(const struct auth_lua_script_parameters *params,
-                                const char **error_r)
-{
-       struct dlua_script *script = params->script;
-       const struct auth_lua_settings *set;
-       const char *fn;
-
-       switch (params->stype) {
-       case AUTH_LUA_SCRIPT_TYPE_PASSDB:
-               fn = AUTH_LUA_PASSDB_INIT;
-               break;
-       case AUTH_LUA_SCRIPT_TYPE_USERDB:
-               fn = AUTH_LUA_USERDB_INIT;
-               break;
-       default:
-               i_unreached();
-       }
-       if (!dlua_script_has_function(script, fn))
-               return 0;
-
-       if (settings_get(script->event, &auth_lua_setting_parser_info, 0,
-                        &set, error_r) < 0)
-               return -1;
-
-       i_assert(array_is_empty(&set->auth_lua_config) ||
-                (array_count(&set->auth_lua_config) % 2 == 0));
-       if (!array_is_empty(&set->auth_lua_config)) {
-               /* prepare a table for arguments */
-               lua_createtable(script->L, 0,
-                               array_count(&set->auth_lua_config) / 2);
-               unsigned int count;
-               const char *const *str_array = array_get(&set->auth_lua_config,
-                                                        &count);
-               for (unsigned int i = 0; i < count; i += 2) {
-                       lua_pushstring(script->L, str_array[i + 1]);
-                       lua_setfield(script->L, -2, str_array[i]);
-               }
-       } else {
-               lua_newtable(script->L);
-       }
-
-       settings_free(set);
-       /* call the function */
-       if (dlua_pcall(script->L, fn, 1, 0, error_r) < 0)
-               return -1;
-
-       i_assert(lua_gettop(script->L) == 0);
-       return 0;
-}
-
 static void
 auth_lua_export_fields(struct auth_request *req,
                       const char *str,
index 2b17bf010269f1014a6a5bf3a1c097004ee3e087..e1e8abfffa67e4fc0a6e425982acf6f87369be7f 100644 (file)
@@ -9,7 +9,6 @@ struct dlua_script;
 
 struct auth_lua_settings {
        pool_t pool;
-       ARRAY_TYPE(const_string) auth_lua_config;
 };
 
 extern const struct setting_parser_info auth_lua_setting_parser_info;
@@ -41,9 +40,6 @@ struct auth_lua_script_parameters {
 int
 auth_lua_script_get_default_cache_key(const struct auth_lua_script_parameters *params,
                                      const char **error_r);
-int
-auth_lua_script_auth_db_init(const struct auth_lua_script_parameters *params,
-                            const char **error_r);
 int auth_lua_script_init(const struct auth_lua_script_parameters *params,
                         const char **error_r);
 
index dd73d436f2a2a12c682d0159d9789b8a4744eba1..861dca7858cb91efd31765cd1ee7699d656eef78 100644 (file)
@@ -134,15 +134,6 @@ static void passdb_lua_init(struct passdb_module *_module)
 {
        struct dlua_passdb_module *module =
                (struct dlua_passdb_module *)_module;
-       const char *error;
-
-       const struct auth_lua_script_parameters params = {
-               .script = module->script,
-               .stype = AUTH_LUA_SCRIPT_TYPE_PASSDB,
-               .passdb_module = module,
-       };
-       if (auth_lua_script_auth_db_init(&params, &error) < 0)
-               i_fatal("passdb-lua: auth_passdb_init() failed: %s", error);
 
        module->has_password_verify =
                dlua_script_has_function(module->script, AUTH_LUA_PASSWORD_VERIFY);
index 7f7dd65ce1b61c7a41d956c5ea565902cbf68e67..b1e9de8b0d8a9f2eadb3f25428cd108647fd4459 100644 (file)
@@ -56,21 +56,6 @@ userdb_lua_preinit(pool_t pool, struct event *event,
        return 0;
 }
 
-static void userdb_lua_init(struct userdb_module *_module)
-{
-       struct dlua_userdb_module *module =
-               (struct dlua_userdb_module *)_module;
-       const char *error;
-
-       const struct auth_lua_script_parameters params = {
-               .script = module->script,
-               .stype = AUTH_LUA_SCRIPT_TYPE_USERDB,
-               .userdb_module = module,
-       };
-       if (auth_lua_script_auth_db_init(&params, &error) < 0)
-               i_fatal("userdb-lua: auth_userdb_init() failed: %s", error);
-}
-
 static void userdb_lua_deinit(struct userdb_module *_module)
 {
        struct dlua_userdb_module *module =
@@ -109,7 +94,6 @@ struct userdb_module_interface userdb_lua_plugin =
        .name = "lua",
 
        .preinit = userdb_lua_preinit,
-       .init = userdb_lua_init,
        .deinit = userdb_lua_deinit,
 
        .lookup = userdb_lua_lookup,
index 7e88702939ed33de0a5aa8c64128757d082ee49f..4e25b23fc5a92f3acdf1028a894960ad1e9b73a1 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "llist.h"
+#include "array.h"
 #include "istream.h"
 #include "sha1.h"
 #include "str.h"
@@ -33,12 +34,14 @@ static struct dlua_script *dlua_scripts = NULL;
 
 static const struct setting_define dlua_setting_defines[] = {
        DEF(FILE, file),
+       DEF(STRLIST, settings),
 
        SETTING_DEFINE_LIST_END
 };
 
 static const struct dlua_settings dlua_default_settings = {
        .file = "",
+       .settings = ARRAY_INIT,
 };
 
 const struct setting_parser_info dlua_setting_parser_info = {
@@ -187,6 +190,8 @@ static void dlua_call_deinit_function(struct dlua_script *script)
 
 int dlua_script_init(struct dlua_script *script, const char **error_r)
 {
+       const struct dlua_settings *set;
+
        if (script->init)
                return 0;
        script->init = TRUE;
@@ -200,9 +205,33 @@ int dlua_script_init(struct dlua_script *script, const char **error_r)
 
        int ret = 0;
 
-       if (dlua_pcall(script->L, LUA_SCRIPT_INIT_FN, 0, 0, error_r) < 0)
+       if (settings_get(script->event, &dlua_setting_parser_info, 0, &set,
+                        error_r) < 0)
+               return -1;
+
+       if (!array_is_empty(&set->settings)) {
+               i_assert((array_count(&set->settings) % 2 == 0));
+
+               /* prepare a table for arguments */
+               lua_createtable(script->L, 0,
+                               array_count(&set->settings) / 2);
+               unsigned int count;
+               const char *const *str_array = array_get(&set->settings,
+                                                        &count);
+               for (unsigned int i = 0; i < count; i += 2) {
+                       lua_pushstring(script->L, str_array[i + 1]);
+                       lua_setfield(script->L, -2, str_array[i]);
+               }
+       } else {
+               lua_newtable(script->L);
+       }
+
+       if (dlua_pcall(script->L, LUA_SCRIPT_INIT_FN, 1, 0, error_r) < 0) {
+               settings_free(set);
                return -1;
+       }
 
+       settings_free(set);
        i_assert(lua_gettop(script->L) == 0);
        return ret;
 }
index d0a674e161514295051f7aa811f1835ed626ee4e..5290e06365bd293fbc685ea944efde6f733055da 100644 (file)
@@ -9,6 +9,7 @@ struct dlua_settings {
        pool_t pool;
 
        const char *file;
+       ARRAY_TYPE(const_string) settings;
 };
 
 /* Parse and load a lua script, without actually running it. */