From: Aki Tuomi Date: Wed, 16 Apr 2025 06:40:09 +0000 (+0300) Subject: lib-lua: Add base64 encode/decode support X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a8ebc8c05a29115d00bb3fa592bde01eb8dd0b5e;p=thirdparty%2Fdovecot%2Fcore.git lib-lua: Add base64 encode/decode support --- diff --git a/src/lib-lua/Makefile.am b/src/lib-lua/Makefile.am index 8e89a64729..1fbcbc6a1c 100644 --- a/src/lib-lua/Makefile.am +++ b/src/lib-lua/Makefile.am @@ -63,7 +63,8 @@ pkginc_lib_HEADERS = $(headers) EXTRA_DIST = \ test-lua-http-client.lua \ - test-io-lua.lua + test-io-lua.lua \ + test-lua-base64.lua noinst_PROGRAMS = $(test_programs) diff --git a/src/lib-lua/dlua-dovecot.c b/src/lib-lua/dlua-dovecot.c index 96bcc2adf5..05433a82c3 100644 --- a/src/lib-lua/dlua-dovecot.c +++ b/src/lib-lua/dlua-dovecot.c @@ -4,6 +4,7 @@ #include "ioloop.h" #include "net.h" #include "str.h" +#include "base64.h" #include "time-util.h" #include "dlua-script-private.h" #include "dict-lua.h" @@ -11,6 +12,7 @@ #include "strescape.h" #define LUA_SCRIPT_DOVECOT "dovecot" +#define LUA_SCRIPT_DOVECOT_BASE64 "base64" #define DLUA_EVENT_PASSTHROUGH "struct event_passthrough" #define DLUA_EVENT "struct event" @@ -734,6 +736,28 @@ static int dlua_split_tabescaped(lua_State *L) return 1; } +static int dlua_base64_encode(lua_State *L) +{ + DLUA_REQUIRE_ARGS(L, 1); + size_t len; + const void *input = luaL_checklstring(L, 1, &len); + + buffer_t *output = t_base64_encode(0, UINT_MAX, input, len); + lua_pushlstring(L, output->data, output->used); + return 1; +} + +static int dlua_base64_decode(lua_State *L) +{ + DLUA_REQUIRE_ARGS(L, 1); + size_t len; + const char *input = luaL_checklstring(L, 1, &len); + + buffer_t *output = t_base64_decode(0, input, len); + lua_pushlstring(L, output->data, output->used); + return 1; +} + static luaL_Reg lua_dovecot_methods[] = { { "i_debug", dlua_i_debug }, { "i_info", dlua_i_info }, @@ -754,6 +778,12 @@ static luaL_Reg lua_dovecot_methods[] = { { NULL, NULL } }; +static luaL_Reg lua_dovecot_base64_methods[] = { + { "encode", dlua_base64_encode }, + { "decode", dlua_base64_decode }, + { NULL, NULL } +}; + void dlua_get_dovecot(lua_State *L) { lua_getglobal(L, LUA_SCRIPT_DOVECOT); @@ -778,6 +808,13 @@ void dlua_dovecot_register(struct dlua_script *script) /* set table's metatable, pops stack */ lua_setmetatable(script->L, -2); + /* create 'base64' */ + lua_newtable(script->L); + luaL_setfuncs(script->L, lua_dovecot_base64_methods, 0); + + /* add it to 'dovecot' */ + lua_setfield(script->L, -2, LUA_SCRIPT_DOVECOT_BASE64); + /* register table as global */ lua_setglobal(script->L, LUA_SCRIPT_DOVECOT); diff --git a/src/lib-lua/test-lua-base64.lua b/src/lib-lua/test-lua-base64.lua new file mode 100644 index 0000000000..1e54b9700b --- /dev/null +++ b/src/lib-lua/test-lua-base64.lua @@ -0,0 +1,9 @@ +function test_base64() + local input = "test value" + local result = "dGVzdCB2YWx1ZQ==" + + local encoded = dovecot.base64.encode(input) + test_assert("encoded = \" .. result .. \"", encoded == result) + local output = dovecot.base64.decode(encoded) + test_assert("output = \" .. input .. \"", output == input) +end diff --git a/src/lib-lua/test-lua.c b/src/lib-lua/test-lua.c index 4c05d996e3..676ca8d121 100644 --- a/src/lib-lua/test-lua.c +++ b/src/lib-lua/test-lua.c @@ -518,11 +518,32 @@ static void test_compat_tointegerx_and_isinteger(void) test_end(); } +static void test_lua_base64(void) +{ + test_begin("lua base64"); + + struct dlua_script *script; + const char *error; + + if (dlua_script_create_file("test-lua-base64.lua", &script, NULL, &error) < 0) + i_fatal("%s", error); + + dlua_dovecot_register(script); + dlua_register(script, "test_assert", dlua_test_assert); + + test_assert(dlua_script_init(script, &error) == 0); + test_assert(dlua_pcall(script->L, "test_base64", 0, 0, &error) == 0); + + dlua_script_unref(&script); + test_end(); +} + int main(void) { void (*tests[])(void) = { test_lua, test_tls, test_compat_tointegerx_and_isinteger, + test_lua_base64, NULL };