diff --git a/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp b/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp index 744ac710e..188078b7d 100644 --- a/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp +++ b/login_server/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp @@ -13,6 +13,7 @@ #include "JsonCreateTransaction.h" #include "JsonCreateUser.h" #include "JsonGetLogin.h" +#include "JsonSignTransaction.h" #include "JsonUnknown.h" #include "JsonGetRunningUserTasks.h" #include "JsonGetUsers.h" @@ -76,6 +77,9 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c else if (url_first_part == "/checkSessionState") { return new JsonCheckSessionState; } + else if (url_first_part == "/signTransaction") { + return new JsonSignTransaction; + } else if (url_first_part == "/checkUsername") { return new JsonCheckUsername; } diff --git a/login_server/src/cpp/JSONInterface/JsonSignTransaction.cpp b/login_server/src/cpp/JSONInterface/JsonSignTransaction.cpp new file mode 100644 index 000000000..f38c4b48f --- /dev/null +++ b/login_server/src/cpp/JSONInterface/JsonSignTransaction.cpp @@ -0,0 +1,48 @@ +#include "JsonSignTransaction.h" +#include "lib/DataTypeConverter.h" + +Poco::JSON::Object* JsonSignTransaction::handle(Poco::Dynamic::Var params) +{ + auto result = checkAndLoadSession(params); + if (result) { + return result; + } + + std::string bodyBytes_base64; + auto mm = MemoryManager::getInstance(); + + // if is json object + if (params.type() == typeid(Poco::JSON::Object::Ptr)) { + Poco::JSON::Object::Ptr paramJsonObject = params.extract(); + /// Throws a RangeException if the value does not fit + /// into the result variable. + /// Throws a NotImplementedException if conversion is + /// not available for the given type. + /// Throws InvalidAccessException if Var is empty. + try { + paramJsonObject->get("bodyBytes").convert(bodyBytes_base64); + } + catch (Poco::Exception& ex) { + return stateError("json exception", ex.displayText()); + } + } + auto user = mSession->getNewUser(); + auto keyPair = user->getGradidoKeyPair(); + if (!keyPair) { + return stateError("error reading keys"); + } + + auto bodyBytes = DataTypeConverter::base64ToBin(bodyBytes_base64); + auto sign = keyPair->sign(bodyBytes_base64); + mm->releaseMemory(bodyBytes); + + if (!sign) { + return stateError("error signing transaction"); + } + auto sign_base64 = DataTypeConverter::binToBase64(sign); + mm->releaseMemory(sign); + result = stateSuccess(); + result->set("sign", sign_base64); + + return result; +} \ No newline at end of file diff --git a/login_server/src/cpp/JSONInterface/JsonSignTransaction.h b/login_server/src/cpp/JSONInterface/JsonSignTransaction.h new file mode 100644 index 000000000..108ae9f3a --- /dev/null +++ b/login_server/src/cpp/JSONInterface/JsonSignTransaction.h @@ -0,0 +1,15 @@ +#ifndef __JSON_INTERFACE_JSON_SIGN_TRANSACTION_ +#define __JSON_INTERFACE_JSON_SIGN_TRANSACTION_ + +#include "JsonRequestHandler.h" + +class JsonSignTransaction : public JsonRequestHandler +{ +public: + Poco::JSON::Object* handle(Poco::Dynamic::Var params); + +protected: + +}; + +#endif // __JSON_INTERFACE_JSON_SIGN_TRANSACTION_ \ No newline at end of file