Prepare service for database corruption handling
[platform/core/security/cynara.git] / src / common / protocol / ProtocolAdmin.cpp
index 2c1164e..35eedd8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
  *    you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
  * @file        src/common/protocol/ProtocolAdmin.cpp
  * @author      Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
  * @author      Adam Malinowski <a.malinowsk2@partner.samsung.com>
+ * @author      Pawel Wieczorek <p.wieczorek2@samsung.com>
  * @version     1.0
  * @brief       This file implements protocol class for administration
  */
 #include <protocol/ProtocolFrame.h>
 #include <protocol/ProtocolFrameSerializer.h>
 #include <request/AdminCheckRequest.h>
+#include <request/DescriptionListRequest.h>
+#include <request/EraseRequest.h>
 #include <request/InsertOrUpdateBucketRequest.h>
 #include <request/ListRequest.h>
 #include <request/RemoveBucketRequest.h>
 #include <request/RequestContext.h>
 #include <request/SetPoliciesRequest.h>
 #include <response/AdminCheckResponse.h>
-#include <response/CheckResponse.h>
 #include <response/CodeResponse.h>
+#include <response/DescriptionListResponse.h>
 #include <response/ListResponse.h>
 #include <types/PolicyKey.h>
 
@@ -74,6 +77,31 @@ RequestPtr ProtocolAdmin::deserializeAdminCheckRequest(void) {
                                                m_frameHeader.sequenceNumber());
 }
 
