diff --git a/receiver/CMakeLists.txt b/receiver/CMakeLists.txt index 66049ae23debe69d12047814f18788622298d801..6d6ac3e8aa5d0fec8c24ef70b42f768fd14cc85f 100644 --- a/receiver/CMakeLists.txt +++ b/receiver/CMakeLists.txt @@ -102,8 +102,9 @@ set(TEST_SOURCE_FILES unittests/request_handler/test_request_handler_db_stream_info.cpp unittests/request_handler/test_request_handler_db_last_stream.cpp unittests/request_handler/test_request_handler_db.cpp - unittests/request_handler/test_request_handler_authorizer.cpp + unittests/request_handler/test_authorization_client.cpp unittests/request_handler/test_request_handler_initial_authorization.cpp + unittests/request_handler/test_request_handler_secondary_authorization.cpp unittests/request_handler/test_request_handler_receive_data.cpp unittests/request_handler/test_request_handler_receive_metadata.cpp unittests/request_handler/test_request_handler_delete_stream.cpp diff --git a/receiver/src/receiver_logger.cpp b/receiver/src/receiver_logger.cpp index 85945ae94b4eada91432077a0372f7fc92c04cb8..05edc430a5d22542e9d7e6029214fb01a32f8326 100644 --- a/receiver/src/receiver_logger.cpp +++ b/receiver/src/receiver_logger.cpp @@ -2,6 +2,8 @@ #include "request.h" +#include "request_handler/structs.h" + namespace asapo { AbstractLogger* GetDefaultReceiverLogger() { @@ -9,25 +11,47 @@ AbstractLogger* GetDefaultReceiverLogger() { return logger.get(); } -LogMessageWithFields RequestLog(std::string message, const Request* request) { - LogMessageWithFields msg{std::move(message)}; - msg.Append("beamtime", request->GetBeamtimeId()) - .Append("dataSource", request->GetDataSource()) - .Append("stream", request->GetStream()) - .Append("origin", request->GetOriginHost()) - .Append("operation", OpcodeToString(request->GetOpCode())); +void AppendIdToLogMessageIfNeeded(const Request* request, LogMessageWithFields* msg) { switch (request->GetOpCode()) { case Opcode::kOpcodeTransferData: - msg.Append("id", request->GetDataID()); + msg->Append("id", request->GetDataID()); break; case Opcode::kOpcodeTransferDatasetData: - msg.Append("id", request->GetDataID()); - msg.Append("substream", request->GetCustomData()[1]); + msg->Append("id", request->GetDataID()); + msg->Append("substream", request->GetCustomData()[1]); break; default: break; } +} + +LogMessageWithFields AuthorizationLog(std::string message, const Request* request, const AuthorizationData* data) { + LogMessageWithFields msg{std::move(message)}; + msg.Append("beamtime", data->beamtime_id) + .Append("dataSource", data->data_source) + .Append("beamline", data->beamline) + .Append("origin", request->GetOriginHost()); + + if (request->GetOpCode() != kOpcodeAuthorize) { + msg.Append("stream", request->GetStream()); + AppendIdToLogMessageIfNeeded(request, &msg); + } + + return msg; +} + + +LogMessageWithFields RequestLog(std::string message, const Request* request) { + LogMessageWithFields msg{std::move(message)}; + msg.Append("beamtime", request->GetBeamtimeId()) + .Append("beamline", request->GetBeamline()) + .Append("dataSource", request->GetDataSource()) + .Append("stream", request->GetStream()) + .Append("origin", request->GetOriginHost()) + .Append("operation", OpcodeToString(request->GetOpCode())); + + AppendIdToLogMessageIfNeeded(request, &msg); return msg; } diff --git a/receiver/src/receiver_logger.h b/receiver/src/receiver_logger.h index 49385f52b9597e929f85d1107e0a30177e415314..e1cd160448d8ff500df6549ee0f8c316f48c535d 100644 --- a/receiver/src/receiver_logger.h +++ b/receiver/src/receiver_logger.h @@ -2,12 +2,15 @@ #define ASAPO_RECEIVER_LOGGER_H #include "asapo/logger/logger.h" -#include "request.h" namespace asapo { +struct AuthorizationData; +class Request; + AbstractLogger* GetDefaultReceiverLogger(); LogMessageWithFields RequestLog(std::string message, const Request* request); +LogMessageWithFields AuthorizationLog(std::string message, const Request* request, const AuthorizationData* data); } diff --git a/receiver/src/request.h b/receiver/src/request.h index b14979e905bbf6b77968e8bb0c00156154d489a5..47e3eacffb43d6aaaebce476aaa8f9146f741ec6 100644 --- a/receiver/src/request.h +++ b/receiver/src/request.h @@ -7,14 +7,6 @@ #include "asapo/common/networking.h" #include "asapo/io/io.h" #include "request_handler/request_handler.h" -/*#include "request_handler/request_handler_file_process.h" -#include "request_handler/request_handler_db_write.h" -#include "request_handler/request_handler_authorize.h" -#include "request_handler/request_handler_db_meta_write.h" -#include "request_handler/request_handler_receive_data.h" -#include "request_handler/request_handler_receive_metadata.h" -#include "request_handler/request_handler_db_check_request.h" -*/ #include "statistics/receiver_statistics.h" #include "data_cache.h" @@ -51,8 +43,8 @@ class Request { VIRTUAL Opcode GetOpCode() const; VIRTUAL const char* GetMessage() const; - const std::string& GetOriginUri() const; - const std::string& GetOriginHost() const; + VIRTUAL const std::string& GetOriginUri() const; + VIRTUAL const std::string& GetOriginHost() const; VIRTUAL const std::string& GetMetaData() const; VIRTUAL const std::string& GetBeamtimeId() const; VIRTUAL void SetBeamtimeId(std::string beamtime_id); diff --git a/receiver/src/request_handler/authorization_client.cpp b/receiver/src/request_handler/authorization_client.cpp index 5dcc875e4082d8fe91955a661097b401a016d1ce..d709b548d849d4e06b4f3fed7608e8bd0f1a5279 100644 --- a/receiver/src/request_handler/authorization_client.cpp +++ b/receiver/src/request_handler/authorization_client.cpp @@ -4,31 +4,28 @@ #include "asapo/json_parser/json_parser.h" - - #include "../receiver_config.h" #include "../receiver_logger.h" #include "../request.h" - namespace asapo { -std::string AuthorizationClient::GetRequestString(const Request* request, const std::string& source_credentials) const { +std::string GetRequestString(const Request* request, const std::string& source_credentials) { std::string request_string = std::string("{\"SourceCredentials\":\"") + - source_credentials + "\",\"OriginHost\":\"" + request->GetOriginUri() + "\"}"; + source_credentials + "\",\"OriginHost\":\"" + request->GetOriginUri() + "\"}"; return request_string; } -Error AuthorizationClient::ErrorFromAuthorizationServerResponse(const Error& err, const std::string response, - HttpCode code) const { +Error ErrorFromAuthorizationServerResponse(const Error& err, const std::string response, + HttpCode code) { if (err) { return asapo::ReceiverErrorTemplates::kInternalServerError.Generate( - "cannot authorize request: " + err->Explain()); + "cannot authorize request: " + err->Explain()); } else { if (code != HttpCode::Unauthorized) { return asapo::ReceiverErrorTemplates::kInternalServerError.Generate( - response + " return code " + std::to_string(int( - code))); + response + " return code " + std::to_string(int( + code))); } return asapo::ReceiverErrorTemplates::kAuthorizationFailure.Generate(response); } @@ -43,55 +40,83 @@ Error CheckAccessType(SourceType source_type, const std::vector<std::string>& ac } } -LogMessageWithFields AuthErrorLogMsg(const Request* request, const Error& err, const std::string& request_string) { - return RequestLog("failure authorizing: " + err->Explain(), request) - .Append("authServer", GetReceiverConfig()->authorization_server) - .Append("request", request_string); -} - -Error AuthorizationClient::Authorize(const Request* request, AuthorizationData* data) const { - HttpCode code; +Error ParseServerResponse(const std::string& response, + HttpCode code, + std::vector<std::string>* access_types, + AuthorizationData* data) { Error err; - std::string request_string = GetRequestString(request, data->source_credentials); - auto response = - http_client__->Post(GetReceiverConfig()->authorization_server + "/authorize", "", request_string, &code, - &err); - if (err || code != HttpCode::OK) { - auto auth_error = ErrorFromAuthorizationServerResponse(err, response, code); - log__->Error(AuthErrorLogMsg(request, auth_error, request_string)); - return auth_error; + AuthorizationData creds; + JsonStringParser parser{response}; + std::string stype; + + (err = parser.GetString("beamtimeId", &data->beamtime_id)) || + (err = parser.GetString("dataSource", &data->data_source)) || + (err = parser.GetString("corePath", &data->offline_path)) || + (err = parser.GetString("beamline-path", &data->online_path)) || + (err = parser.GetString("source-type", &stype)) || + (err = parser.GetArrayString("access-types", access_types)) || + (err = GetSourceTypeFromString(stype, &data->source_type)) || + (err = parser.GetString("beamline", &data->beamline)); + if (err) { + return ErrorFromAuthorizationServerResponse(err, "", code); } + return nullptr; +} +Error UpdateDataFromServerResponse(const std::string& response, HttpCode code, AuthorizationData* data) { + Error err; std::string stype; std::vector<std::string> access_types; - - AuthorizationData creds; - JsonStringParser parser{response}; - (err = parser.GetString("beamtimeId", &creds.beamtime_id)) || - (err = parser.GetString("dataSource", &creds.data_source)) || - (err = parser.GetString("corePath", &creds.offline_path)) || - (err = parser.GetString("beamline-path", &creds.online_path)) || - (err = parser.GetString("source-type", &stype)) || - (err = parser.GetArrayString("access-types", &access_types)) || - (err = GetSourceTypeFromString(stype, &creds.source_type)) || - (err = parser.GetString("beamline", &creds.beamline)); + AuthorizationData old_data = *data; + err = ParseServerResponse(response, code, &access_types, data); if (err) { - return ErrorFromAuthorizationServerResponse(err, "", code); + *data = old_data; + return ErrorFromAuthorizationServerResponse(err, response, code); } - err = CheckAccessType(creds.source_type, access_types); + err = CheckAccessType(data->source_type, access_types); if (err) { - log__->Error(AuthErrorLogMsg(request, err, request_string)); + *data = old_data; return err; } - log__->Debug(RequestLog("authorized connection",request)); - *data = creds; data->last_update = std::chrono::system_clock::now(); return nullptr; } +Error AuthorizationClient::DoServerRequest(const std::string& request_string, + std::string* response, + HttpCode* code) const { + Error err; + *response = + http_client__->Post(GetReceiverConfig()->authorization_server + "/authorize", "", request_string, code, + &err); + if (err || *code != HttpCode::OK) { + auto auth_error = ErrorFromAuthorizationServerResponse(err, *response, *code); + return auth_error; + } + return nullptr; +} + +Error AuthorizationClient::Authorize(const Request* request, AuthorizationData* data) const { + HttpCode code; + std::string response; + std::string request_string = GetRequestString(request, data->source_credentials); + auto err = DoServerRequest(request_string, &response, &code); + if (err != nullptr) { + return err; + } + + err = UpdateDataFromServerResponse(response, code, data); + if (err != nullptr) { + return err; + } + log__->Debug(AuthorizationLog( + request->GetOpCode() == kOpcodeAuthorize ? "authorized connection" : "reauthorized connection", request, data)); + return nullptr; +} + AuthorizationClient::AuthorizationClient() : log__{GetDefaultReceiverLogger()}, - http_client__{DefaultHttpClient()} { + http_client__{DefaultHttpClient()} { } } diff --git a/receiver/src/request_handler/authorization_client.h b/receiver/src/request_handler/authorization_client.h index bb1e8306ccfadbe1cfcca92a54995a9e08749813..2312a41dbbad39b757cd6b29cd0e55fd24736ab2 100644 --- a/receiver/src/request_handler/authorization_client.h +++ b/receiver/src/request_handler/authorization_client.h @@ -12,16 +12,15 @@ class Request; class AbstractLogger; class AuthorizationClient { - public: - AuthorizationClient(); - VIRTUAL Error Authorize(const Request* request, AuthorizationData* data) const; - const AbstractLogger* log__; - std::unique_ptr<HttpClient>http_client__; - VIRTUAL ~AuthorizationClient()=default; - private: - Error ErrorFromAuthorizationServerResponse(const Error& err, const std::string response, HttpCode code) const; - void SetRequestFields(Request* request) const; - std::string GetRequestString(const Request* request, const std::string& source_credentials) const; + public: + AuthorizationClient(); + VIRTUAL Error Authorize(const Request* request, AuthorizationData* data) const; + const AbstractLogger* log__; + std::unique_ptr<HttpClient> http_client__; + VIRTUAL ~AuthorizationClient() = default; + private: + Error DoServerRequest(const std::string& request_string, std::string* response, HttpCode* code) const; + }; } diff --git a/receiver/src/request_handler/request_handler_authorize.cpp b/receiver/src/request_handler/request_handler_authorize.cpp index ab33e19b4936d8c97efaac968559cd58639b2c8c..7e0412a961694f1795f13f5546b3d0f4a450a085 100644 --- a/receiver/src/request_handler/request_handler_authorize.cpp +++ b/receiver/src/request_handler/request_handler_authorize.cpp @@ -1,5 +1,4 @@ #include "request_handler_authorize.h" -#include "../receiver_config.h" #include "../receiver_logger.h" #include "../request.h" @@ -22,7 +21,7 @@ Error RequestHandlerAuthorize::CheckVersion(const Request* request) const { } RequestHandlerAuthorize::RequestHandlerAuthorize(AuthorizationData* authorization_cache) : log__{GetDefaultReceiverLogger()}, - auth_client__{new AuthorizationClient()},authorization_cache_{authorization_cache} { + auth_client__{new AuthorizationClient()}, authorization_cache_{authorization_cache} { } StatisticEntity RequestHandlerAuthorize::GetStatisticEntity() const { diff --git a/receiver/src/request_handler/request_handler_authorize.h b/receiver/src/request_handler/request_handler_authorize.h index 08c814d2b7fc36b03290089f7846e29294c1911e..5e504fb5a11b66727c9cc2ab5b91e64f9374401c 100644 --- a/receiver/src/request_handler/request_handler_authorize.h +++ b/receiver/src/request_handler/request_handler_authorize.h @@ -15,11 +15,11 @@ namespace asapo { class RequestHandlerAuthorize : public ReceiverRequestHandler { public: - RequestHandlerAuthorize()=delete; + RequestHandlerAuthorize() = delete; RequestHandlerAuthorize(AuthorizationData* authorization_cache); StatisticEntity GetStatisticEntity() const override; virtual Error ProcessRequest(Request* request) const override = 0; - virtual ~RequestHandlerAuthorize()=default; + virtual ~RequestHandlerAuthorize() = default; const AbstractLogger* log__; std::unique_ptr<AuthorizationClient> auth_client__; protected: diff --git a/receiver/src/request_handler/request_handler_initial_authorization.cpp b/receiver/src/request_handler/request_handler_initial_authorization.cpp index 7b0bdc797aee273114b7985bfc316859a27bd9c5..e95c9a3718162880d11ae9ed9ec993a440bae97c 100644 --- a/receiver/src/request_handler/request_handler_initial_authorization.cpp +++ b/receiver/src/request_handler/request_handler_initial_authorization.cpp @@ -4,14 +4,14 @@ namespace asapo { -RequestHandlerInitialAuthorization::RequestHandlerInitialAuthorization(AuthorizationData *authorization_cache) +RequestHandlerInitialAuthorization::RequestHandlerInitialAuthorization(AuthorizationData* authorization_cache) : RequestHandlerAuthorize(authorization_cache) { } -Error RequestHandlerInitialAuthorization::ProcessRequest(asapo::Request *request) const { +Error RequestHandlerInitialAuthorization::ProcessRequest(asapo::Request* request) const { auto err = CheckVersion(request); - if (err!=nullptr) { + if (err != nullptr) { return err; } @@ -20,7 +20,7 @@ Error RequestHandlerInitialAuthorization::ProcessRequest(asapo::Request *request } authorization_cache_->source_credentials = request->GetMetaData(); - return auth_client__->Authorize(request,authorization_cache_); + return auth_client__->Authorize(request, authorization_cache_); } diff --git a/receiver/src/request_handler/request_handler_initial_authorization.h b/receiver/src/request_handler/request_handler_initial_authorization.h index 13ea82f48b7c67d2cf53527c535a1eb619869652..454a7bcaaa482e056b1d0ff1e2114e7f409bf56c 100644 --- a/receiver/src/request_handler/request_handler_initial_authorization.h +++ b/receiver/src/request_handler/request_handler_initial_authorization.h @@ -6,10 +6,10 @@ namespace asapo { class RequestHandlerInitialAuthorization final: public RequestHandlerAuthorize { - public: - RequestHandlerInitialAuthorization(AuthorizationData* authorization_cache); - Error ProcessRequest(Request* request) const override; - ~RequestHandlerInitialAuthorization()=default; + public: + RequestHandlerInitialAuthorization(AuthorizationData* authorization_cache); + Error ProcessRequest(Request* request) const override; + ~RequestHandlerInitialAuthorization() = default; }; } diff --git a/receiver/src/request_handler/request_handler_secondary_authorization.cpp b/receiver/src/request_handler/request_handler_secondary_authorization.cpp index ac2b2fee5359b4ee62551402fe9d1ab48a54cc33..55ded2f08531dfb3e2d3f05f322e016175f2f24e 100644 --- a/receiver/src/request_handler/request_handler_secondary_authorization.cpp +++ b/receiver/src/request_handler/request_handler_secondary_authorization.cpp @@ -11,108 +11,74 @@ using std::chrono::system_clock; namespace asapo { -/* -Error RequestHandlerAuthorize::CheckVersion(const std::string& version_from_client) const { - int verClient = VersionToNumber(version_from_client); - int verService = VersionToNumber(GetReceiverApiVersion()); - if (verClient > verService) { - auto err_string = "client version: " + version_from_client + ", server version: " + GetReceiverApiVersion(); - return asapo::ReceiverErrorTemplates::kUnsupportedClient.Generate(err_string); - } - return nullptr; -} - -Error RequestHandlerAuthorize::ProcessAuthorizationRequest(Request* request) const { - if (!cached_source_credentials_.empty()) { - Error auth_error = asapo::ReceiverErrorTemplates::kAuthorizationFailure.Generate(); - auth_error->Append("already authorized"); - return auth_error; - } - - auto err = CheckVersion(request->GetApiVersion()); - if (err) { - return err; - } - err = auth_client__->Authorize(request, request->GetMetaData().c_str(),&cached_auth_); - if (err) { - return err; - } - - cached_source_credentials_ = request->GetMetaData(); - last_updated_ = system_clock::now(); - return nullptr; -} -Error RequestHandlerAuthorize::ProcessReAuthorization(Request* request) const { - std::string old_beamtimeId = cached_auth_.beamtime_id; - auto err = auth_client__->Authorize(request, cached_source_credentials_.c_str(),&cached_auth_); +Error RequestHandlerSecondaryAuthorization::ProcessReAuthorization(const Request* request) const { + std::string old_beamtimeId = authorization_cache_->beamtime_id; + auto err = auth_client__->Authorize(request, authorization_cache_); if (err == asapo::ReceiverErrorTemplates::kAuthorizationFailure || ( - err == nullptr && old_beamtimeId != cached_auth_.beamtime_id)) { + err == nullptr && old_beamtimeId != authorization_cache_->beamtime_id)) { + InvalidateAuthCache(); return asapo::ReceiverErrorTemplates::kReAuthorizationFailure.Generate(); } - if (err==nullptr) { - last_updated_ = system_clock::now(); - } return err; } -bool RequestHandlerAuthorize::NeedReauthorize() const { +bool RequestHandlerSecondaryAuthorization::NeedReauthorize() const { uint64_t elapsed_ms = (uint64_t) std::chrono::duration_cast<std::chrono::milliseconds> - (system_clock::now() - last_updated_).count(); + (system_clock::now() - authorization_cache_->last_update).count(); return elapsed_ms >= GetReceiverConfig()->authorization_interval_ms; } -void RequestHandlerAuthorize::SetRequestFields(Request* request) const { - request->SetBeamtimeId(cached_auth_.beamtime_id); - request->SetBeamline(cached_auth_.beamline); - request->SetDataSource(cached_auth_.data_source); - request->SetOfflinePath(cached_auth_.offline_path); - request->SetOnlinePath(cached_auth_.online_path); - request->SetSourceType(cached_auth_.source_type); +void RequestHandlerSecondaryAuthorization::SetRequestFields(Request* request) const { + request->SetBeamtimeId(authorization_cache_->beamtime_id); + request->SetBeamline(authorization_cache_->beamline); + request->SetDataSource(authorization_cache_->data_source); + request->SetOfflinePath(authorization_cache_->offline_path); + request->SetOnlinePath(authorization_cache_->online_path); + request->SetSourceType(authorization_cache_->source_type); } +RequestHandlerSecondaryAuthorization::RequestHandlerSecondaryAuthorization(AuthorizationData* authorization_cache) + : RequestHandlerAuthorize(authorization_cache) { -Error RequestHandlerAuthorize::ProcessOtherRequest(Request* request) const { - if (cached_source_credentials_.empty()) { - return ReceiverErrorTemplates::kAuthorizationFailure.Generate(); +} + +Error RequestHandlerSecondaryAuthorization::CheckRequest(const Request* request) const { + auto err = CheckVersion(request); + if (err != nullptr) { + return err; } - if (NeedReauthorize()) { - auto err = ProcessReAuthorization(request); - if (err) { - return err; - } + if (authorization_cache_->source_credentials.empty()) { + return ReceiverErrorTemplates::kAuthorizationFailure.Generate("not authorized"); } - SetRequestFields(request); return nullptr; } -Error RequestHandlerAuthorize::ProcessRequest(Request* request) const { - if (request->GetOpCode() == kOpcodeAuthorize) { - return ProcessAuthorizationRequest(request); - } else { - return ProcessOtherRequest(request); +Error RequestHandlerSecondaryAuthorization::ProcessRequest(asapo::Request* request) const { + auto err = CheckRequest(request); + if (err != nullptr) { + return err; } -} -RequestHandlerAuthorize::RequestHandlerAuthorize() : log__{GetDefaultReceiverLogger()}, - auth_client__{new AuthorizationClient()} { -} + err = ReauthorizeIfNeeded(request); + if (err != nullptr) { + return err; + } -StatisticEntity RequestHandlerAuthorize::GetStatisticEntity() const { - return StatisticEntity::kNetwork; + SetRequestFields(request); + return nullptr; } -*/ - -RequestHandlerSecondaryAuthorization::RequestHandlerSecondaryAuthorization(AuthorizationData *authorization_cache) - : RequestHandlerAuthorize(authorization_cache) { +Error RequestHandlerSecondaryAuthorization::ReauthorizeIfNeeded(const Request* request) const { + if (!NeedReauthorize()) { + return nullptr; + } + return ProcessReAuthorization(request); } -Error RequestHandlerSecondaryAuthorization::ProcessRequest(asapo::Request *request) const { - (void) request; - return nullptr; +void RequestHandlerSecondaryAuthorization::InvalidateAuthCache() const { + authorization_cache_->source_credentials = ""; } } - diff --git a/receiver/src/request_handler/request_handler_secondary_authorization.h b/receiver/src/request_handler/request_handler_secondary_authorization.h index 960596b30f9d0b0110e07427b3f75af189b50339..9d568cf16406d1244e15d4a7f2e928ae3702590e 100644 --- a/receiver/src/request_handler/request_handler_secondary_authorization.h +++ b/receiver/src/request_handler/request_handler_secondary_authorization.h @@ -14,21 +14,19 @@ namespace asapo { class RequestHandlerSecondaryAuthorization final: public RequestHandlerAuthorize { - public: - RequestHandlerSecondaryAuthorization() = delete; - RequestHandlerSecondaryAuthorization(AuthorizationData* authorization_cache); - virtual Error ProcessRequest(Request* request) const override; - ~RequestHandlerSecondaryAuthorization()=default; -/* private: - mutable AuthorizationData cached_auth_; - mutable std::string cached_source_credentials_; - mutable std::chrono::system_clock::time_point last_updated_; - Error ProcessAuthorizationRequest(Request* request) const; - Error ProcessOtherRequest(Request* request) const; - Error ProcessReAuthorization(Request* request) const; - bool NeedReauthorize() const; - void SetRequestFields(Request* request) const; - Error CheckVersion(const std::string& version_from_client) const;*/ + public: + RequestHandlerSecondaryAuthorization() = delete; + RequestHandlerSecondaryAuthorization(AuthorizationData* authorization_cache); + virtual Error ProcessRequest(Request* request) const override; + ~RequestHandlerSecondaryAuthorization() = default; + private: + bool NeedReauthorize() const; + void SetRequestFields(Request* request) const; + Error ProcessReAuthorization(const Request* request) const; + Error CheckRequest(const Request* request) const; + Error ReauthorizeIfNeeded(const Request* request) const; + void InvalidateAuthCache() const; + }; } diff --git a/receiver/src/request_handler/structs.h b/receiver/src/request_handler/structs.h index a0d3ad3820d4685d28604f55f7777d8b7a4e64cc..80bd533af2f92a04247d4c63d0d41851f5ad2235 100644 --- a/receiver/src/request_handler/structs.h +++ b/receiver/src/request_handler/structs.h @@ -8,14 +8,14 @@ namespace asapo { struct AuthorizationData { - std::string beamtime_id; - std::string data_source; - std::string beamline; - std::string offline_path; - std::string online_path; - SourceType source_type; - std::chrono::system_clock::time_point last_update; - std::string source_credentials; + std::string beamtime_id; + std::string data_source; + std::string beamline; + std::string offline_path; + std::string online_path; + SourceType source_type; + std::chrono::system_clock::time_point last_update; + std::string source_credentials; }; } diff --git a/receiver/unittests/receiver_mocking.h b/receiver/unittests/receiver_mocking.h index 4c5be8b5a774317bc9eda362cd662548b41e19a9..79e76f1f68c061aba448bb806f7fbc8ba112db94 100644 --- a/receiver/unittests/receiver_mocking.h +++ b/receiver/unittests/receiver_mocking.h @@ -69,6 +69,7 @@ class MockRequest: public Request { MOCK_CONST_METHOD0(GetFileName, std::string()); MOCK_CONST_METHOD0(GetStream, std::string()); MOCK_CONST_METHOD0(GetApiVersion, std::string()); + MOCK_CONST_METHOD0(GetOriginUri, const std::string & ()); MOCK_CONST_METHOD0(GetDataSize, uint64_t()); MOCK_CONST_METHOD0(GetDataID, uint64_t()); MOCK_CONST_METHOD0(GetSlotId, uint64_t()); @@ -148,11 +149,11 @@ class MockFileProcessor: public FileProcessor { class MockAuthorizationClient: public AuthorizationClient { - public: - Error Authorize(const Request* request, AuthorizationData* data) const override { - return Error{Authorize_t(request, data)}; - } - MOCK_CONST_METHOD2(Authorize_t, ErrorInterface * (const Request*, AuthorizationData* )); + public: + Error Authorize(const Request* request, AuthorizationData* data) const override { + return Error{Authorize_t(request, data)}; + } + MOCK_CONST_METHOD2(Authorize_t, ErrorInterface * (const Request*, AuthorizationData* )); }; diff --git a/receiver/unittests/request_handler/test_authorization_client.cpp b/receiver/unittests/request_handler/test_authorization_client.cpp new file mode 100644 index 0000000000000000000000000000000000000000..92028ca4717b19299646ab4f2091078d1922a84f --- /dev/null +++ b/receiver/unittests/request_handler/test_authorization_client.cpp @@ -0,0 +1,179 @@ +#include <gtest/gtest.h> +#include <gmock/gmock.h> + +#include "asapo/unittests/MockHttpClient.h" +#include "asapo/unittests/MockLogger.h" + +#include "../../src/receiver_error.h" +#include "asapo/common/networking.h" +#include "../mock_receiver_config.h" +#include "asapo/preprocessor/definitions.h" + +#include "../receiver_mocking.h" + +#include "../../src/receiver_config.h" +#include "../../src/request_handler/authorization_client.h" +#include "../../src/receiver_logger.h" + + +using namespace testing; +using namespace asapo; + + +namespace { + +TEST(Authorizer, Constructor) { + AuthorizationClient client; + ASSERT_THAT(dynamic_cast<const asapo::AbstractLogger*>(client.log__), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<asapo::HttpClient*>(client.http_client__.get()), Ne(nullptr)); +} + + +class AuthorizerClientTests : public Test { + public: + AuthorizationClient client; + AuthorizationData expected_auth_data; + MockHttpClient mock_http_client; + std::unique_ptr<MockRequest> mock_request; + ReceiverConfig config; + + NiceMock<asapo::MockLogger> mock_logger; + std::string expected_beamtime_id = "beamtime_id"; + std::string expected_data_source = "source"; + std::string expected_beamline = "beamline"; + std::string expected_beamline_path = "/beamline/p01/current"; + std::string expected_core_path = "/gpfs/blabla"; + std::string expected_producer_uri = "producer_uri"; + std::string expected_authorization_server = "authorizer_host"; + std::string expect_request_string; + std::string expected_source_credentials; + asapo::SourceType expected_source_type = asapo::SourceType::kProcessed; + + std::string expected_source_type_str = "processed"; + std::string expected_access_type_str = "[\"write\"]"; + void SetUp() override { + GenericRequestHeader request_header; + expected_source_credentials = "processed%" + expected_beamtime_id + "%source%token"; + expected_auth_data.source_credentials = expected_source_credentials; + expect_request_string = std::string("{\"SourceCredentials\":\"") + expected_source_credentials + + "\",\"OriginHost\":\"" + + expected_producer_uri + "\"}"; + + mock_request.reset(new MockRequest{request_header, 1, expected_producer_uri, nullptr}); + client.http_client__ = std::unique_ptr<asapo::HttpClient> {&mock_http_client}; + client.log__ = &mock_logger; + config.authorization_server = expected_authorization_server; + config.authorization_interval_ms = 0; + SetReceiverConfig(config, "none"); + } + void TearDown() override { + client.http_client__.release(); + } + void MockAuthRequest(bool error, HttpCode code = HttpCode::OK) { + EXPECT_CALL(*mock_request, + GetOriginUri()).WillOnce(ReturnRef(expected_producer_uri)); + if (error) { + EXPECT_CALL(mock_http_client, + Post_t(expected_authorization_server + "/authorize", _, expect_request_string, _, _)). + WillOnce( + DoAll(SetArgPointee<4>(new asapo::SimpleError("http error")), + Return("") + )); + } else { + EXPECT_CALL(mock_http_client, + Post_t(expected_authorization_server + "/authorize", _, expect_request_string, _, _)). + WillOnce( + DoAll(SetArgPointee<4>(nullptr), + SetArgPointee<3>(code), + Return("{\"beamtimeId\":\"" + expected_beamtime_id + + "\",\"dataSource\":" + "\"" + expected_data_source + + "\",\"beamline-path\":" + "\"" + expected_beamline_path + + "\",\"corePath\":" + "\"" + expected_core_path + + "\",\"source-type\":" + "\"" + expected_source_type_str + + "\",\"beamline\":" + "\"" + expected_beamline + + "\",\"access-types\":" + expected_access_type_str + "}") + )); + } + } +}; + + +TEST_F(AuthorizerClientTests, AuthorizeRequestReturnsInternalerror) { + MockAuthRequest(true); + + auto err = client.Authorize(mock_request.get(), &expected_auth_data); + + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kInternalServerError)); +} + +TEST_F(AuthorizerClientTests, AuthorizeRequestReturns401) { + MockAuthRequest(false, HttpCode::Unauthorized); + + auto err = client.Authorize(mock_request.get(), &expected_auth_data); + + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); +} + + +TEST_F(AuthorizerClientTests, AuthorizeOk) { + MockAuthRequest(false, HttpCode::OK); + + EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("authorized"), + HasSubstr(expected_beamtime_id) + ))); + + auto err = client.Authorize(mock_request.get(), &expected_auth_data); + + ASSERT_THAT(err, Eq(nullptr)); + ASSERT_THAT(expected_auth_data.data_source, Eq(expected_data_source)); + ASSERT_THAT(expected_auth_data.source_type, Eq(expected_source_type)); + ASSERT_THAT(expected_auth_data.beamline, Eq(expected_beamline)); + ASSERT_THAT(expected_auth_data.beamtime_id, Eq(expected_beamtime_id)); + ASSERT_THAT(expected_auth_data.offline_path, Eq(expected_core_path)); + ASSERT_THAT(expected_auth_data.online_path, Eq(expected_beamline_path)); + ASSERT_THAT(expected_auth_data.last_update, Gt(std::chrono::system_clock::time_point{})); + ASSERT_THAT(expected_auth_data.source_credentials, Eq(expected_source_credentials)); + +} + +TEST_F(AuthorizerClientTests, AuthorizeFailsOnWrongAccessType) { + expected_access_type_str = "[\"read\"]"; + MockAuthRequest(false, HttpCode::OK); + + auto err = client.Authorize(mock_request.get(), &expected_auth_data); + + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); +} + +TEST_F(AuthorizerClientTests, AuthorizeFailsOnWrongAccessTypeForRaw) { + expected_access_type_str = "[\"write\"]"; + expected_source_type_str = "raw"; + MockAuthRequest(false, HttpCode::OK); + + auto err = client.Authorize(mock_request.get(), &expected_auth_data); + + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); +} + +TEST_F(AuthorizerClientTests, AuthorizeFailsOnWrongAccessTypeForProcessed) { + expected_access_type_str = "[\"writeraw\"]"; + expected_source_type_str = "processed"; + MockAuthRequest(false, HttpCode::OK); + + auto err = client.Authorize(mock_request.get(), &expected_auth_data); + + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); +} + +TEST_F(AuthorizerClientTests, AuthorizeOkForRaw) { + expected_access_type_str = "[\"writeraw\"]"; + expected_source_type_str = "raw"; + expected_source_type = asapo::SourceType::kRaw; + MockAuthRequest(false, HttpCode::OK); + + auto err = client.Authorize(mock_request.get(), &expected_auth_data); + + ASSERT_THAT(err, Eq(nullptr)); +} + +} diff --git a/receiver/unittests/request_handler/test_request_factory.cpp b/receiver/unittests/request_handler/test_request_factory.cpp index c82869d432de679312e86a1d20c955e717df0b82..f2c6179a22a17ad97f823dc5fa11747ea9c5cf06 100644 --- a/receiver/unittests/request_handler/test_request_factory.cpp +++ b/receiver/unittests/request_handler/test_request_factory.cpp @@ -54,7 +54,8 @@ TEST_F(FactoryTests, ReturnsDataRequestOnkNetOpcodeSendCode) { ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(dynamic_cast<asapo::Request*>(request.get()), Ne(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(5)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveMetaData*>(request->GetListHandlers()[1]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveData*>(request->GetListHandlers()[2]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerFileProcess*>(request->GetListHandlers()[3]), Ne(nullptr)); @@ -74,7 +75,8 @@ TEST_F(FactoryTests, ReturnsDataRequestOnkNetOpcodeSendCodeLargeFile) { ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(dynamic_cast<asapo::Request*>(request.get()), Ne(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(4)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveMetaData*>(request->GetListHandlers()[1]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerFileProcess*>(request->GetListHandlers()[2]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerDbWrite*>(request->GetListHandlers().back()), Ne(nullptr)); @@ -97,7 +99,8 @@ TEST_F(FactoryTests, DoNotAddDiskAndDbWriterIfNotWantedInRequest) { auto request = factory.GenerateRequest(generic_request_header, 1, origin_uri, &err); ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(3)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); } TEST_F(FactoryTests, DoNotAddDbWriterIfNotWanted) { @@ -109,7 +112,8 @@ TEST_F(FactoryTests, DoNotAddDbWriterIfNotWanted) { auto request = factory.GenerateRequest(generic_request_header, 1, origin_uri, &err); ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(4)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveMetaData*>(request->GetListHandlers()[1]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveData*>(request->GetListHandlers()[2]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerFileProcess*>(request->GetListHandlers()[3]), Ne(nullptr)); @@ -131,7 +135,8 @@ TEST_F(FactoryTests, ReturnsMetaDataRequestOnTransferMetaDataOnly) { ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(dynamic_cast<asapo::Request*>(request.get()), Ne(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(4)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveMetaData*>(request->GetListHandlers()[1]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveData*>(request->GetListHandlers()[2]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerDbWrite*>(request->GetListHandlers()[3]), Ne(nullptr)); @@ -146,7 +151,8 @@ TEST_F(FactoryTests, ReturnsMetaDataRequestOnkOpcodeTransferMetaData) { ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(dynamic_cast<asapo::Request*>(request.get()), Ne(nullptr)); ASSERT_THAT(dynamic_cast<asapo::Request*>(request->cache__), Eq(nullptr)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveData*>(request->GetListHandlers()[1]), Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerDbMetaWrite*>(request->GetListHandlers().back()), Ne(nullptr)); } @@ -169,7 +175,8 @@ TEST_F(FactoryTests, StreamInfoRequest) { auto request = factory.GenerateRequest(generic_request_header, 1, origin_uri, &err); ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(2)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerDbStreamInfo*>(request->GetListHandlers()[1]), Ne(nullptr)); } @@ -178,7 +185,8 @@ TEST_F(FactoryTests, LastStreamRequest) { auto request = factory.GenerateRequest(generic_request_header, 1, origin_uri, &err); ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(2)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerDbLastStream*>(request->GetListHandlers()[1]), Ne(nullptr)); } @@ -187,7 +195,8 @@ TEST_F(FactoryTests, DeleteStreamRequest) { auto request = factory.GenerateRequest(generic_request_header, 1, origin_uri, &err); ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(2)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerDbDeleteStream*>(request->GetListHandlers()[1]), Ne(nullptr)); } @@ -196,7 +205,8 @@ TEST_F(FactoryTests, GetMetamRequest) { auto request = factory.GenerateRequest(generic_request_header, 1, origin_uri, &err); ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(request->GetListHandlers().size(), Eq(2)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerSecondaryAuthorization*>(request->GetListHandlers()[0]), + Ne(nullptr)); ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerDbGetMeta*>(request->GetListHandlers()[1]), Ne(nullptr)); } diff --git a/receiver/unittests/request_handler/test_request_handler_authorizer.cpp b/receiver/unittests/request_handler/test_request_handler_authorizer.cpp deleted file mode 100644 index 0e6d1f7f36629b89bc4b26fb6808145655ebf3d3..0000000000000000000000000000000000000000 --- a/receiver/unittests/request_handler/test_request_handler_authorizer.cpp +++ /dev/null @@ -1,342 +0,0 @@ -#include <gtest/gtest.h> -#include <gmock/gmock.h> - -#include "asapo/unittests/MockHttpClient.h" -#include "asapo/unittests/MockLogger.h" - -#include "../../src/receiver_error.h" -#include "../../src/request.h" -#include "../../src/request_handler/request_handler.h" -#include "../../src/request_handler/request_handler_authorize.h" -#include "asapo/common/networking.h" -#include "../mock_receiver_config.h" -#include "asapo/preprocessor/definitions.h" - -#include "../receiver_mocking.h" - -#include "../../src/receiver_config.h" - - -using ::testing::Test; -using ::testing::Return; -using ::testing::ReturnRef; -using ::testing::_; -using ::testing::DoAll; -using ::testing::SetArgReferee; -using ::testing::Gt; -using ::testing::Eq; -using ::testing::Ne; -using ::testing::Mock; -using ::testing::NiceMock; -using ::testing::InSequence; -using ::testing::SetArgPointee; -using ::testing::AllOf; -using ::testing::HasSubstr; - -using asapo::MockRequest; -using ::asapo::Error; -using ::asapo::ErrorInterface; -using ::asapo::FileDescriptor; -using ::asapo::SocketDescriptor; -using ::asapo::MockHttpClient; -using asapo::Request; -using asapo::RequestHandlerAuthorize; -using ::asapo::GenericRequestHeader; -using asapo::ReceiverConfig; -using asapo::SetReceiverConfig; -using asapo::HttpCode; - -namespace { - -/* -TEST(Authorizer, Constructor) { - RequestHandlerAuthorize handler; -// ASSERT_THAT(dynamic_cast<asapo::HttpClient*>(handler.http_client__.get()), Ne(nullptr)); - ASSERT_THAT(dynamic_cast<const asapo::AbstractLogger*>(handler.log__), Ne(nullptr)); -} - - -class AuthorizerHandlerTests : public Test { - public: - RequestHandlerAuthorize handler; - MockHttpClient mock_http_client; - std::unique_ptr<MockRequest> mock_request; - ReceiverConfig config; - - NiceMock<asapo::MockLogger> mock_logger; - std::string expected_beamtime_id = "beamtime_id"; - std::string expected_data_source = "source"; - std::string expected_beamline = "beamline"; - std::string expected_beamline_path = "/beamline/p01/current"; - std::string expected_core_path = "/gpfs/blabla"; - std::string expected_producer_uri = "producer_uri"; - std::string expected_authorization_server = "authorizer_host"; - std::string expect_request_string; - std::string expected_source_credentials; - std::string expected_api_version = "v0.1"; - - asapo::SourceType expected_source_type = asapo::SourceType::kProcessed; - std::string expected_source_type_str = "processed"; - std::string expected_access_type_str = "[\"write\"]"; - void MockRequestData(); - void SetUp() override { - GenericRequestHeader request_header; - expected_source_credentials = "processed%" + expected_beamtime_id + "%source%token"; - expect_request_string = std::string("{\"SourceCredentials\":\"") + expected_source_credentials + - "\",\"OriginHost\":\"" + - expected_producer_uri + "\"}"; - - mock_request.reset(new MockRequest{request_header, 1, expected_producer_uri, nullptr}); - handler.http_client__ = std::unique_ptr<asapo::HttpClient> {&mock_http_client}; - handler.log__ = &mock_logger; - config.authorization_server = expected_authorization_server; - config.authorization_interval_ms = 0; - SetReceiverConfig(config, "none"); - } - void TearDown() override { - handler.http_client__.release(); - } - void MockAuthRequest(bool error, HttpCode code = HttpCode::OK, bool opError = false) { - if (error) { - EXPECT_CALL(mock_http_client, Post_t(expected_authorization_server + "/authorize", _, expect_request_string, _, _)). - WillOnce( - DoAll(SetArgPointee<4>(new asapo::SimpleError("http error")), - Return("") - )); - EXPECT_CALL(mock_logger, Error(AllOf(HasSubstr("failure authorizing"), - HasSubstr("http error"), - HasSubstr(expected_beamtime_id), - HasSubstr(expected_producer_uri), - HasSubstr(expected_authorization_server)))); - - } else { - EXPECT_CALL(mock_http_client, Post_t(expected_authorization_server + "/authorize", _, expect_request_string, _, _)). - WillOnce( - DoAll(SetArgPointee<4>(nullptr), - SetArgPointee<3>(code), - Return("{\"beamtimeId\":\"" + expected_beamtime_id + - "\",\"dataSource\":" + "\"" + expected_data_source + - "\",\"beamline-path\":" + "\"" + expected_beamline_path + - "\",\"corePath\":" + "\"" + expected_core_path + - "\",\"source-type\":" + "\"" + expected_source_type_str + - "\",\"beamline\":" + "\"" + expected_beamline + - "\",\"access-types\":" + expected_access_type_str + "}") - )); - if (code != HttpCode::OK) { - EXPECT_CALL(mock_logger, Error(AllOf(HasSubstr("failure authorizing"), - HasSubstr(expected_source_type_str), - HasSubstr(expected_beamtime_id), - HasSubstr(expected_data_source), - HasSubstr(expected_producer_uri), - HasSubstr(expected_authorization_server)))); - } else if (!opError) { - EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("authorized"), - HasSubstr(expected_beamtime_id), -// HasSubstr(expected_beamline), -// HasSubstr(expected_source_type_str), - HasSubstr(expected_data_source), - HasSubstr(expected_producer_uri)))); - } - } - } - Error MockFirstAuthorization(bool error, HttpCode code = HttpCode::OK, bool opError = false) { - - if (!error && code == HttpCode::OK && !opError) { - EXPECT_CALL(*mock_request, SetBeamtimeId(expected_beamtime_id)); - EXPECT_CALL(*mock_request, SetDataSource(expected_data_source)); - EXPECT_CALL(*mock_request, SetOfflinePath(expected_core_path)); - EXPECT_CALL(*mock_request, SetOnlinePath(expected_beamline_path)); - EXPECT_CALL(*mock_request, SetBeamline(expected_beamline)); - EXPECT_CALL(*mock_request, SetSourceType(expected_source_type)); - } - - EXPECT_CALL(*mock_request, GetOpCode()) - .WillRepeatedly(Return(asapo::kOpcodeAuthorize)) - ; - EXPECT_CALL(*mock_request, GetMetaData()) - .WillOnce(ReturnRef(expected_source_credentials)) - ; - - EXPECT_CALL(*mock_request, GetApiVersion()) - .WillOnce(Return(expected_api_version)) - ; - - EXPECT_CALL(*mock_request, GetDataSource()) - .WillRepeatedly(ReturnRef(expected_data_source)) - ; - - EXPECT_CALL(*mock_request, GetStream()) - .WillRepeatedly(Return("stream")) - ; - - EXPECT_CALL(*mock_request, GetBeamtimeId()) - .WillRepeatedly(ReturnRef(expected_beamtime_id)) - ; - - MockAuthRequest(error, code, opError); - return handler.ProcessRequest(mock_request.get()); - } - Error MockRequestAuthorization(bool error, HttpCode code = HttpCode::OK, bool set_request = true) { - EXPECT_CALL(*mock_request, GetOpCode()) - .WillRepeatedly(Return(asapo::kOpcodeTransferData)) - ; - - if (!error && code == HttpCode::OK && set_request) { - EXPECT_CALL(*mock_request, SetBeamtimeId(expected_beamtime_id)); - EXPECT_CALL(*mock_request, SetDataSource(expected_data_source)); - EXPECT_CALL(*mock_request, SetOfflinePath(expected_core_path)); - EXPECT_CALL(*mock_request, SetOnlinePath(expected_beamline_path)); - EXPECT_CALL(*mock_request, SetBeamline(expected_beamline)); - EXPECT_CALL(*mock_request, SetSourceType(expected_source_type)); - } - - MockAuthRequest(error, code); - return handler.ProcessRequest(mock_request.get()); - } - -}; - -TEST_F(AuthorizerHandlerTests, CheckStatisticEntity) { - auto entity = handler.GetStatisticEntity(); - ASSERT_THAT(entity, Eq(asapo::StatisticEntity::kNetwork)); -} - -TEST_F(AuthorizerHandlerTests, ErrorNotAuthorizedYet) { - EXPECT_CALL(*mock_request, GetOpCode()) - .WillOnce(Return(asapo::kOpcodeTransferData)) - ; - - auto err = handler.ProcessRequest(mock_request.get()); - - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); -} - -TEST_F(AuthorizerHandlerTests, ErrorProcessingAuthorizeRequest) { - - auto err = MockFirstAuthorization(true); - - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kInternalServerError)); -} - - -TEST_F(AuthorizerHandlerTests, AuthorizeRequestreturns401) { - - auto err = MockFirstAuthorization(false, HttpCode::Unauthorized); - - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); -} - - -TEST_F(AuthorizerHandlerTests, AuthorizeOk) { - auto err = MockFirstAuthorization(false); - - ASSERT_THAT(err, Eq(nullptr)); -} - - -TEST_F(AuthorizerHandlerTests, AuthorizeFailsOnWrongAccessType) { - expected_access_type_str = "[\"read\"]"; - auto err = MockFirstAuthorization(false, HttpCode::OK, true); - - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); -} - -TEST_F(AuthorizerHandlerTests, AuthorizeFailsOnWrongAccessTypeForRaw) { - expected_access_type_str = "[\"write\"]"; - expected_source_type_str = "raw"; - auto err = MockFirstAuthorization(false, HttpCode::OK, true); - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); -} - -TEST_F(AuthorizerHandlerTests, AuthorizeFailsOnWrongAccessTypeForProcessed) { - expected_access_type_str = "[\"writeraw\"]"; - expected_source_type_str = "processed"; - auto err = MockFirstAuthorization(false, HttpCode::OK, true); - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); -} - -TEST_F(AuthorizerHandlerTests, AuthorizeOkForRaw) { - expected_access_type_str = "[\"writeraw\"]"; - expected_source_type_str = "raw"; - expected_source_type = asapo::SourceType::kRaw; - auto err = MockFirstAuthorization(false, HttpCode::OK, false); - ASSERT_THAT(err, Eq(nullptr)); -} - -TEST_F(AuthorizerHandlerTests, ErrorOnSecondAuthorize) { - MockFirstAuthorization(false); - EXPECT_CALL(*mock_request, GetOpCode()) - .WillOnce(Return(asapo::kOpcodeAuthorize)); - - auto err = handler.ProcessRequest(mock_request.get()); - - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); -} - -TEST_F(AuthorizerHandlerTests, ErrorOnDataTransferRequestAuthorize) { - MockFirstAuthorization(false); - - auto err = MockRequestAuthorization(true); - - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kInternalServerError)); -} - - -TEST_F(AuthorizerHandlerTests, DataTransferRequestAuthorizeReturns401) { - MockFirstAuthorization(false); - - auto err = MockRequestAuthorization(false, HttpCode::Unauthorized); - - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kReAuthorizationFailure)); -} - -TEST_F(AuthorizerHandlerTests, DataTransferRequestAuthorizeReturnsSameBeamtimeId) { - MockFirstAuthorization(false); - auto err = MockRequestAuthorization(false); - - ASSERT_THAT(err, Eq(nullptr)); -} - -TEST_F(AuthorizerHandlerTests, RequestAuthorizeReturnsDifferentBeamtimeId) { - MockFirstAuthorization(false); - expected_beamtime_id = "different_id"; - - auto err = MockRequestAuthorization(false, HttpCode::OK, false); - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kReAuthorizationFailure)); -} - - -TEST_F(AuthorizerHandlerTests, RequestFromUnsupportedClient) { - EXPECT_CALL(*mock_request, GetOpCode()) - .WillOnce(Return(asapo::kOpcodeAuthorize)) - ; - EXPECT_CALL(*mock_request, GetApiVersion()) - .WillOnce(Return("v1000.2")) - ; - - auto err = handler.ProcessRequest(mock_request.get()); - ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kUnsupportedClient)); -} - -TEST_F(AuthorizerHandlerTests, DataTransferRequestAuthorizeUsesCachedValue) { - config.authorization_interval_ms = 10000; - SetReceiverConfig(config, "none"); - MockFirstAuthorization(false); - EXPECT_CALL(*mock_request, GetOpCode()) - .WillOnce(Return(asapo::kOpcodeTransferData)); - EXPECT_CALL(mock_http_client, Post_t(_, _, _, _, _)).Times(0); - EXPECT_CALL(*mock_request, SetBeamtimeId(expected_beamtime_id)); - EXPECT_CALL(*mock_request, SetBeamline(expected_beamline)); - EXPECT_CALL(*mock_request, SetDataSource(expected_data_source)); - EXPECT_CALL(*mock_request, SetOnlinePath(expected_beamline_path)); - EXPECT_CALL(*mock_request, SetOfflinePath(expected_core_path)); - EXPECT_CALL(*mock_request, SetSourceType(expected_source_type)); - auto err = handler.ProcessRequest(mock_request.get()); - - ASSERT_THAT(err, Eq(nullptr)); -} - - -*/ - -} diff --git a/receiver/unittests/request_handler/test_request_handler_initial_authorization.cpp b/receiver/unittests/request_handler/test_request_handler_initial_authorization.cpp index 26d1e3d2afad81321fdcf3a9de91821afe5ea36b..f135251a54696206a437d5aeee3f983453dc1dc0 100644 --- a/receiver/unittests/request_handler/test_request_handler_initial_authorization.cpp +++ b/receiver/unittests/request_handler/test_request_handler_initial_authorization.cpp @@ -1,55 +1,45 @@ #include <gtest/gtest.h> #include <gmock/gmock.h> -#include "asapo/unittests/MockLogger.h" #include "asapo/common/internal/version.h" #include "asapo/common/networking.h" #include "../../src/request_handler/request_handler_initial_authorization.h" #include "../../src/request.h" #include "../receiver_mocking.h" -#include "../../src/receiver_logger.h" using namespace testing; using namespace asapo; namespace { -TEST(Authorizer, Constructor) { - AuthorizationData data; - RequestHandlerInitialAuthorization handler{&data}; - ASSERT_THAT(dynamic_cast<const asapo::AbstractLogger *>(handler.log__), Ne(nullptr)); -} - class InitialAuthorizationHandlerTests : public Test { - public: - AuthorizationData auth_data; - AuthorizationData *expected_auth_data{&auth_data}; - RequestHandlerInitialAuthorization handler{&auth_data}; - asapo::MockAuthorizationClient mock_authorization_client; - std::unique_ptr<MockRequest> mock_request; - - NiceMock<asapo::MockLogger> mock_logger; - std::string expected_source_credentials = "source_creds"; - - void SetUp() override { - GenericRequestHeader request_header; - mock_request.reset(new MockRequest{request_header, 1, "", nullptr}); - handler.auth_client__ = std::unique_ptr<asapo::AuthorizationClient>{&mock_authorization_client}; - handler.log__ = &mock_logger; - } - void ExpectAuthMocks() { - EXPECT_CALL(*mock_request,GetApiVersion()).WillRepeatedly(Return(asapo::GetReceiverApiVersion())); - EXPECT_CALL(*mock_request, GetMetaData()) - .WillOnce(ReturnRef(expected_source_credentials)) - ; - EXPECT_CALL(mock_authorization_client, - Authorize_t(mock_request.get(), expected_auth_data)).WillOnce(Return(nullptr)); - ; - } - void TearDown() override { - handler.auth_client__.release(); - } + public: + AuthorizationData auth_data; + AuthorizationData* expected_auth_data{&auth_data}; + RequestHandlerInitialAuthorization handler{&auth_data}; + asapo::MockAuthorizationClient mock_authorization_client; + std::unique_ptr<MockRequest> mock_request; + + std::string expected_source_credentials = "source_creds"; + + void SetUp() override { + GenericRequestHeader request_header; + mock_request.reset(new MockRequest{request_header, 1, "", nullptr}); + handler.auth_client__ = std::unique_ptr<asapo::AuthorizationClient> {&mock_authorization_client}; + } + void ExpectAuthMocks() { + EXPECT_CALL(*mock_request, GetApiVersion()).WillRepeatedly(Return(asapo::GetReceiverApiVersion())); + EXPECT_CALL(*mock_request, GetMetaData()) + .WillOnce(ReturnRef(expected_source_credentials)) + ; + EXPECT_CALL(mock_authorization_client, + Authorize_t(mock_request.get(), expected_auth_data)).WillOnce(Return(nullptr)); + ; + } + void TearDown() override { + handler.auth_client__.release(); + } }; TEST_F(InitialAuthorizationHandlerTests, AuthorizeOk) { @@ -72,10 +62,16 @@ TEST_F(InitialAuthorizationHandlerTests, ErrorOnSecondAuthorize) { TEST_F(InitialAuthorizationHandlerTests, RequestFromUnsupportedClient) { EXPECT_CALL(*mock_request, GetApiVersion()) - .WillOnce(Return("v1000.2")); + .WillOnce(Return("v1000.2")); auto err = handler.ProcessRequest(mock_request.get()); ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kUnsupportedClient)); } +TEST_F(InitialAuthorizationHandlerTests, CheckStatisticEntity) { + auto entity = handler.GetStatisticEntity(); + ASSERT_THAT(entity, Eq(asapo::StatisticEntity::kNetwork)); +} + + } diff --git a/receiver/unittests/request_handler/test_request_handler_secondary_authorization.cpp b/receiver/unittests/request_handler/test_request_handler_secondary_authorization.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7cdafb0bb4ac894a31d98e390eea9f8d32cd5396 --- /dev/null +++ b/receiver/unittests/request_handler/test_request_handler_secondary_authorization.cpp @@ -0,0 +1,141 @@ +#include <gtest/gtest.h> +#include <gmock/gmock.h> + +#include <chrono> + +#include "asapo/common/internal/version.h" +#include "asapo/common/networking.h" +#include "asapo/common/data_structs.h" + + +#include "../../src/request_handler/request_handler_secondary_authorization.h" +#include "../../src/request.h" +#include "../receiver_mocking.h" +#include "../mock_receiver_config.h" +#include "../../src/receiver_config.h" + +using namespace testing; +using namespace asapo; + +namespace { + +class SecondaryAuthorizationHandlerTests : public Test { + public: + AuthorizationData auth_data; + ReceiverConfig config; + AuthorizationData* expected_auth_data{&auth_data}; + RequestHandlerSecondaryAuthorization handler{&auth_data}; + asapo::MockAuthorizationClient mock_authorization_client; + std::unique_ptr<NiceMock<MockRequest>> mock_request; + + std::string expected_source_credentials = "source_creds"; + std::string expected_beamtime_id = "expected_beamtime"; + std::string expected_beamline = "expected_beamline"; + std::string expected_data_source = "expected_data_source"; + std::string expected_beamline_path = "expected_beamline_path"; + std::string expected_core_path = "expected_core_path"; + SourceType expected_source_type = SourceType::kProcessed; + + void SetUp() override { + auth_data.data_source = expected_data_source; + auth_data.source_credentials = expected_data_source; + auth_data.source_type = expected_source_type; + auth_data.beamtime_id = expected_beamtime_id; + auth_data.last_update = std::chrono::system_clock::now(); + auth_data.online_path = expected_beamline_path; + auth_data.offline_path = expected_core_path; + auth_data.beamline = expected_beamline; + + auth_data.source_credentials = expected_source_credentials; + GenericRequestHeader request_header; + mock_request.reset(new NiceMock<MockRequest> {request_header, 1, "", nullptr}); + handler.auth_client__ = std::unique_ptr<asapo::AuthorizationClient> {&mock_authorization_client}; + config.authorization_interval_ms = 10000; + SetReceiverConfig(config, "none"); + ON_CALL(*mock_request, GetApiVersion()).WillByDefault(Return(asapo::GetReceiverApiVersion())); + } + void ExpectAuth(); + void ExpectSetRequest() { + EXPECT_CALL(*mock_request, SetBeamtimeId(expected_beamtime_id)); + EXPECT_CALL(*mock_request, SetBeamline(expected_beamline)); + EXPECT_CALL(*mock_request, SetDataSource(expected_data_source)); + EXPECT_CALL(*mock_request, SetOnlinePath(expected_beamline_path)); + EXPECT_CALL(*mock_request, SetOfflinePath(expected_core_path)); + EXPECT_CALL(*mock_request, SetSourceType(expected_source_type)); + } + void TearDown() override { + handler.auth_client__.release(); + } +}; + +ACTION_P(A_WriteCache, beamtime_id) { + ((AuthorizationData*)arg1)->beamtime_id = static_cast<std::string>(beamtime_id); +} + +void SecondaryAuthorizationHandlerTests::ExpectAuth() { + EXPECT_CALL(mock_authorization_client, + Authorize_t(mock_request.get(), expected_auth_data)).WillOnce(DoAll( + A_WriteCache(expected_beamtime_id), + Return(nullptr) + )); +} + + +TEST_F(SecondaryAuthorizationHandlerTests, AuthorizeWithCacheOk) { + ExpectSetRequest(); + + auto err = handler.ProcessRequest(mock_request.get()); + ASSERT_THAT(err, Eq(nullptr)); + ASSERT_THAT(expected_auth_data->source_credentials, Eq(expected_source_credentials)); + ASSERT_THAT(expected_auth_data->beamtime_id, Eq(expected_beamtime_id)); +} + +TEST_F(SecondaryAuthorizationHandlerTests, ReauthorizeOk) { + ExpectAuth(); + ExpectSetRequest(); + auth_data.last_update = std::chrono::system_clock::time_point{}; + + auto err = handler.ProcessRequest(mock_request.get()); + ASSERT_THAT(err, Eq(nullptr)); + ASSERT_THAT(expected_auth_data->source_credentials, Eq(expected_source_credentials)); + ASSERT_THAT(expected_auth_data->beamtime_id, Eq(expected_beamtime_id)); +} + +TEST_F(SecondaryAuthorizationHandlerTests, ReauthorizeWrongBeamtime) { + expected_beamtime_id = "new_beamtime"; + ExpectAuth(); + auth_data.last_update = std::chrono::system_clock::time_point{}; + + auto err = handler.ProcessRequest(mock_request.get()); + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kReAuthorizationFailure)); + ASSERT_THAT(expected_auth_data->source_credentials, Eq("")); +} + +TEST_F(SecondaryAuthorizationHandlerTests, ReauthorizeWithAutherror) { + EXPECT_CALL(mock_authorization_client, Authorize_t(_, _)).WillOnce(Return( + ReceiverErrorTemplates::kAuthorizationFailure.Generate().release())); + auth_data.last_update = std::chrono::system_clock::time_point{}; + + auto err = handler.ProcessRequest(mock_request.get()); + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kReAuthorizationFailure)); + ASSERT_THAT(expected_auth_data->source_credentials, Eq("")); +} + + +TEST_F(SecondaryAuthorizationHandlerTests, ErrorOnEmptyCache) { + auth_data.source_credentials = ""; + + auto err = handler.ProcessRequest(mock_request.get()); + + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); +} + +TEST_F(SecondaryAuthorizationHandlerTests, RequestFromUnsupportedClient) { + EXPECT_CALL(*mock_request, GetApiVersion()) + .WillOnce(Return("v1000.2")); + + auto err = handler.ProcessRequest(mock_request.get()); + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kUnsupportedClient)); +} + +}