summaryrefslogtreecommitdiffstats
path: root/Sluift
diff options
context:
space:
mode:
Diffstat (limited to 'Sluift')
-rw-r--r--Sluift/Lua/Check.cpp12
-rw-r--r--Sluift/Lua/Check.h5
-rw-r--r--Sluift/Lua/LuaUtils.cpp8
-rw-r--r--Sluift/Lua/LuaUtils.h2
-rw-r--r--Sluift/SluiftGlobals.h2
-rw-r--r--Sluift/core.lua10
-rw-r--r--Sluift/sluift.cpp44
7 files changed, 78 insertions, 5 deletions
diff --git a/Sluift/Lua/Check.cpp b/Sluift/Lua/Check.cpp
index 65ada7b..a9b8f02 100644
--- a/Sluift/Lua/Check.cpp
+++ b/Sluift/Lua/Check.cpp
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2013 Remko Tronçon
+ * Copyright (c) 2013-2014 Remko Tronçon
* Licensed under the GNU General Public License.
* See the COPYING file for more information.
@@ -13,4 +13,5 @@
#include <Sluift/Lua/Exception.h>
+#include <Swiften/Base/ByteArray.h>
using namespace Swift;
@@ -44,4 +45,13 @@ std::string Lua::checkString(lua_State* L, int arg) {
}
+ByteArray Lua::checkByteArray(lua_State* L, int arg) {
+ size_t len;
+ const char *s = lua_tolstring(L, arg, &len);
+ if (!s) {
+ throw Lua::Exception(getArgTypeError(L, arg, LUA_TSTRING));
+ }
+ return createByteArray(s, len);
+}
+
void* Lua::checkUserDataRaw(lua_State* L, int arg) {
void* userData = lua_touserdata(L, arg);
diff --git a/Sluift/Lua/Check.h b/Sluift/Lua/Check.h
index 8a8b64a..c22751b 100644
--- a/Sluift/Lua/Check.h
+++ b/Sluift/Lua/Check.h
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2013 Remko Tronçon
+ * Copyright (c) 2013-2014 Remko Tronçon
* Licensed under the GNU General Public License.
* See the COPYING file for more information.
@@ -9,4 +9,6 @@
#include <string>
+#include <Swiften/Base/ByteArray.h>
+
struct lua_State;
@@ -16,4 +18,5 @@ namespace Swift {
int checkIntNumber(lua_State* L, int arg);
std::string checkString(lua_State* L, int arg);
+ ByteArray checkByteArray(lua_State* L, int arg);
void* checkUserDataRaw(lua_State* L, int arg);
diff --git a/Sluift/Lua/LuaUtils.cpp b/Sluift/Lua/LuaUtils.cpp
index 915f3cc..dbadaab 100644
--- a/Sluift/Lua/LuaUtils.cpp
+++ b/Sluift/Lua/LuaUtils.cpp
@@ -190,2 +190,10 @@ void Swift::Lua::registerExtraHelp(lua_State* L, int index, const std::string& n
lua_pop(L, 3);
}
+
+void Swift::Lua::pushStringArray(lua_State* L, const std::vector<std::string>& strings) {
+ lua_createtable(L, strings.size(), 0);
+ for (size_t i = 0; i < strings.size(); ++i) {
+ lua_pushstring(L, strings[i].c_str());
+ lua_rawseti(L, -2, boost::numeric_cast<int>(i+1));
+ }
+}
diff --git a/Sluift/Lua/LuaUtils.h b/Sluift/Lua/LuaUtils.h
index 105f249..ed4fcc1 100644
--- a/Sluift/Lua/LuaUtils.h
+++ b/Sluift/Lua/LuaUtils.h
@@ -38,4 +38,6 @@ namespace Swift {
boost::optional<bool> getBooleanField(lua_State* L, int index, const std::string&);
boost::optional<int> getIntField(lua_State* L, int index, const std::string&);
+
+ void pushStringArray(lua_State* L, const std::vector<std::string>& strings);
}
}
diff --git a/Sluift/SluiftGlobals.h b/Sluift/SluiftGlobals.h
index e89f495..9d9cc51 100644
--- a/Sluift/SluiftGlobals.h
+++ b/Sluift/SluiftGlobals.h
@@ -10,4 +10,5 @@
#include <Swiften/EventLoop/SimpleEventLoop.h>
#include <Swiften/Network/BoostNetworkFactories.h>
+#include <Swiften/TLS/PlatformTLSFactories.h>
#ifdef HAVE_ITUNES
#include <Sluift/ITunesInterface.h>
@@ -26,4 +27,5 @@ namespace Swift {
SimpleEventLoop eventLoop;
BoostNetworkFactories networkFactories;
+ PlatformTLSFactories tlsFactories;
int coreLibIndex;
int moduleLibIndex;
diff --git a/Sluift/core.lua b/Sluift/core.lua
index 9e81575..48b8a97 100644
--- a/Sluift/core.lua
+++ b/Sluift/core.lua
@@ -7,5 +7,5 @@
local sluift = select(1, ...)
local _G = _G
-local pairs, ipairs, print, tostring, type, error, assert, next, rawset, xpcall, unpack = pairs, ipairs, print, tostring, type, error, assert, next, rawset, xpcall, unpack
+local pairs, ipairs, print, tostring, type, error, assert, next, rawset, xpcall, unpack, io = pairs, ipairs, print, tostring, type, error, assert, next, rawset, xpcall, unpack, io
local setmetatable, getmetatable = setmetatable, getmetatable
local string = require "string"
@@ -436,4 +436,11 @@ local function call(options)
end
+local function read_file(file)
+ local f = io.open(file, 'rb')
+ local result = f:read('*all')
+ f:close()
+ return result
+end
+
--------------------------------------------------------------------------------
-- Metatables
@@ -1006,4 +1013,5 @@ return {
process_pubsub_event = process_pubsub_event,
tprint = tprint,
+ read_file = read_file,
disco = disco,
get_help = get_help,
diff --git a/Sluift/sluift.cpp b/Sluift/sluift.cpp
index 37cb4f2..858e634 100644
--- a/Sluift/sluift.cpp
+++ b/Sluift/sluift.cpp
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2011-2013 Remko Tronçon
+ * Copyright (c) 2011-2014 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -27,4 +27,6 @@
#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h>
#include <Swiften/Serializer/PayloadSerializer.h>
+#include <Swiften/TLS/Certificate.h>
+#include <Swiften/TLS/CertificateFactory.h>
#include <Sluift/LuaElementConvertor.h>
#include <Sluift/Lua/Debug.h>
@@ -179,4 +181,40 @@ SLUIFT_LUA_FUNCTION_WITH_HELP(
/*******************************************************************************
+ * Crypto functions
+ ******************************************************************************/
+
+SLUIFT_LUA_FUNCTION_WITH_HELP(
+ Crypto, new_certificate,
+ "Creates a new X.509 certificate from DER data.\n",
+
+ "der the DER-encoded certificate data",
+
+ "") {
+ ByteArray certData(Lua::checkByteArray(L, 1));
+ Certificate::ref cert(Sluift::globals.tlsFactories.getCertificateFactory()->createCertificateFromDER(certData));
+ lua_createtable(L, 0, 0);
+ lua_pushstring(L, cert->getSubjectName().c_str());
+ lua_setfield(L, -2, "subject_name");
+ lua_pushstring(L, Certificate::getSHA1Fingerprint(cert, Sluift::globals.networkFactories.getCryptoProvider()).c_str());
+ lua_setfield(L, -2, "sha1_fingerprint");
+
+ Lua::pushStringArray(L, cert->getCommonNames());
+ lua_setfield(L, -2, "common_names");
+
+ Lua::pushStringArray(L, cert->getSRVNames());
+ lua_setfield(L, -2, "srv_names");
+
+ Lua::pushStringArray(L, cert->getDNSNames());
+ lua_setfield(L, -2, "dns_names");
+
+ Lua::pushStringArray(L, cert->getXMPPAddresses());
+ lua_setfield(L, -2, "xmpp_addresses");
+
+ Lua::registerTableToString(L, -1);
+ return 1;
+}
+
+
+/*******************************************************************************
* JID Functions
******************************************************************************/
@@ -334,4 +372,6 @@ SLUIFT_API int luaopen_sluift(lua_State* L) {
Lua::FunctionRegistry::getInstance().createFunctionTable(L, "IDN");
lua_setfield(L, -2, "idn");
+ Lua::FunctionRegistry::getInstance().createFunctionTable(L, "Crypto");
+ lua_setfield(L, -2, "crypto");
#ifdef HAVE_ITUNES
Lua::FunctionRegistry::getInstance().createFunctionTable(L, "iTunes");
@@ -342,5 +382,5 @@ SLUIFT_API int luaopen_sluift(lua_State* L) {
lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex);
std::vector<std::string> coreLibExports = boost::assign::list_of
- ("tprint")("disco")("help")("get_help")("copy")("with");
+ ("tprint")("disco")("help")("get_help")("copy")("with")("read_file");
foreach (const std::string& coreLibExport, coreLibExports) {
lua_getfield(L, -1, coreLibExport.c_str());