From 6566b149fe740e5f4347da1df4c579bbfb1979ce Mon Sep 17 00:00:00 2001 From: Lukasz Wojciechowski Date: Sat, 6 Dec 2014 00:37:20 +0100 Subject: [PATCH] Respond to AdminCheckRequest with AdminCheckResponse Change implementation of both service and admin library Logic layers so they use AdminCheckResponse instead of CheckResponse as a reply for AdminCheckRequest. This change allows passing additional information about existence or vacancy of start bucket given in AdminCheckRequest. In case of vacancy of such bucket in cynara database cynara-admin library returns CYNARA_API_BUCKET_NOT_FOUND from cynara_admin_check() function. This fixes also a bug that was hidden in service Logic. Passing unexisting bucket causes cynara service to stop because of an unhandled exception. Change-Id: Ibf65a69c35ba92ea62bee91a67f43975b97052ca --- src/admin/logic/Logic.cpp | 24 +++++++++++++++--------- src/common/protocol/ProtocolAdmin.cpp | 34 ---------------------------------- src/common/protocol/ProtocolAdmin.h | 2 -- src/service/logic/Logic.cpp | 13 ++++++++++--- 4 files changed, 25 insertions(+), 48 deletions(-) diff --git a/src/admin/logic/Logic.cpp b/src/admin/logic/Logic.cpp index 6648189..7fef282 100644 --- a/src/admin/logic/Logic.cpp +++ b/src/admin/logic/Logic.cpp @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include #include @@ -132,7 +132,7 @@ int Logic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const P ProtocolFrameSequenceNumber sequenceNumber = generateSequenceNumber(); //Ask cynara service - CheckResponsePtr checkResponse; + AdminCheckResponsePtr adminCheckResponse; RequestPtr request = std::make_shared(key, startBucket, recursive, sequenceNumber); @@ -142,17 +142,23 @@ int Logic::adminCheck(const PolicyBucketId &startBucket, bool recursive, const P return CYNARA_API_SERVICE_NOT_AVAILABLE; } - checkResponse = std::dynamic_pointer_cast(response); - if (!checkResponse) { - LOGC("Casting Response to CheckResponse failed."); + adminCheckResponse = std::dynamic_pointer_cast(response); + if (!adminCheckResponse) { + LOGC("Casting Response to AdminCheckResponse failed."); return CYNARA_API_UNKNOWN_ERROR; } - LOGD("checkResponse: policyType [%" PRIu16 "], metadata <%s>", - checkResponse->m_resultRef.policyType(), - checkResponse->m_resultRef.metadata().c_str()); + LOGD("AdminCheckResponse: policyType [%" PRIu16 "], metadata <%s>, bucketValid [%d]", + adminCheckResponse->result().policyType(), adminCheckResponse->result().metadata().c_str(), + static_cast(adminCheckResponse->isBucketValid())); - result = checkResponse->m_resultRef; + if (!adminCheckResponse->isBucketValid()) { + LOGE("Bucket <%s> provided as startBucket in adminCheck does not exist in cynara database", + startBucket.c_str()); + return CYNARA_API_BUCKET_NOT_FOUND; + } + + result = adminCheckResponse->result(); return CYNARA_API_SUCCESS; } diff --git a/src/common/protocol/ProtocolAdmin.cpp b/src/common/protocol/ProtocolAdmin.cpp index 2c1164e..293db97 100644 --- a/src/common/protocol/ProtocolAdmin.cpp +++ b/src/common/protocol/ProtocolAdmin.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -216,21 +215,6 @@ ResponsePtr ProtocolAdmin::deserializeAdminCheckResponse(void) { m_frameHeader.sequenceNumber()); } -ResponsePtr ProtocolAdmin::deserializeCheckResponse(void) { - PolicyType result; - PolicyResult::PolicyMetadata additionalInfo; - - ProtocolDeserialization::deserialize(m_frameHeader, result); - ProtocolDeserialization::deserialize(m_frameHeader, additionalInfo); - - const PolicyResult policyResult(result, additionalInfo); - - LOGD("Deserialized CheckResponse: result [%" PRIu16 "], metadata <%s>", - policyResult.policyType(), policyResult.metadata().c_str()); - - return std::make_shared(policyResult, m_frameHeader.sequenceNumber()); -} - ResponsePtr ProtocolAdmin::deserializeCodeResponse(void) { ProtocolResponseCode responseCode; ProtocolDeserialization::deserialize(m_frameHeader, responseCode); @@ -285,8 +269,6 @@ ResponsePtr ProtocolAdmin::extractResponseFromBuffer(BinaryQueuePtr bufferQueue) switch (opCode) { case OpAdminCheckPolicyResponse: return deserializeAdminCheckResponse(); - case OpCheckPolicyResponse: - return deserializeCheckResponse(); case OpCodeResponse: return deserializeCodeResponse(); case OpListResponse: @@ -424,22 +406,6 @@ void ProtocolAdmin::execute(RequestContextPtr context, AdminCheckResponsePtr res ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue())); } -void ProtocolAdmin::execute(RequestContextPtr context, CheckResponsePtr response) { - LOGD("Serializing CheckResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], " - "policyType [%" PRIu16 "], metadata <%s>", OpCheckPolicyResponse, - response->sequenceNumber(), response->m_resultRef.policyType(), - response->m_resultRef.metadata().c_str()); - - ProtocolFrame frame = ProtocolFrameSerializer::startSerialization( - response->sequenceNumber()); - - ProtocolSerialization::serialize(frame, OpCheckPolicyResponse); - ProtocolSerialization::serialize(frame, response->m_resultRef.policyType()); - ProtocolSerialization::serialize(frame, response->m_resultRef.metadata()); - - ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue())); -} - void ProtocolAdmin::execute(RequestContextPtr context, CodeResponsePtr response) { LOGD("Serializing CodeResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], " "code [%" PRIu16 "]", OpCodeResponse, response->sequenceNumber(), response->m_code); diff --git a/src/common/protocol/ProtocolAdmin.h b/src/common/protocol/ProtocolAdmin.h index 1454be2..b9c7e17 100644 --- a/src/common/protocol/ProtocolAdmin.h +++ b/src/common/protocol/ProtocolAdmin.h @@ -45,7 +45,6 @@ public: virtual void execute(RequestContextPtr context, SetPoliciesRequestPtr request); virtual void execute(RequestContextPtr context, AdminCheckResponsePtr response); - virtual void execute(RequestContextPtr context, CheckResponsePtr response); virtual void execute(RequestContextPtr context, CodeResponsePtr response); virtual void execute(RequestContextPtr context, ListResponsePtr response); @@ -57,7 +56,6 @@ private: RequestPtr deserializeSetPoliciesRequest(void); ResponsePtr deserializeAdminCheckResponse(void); - ResponsePtr deserializeCheckResponse(void); ResponsePtr deserializeCodeResponse(void); ResponsePtr deserializeListResponse(void); }; diff --git a/src/service/logic/Logic.cpp b/src/service/logic/Logic.cpp index 679da17..3445984 100644 --- a/src/service/logic/Logic.cpp +++ b/src/service/logic/Logic.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -86,10 +87,16 @@ void Logic::execute(RequestContextPtr context UNUSED, SignalRequestPtr request) } void Logic::execute(RequestContextPtr context, AdminCheckRequestPtr request) { - PolicyResult result = m_storage->checkPolicy(request->key(), request->startBucket(), - request->recursive()); + PolicyResult result; + bool bucketValid = true; + try { + result = m_storage->checkPolicy(request->key(), request->startBucket(), + request->recursive()); + } catch (const BucketNotExistsException &ex) { + bucketValid = false; + } - context->returnResponse(context, std::make_shared(result, + context->returnResponse(context, std::make_shared(result, bucketValid, request->sequenceNumber())); } -- 2.7.4