Add sha1 to lua utils. (#6563)
authorRob Blanckaert <basicer@basicer.com>
Mon, 30 Oct 2017 07:18:18 +0000 (00:18 -0700)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 30 Oct 2017 07:18:18 +0000 (08:18 +0100)
doc/client_lua_api.md
doc/lua_api.txt
src/script/lua_api/l_util.cpp
src/script/lua_api/l_util.h

index d8e2da69c1cbc0372fe224d8be147802387b186f..3655cf2355c1acb8c101b520e0aff21232ee851a 100644 (file)
@@ -630,6 +630,9 @@ Minetest namespace reference
   version entirely. To check for the presence of engine features, test
   whether the functions exported by the wanted features exist. For example:
   `if minetest.check_for_falling then ... end`.
+* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
+    * `data`: string of data to hash
+    * `raw`: return raw bytes instead of hex digits, default: false
 
 ### Logging
 * `minetest.debug(...)`
index d9a31b9f4f08b4eb10b1808bd58d0a2f4845f8d6..8721b6b23f21b9de1acc4dd215da99007c9bacad 100644 (file)
@@ -2391,6 +2391,9 @@ Strings that need to be translated can contain several escapes, preceded by `@`.
   version entirely. To check for the presence of engine features, test
   whether the functions exported by the wanted features exist. For example:
   `if minetest.check_for_falling then ... end`.
+* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
+    * `data`: string of data to hash
+    * `raw`: return raw bytes instead of hex digits, default: false
 
 ### Logging
 * `minetest.debug(...)`
index 5128e79e6c827413e017dc3df2d2a3522ceddf03..ef4df8182c87881d66e44cf76f304594b70a7c71 100644 (file)
@@ -37,6 +37,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/base64.h"
 #include "config.h"
 #include "version.h"
+#include "util/hex.h"
+#include "util/sha1.h"
 #include <algorithm>
 
 
@@ -423,6 +425,32 @@ int ModApiUtil::l_get_version(lua_State *L)
        return 1;
 }
 
+int ModApiUtil::l_sha1(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       size_t size;
+       const char *data = luaL_checklstring(L, 1, &size);
+       bool hex = !lua_isboolean(L, 2) || !lua_toboolean(L, 2);
+
+       // Compute actual checksum of data
+       std::string data_sha1;
+       {
+               SHA1 ctx;
+               ctx.addBytes(data, size);
+               unsigned char *data_tmpdigest = ctx.getDigest();
+               data_sha1.assign((char*) data_tmpdigest, 20);
+               free(data_tmpdigest);
+       }
+
+       if (hex) {
+               std::string sha1_hex = hex_encode(data_sha1);
+               lua_pushstring(L, sha1_hex.c_str());
+       } else {
+               lua_pushlstring(L, data_sha1.data(), data_sha1.size());
+       }
+
+       return 1;
+}
 
 void ModApiUtil::Initialize(lua_State *L, int top)
 {
@@ -455,6 +483,7 @@ void ModApiUtil::Initialize(lua_State *L, int top)
        API_FCT(decode_base64);
 
        API_FCT(get_version);
+       API_FCT(sha1);
 
        LuaSettings::create(L, g_settings, g_settings_path);
        lua_setfield(L, top, "settings");
@@ -478,6 +507,7 @@ void ModApiUtil::InitializeClient(lua_State *L, int top)
        API_FCT(decode_base64);
 
        API_FCT(get_version);
+       API_FCT(sha1);
 }
 
 void ModApiUtil::InitializeAsync(lua_State *L, int top)
@@ -503,6 +533,7 @@ void ModApiUtil::InitializeAsync(lua_State *L, int top)
        API_FCT(decode_base64);
 
        API_FCT(get_version);
+       API_FCT(sha1);
 
        LuaSettings::create(L, g_settings, g_settings_path);
        lua_setfield(L, top, "settings");
index b7aafe8d5d8192933be669ad443ee9f50609db58..e17425d733aaf293f03bae3d5a93b4221dd2e36e 100644 (file)
@@ -92,6 +92,9 @@ private:
        // get_version()
        static int l_get_version(lua_State *L);
 
+       // sha1(string, raw)
+       static int l_sha1(lua_State *L);
+
 public:
        static void Initialize(lua_State *L, int top);
        static void InitializeAsync(lua_State *L, int top);