diff --git a/receiver/src/request_handler/request_factory.cpp b/receiver/src/request_handler/request_factory.cpp index fdacdd94a3c4eed52152fddc0489786f85b76818..de3f74cec40946b86836c391a28e85001bef8320 100644 --- a/receiver/src/request_handler/request_factory.cpp +++ b/receiver/src/request_handler/request_factory.cpp @@ -47,7 +47,9 @@ Error RequestFactory::AddReceiveDirectToFileHandler(std::unique_ptr<Request> &re Error RequestFactory::AddHandlersToRequest(std::unique_ptr<Request> &request, const GenericRequestHeader &request_header) const { - request->AddHandler(&request_handler_authorize_); + if (request_header.op_code != Opcode::kOpcodeAuthorize) { + request->AddHandler(&request_handler_authorize_); + } switch (request_header.op_code) { case Opcode::kOpcodeTransferData: @@ -73,7 +75,8 @@ Error RequestFactory::AddHandlersToRequest(std::unique_ptr<Request> &request, break; } case Opcode::kOpcodeAuthorize: { - // do nothing + request->AddHandler(&request_handler_receive_metadata_); + request->AddHandler(&request_handler_authorize_); break; } case Opcode::kOpcodeStreamInfo: { diff --git a/receiver/src/request_handler/request_handler_authorize.cpp b/receiver/src/request_handler/request_handler_authorize.cpp index f13fc1ae28a41cedcd44ba348544e4c1e6c9d4fa..9904d5844bc5dd2a7ad02c4831a1b18d8d878b59 100644 --- a/receiver/src/request_handler/request_handler_authorize.cpp +++ b/receiver/src/request_handler/request_handler_authorize.cpp @@ -26,6 +26,14 @@ Error RequestHandlerAuthorize::ErrorFromAuthorizationServerResponse(const Error& } } +Error CheckAccessType(const std::string& access_type) { + if (access_type!="write") { + return asapo::ReceiverErrorTemplates::kAuthorizationFailure.Generate("wrong access type " + access_type); + } + return nullptr; +} + + Error RequestHandlerAuthorize::Authorize(Request* request, const char* source_credentials) const { HttpCode code; Error err; @@ -42,6 +50,7 @@ Error RequestHandlerAuthorize::Authorize(Request* request, const char* source_cr } std::string stype; + std::string access_type; JsonStringParser parser{response}; (err = parser.GetString("beamtimeId", &beamtime_id_)) || @@ -49,15 +58,24 @@ Error RequestHandlerAuthorize::Authorize(Request* request, const char* source_cr (err = parser.GetString("core-path", &offline_path_)) || (err = parser.GetString("beamline-path", &online_path_)) || (err = parser.GetString("source-type", &stype)) || + (err = parser.GetString("access-type", &access_type)) || (err = GetSourceTypeFromString(stype, &source_type_)) || (err = parser.GetString("beamline", &beamline_)); if (err) { return ErrorFromAuthorizationServerResponse(err, code); - } else { - log__->Debug(std::string("authorized connection from ") + request->GetOriginUri() +"source type: "+stype+ " beamline: " + - beamline_ + ", beamtime id: " + beamtime_id_ + ", data soucre: " + data_source_); } + err = CheckAccessType(access_type); + if (err) { + log__->Error("failure authorizing at " + GetReceiverConfig()->authorization_server + " request: " + request_string + + " - " + + err->Explain()); + return err; + } + + log__->Debug(std::string("authorized connection from ") + request->GetOriginUri() +"source type: "+stype+ " beamline: " + + beamline_ + ", beamtime id: " + beamtime_id_ + ", data soucre: " + data_source_); + last_updated_ = system_clock::now(); cached_source_credentials_ = source_credentials; @@ -73,7 +91,7 @@ Error RequestHandlerAuthorize::ProcessAuthorizationRequest(Request* request) con return auth_error; } - return Authorize(request, request->GetMessage()); + return Authorize(request, request->GetMetaData().c_str()); } Error RequestHandlerAuthorize::ProcessReAuthorization(Request* request) const { diff --git a/receiver/unittests/request_handler/test_request_factory.cpp b/receiver/unittests/request_handler/test_request_factory.cpp index 5f224d3d01135bacd0906518eccd10ba51c7aa72..a6c1d02b6c6479928f8b625d96fdcd1ba73a331b 100644 --- a/receiver/unittests/request_handler/test_request_factory.cpp +++ b/receiver/unittests/request_handler/test_request_factory.cpp @@ -121,7 +121,8 @@ TEST_F(FactoryTests, ReturnsDataRequestForAuthorizationCode) { ASSERT_THAT(err, Eq(nullptr)); ASSERT_THAT(dynamic_cast<asapo::Request*>(request.get()), Ne(nullptr)); - ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerAuthorize*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerReceiveMetaData*>(request->GetListHandlers()[0]), Ne(nullptr)); + ASSERT_THAT(dynamic_cast<const asapo::RequestHandlerAuthorize*>(request->GetListHandlers()[1]), Ne(nullptr)); } TEST_F(FactoryTests, DoNotAddDiskAndDbWriterIfNotWantedInRequest) { diff --git a/receiver/unittests/request_handler/test_request_handler_authorizer.cpp b/receiver/unittests/request_handler/test_request_handler_authorizer.cpp index c1e5a97410fb279f029ee9a3447c67ba4abce3a2..e85038de4c1cf9dbb23e6e4d336179840b7bf959 100644 --- a/receiver/unittests/request_handler/test_request_handler_authorizer.cpp +++ b/receiver/unittests/request_handler/test_request_handler_authorizer.cpp @@ -74,6 +74,7 @@ class AuthorizerHandlerTests : public Test { 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 MockRequestData(); void SetUp() override { GenericRequestHeader request_header; @@ -115,7 +116,8 @@ class AuthorizerHandlerTests : public Test { "\",\"beamline-path\":" + "\"" + expected_beamline_path + "\",\"core-path\":" + "\"" + expected_core_path + "\",\"source-type\":" + "\"" + expected_source_type_str + - "\",\"beamline\":" + "\"" + expected_beamline + "\"}") + "\",\"beamline\":" + "\"" + expected_beamline + + "\",\"access-type\":" + "\"" + expected_access_type_str + "\"}") )); if (code != HttpCode::OK) { EXPECT_CALL(mock_logger, Error(AllOf(HasSubstr("failure authorizing"), @@ -126,13 +128,16 @@ class AuthorizerHandlerTests : public Test { HasSubstr(expected_data_source), HasSubstr(expected_producer_uri), HasSubstr(expected_authorization_server)))); - } else { + } else if (expected_access_type_str=="write") { 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)))); + } else { + EXPECT_CALL(mock_logger, Error(AllOf(HasSubstr(expected_access_type_str), + HasSubstr(expected_access_type_str)))); } } @@ -142,8 +147,8 @@ class AuthorizerHandlerTests : public Test { EXPECT_CALL(*mock_request, GetOpCode()) .WillOnce(Return(asapo::kOpcodeAuthorize)) ; - EXPECT_CALL(*mock_request, GetMessage()) - .WillOnce(Return(expected_source_credentials.c_str())) + EXPECT_CALL(*mock_request, GetMetaData()) + .WillOnce(ReturnRef(expected_source_credentials)) ; MockAuthRequest(error, code); @@ -206,6 +211,14 @@ TEST_F(AuthorizerHandlerTests, AuthorizeOk) { ASSERT_THAT(err, Eq(nullptr)); } + +TEST_F(AuthorizerHandlerTests, AuthorizeFailsOnWrongAccessType) { + expected_access_type_str = "read"; + auto err = MockFirstAuthorization(false); + + ASSERT_THAT(err, Eq(asapo::ReceiverErrorTemplates::kAuthorizationFailure)); +} + TEST_F(AuthorizerHandlerTests, ErrorOnSecondAuthorize) { MockFirstAuthorization(false); EXPECT_CALL(*mock_request, GetOpCode())