diff options
Diffstat (limited to 'src/auth/test-lua.c')
-rw-r--r-- | src/auth/test-lua.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/auth/test-lua.c b/src/auth/test-lua.c new file mode 100644 index 0000000..c358489 --- /dev/null +++ b/src/auth/test-lua.c @@ -0,0 +1,137 @@ +/* Copyright (c) 2018 Dovecot authors, see the included COPYING file */ + +#include "test-auth.h" + +#ifdef BUILTIN_LUA +#include "istream.h" +#include "auth-settings.h" +#include "auth-request.h" +#include "db-lua.h" + +static struct auth_settings test_lua_auth_set = { + .master_user_separator = "", + .default_realm = "", + .username_format = "", +}; + +static struct auth_request *test_db_lua_auth_request_new(void) +{ + const char *error; + struct auth_request *req = auth_request_new_dummy(NULL); + req->set = global_auth_settings; + struct event *event = event_create(req->event); + array_push_back(&req->authdb_event, &event); + req->passdb = passdb_mock(); + test_assert(auth_request_set_username(req, "testuser", &error)); + return req; +} + +static void test_db_lua_auth_verify(void) +{ + struct auth_request *req = test_db_lua_auth_request_new(); + + static const char *luascript = +"function auth_password_verify(req, pass)\n" +" req:log_debug(\"user \" .. req.user)\n" +" if req:password_verify(\"{SHA256-CRYPT}$5$XtUywQCSjW0zAJgE$YjuPKQnsLuH4iE9kranZyy1lbil5IrRUfs7X6EyJyG1\", pass) then\n" +" return dovecot.auth.PASSDB_RESULT_OK, {}\n" +" end\n" +"end\n"; + const char *error = NULL; + struct dlua_script *script = NULL; + + test_begin("auth db lua passdb_verify"); + + test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0); + if (script != NULL) { + test_assert(auth_lua_script_init(script, &error) == 0); + test_assert(auth_lua_call_password_verify(script, req, "password", &error) == 1); + dlua_script_unref(&script); + } + if (error != NULL) { + i_error("Test failed: %s", error); + } + i_free(req->passdb); + + auth_request_passdb_lookup_end(req, PASSDB_RESULT_OK); + auth_request_unref(&req); + + test_end(); +} + +static void test_db_lua_auth_lookup_numberish_value(void) +{ + const char *scheme,*pass; + + struct auth_request *req = test_db_lua_auth_request_new(); + + static const char *luascript = +"function auth_passdb_lookup(req)\n" +" local fields = {}\n" +" fields[\"user\"] = \"01234\"\n" +" return dovecot.auth.PASSDB_RESULT_OK, fields\n" +"end\n"; + const char *error = NULL; + struct dlua_script *script = NULL; + + test_begin("auth db lua passdb_lookup"); + + test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0); + if (script != NULL) { + test_assert(auth_lua_script_init(script, &error) == 0); + test_assert(auth_lua_call_passdb_lookup(script, req, &scheme, &pass, &error) == 1); + test_assert(strcmp(req->fields.user, "01234") == 0); + dlua_script_unref(&script); + } + if (error != NULL) { + i_error("Test failed: %s", error); + } + i_free(req->passdb); + auth_request_passdb_lookup_end(req, PASSDB_RESULT_OK); + auth_request_unref(&req); + + test_end(); +} + +static void test_db_lua_auth_lookup(void) +{ + const char *scheme,*pass; + + struct auth_request *req = test_db_lua_auth_request_new(); + + static const char *luascript = +"function auth_passdb_lookup(req)\n" +" req:log_debug(\"user \" .. req.user)\n" +" return dovecot.auth.PASSDB_RESULT_OK, req:var_expand(\"password=pass\")\n" +"end\n"; + const char *error = NULL; + struct dlua_script *script = NULL; + + test_begin("auth db lua passdb_lookup"); + + test_assert(dlua_script_create_string(luascript, &script, NULL, &error) == 0); + if (script != NULL) { + test_assert(auth_lua_script_init(script, &error) == 0); + test_assert(auth_lua_call_passdb_lookup(script, req, &scheme, &pass, &error) == 1); + dlua_script_unref(&script); + } + if (error != NULL) { + i_error("Test failed: %s", error); + } + i_free(req->passdb); + auth_request_passdb_lookup_end(req, PASSDB_RESULT_OK); + auth_request_unref(&req); + + test_end(); +} + +void test_db_lua(void) { + memset(test_lua_auth_set.username_chars_map, 0xff, + sizeof(test_lua_auth_set.username_chars_map)); + global_auth_settings = &test_lua_auth_set; + test_db_lua_auth_lookup(); + test_db_lua_auth_lookup_numberish_value(); + test_db_lua_auth_verify(); +} + +#endif |