+RequestPtr ProtocolAdmin::deserializeDescriptionListRequest(void) {
+    LOGD("Deserialized DescriptionListRequest");
+    return std::make_shared<DescriptionListRequest>(m_frameHeader.sequenceNumber());
+}
+
+RequestPtr ProtocolAdmin::deserializeEraseRequest(void) {
+    PolicyBucketId startBucket;
+    bool recursive;
+    PolicyKeyFeature::ValueType client, user, privilege;
+
+    ProtocolDeserialization::deserialize(m_frameHeader, startBucket);
+    ProtocolDeserialization::deserialize(m_frameHeader, recursive);
+    ProtocolDeserialization::deserialize(m_frameHeader, client);
+    ProtocolDeserialization::deserialize(m_frameHeader, user);
+    ProtocolDeserialization::deserialize(m_frameHeader, privilege);
+
+    LOGD("Deserialized EraseRequest: startBucket <%s>, recursive [%d], filter client <%s> "
+         "filter user <%s>, filter privilege <%s>", startBucket.c_str(),
+         static_cast<int>(recursive), client.c_str(), user.c_str(), privilege.c_str());
+
+    return std::make_shared<EraseRequest>(startBucket, recursive,
+                                          PolicyKey(client, user, privilege),
+                                          m_frameHeader.sequenceNumber());
+}
+
 RequestPtr ProtocolAdmin::deserializeInsertOrUpdateBucketRequest(void) {
     PolicyBucketId policyBucketId;
     PolicyType policyType;
@@ -181,6 +209,10 @@ RequestPtr ProtocolAdmin::extractRequestFromBuffer(BinaryQueuePtr bufferQueue) {
         switch (opCode) {
         case OpAdminCheckRequest:
             return deserializeAdminCheckRequest();
+        case OpDescriptionListRequest:
+            return deserializeDescriptionListRequest();
+        case OpEraseRequest:
+            return deserializeEraseRequest();
         case OpInsertOrUpdateBucket:
             return deserializeInsertOrUpdateBucketRequest();
         case OpListRequest:
@@ -202,35 +234,23 @@ ResponsePtr ProtocolAdmin::deserializeAdminCheckResponse(void) {
     PolicyType result;
     PolicyResult::PolicyMetadata additionalInfo;
     bool bucketValid;
+    bool dbCorrupted;
 
     ProtocolDeserialization::deserialize(m_frameHeader, result);
     ProtocolDeserialization::deserialize(m_frameHeader, additionalInfo);
     ProtocolDeserialization::deserialize(m_frameHeader, bucketValid);
+    ProtocolDeserialization::deserialize(m_frameHeader, dbCorrupted);
 
     const PolicyResult policyResult(result, additionalInfo);
 
-    LOGD("Deserialized AdminCheckResponse: result [%" PRIu16 "], metadata <%s>, bucketValid [%d]",
-         policyResult.policyType(), policyResult.metadata().c_str(), static_cast<int>(bucketValid));
+    LOGD("Deserialized AdminCheckResponse: result [%" PRIu16 "], metadata <%s>, bucketValid [%d], "
+         "dbCorrupted [%d]", policyResult.policyType(), policyResult.metadata().c_str(),
+         static_cast<int>(bucketValid), static_cast<int>(dbCorrupted));
 
-    return std::make_shared<AdminCheckResponse>(policyResult, bucketValid,
+    return std::make_shared<AdminCheckResponse>(policyResult, bucketValid, dbCorrupted,
                                                 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<CheckResponse>(policyResult, m_frameHeader.sequenceNumber());
-}
-
 ResponsePtr ProtocolAdmin::deserializeCodeResponse(void) {
     ProtocolResponseCode responseCode;
     ProtocolDeserialization::deserialize(m_frameHeader, responseCode);
@@ -241,6 +261,28 @@ ResponsePtr ProtocolAdmin::deserializeCodeResponse(void) {
                                           m_frameHeader.sequenceNumber());
 }
 
+ResponsePtr ProtocolAdmin::deserializeDescriptionListResponse(void) {
+    ProtocolFrameFieldsCount descriptionsCount;
+
+    ProtocolDeserialization::deserialize(m_frameHeader, descriptionsCount);
+    std::vector<PolicyDescription> descriptions(descriptionsCount,
+                                                PolicyDescription(PredefinedPolicyType::NONE));
+
+    for (ProtocolFrameFieldsCount fields = 0; fields < descriptionsCount; fields++) {
+        ProtocolDeserialization::deserialize(m_frameHeader, descriptions[fields].type);
+        ProtocolDeserialization::deserialize(m_frameHeader, descriptions[fields].name);
+    }
+
+    bool dbCorrupted;
+    ProtocolDeserialization::deserialize(m_frameHeader, dbCorrupted);
+
+    LOGD("Deserialized DescriptionListResponse: number of descriptions [%" PRIu16 "], "
+         "dbCorrupted [%d]", descriptionsCount, static_cast<int>(dbCorrupted));
+
+    return std::make_shared<DescriptionListResponse>(descriptions, dbCorrupted,
+                                                     m_frameHeader.sequenceNumber());
+}
+
 ResponsePtr ProtocolAdmin::deserializeListResponse(void) {
     ProtocolFrameFieldsCount policiesCount;
     PolicyKeyFeature::ValueType client, user, privilege;
@@ -264,13 +306,18 @@ ResponsePtr ProtocolAdmin::deserializeListResponse(void) {
                                         PolicyResult(policyType, metadata)));
     }
 
-    bool isBucketValid;
-    ProtocolDeserialization::deserialize(m_frameHeader, isBucketValid);
+    bool bucketValid;
+    bool dbCorrupted;
+    ProtocolDeserialization::deserialize(m_frameHeader, bucketValid);
+    ProtocolDeserialization::deserialize(m_frameHeader, dbCorrupted);
 
-    LOGD("Deserialized ListResponse: number of policies [%" PRIu16 "], isBucketValid [%d]",
-         policiesCount, isBucketValid);
+    LOGD("Deserialized ListResponse: number of policies [%" PRIu16 "], bucketValid [%d], "
+         "dbCorrupted [%d]", policiesCount, static_cast<int>(bucketValid),
+         static_cast<int>(dbCorrupted));
+
+    return std::make_shared<ListResponse>(policies, bucketValid, dbCorrupted,
+                                          m_frameHeader.sequenceNumber());
 
-    return std::make_shared<ListResponse>(policies, isBucketValid, m_frameHeader.sequenceNumber());
 }
 
 ResponsePtr ProtocolAdmin::extractResponseFromBuffer(BinaryQueuePtr bufferQueue) {
@@ -285,10 +332,10 @@ ResponsePtr ProtocolAdmin::extractResponseFromBuffer(BinaryQueuePtr bufferQueue)
         switch (opCode) {
         case OpAdminCheckPolicyResponse:
             return deserializeAdminCheckResponse();
-        case OpCheckPolicyResponse:
-            return deserializeCheckResponse();
         case OpCodeResponse:
             return deserializeCodeResponse();
+        case OpDescriptionListResponse:
+            return deserializeDescriptionListResponse();
         case OpListResponse:
             return deserializeListResponse();
         default:
@@ -318,6 +365,34 @@ void ProtocolAdmin::execute(RequestContextPtr context, AdminCheckRequestPtr requ
     ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
 }
 
+void ProtocolAdmin::execute(RequestContextPtr context, DescriptionListRequestPtr request) {
+    LOGD("Serializing DescriptionListRequest");
+    ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request->sequenceNumber());
+
+    ProtocolSerialization::serialize(frame, OpDescriptionListRequest);
+
+    ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
+}
+
+void ProtocolAdmin::execute(RequestContextPtr context, EraseRequestPtr request) {
+    LOGD("Serializing EraseRequest: sequenceNumber [%" PRIu16 "], startBucket <%s>, "
+         "recursive [%d], filter client <%s> filter user <%s> filter privilege <%s>",
+         request->sequenceNumber(), request->startBucket().c_str(),
+         static_cast<int>(request->recursive()), request->filter().client().value().c_str(),
+         request->filter().user().value().c_str(), request->filter().privilege().value().c_str());
+
+    ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request->sequenceNumber());
+
+    ProtocolSerialization::serialize(frame, OpEraseRequest);
+    ProtocolSerialization::serialize(frame, request->startBucket());
+    ProtocolSerialization::serialize(frame, request->recursive());
+    ProtocolSerialization::serialize(frame, request->filter().client().value());
+    ProtocolSerialization::serialize(frame, request->filter().user().value());
+    ProtocolSerialization::serialize(frame, request->filter().privilege().value());
+
+    ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
+}
+
 void ProtocolAdmin::execute(RequestContextPtr context, InsertOrUpdateBucketRequestPtr request) {
     LOGD("Serializing InsertOrUpdateBucketRequest: sequenceNumber [%" PRIu16 "], bucketId <%s>, "
          "result.type [%" PRIu16 "], result.meta <%s>", request->sequenceNumber(),
@@ -409,9 +484,10 @@ void ProtocolAdmin::execute(RequestContextPtr context, SetPoliciesRequestPtr req
 
 void ProtocolAdmin::execute(RequestContextPtr context, AdminCheckResponsePtr response) {
     LOGD("Serializing AdminCheckResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
-         "policyType [%" PRIu16 "], metadata <%s>, bucketValid [%d]", OpAdminCheckPolicyResponse,
-         response->sequenceNumber(), response->result().policyType(),
-         response->result().metadata().c_str(), static_cast<int>(response->isBucketValid()));
+         "policyType [%" PRIu16 "], metadata <%s>, bucketValid [%d], dbCorrupted [%d]",
+         OpAdminCheckPolicyResponse, response->sequenceNumber(), response->result().policyType(),
+         response->result().metadata().c_str(), static_cast<int>(response->isBucketValid()),
+         static_cast<int>(response->isDbCorrupted()));
 
     ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
             response->sequenceNumber());
@@ -420,35 +496,41 @@ void ProtocolAdmin::execute(RequestContextPtr context, AdminCheckResponsePtr res
     ProtocolSerialization::serialize(frame, response->result().policyType());
     ProtocolSerialization::serialize(frame, response->result().metadata());
     ProtocolSerialization::serialize(frame, response->isBucketValid());
+    ProtocolSerialization::serialize(frame, response->isDbCorrupted());
 
     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());
+void ProtocolAdmin::execute(RequestContextPtr context, CodeResponsePtr response) {
+    LOGD("Serializing CodeResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
+         "code [%" PRIu16 "]", OpCodeResponse, response->sequenceNumber(), response->m_code);
 
     ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
             response->sequenceNumber());
 
-    ProtocolSerialization::serialize(frame, OpCheckPolicyResponse);
-    ProtocolSerialization::serialize(frame, response->m_resultRef.policyType());
-    ProtocolSerialization::serialize(frame, response->m_resultRef.metadata());
+    ProtocolSerialization::serialize(frame, OpCodeResponse);
+    ProtocolSerialization::serialize(frame, static_cast<ProtocolResponseCode>(response->m_code));
 
     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);
+void ProtocolAdmin::execute(RequestContextPtr context, DescriptionListResponsePtr response) {
+    ProtocolFrameFieldsCount descriptionsSize
+        = static_cast<ProtocolFrameFieldsCount>(response->descriptions().size());
 
-    ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
-            response->sequenceNumber());
+    LOGD("Serializing DescriptionListResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
+         "number of descriptions [%" PRIu16 "], dbCorrupted [%d]", OpDescriptionListResponse,
+         response->sequenceNumber(), descriptionsSize, static_cast<int>(response->isDbCorrupted()));
 
-    ProtocolSerialization::serialize(frame, OpCodeResponse);
-    ProtocolSerialization::serialize(frame, static_cast<ProtocolResponseCode>(response->m_code));
+    ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(response->sequenceNumber());
+
+    ProtocolSerialization::serialize(frame, OpDescriptionListResponse);
+    ProtocolSerialization::serialize(frame, descriptionsSize);
+    for (auto &desc : response->descriptions()) {
+        ProtocolSerialization::serialize(frame, desc.type);
+        ProtocolSerialization::serialize(frame, desc.name);
+    }
+    ProtocolSerialization::serialize(frame, response->isDbCorrupted());
 
     ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
 }
@@ -458,8 +540,9 @@ void ProtocolAdmin::execute(RequestContextPtr context, ListResponsePtr response)
         = static_cast<ProtocolFrameFieldsCount>(response->policies().size());
 
     LOGD("Serializing ListResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
-         "number of policies [%" PRIu16 "], isBucketValid [%d]", OpListResponse,
-         response->sequenceNumber(), policiesSize, response->isBucketValid());
+         "number of policies [%" PRIu16 "], bucketValid [%d], dbCorrupted [%d]", OpListResponse,
+         response->sequenceNumber(), policiesSize, static_cast<int>(response->isBucketValid()),
+         static_cast<int>(response->isDbCorrupted()));
 
     ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(response->sequenceNumber());
 
@@ -475,6 +558,7 @@ void ProtocolAdmin::execute(RequestContextPtr context, ListResponsePtr response)
         ProtocolSerialization::serialize(frame, policy.result().metadata());
     }
     ProtocolSerialization::serialize(frame, response->isBucketValid());
+    ProtocolSerialization::serialize(frame, response->isDbCorrupted());
 
     ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
 }