]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-lua: Add base64 encode/decode support
authorAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 16 Apr 2025 06:40:09 +0000 (09:40 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 13 May 2025 09:06:16 +0000 (09:06 +0000)
src/lib-lua/Makefile.am
src/lib-lua/dlua-dovecot.c
src/lib-lua/test-lua-base64.lua [new file with mode: 0644]
src/lib-lua/test-lua.c

index 8e89a64729d221da023105b0b557bdaa24f9a612..1fbcbc6a1c438912dd494c4bb4b3d8a1f4c4195d 100644 (file)
@@ -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)
 
index 96bcc2adf507750d89880adaf1cca58aae4e70ff..05433a82c31a44720e351b5328dbb08f02af3bbb 100644 (file)
@@ -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 (file)
index 0000000..1e54b97
--- /dev/null
@@ -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
index 4c05d996e3634745bbca090ded6628de6f9eed0f..676ca8d121fbf39d781b75be9557e77206be1869 100644 (file)
@@ -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
        };