Skip to content

Commit

Permalink
Add base64 encoding and decoding to the lua api. (#3919)
Browse files Browse the repository at this point in the history
  • Loading branch information
red-001 authored and kwolekr committed May 28, 2016
1 parent c4e083f commit 62d15ac
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
4 changes: 4 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -2438,6 +2438,10 @@ These functions return the leftover itemstack.
* See documentation on `minetest.compress()` for supported compression methods.
* currently supported.
* `...` indicates method-specific arguments. Currently, no methods use this.
* `minetest.encode_base64(string)`: returns string encoded in base64
* Encodes a string in base64.
* `minetest.decode_base64(string)`: returns string
* Decodes a string encoded in base64.
* `minetest.is_protected(pos, name)`: returns boolean
* Returns true, if player `name` shouldn't be abled to dig at `pos` or do other
actions, defineable by mods, due to some mod-defined ownership-like concept.
Expand Down
4 changes: 4 additions & 0 deletions doc/menu_lua_api.txt
Expand Up @@ -210,6 +210,10 @@ string:trim()
^ eg. string.trim("\n \t\tfoo bar\t ") == "foo bar"
core.is_yes(arg) (possible in async calls)
^ returns whether arg can be interpreted as yes
minetest.encode_base64(string) (possible in async calls)
^ Encodes a string in base64.
minetest.decode_base64(string) (possible in async calls)
^ Decodes a string encoded in base64.

Version compat:
core.get_min_supp_proto()
Expand Down
35 changes: 35 additions & 0 deletions src/script/lua_api/l_util.cpp
Expand Up @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "filesys.h"
#include "settings.h"
#include "util/auth.h"
#include "util/base64.h"
#include <algorithm>

// log([level,] text)
Expand Down Expand Up @@ -320,6 +321,34 @@ int ModApiUtil::l_decompress(lua_State *L)
return 1;
}

// encode_base64(string)
int ModApiUtil::l_encode_base64(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;

size_t size;
const char *data = luaL_checklstring(L, 1, &size);

std::string out = base64_encode((const unsigned char *)(data), size);

lua_pushlstring(L, out.data(), out.size());
return 1;
}

// decode_base64(string)
int ModApiUtil::l_decode_base64(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;

size_t size;
const char *data = luaL_checklstring(L, 1, &size);

std::string out = base64_decode(std::string(data, size));

lua_pushlstring(L, out.data(), out.size());
return 1;
}

// mkdir(path)
int ModApiUtil::l_mkdir(lua_State *L)
{
Expand Down Expand Up @@ -433,6 +462,9 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(get_dir_list);

API_FCT(request_insecure_environment);

API_FCT(encode_base64);
API_FCT(decode_base64);
}

void ModApiUtil::InitializeAsync(AsyncEngine& engine)
Expand All @@ -459,5 +491,8 @@ void ModApiUtil::InitializeAsync(AsyncEngine& engine)

ASYNC_API_FCT(mkdir);
ASYNC_API_FCT(get_dir_list);

ASYNC_API_FCT(encode_base64);
ASYNC_API_FCT(decode_base64);
}

6 changes: 6 additions & 0 deletions src/script/lua_api/l_util.h
Expand Up @@ -95,6 +95,12 @@ class ModApiUtil : public ModApiBase {
// request_insecure_environment()
static int l_request_insecure_environment(lua_State *L);

// encode_base64(string)
static int l_encode_base64(lua_State *L);

// decode_base64(string)
static int l_decode_base64(lua_State *L);

public:
static void Initialize(lua_State *L, int top);

Expand Down

1 comment on commit 62d15ac

@HybridDog
Copy link
Contributor

@HybridDog HybridDog commented on 62d15ac Jul 18, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@red-001 Since complex Unicode text can't always be put into clipboard, can this be used to send custom player skins to the server (/send_skin <ctrl+v>)?

Please sign in to comment.