2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * @file src/common/protocol/ProtocolAdmin.cpp
18 * @author Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
19 * @author Adam Malinowski <a.malinowsk2@partner.samsung.com>
21 * @brief This file implements protocol class for administration
27 #include <exceptions/InvalidProtocolException.h>
29 #include <protocol/ProtocolFrame.h>
30 #include <protocol/ProtocolFrameSerializer.h>
31 #include <request/AdminCheckRequest.h>
32 #include <request/InsertOrUpdateBucketRequest.h>
33 #include <request/ListRequest.h>
34 #include <request/RemoveBucketRequest.h>
35 #include <request/RequestContext.h>
36 #include <request/SetPoliciesRequest.h>
37 #include <response/CheckResponse.h>
38 #include <response/CodeResponse.h>
39 #include <types/PolicyKey.h>
41 #include "ProtocolAdmin.h"
45 ProtocolAdmin::ProtocolAdmin() {
48 ProtocolAdmin::~ProtocolAdmin() {
51 ProtocolPtr ProtocolAdmin::clone(void) {
52 return std::make_shared<ProtocolAdmin>();
55 RequestPtr ProtocolAdmin::deserializeAdminCheckRequest(void) {
56 std::string clientId, userId, privilegeId;
57 PolicyBucketId startBucket;
60 ProtocolDeserialization::deserialize(m_frameHeader, clientId);
61 ProtocolDeserialization::deserialize(m_frameHeader, userId);
62 ProtocolDeserialization::deserialize(m_frameHeader, privilegeId);
63 ProtocolDeserialization::deserialize(m_frameHeader, startBucket);
64 ProtocolDeserialization::deserialize(m_frameHeader, recursive);
66 LOGD("Deserialized AdminCheckRequest: clientId <%s>, userId <%s>, privilegeId <%s>, "
67 "startBucket <%s>, recursive [%d]", clientId.c_str(), userId.c_str(),
68 privilegeId.c_str(), startBucket.c_str(), recursive);
70 return std::make_shared<AdminCheckRequest>(PolicyKey(clientId, userId, privilegeId),
71 startBucket, recursive,
72 m_frameHeader.sequenceNumber());
75 RequestPtr ProtocolAdmin::deserializeInsertOrUpdateBucketRequest(void) {
76 PolicyBucketId policyBucketId;
77 PolicyType policyType;
78 PolicyResult::PolicyMetadata policyMetaData;
80 ProtocolDeserialization::deserialize(m_frameHeader, policyBucketId);
81 ProtocolDeserialization::deserialize(m_frameHeader, policyType);
82 ProtocolDeserialization::deserialize(m_frameHeader, policyMetaData);
84 LOGD("Deserialized InsertOrUpdateBucketRequest: bucketId <%s>, "
85 "result.type [%" PRIu16 "], result.meta <%s>", policyBucketId.c_str(),
86 policyType, policyMetaData.c_str());
88 return std::make_shared<InsertOrUpdateBucketRequest>(policyBucketId,
89 PolicyResult(policyType, policyMetaData), m_frameHeader.sequenceNumber());
92 RequestPtr ProtocolAdmin::deserializeListRequest(void) {
93 PolicyBucketId bucketId;
94 PolicyKeyFeature::ValueType client, user, privilege;
96 ProtocolDeserialization::deserialize(m_frameHeader, bucketId);
97 ProtocolDeserialization::deserialize(m_frameHeader, client);
98 ProtocolDeserialization::deserialize(m_frameHeader, user);
99 ProtocolDeserialization::deserialize(m_frameHeader, privilege);
101 LOGD("Deserialized ListRequest: bucketId <%s>, filter client <%s> filter user <%s>, filter "
102 "privilege <%s>", bucketId.c_str(), client.c_str(), user.c_str(), privilege.c_str());
104 return std::make_shared<ListRequest>(bucketId, PolicyKey(client, user, privilege),
105 m_frameHeader.sequenceNumber());
108 RequestPtr ProtocolAdmin::deserializeRemoveBucketRequest(void) {
109 PolicyBucketId policyBucketId;
111 ProtocolDeserialization::deserialize(m_frameHeader, policyBucketId);
113 LOGD("Deserialized RemoveBucketRequest: bucketId <%s>", policyBucketId.c_str());
115 return std::make_shared<RemoveBucketRequest>(policyBucketId, m_frameHeader.sequenceNumber());
118 RequestPtr ProtocolAdmin::deserializeSetPoliciesRequest(void) {
119 ProtocolFrameFieldsCount toBeInsertedOrUpdatedCount, toBeRemovedCount;
120 ProtocolFrameFieldsCount policyCount;
121 PolicyKeyFeature::ValueType clientId, user, privilege;
122 PolicyType policyType;
123 PolicyResult::PolicyMetadata metadata;
124 std::map<PolicyBucketId, std::vector<Policy>> toBeInsertedOrUpdatedPolicies;
125 std::map<PolicyBucketId, std::vector<PolicyKey>> toBeRemovedPolicies;
127 ProtocolDeserialization::deserialize(m_frameHeader, toBeInsertedOrUpdatedCount);
128 for (ProtocolFrameFieldsCount b = 0; b < toBeInsertedOrUpdatedCount; ++b) {
129 PolicyBucketId policyBucketId;
130 ProtocolDeserialization::deserialize(m_frameHeader, policyBucketId);
131 ProtocolDeserialization::deserialize(m_frameHeader, policyCount);
132 for (ProtocolFrameFieldsCount p = 0; p < policyCount; ++p) {
134 ProtocolDeserialization::deserialize(m_frameHeader, clientId);
135 ProtocolDeserialization::deserialize(m_frameHeader, user);
136 ProtocolDeserialization::deserialize(m_frameHeader, privilege);
138 ProtocolDeserialization::deserialize(m_frameHeader, policyType);
139 ProtocolDeserialization::deserialize(m_frameHeader, metadata);
141 toBeInsertedOrUpdatedPolicies[policyBucketId].push_back(
142 Policy(PolicyKey(clientId, user, privilege),
143 PolicyResult(policyType, metadata)));
147 ProtocolDeserialization::deserialize(m_frameHeader, toBeRemovedCount);
148 for (ProtocolFrameFieldsCount b = 0; b < toBeRemovedCount; ++b) {
149 PolicyBucketId policyBucketId;
150 ProtocolDeserialization::deserialize(m_frameHeader, policyBucketId);
151 ProtocolDeserialization::deserialize(m_frameHeader, policyCount);
152 for (ProtocolFrameFieldsCount p = 0; p < policyCount; ++p) {
154 ProtocolDeserialization::deserialize(m_frameHeader, clientId);
155 ProtocolDeserialization::deserialize(m_frameHeader, user);
156 ProtocolDeserialization::deserialize(m_frameHeader, privilege);
158 toBeRemovedPolicies[policyBucketId].push_back(PolicyKey(clientId, user, privilege));
162 LOGD("Deserialized SetPoliciesRequestPtr: insertOrUpdate count [%" PRIu16 "], "
163 "remove count [%" PRIu16 "]", toBeInsertedOrUpdatedCount, toBeRemovedCount);
165 return std::make_shared<SetPoliciesRequest>(toBeInsertedOrUpdatedPolicies,
167 m_frameHeader.sequenceNumber());
170 RequestPtr ProtocolAdmin::extractRequestFromBuffer(BinaryQueuePtr bufferQueue) {
171 ProtocolFrameSerializer::deserializeHeader(m_frameHeader, bufferQueue);
173 if (m_frameHeader.isFrameComplete()) {
174 ProtocolOpCode opCode;
176 m_frameHeader.resetState();
177 ProtocolDeserialization::deserialize(m_frameHeader, opCode);
178 LOGD("Deserialized opCode [%" PRIu8 "]", opCode);
180 case OpAdminCheckRequest:
181 return deserializeAdminCheckRequest();
182 case OpInsertOrUpdateBucket:
183 return deserializeInsertOrUpdateBucketRequest();
185 return deserializeListRequest();
187 return deserializeRemoveBucketRequest();
189 return deserializeSetPoliciesRequest();
191 throw InvalidProtocolException(InvalidProtocolException::WrongOpCode);
199 ResponsePtr ProtocolAdmin::deserializeCheckResponse(void) {
201 PolicyResult::PolicyMetadata additionalInfo;
203 ProtocolDeserialization::deserialize(m_frameHeader, result);
204 ProtocolDeserialization::deserialize(m_frameHeader, additionalInfo);
206 const PolicyResult policyResult(result, additionalInfo);
208 LOGD("Deserialized CheckResponse: result [%" PRIu16 "], metadata <%s>",
209 policyResult.policyType(), policyResult.metadata().c_str());
211 return std::make_shared<CheckResponse>(policyResult, m_frameHeader.sequenceNumber());
214 ResponsePtr ProtocolAdmin::deserializeCodeResponse(void) {
215 ProtocolResponseCode responseCode;
216 ProtocolDeserialization::deserialize(m_frameHeader, responseCode);
218 LOGD("Deserialized CodeResponse: code [%" PRIu16 "], ", responseCode);
220 return std::make_shared<CodeResponse>(static_cast<CodeResponse::Code>(responseCode),
221 m_frameHeader.sequenceNumber());
224 ResponsePtr ProtocolAdmin::extractResponseFromBuffer(BinaryQueuePtr bufferQueue) {
225 ProtocolFrameSerializer::deserializeHeader(m_frameHeader, bufferQueue);
227 if (m_frameHeader.isFrameComplete()) {
228 ProtocolOpCode opCode;
230 m_frameHeader.resetState();
231 ProtocolDeserialization::deserialize(m_frameHeader, opCode);
232 LOGD("Deserialized opCode [%" PRIu8 "]", opCode);
234 case OpCheckPolicyResponse:
235 return deserializeCheckResponse();
237 return deserializeCodeResponse();
239 throw InvalidProtocolException(InvalidProtocolException::WrongOpCode);
247 void ProtocolAdmin::execute(RequestContextPtr context, AdminCheckRequestPtr request) {
248 LOGD("Serializing AdminCheckRequest: client <%s>, user <%s>, privilege <%s>, "
249 "startBucket <%s>, recursive [%d]", request->key().client().value().c_str(),
250 request->key().user().value().c_str(), request->key().privilege().value().c_str(),
251 request->startBucket().c_str(), request->recursive());
253 ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request->sequenceNumber());
255 ProtocolSerialization::serialize(frame, OpAdminCheckRequest);
256 ProtocolSerialization::serialize(frame, request->key().client().value());
257 ProtocolSerialization::serialize(frame, request->key().user().value());
258 ProtocolSerialization::serialize(frame, request->key().privilege().value());
259 ProtocolSerialization::serialize(frame, request->startBucket());
260 ProtocolSerialization::serialize(frame, request->recursive());
262 ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
265 void ProtocolAdmin::execute(RequestContextPtr context, InsertOrUpdateBucketRequestPtr request) {
266 LOGD("Serializing InsertOrUpdateBucketRequest: sequenceNumber [%" PRIu16 "], bucketId <%s>, "
267 "result.type [%" PRIu16 "], result.meta <%s>", request->sequenceNumber(),
268 request->bucketId().c_str(), request->result().policyType(),
269 request->result().metadata().c_str());
271 ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request->sequenceNumber());
273 ProtocolSerialization::serialize(frame, OpInsertOrUpdateBucket);
274 ProtocolSerialization::serialize(frame, request->bucketId());
275 ProtocolSerialization::serialize(frame, request->result().policyType());
276 ProtocolSerialization::serialize(frame, request->result().metadata());
278 ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
281 void ProtocolAdmin::execute(RequestContextPtr context, ListRequestPtr request) {
282 LOGD("Serializing ListRequest: sequenceNumber [%" PRIu16 "], bucketId <%s>, "
283 "filter client <%s> filter user <%s> filter privilege <%s>", request->sequenceNumber(),
284 request->bucket().c_str(), request->filter().client().value().c_str(),
285 request->filter().user().value().c_str(), request->filter().privilege().value().c_str());
287 ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request->sequenceNumber());
289 ProtocolSerialization::serialize(frame, OpListRequest);
290 ProtocolSerialization::serialize(frame, request->bucket());
291 ProtocolSerialization::serialize(frame, request->filter().client().value());
292 ProtocolSerialization::serialize(frame, request->filter().user().value());
293 ProtocolSerialization::serialize(frame, request->filter().privilege().value());
295 ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
298 void ProtocolAdmin::execute(RequestContextPtr context, RemoveBucketRequestPtr request) {
299 LOGD("Serializing RemoveBucketRequest: sequenceNumber [%" PRIu16 "], bucketId <%s>",
300 request->sequenceNumber(), request->bucketId().c_str());
302 ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request->sequenceNumber());
304 ProtocolSerialization::serialize(frame, OpRemoveBucket);
305 ProtocolSerialization::serialize(frame, request->bucketId());
307 ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
310 void ProtocolAdmin::execute(RequestContextPtr context, SetPoliciesRequestPtr request) {
311 LOGD("Serializing SetPoliciesRequestPtr: sequenceNumber [%" PRIu16 "], "
312 "insertOrUpdate count [%zu], remove count [%zu]", request->sequenceNumber(),
313 request->policiesToBeInsertedOrUpdated().size(), request->policiesToBeRemoved().size());
315 ProtocolFrame frame =
316 ProtocolFrameSerializer::startSerialization(request->sequenceNumber());
318 ProtocolSerialization::serialize(frame, OpSetPolicies);
320 ProtocolSerialization::serialize(frame,
321 static_cast<ProtocolFrameFieldsCount>(request->policiesToBeInsertedOrUpdated().size()));
322 for (auto policyBucket : request->policiesToBeInsertedOrUpdated()) {
323 ProtocolSerialization::serialize(frame, policyBucket.first);
324 ProtocolSerialization::serialize(frame,
325 static_cast<ProtocolFrameFieldsCount>(policyBucket.second.size()));
326 for (auto policy : policyBucket.second) {
328 ProtocolSerialization::serialize(frame, policy.key().client().value());
329 ProtocolSerialization::serialize(frame, policy.key().user().value());
330 ProtocolSerialization::serialize(frame, policy.key().privilege().value());
332 ProtocolSerialization::serialize(frame, policy.result().policyType());
333 ProtocolSerialization::serialize(frame, policy.result().metadata());
337 ProtocolSerialization::serialize(frame,
338 static_cast<ProtocolFrameFieldsCount>(request->policiesToBeRemoved().size()));
339 for (auto policyBucket : request->policiesToBeRemoved()) {
340 ProtocolSerialization::serialize(frame, policyBucket.first);
341 ProtocolSerialization::serialize(frame,
342 static_cast<ProtocolFrameFieldsCount>(policyBucket.second.size()));
343 for (auto policyKey : policyBucket.second) {
345 ProtocolSerialization::serialize(frame, policyKey.client().value());
346 ProtocolSerialization::serialize(frame, policyKey.user().value());
347 ProtocolSerialization::serialize(frame, policyKey.privilege().value());
351 ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
354 void ProtocolAdmin::execute(RequestContextPtr context, CheckResponsePtr response) {
355 LOGD("Serializing CheckResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
356 "policyType [%" PRIu16 "], metadata <%s>", OpCheckPolicyResponse,
357 response->sequenceNumber(), response->m_resultRef.policyType(),
358 response->m_resultRef.metadata().c_str());
360 ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
361 response->sequenceNumber());
363 ProtocolSerialization::serialize(frame, OpCheckPolicyResponse);
364 ProtocolSerialization::serialize(frame, response->m_resultRef.policyType());
365 ProtocolSerialization::serialize(frame, response->m_resultRef.metadata());
367 ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
370 void ProtocolAdmin::execute(RequestContextPtr context, CodeResponsePtr response) {
371 LOGD("Serializing CodeResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
372 "code [%" PRIu16 "]", OpCodeResponse, response->sequenceNumber(), response->m_code);
374 ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
375 response->sequenceNumber());
377 ProtocolSerialization::serialize(frame, OpCodeResponse);
378 ProtocolSerialization::serialize(frame, static_cast<ProtocolResponseCode>(response->m_code));
380 ProtocolFrameSerializer::finishSerialization(frame, *(context->responseQueue()));
383 } // namespace Cynara