add Json for getting app access token with valid session_id

This commit is contained in:
Dario 2020-11-30 16:59:04 +01:00 committed by Ulf Gebhardt
parent 5323052300
commit d35c4682c2
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
7 changed files with 133 additions and 1 deletions

View File

@ -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<controller::AppAccessToken> 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;
}

View File

@ -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_

View File

@ -13,6 +13,14 @@
#include "../lib/DataTypeConverter.h" #include "../lib/DataTypeConverter.h"
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
#include "../SingletonManager/SessionManager.h"
JsonRequestHandler::JsonRequestHandler()
: mSession(nullptr)
{
}
void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) 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); //Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
//std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; //std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
mClientIp = request.clientAddress().host();
auto method = request.getMethod(); auto method = request.getMethod();
std::istream& request_stream = request.stream(); std::istream& request_stream = request.stream();
Poco::JSON::Object* json_result = nullptr; Poco::JSON::Object* json_result = nullptr;
@ -136,3 +146,56 @@ Poco::JSON::Object* JsonRequestHandler::customStateError(const char* state, cons
} }
return result; 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<Poco::URI::QueryParameters>();
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;
}

View File

@ -3,7 +3,7 @@
#include "Poco/Net/HTTPRequestHandler.h" #include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/JSON/Object.h" #include "Poco/JSON/Object.h"
#include "../model/Session.h"
#include "../lib/NotificationList.h" #include "../lib/NotificationList.h"
@ -11,6 +11,8 @@ class JsonRequestHandler : public Poco::Net::HTTPRequestHandler
{ {
public: public:
JsonRequestHandler();
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
virtual Poco::JSON::Object* handle(Poco::Dynamic::Var params) = 0; virtual Poco::JSON::Object* handle(Poco::Dynamic::Var params) = 0;
@ -19,6 +21,11 @@ public:
protected: protected:
Poco::JSON::Object* mResultJson; 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* 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* customStateError(const char* state, const char* msg, std::string details = "");
static Poco::JSON::Object* stateSuccess(); static Poco::JSON::Object* stateSuccess();

View File

@ -5,6 +5,7 @@
#include "../SingletonManager/SessionManager.h" #include "../SingletonManager/SessionManager.h"
#include "JsonAdminEmailVerificationResend.h" #include "JsonAdminEmailVerificationResend.h"
#include "JsonAquireAccessToken.h"
#include "JsonCreateTransaction.h" #include "JsonCreateTransaction.h"
#include "JsonCreateUser.h" #include "JsonCreateUser.h"
#include "JsonGetLogin.h" #include "JsonGetLogin.h"
@ -82,5 +83,8 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c
else if (url_first_part == "/logout") { else if (url_first_part == "/logout") {
return new JsonLogout(client_host); return new JsonLogout(client_host);
} }
else if (url_first_part == "/acquireAccessToken") {
return new JsonAquireAccessToken;
}
return new JsonUnknown; return new JsonUnknown;
} }

View File

@ -59,6 +59,11 @@ namespace model
return insert; return insert;
} }
size_t AppAccessToken::update()
{
return updateIntoDB("update", Poco::DateTime());
}
Poco::Data::Statement AppAccessToken::_loadFromDB(Poco::Data::Session session, const std::string& fieldName) Poco::Data::Statement AppAccessToken::_loadFromDB(Poco::Data::Session session, const std::string& fieldName)
{ {

View File

@ -29,6 +29,7 @@ namespace model {
inline void setCode(Poco::UInt64 code) { mAccessCode = code; } inline void setCode(Poco::UInt64 code) { mAccessCode = code; }
inline void setUserId(int user_Id) { mUserId = user_Id; } inline void setUserId(int user_Id) { mUserId = user_Id; }
size_t update();
protected: protected:
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName); Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);