From 063cbde569e7a2e7172844531eb797d0e4fe3dae Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 16 Sep 2025 22:16:56 +0300 Subject: [PATCH 1/2] add base64.encode_urlsafe, base64.decode_urlsafe --- src/logic/scripting/lua/libs/libbase64.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/logic/scripting/lua/libs/libbase64.cpp b/src/logic/scripting/lua/libs/libbase64.cpp index 5d50f1e8..faf718de 100644 --- a/src/logic/scripting/lua/libs/libbase64.cpp +++ b/src/logic/scripting/lua/libs/libbase64.cpp @@ -2,6 +2,7 @@ #include "util/stringutil.hpp" +template static int l_encode(lua::State* L) { if (lua::istable(L, 1)) { lua::pushvalue(L, 1); @@ -13,12 +14,12 @@ static int l_encode(lua::State* L) { lua::pop(L); } lua::pop(L); - return lua::pushstring(L, util::base64_encode( + return lua::pushstring(L, encode_func( reinterpret_cast(buffer.data()), buffer.size() )); } else { auto string = lua::bytearray_as_string(L, 1); - auto out = util::base64_encode( + auto out = encode_func( reinterpret_cast(string.data()), string.size() ); @@ -28,8 +29,9 @@ static int l_encode(lua::State* L) { throw std::runtime_error("array or ByteArray expected"); } +template(*decode_func)(std::string_view)> static int l_decode(lua::State* L) { - auto buffer = util::base64_decode(lua::require_lstring(L, 1)); + auto buffer = decode_func(lua::require_lstring(L, 1)); if (lua::toboolean(L, 2)) { lua::createtable(L, buffer.size(), 0); for (size_t i = 0; i < buffer.size(); i++) { @@ -43,7 +45,9 @@ static int l_decode(lua::State* L) { } const luaL_Reg base64lib[] = { - {"encode", lua::wrap}, - {"decode", lua::wrap}, + {"encode", lua::wrap>}, + {"decode", lua::wrap>}, + {"encode_urlsafe", lua::wrap>}, + {"decode_urlsafe", lua::wrap>}, {NULL, NULL} }; From 34a9310e3cd62468a8e466217b8115298b1cc9d5 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 16 Sep 2025 22:24:29 +0300 Subject: [PATCH 2/2] update doc/*/scripting/builtins/libbase64.md --- doc/en/scripting/builtins/libbase64.md | 6 ++++++ doc/ru/scripting/builtins/libbase64.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/doc/en/scripting/builtins/libbase64.md b/doc/en/scripting/builtins/libbase64.md index fdfd467e..3f2ee2a5 100644 --- a/doc/en/scripting/builtins/libbase64.md +++ b/doc/en/scripting/builtins/libbase64.md @@ -8,4 +8,10 @@ base64.encode(bytes: table|ByteArray) -> str -- Decode base64 string to ByteArray or lua table if second argument is set to true base64.decode(base64string: str, [optional]usetable: bool=false) -> table|ByteArray + +-- Encode bytes to urlsafe-base64 string ('-', '_' instead of '+', '/') +base64.encode_urlsafe(bytes: table|ByteArray) -> str + +-- Decodes urlsafe-base64 string to a ByteArray or a table of numbers if the second argument is set to true +base64.decode_urlsafe(base64string: str, [optional]usetable: bool=false) -> table|ByteArray ``` diff --git a/doc/ru/scripting/builtins/libbase64.md b/doc/ru/scripting/builtins/libbase64.md index 7078fa0b..33bac975 100644 --- a/doc/ru/scripting/builtins/libbase64.md +++ b/doc/ru/scripting/builtins/libbase64.md @@ -8,4 +8,10 @@ base64.encode(bytes: table|ByteArray) -> str -- Декодирует base64 строку в ByteArray или таблицу чисел, если второй аргумент установлен на true base64.decode(base64string: str, [опционально]usetable: bool=false) -> table|ByteArray + +-- Кодирует массив байт в urlsafe-base64 строку ('-', '_' вместо '+', '/') +base64.encode_urlsafe(bytes: table|ByteArray) -> str + +-- Декодирует urlsafe-base64 строку в ByteArray или таблицу чисел, если второй аргумент установлен на true +base64.decode_urlsafe(base64string: str, [опционально]usetable: bool=false) -> table|ByteArray ```