diff --git a/src/cpp/JSONInterface/JsonAquireAccessToken.cpp b/src/cpp/JSONInterface/JsonAquireAccessToken.cpp new file mode 100644 index 000000000..99a8cb17e --- /dev/null +++ b/src/cpp/JSONInterface/JsonAquireAccessToken.cpp @@ -0,0 +1,36 @@ +#include "JsonAquireAccessToken.h" +#include "Poco/URI.h" + +#include "../SingletonManager/SessionManager.h" +#include "../SingletonManager/ErrorManager.h" + +#include "../controller/AppAccessToken.h" + +#include "../lib/DataTypeConverter.h" + +Poco::JSON::Object* JsonAquireAccessToken::handle(Poco::Dynamic::Var params) +{ + auto session_result = checkAndLoadSession(params); + if (session_result) { + return session_result; + } + Poco::JSON::Object* result = new Poco::JSON::Object; + result->set("state", "success"); + auto user = mSession->getNewUser(); + auto user_id = user->getModel()->getID(); + auto access_tokens = controller::AppAccessToken::load(user_id); + Poco::AutoPtr access_token; + if (access_tokens.size() > 0) { + access_token = access_tokens[0]; + access_token->getModel()->update(); + } + else { + access_token = controller::AppAccessToken::create(user_id); + access_token->getModel()->insertIntoDB(false); + } + + result->set("access_token", std::to_string(access_token->getModel()->getCode())); + + return result; + +} \ No newline at end of file diff --git a/src/cpp/JSONInterface/JsonAquireAccessToken.h b/src/cpp/JSONInterface/JsonAquireAccessToken.h new file mode 100644 index 000000000..dfacb85d8 --- /dev/null +++ b/src/cpp/JSONInterface/JsonAquireAccessToken.h @@ -0,0 +1,16 @@ +#ifndef __JSON_INTERFACE_JSON_ACQUIRE_ACCESS_TOKEN_ +#define __JSON_INTERFACE_JSON_ACQUIRE_ACCESS_TOKEN_ + +#include "JsonRequestHandler.h" + +class JsonAquireAccessToken : public JsonRequestHandler +{ +public: + Poco::JSON::Object* handle(Poco::Dynamic::Var params); + +protected: + + +}; + +#endif // __JSON_INTERFACE_JSON_ACQUIRE_ACCESS_TOKEN_ \ No newline at end of file diff --git a/src/cpp/JSONInterface/JsonRequestHandler.cpp b/src/cpp/JSONInterface/JsonRequestHandler.cpp index 1601c764c..9ddbbc98c 100644 --- a/src/cpp/JSONInterface/JsonRequestHandler.cpp +++ b/src/cpp/JSONInterface/JsonRequestHandler.cpp @@ -13,6 +13,14 @@ #include "../lib/DataTypeConverter.h" #include "../SingletonManager/SessionManager.h" +#include "../SingletonManager/SessionManager.h" + +JsonRequestHandler::JsonRequestHandler() + : mSession(nullptr) +{ + +} + void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) { @@ -29,6 +37,8 @@ void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Po //Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); //std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; + mClientIp = request.clientAddress().host(); + auto method = request.getMethod(); std::istream& request_stream = request.stream(); Poco::JSON::Object* json_result = nullptr; @@ -136,3 +146,56 @@ Poco::JSON::Object* JsonRequestHandler::customStateError(const char* state, cons } return result; } + +Poco::JSON::Object* JsonRequestHandler::checkAndLoadSession(Poco::Dynamic::Var params) +{ + int session_id = 0; + auto sm = SessionManager::getInstance(); + + if (params.isStruct()) { + session_id = params["session_id"]; + //std::string miau = params["miau"]; + } + else if (params.isVector()) { + try { + const Poco::URI::QueryParameters queryParams = params.extract(); + for (auto it = queryParams.begin(); it != queryParams.end(); it++) { + if (it->first == "session_id") { + auto numberParseResult = DataTypeConverter::strToInt(it->second, session_id); + if (DataTypeConverter::NUMBER_PARSE_OKAY != numberParseResult) { + return stateError("error parsing session_id", DataTypeConverter::numberParseStateToString(numberParseResult)); + } + break; + } + } + //auto var = params[0]; + } + catch (Poco::Exception& ex) { + return stateError("error parsing query params, Poco Error", ex.displayText()); + } + } + + if (!session_id) { + return stateError("empty session id"); + } + + auto session = sm->getSession(session_id); + if (!session) { + return customStateError("not found", "session not found"); + } + if (!session->isIPValid(mClientIp)) { + return stateError("client ip differ from login client ip"); + } + auto userNew = session->getNewUser(); + //auto user = session->getUser(); + if (userNew.isNull()) { + return customStateError("not found", "Session didn't contain user"); + } + auto userModel = userNew->getModel(); + if (userModel.isNull()) { + return customStateError("not found", "User is empty"); + } + mSession = session; + return nullptr; + +} diff --git a/src/cpp/JSONInterface/JsonRequestHandler.h b/src/cpp/JSONInterface/JsonRequestHandler.h index 90c3e3171..aaa32dba5 100644 --- a/src/cpp/JSONInterface/JsonRequestHandler.h +++ b/src/cpp/JSONInterface/JsonRequestHandler.h @@ -3,7 +3,7 @@ #include "Poco/Net/HTTPRequestHandler.h" #include "Poco/JSON/Object.h" - +#include "../model/Session.h" #include "../lib/NotificationList.h" @@ -11,6 +11,8 @@ class JsonRequestHandler : public Poco::Net::HTTPRequestHandler { public: + JsonRequestHandler(); + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); virtual Poco::JSON::Object* handle(Poco::Dynamic::Var params) = 0; @@ -19,6 +21,11 @@ public: protected: Poco::JSON::Object* mResultJson; + Poco::Net::IPAddress mClientIp; + Session* mSession; + + Poco::JSON::Object* checkAndLoadSession(Poco::Dynamic::Var params); + static Poco::JSON::Object* stateError(const char* msg, std::string details = ""); static Poco::JSON::Object* customStateError(const char* state, const char* msg, std::string details = ""); static Poco::JSON::Object* stateSuccess(); diff --git a/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp b/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp index ea4670eca..dafb75aaf 100644 --- a/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp +++ b/src/cpp/JSONInterface/JsonRequestHandlerFactory.cpp @@ -5,6 +5,7 @@ #include "../SingletonManager/SessionManager.h" #include "JsonAdminEmailVerificationResend.h" +#include "JsonAquireAccessToken.h" #include "JsonCreateTransaction.h" #include "JsonCreateUser.h" #include "JsonGetLogin.h" @@ -82,5 +83,8 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c else if (url_first_part == "/logout") { return new JsonLogout(client_host); } + else if (url_first_part == "/acquireAccessToken") { + return new JsonAquireAccessToken; + } return new JsonUnknown; } diff --git a/src/cpp/model/table/AppAccessToken.cpp b/src/cpp/model/table/AppAccessToken.cpp index 615dbb361..d15db1a21 100644 --- a/src/cpp/model/table/AppAccessToken.cpp +++ b/src/cpp/model/table/AppAccessToken.cpp @@ -59,6 +59,11 @@ namespace model return insert; } + size_t AppAccessToken::update() + { + return updateIntoDB("update", Poco::DateTime()); + } + Poco::Data::Statement AppAccessToken::_loadFromDB(Poco::Data::Session session, const std::string& fieldName) { diff --git a/src/cpp/model/table/AppAccessToken.h b/src/cpp/model/table/AppAccessToken.h index 1bca2c351..821cb6e3c 100644 --- a/src/cpp/model/table/AppAccessToken.h +++ b/src/cpp/model/table/AppAccessToken.h @@ -29,6 +29,7 @@ namespace model { inline void setCode(Poco::UInt64 code) { mAccessCode = code; } inline void setUserId(int user_Id) { mUserId = user_Id; } + size_t update(); protected: Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);