PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/src/common/protocol/ProtocolAdmin.cpp

https://gitlab.com/admin-github-cloud/cynara
C++ | 568 lines | 422 code | 113 blank | 33 comment | 16 complexity | 3f094bc6dcce698dea1dd60a2e12582c MD5 | raw file
  1. /*
  2. * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
  3. *
  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
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  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.
  15. */
  16. /**
  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>
  20. * @author Pawel Wieczorek <p.wieczorek2@samsung.com>
  21. * @version 1.0
  22. * @brief This file implements protocol class for administration
  23. */
  24. #include <cinttypes>
  25. #include <memory>
  26. #include <exceptions/InvalidProtocolException.h>
  27. #include <log/log.h>
  28. #include <protocol/ProtocolFrame.h>
  29. #include <protocol/ProtocolFrameSerializer.h>
  30. #include <request/AdminCheckRequest.h>
  31. #include <request/DescriptionListRequest.h>
  32. #include <request/EraseRequest.h>
  33. #include <request/InsertOrUpdateBucketRequest.h>
  34. #include <request/ListRequest.h>
  35. #include <request/RemoveBucketRequest.h>
  36. #include <request/RequestContext.h>
  37. #include <request/SetPoliciesRequest.h>
  38. #include <response/AdminCheckResponse.h>
  39. #include <response/CodeResponse.h>
  40. #include <response/DescriptionListResponse.h>
  41. #include <response/ListResponse.h>
  42. #include <types/PolicyKey.h>
  43. #include "ProtocolAdmin.h"
  44. namespace Cynara {
  45. ProtocolAdmin::ProtocolAdmin() {
  46. }
  47. ProtocolAdmin::~ProtocolAdmin() {
  48. }
  49. ProtocolPtr ProtocolAdmin::clone(void) {
  50. return std::make_shared<ProtocolAdmin>();
  51. }
  52. RequestPtr ProtocolAdmin::deserializeAdminCheckRequest(void) {
  53. std::string clientId, userId, privilegeId;
  54. PolicyBucketId startBucket;
  55. bool recursive;
  56. ProtocolDeserialization::deserialize(m_frameHeader, clientId);
  57. ProtocolDeserialization::deserialize(m_frameHeader, userId);
  58. ProtocolDeserialization::deserialize(m_frameHeader, privilegeId);
  59. ProtocolDeserialization::deserialize(m_frameHeader, startBucket);
  60. ProtocolDeserialization::deserialize(m_frameHeader, recursive);
  61. LOGD("Deserialized AdminCheckRequest: clientId <%s>, userId <%s>, privilegeId <%s>, "
  62. "startBucket <%s>, recursive [%d]", clientId.c_str(), userId.c_str(),
  63. privilegeId.c_str(), startBucket.c_str(), recursive);
  64. return std::make_shared<AdminCheckRequest>(PolicyKey(clientId, userId, privilegeId),
  65. startBucket, recursive,
  66. m_frameHeader.sequenceNumber());
  67. }
  68. RequestPtr ProtocolAdmin::deserializeDescriptionListRequest(void) {
  69. LOGD("Deserialized DescriptionListRequest");
  70. return std::make_shared<DescriptionListRequest>(m_frameHeader.sequenceNumber());
  71. }
  72. RequestPtr ProtocolAdmin::deserializeEraseRequest(void) {
  73. PolicyBucketId startBucket;
  74. bool recursive;
  75. PolicyKeyFeature::ValueType client, user, privilege;
  76. ProtocolDeserialization::deserialize(m_frameHeader, startBucket);
  77. ProtocolDeserialization::deserialize(m_frameHeader, recursive);
  78. ProtocolDeserialization::deserialize(m_frameHeader, client);
  79. ProtocolDeserialization::deserialize(m_frameHeader, user);
  80. ProtocolDeserialization::deserialize(m_frameHeader, privilege);
  81. LOGD("Deserialized EraseRequest: startBucket <%s>, recursive [%d], filter client <%s> "
  82. "filter user <%s>, filter privilege <%s>", startBucket.c_str(),
  83. static_cast<int>(recursive), client.c_str(), user.c_str(), privilege.c_str());
  84. return std::make_shared<EraseRequest>(startBucket, recursive,
  85. PolicyKey(client, user, privilege),
  86. m_frameHeader.sequenceNumber());
  87. }
  88. RequestPtr ProtocolAdmin::deserializeInsertOrUpdateBucketRequest(void) {
  89. PolicyBucketId policyBucketId;
  90. PolicyType policyType;
  91. PolicyResult::PolicyMetadata policyMetaData;
  92. ProtocolDeserialization::deserialize(m_frameHeader, policyBucketId);
  93. ProtocolDeserialization::deserialize(m_frameHeader, policyType);
  94. ProtocolDeserialization::deserialize(m_frameHeader, policyMetaData);
  95. LOGD("Deserialized InsertOrUpdateBucketRequest: bucketId <%s>, "
  96. "result.type [%" PRIu16 "], result.meta <%s>", policyBucketId.c_str(),
  97. policyType, policyMetaData.c_str());
  98. return std::make_shared<InsertOrUpdateBucketRequest>(policyBucketId,
  99. PolicyResult(policyType, policyMetaData), m_frameHeader.sequenceNumber());
  100. }
  101. RequestPtr ProtocolAdmin::deserializeListRequest(void) {
  102. PolicyBucketId bucketId;
  103. PolicyKeyFeature::ValueType client, user, privilege;
  104. ProtocolDeserialization::deserialize(m_frameHeader, bucketId);
  105. ProtocolDeserialization::deserialize(m_frameHeader, client);
  106. ProtocolDeserialization::deserialize(m_frameHeader, user);
  107. ProtocolDeserialization::deserialize(m_frameHeader, privilege);
  108. LOGD("Deserialized ListRequest: bucketId <%s>, filter client <%s> filter user <%s>, filter "
  109. "privilege <%s>", bucketId.c_str(), client.c_str(), user.c_str(), privilege.c_str());
  110. return std::make_shared<ListRequest>(bucketId, PolicyKey(client, user, privilege),
  111. m_frameHeader.sequenceNumber());
  112. }
  113. RequestPtr ProtocolAdmin::deserializeRemoveBucketRequest(void) {
  114. PolicyBucketId policyBucketId;
  115. ProtocolDeserialization::deserialize(m_frameHeader, policyBucketId);
  116. LOGD("Deserialized RemoveBucketRequest: bucketId <%s>", policyBucketId.c_str());
  117. return std::make_shared<RemoveBucketRequest>(policyBucketId, m_frameHeader.sequenceNumber());
  118. }
  119. RequestPtr ProtocolAdmin::deserializeSetPoliciesRequest(void) {
  120. ProtocolFrameFieldsCount toBeInsertedOrUpdatedCount, toBeRemovedCount;
  121. ProtocolFrameFieldsCount policyCount;
  122. PolicyKeyFeature::ValueType clientId, user, privilege;
  123. PolicyType policyType;
  124. PolicyResult::PolicyMetadata metadata;
  125. std::map<PolicyBucketId, std::vector<Policy>> toBeInsertedOrUpdatedPolicies;
  126. 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) {
  133. // PolicyKey
  134. ProtocolDeserialization::deserialize(m_frameHeader, clientId);
  135. ProtocolDeserialization::deserialize(m_frameHeader, user);
  136. ProtocolDeserialization::deserialize(m_frameHeader, privilege);
  137. // PolicyResult
  138. ProtocolDeserialization::deserialize(m_frameHeader, policyType);
  139. ProtocolDeserialization::deserialize(m_frameHeader, metadata);
  140. toBeInsertedOrUpdatedPolicies[policyBucketId].push_back(
  141. Policy(PolicyKey(clientId, user, privilege),
  142. PolicyResult(policyType, metadata)));
  143. }
  144. }
  145. ProtocolDeserialization::deserialize(m_frameHeader, toBeRemovedCount);
  146. for (ProtocolFrameFieldsCount b = 0; b < toBeRemovedCount; ++b) {
  147. PolicyBucketId policyBucketId;
  148. ProtocolDeserialization::deserialize(m_frameHeader, policyBucketId);
  149. ProtocolDeserialization::deserialize(m_frameHeader, policyCount);
  150. for (ProtocolFrameFieldsCount p = 0; p < policyCount; ++p) {
  151. // PolicyKey
  152. ProtocolDeserialization::deserialize(m_frameHeader, clientId);
  153. ProtocolDeserialization::deserialize(m_frameHeader, user);
  154. ProtocolDeserialization::deserialize(m_frameHeader, privilege);
  155. toBeRemovedPolicies[policyBucketId].push_back(PolicyKey(clientId, user, privilege));
  156. }
  157. }
  158. LOGD("Deserialized SetPoliciesRequestPtr: insertOrUpdate count [%" PRIu16 "], "
  159. "remove count [%" PRIu16 "]", toBeInsertedOrUpdatedCount, toBeRemovedCount);
  160. return std::make_shared<SetPoliciesRequest>(toBeInsertedOrUpdatedPolicies,
  161. toBeRemovedPolicies,
  162. m_frameHeader.sequenceNumber());
  163. }
  164. RequestPtr ProtocolAdmin::extractRequestFromBuffer(BinaryQueuePtr bufferQueue) {
  165. ProtocolFrameSerializer::deserializeHeader(m_frameHeader, bufferQueue);
  166. if (m_frameHeader.isFrameComplete()) {
  167. ProtocolOpCode opCode;
  168. m_frameHeader.resetState();
  169. ProtocolDeserialization::deserialize(m_frameHeader, opCode);
  170. LOGD("Deserialized opCode [%" PRIu8 "]", opCode);
  171. switch (opCode) {
  172. case OpAdminCheckRequest:
  173. return deserializeAdminCheckRequest();
  174. case OpDescriptionListRequest:
  175. return deserializeDescriptionListRequest();
  176. case OpEraseRequest:
  177. return deserializeEraseRequest();
  178. case OpInsertOrUpdateBucket:
  179. return deserializeInsertOrUpdateBucketRequest();
  180. case OpListRequest:
  181. return deserializeListRequest();
  182. case OpRemoveBucket:
  183. return deserializeRemoveBucketRequest();
  184. case OpSetPolicies:
  185. return deserializeSetPoliciesRequest();
  186. default:
  187. throw InvalidProtocolException(InvalidProtocolException::WrongOpCode);
  188. break;
  189. }
  190. }
  191. return nullptr;
  192. }
  193. ResponsePtr ProtocolAdmin::deserializeAdminCheckResponse(void) {
  194. PolicyType result;
  195. PolicyResult::PolicyMetadata additionalInfo;
  196. bool bucketValid;
  197. bool dbCorrupted;
  198. ProtocolDeserialization::deserialize(m_frameHeader, result);
  199. ProtocolDeserialization::deserialize(m_frameHeader, additionalInfo);
  200. ProtocolDeserialization::deserialize(m_frameHeader, bucketValid);
  201. ProtocolDeserialization::deserialize(m_frameHeader, dbCorrupted);
  202. const PolicyResult policyResult(result, additionalInfo);
  203. LOGD("Deserialized AdminCheckResponse: result [%" PRIu16 "], metadata <%s>, bucketValid [%d], "
  204. "dbCorrupted [%d]", policyResult.policyType(), policyResult.metadata().c_str(),
  205. static_cast<int>(bucketValid), static_cast<int>(dbCorrupted));
  206. return std::make_shared<AdminCheckResponse>(policyResult, bucketValid, dbCorrupted,
  207. m_frameHeader.sequenceNumber());
  208. }
  209. ResponsePtr ProtocolAdmin::deserializeCodeResponse(void) {
  210. ProtocolResponseCode responseCode;
  211. ProtocolDeserialization::deserialize(m_frameHeader, responseCode);
  212. LOGD("Deserialized CodeResponse: code [%" PRIu16 "], ", responseCode);
  213. return std::make_shared<CodeResponse>(static_cast<CodeResponse::Code>(responseCode),
  214. m_frameHeader.sequenceNumber());
  215. }
  216. ResponsePtr ProtocolAdmin::deserializeDescriptionListResponse(void) {
  217. ProtocolFrameFieldsCount descriptionsCount;
  218. ProtocolDeserialization::deserialize(m_frameHeader, descriptionsCount);
  219. std::vector<PolicyDescription> descriptions(descriptionsCount,
  220. PolicyDescription(PredefinedPolicyType::NONE));
  221. for (ProtocolFrameFieldsCount fields = 0; fields < descriptionsCount; fields++) {
  222. ProtocolDeserialization::deserialize(m_frameHeader, descriptions[fields].type);
  223. ProtocolDeserialization::deserialize(m_frameHeader, descriptions[fields].name);
  224. }
  225. bool dbCorrupted;
  226. ProtocolDeserialization::deserialize(m_frameHeader, dbCorrupted);
  227. LOGD("Deserialized DescriptionListResponse: number of descriptions [%" PRIu16 "], "
  228. "dbCorrupted [%d]", descriptionsCount, static_cast<int>(dbCorrupted));
  229. return std::make_shared<DescriptionListResponse>(descriptions, dbCorrupted,
  230. m_frameHeader.sequenceNumber());
  231. }
  232. ResponsePtr ProtocolAdmin::deserializeListResponse(void) {
  233. ProtocolFrameFieldsCount policiesCount;
  234. PolicyKeyFeature::ValueType client, user, privilege;
  235. PolicyType policyType;
  236. PolicyResult::PolicyMetadata metadata;
  237. std::vector<Policy> policies;
  238. ProtocolDeserialization::deserialize(m_frameHeader, policiesCount);
  239. policies.reserve(policiesCount);
  240. for (ProtocolFrameFieldsCount p = 0; p < policiesCount; ++p) {
  241. // PolicyKey
  242. ProtocolDeserialization::deserialize(m_frameHeader, client);
  243. ProtocolDeserialization::deserialize(m_frameHeader, user);
  244. ProtocolDeserialization::deserialize(m_frameHeader, privilege);
  245. // PolicyResult
  246. ProtocolDeserialization::deserialize(m_frameHeader, policyType);
  247. ProtocolDeserialization::deserialize(m_frameHeader, metadata);
  248. policies.push_back(Policy(PolicyKey(client, user, privilege),
  249. PolicyResult(policyType, metadata)));
  250. }
  251. bool bucketValid;
  252. bool dbCorrupted;
  253. ProtocolDeserialization::deserialize(m_frameHeader, bucketValid);
  254. ProtocolDeserialization::deserialize(m_frameHeader, dbCorrupted);
  255. LOGD("Deserialized ListResponse: number of policies [%" PRIu16 "], bucketValid [%d], "
  256. "dbCorrupted [%d]", policiesCount, static_cast<int>(bucketValid),
  257. static_cast<int>(dbCorrupted));
  258. return std::make_shared<ListResponse>(policies, bucketValid, dbCorrupted,
  259. m_frameHeader.sequenceNumber());
  260. }
  261. ResponsePtr ProtocolAdmin::extractResponseFromBuffer(BinaryQueuePtr bufferQueue) {
  262. ProtocolFrameSerializer::deserializeHeader(m_frameHeader, bufferQueue);
  263. if (m_frameHeader.isFrameComplete()) {
  264. ProtocolOpCode opCode;
  265. m_frameHeader.resetState();
  266. ProtocolDeserialization::deserialize(m_frameHeader, opCode);
  267. LOGD("Deserialized opCode [%" PRIu8 "]", opCode);
  268. switch (opCode) {
  269. case OpAdminCheckPolicyResponse:
  270. return deserializeAdminCheckResponse();
  271. case OpCodeResponse:
  272. return deserializeCodeResponse();
  273. case OpDescriptionListResponse:
  274. return deserializeDescriptionListResponse();
  275. case OpListResponse:
  276. return deserializeListResponse();
  277. default:
  278. throw InvalidProtocolException(InvalidProtocolException::WrongOpCode);
  279. break;
  280. }
  281. }
  282. return nullptr;
  283. }
  284. void ProtocolAdmin::execute(const RequestContext &context, const AdminCheckRequest &request) {
  285. LOGD("Serializing AdminCheckRequest: client <%s>, user <%s>, privilege <%s>, "
  286. "startBucket <%s>, recursive [%d]", request.key().client().value().c_str(),
  287. request.key().user().value().c_str(), request.key().privilege().value().c_str(),
  288. request.startBucket().c_str(), request.recursive());
  289. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  290. ProtocolSerialization::serialize(frame, OpAdminCheckRequest);
  291. ProtocolSerialization::serialize(frame, request.key().client().value());
  292. ProtocolSerialization::serialize(frame, request.key().user().value());
  293. ProtocolSerialization::serialize(frame, request.key().privilege().value());
  294. ProtocolSerialization::serialize(frame, request.startBucket());
  295. ProtocolSerialization::serialize(frame, request.recursive());
  296. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  297. }
  298. void ProtocolAdmin::execute(const RequestContext &context, const DescriptionListRequest &request) {
  299. LOGD("Serializing DescriptionListRequest");
  300. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  301. ProtocolSerialization::serialize(frame, OpDescriptionListRequest);
  302. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  303. }
  304. void ProtocolAdmin::execute(const RequestContext &context, const EraseRequest &request) {
  305. LOGD("Serializing EraseRequest: sequenceNumber [%" PRIu16 "], startBucket <%s>, "
  306. "recursive [%d], filter client <%s> filter user <%s> filter privilege <%s>",
  307. request.sequenceNumber(), request.startBucket().c_str(),
  308. static_cast<int>(request.recursive()), request.filter().client().value().c_str(),
  309. request.filter().user().value().c_str(), request.filter().privilege().value().c_str());
  310. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  311. ProtocolSerialization::serialize(frame, OpEraseRequest);
  312. ProtocolSerialization::serialize(frame, request.startBucket());
  313. ProtocolSerialization::serialize(frame, request.recursive());
  314. ProtocolSerialization::serialize(frame, request.filter().client().value());
  315. ProtocolSerialization::serialize(frame, request.filter().user().value());
  316. ProtocolSerialization::serialize(frame, request.filter().privilege().value());
  317. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  318. }
  319. void ProtocolAdmin::execute(const RequestContext &context,
  320. const InsertOrUpdateBucketRequest &request) {
  321. LOGD("Serializing InsertOrUpdateBucketRequest: sequenceNumber [%" PRIu16 "], bucketId <%s>, "
  322. "result.type [%" PRIu16 "], result.meta <%s>", request.sequenceNumber(),
  323. request.bucketId().c_str(), request.result().policyType(),
  324. request.result().metadata().c_str());
  325. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  326. ProtocolSerialization::serialize(frame, OpInsertOrUpdateBucket);
  327. ProtocolSerialization::serialize(frame, request.bucketId());
  328. ProtocolSerialization::serialize(frame, request.result().policyType());
  329. ProtocolSerialization::serialize(frame, request.result().metadata());
  330. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  331. }
  332. void ProtocolAdmin::execute(const RequestContext &context, const ListRequest &request) {
  333. LOGD("Serializing ListRequest: sequenceNumber [%" PRIu16 "], bucketId <%s>, "
  334. "filter client <%s> filter user <%s> filter privilege <%s>", request.sequenceNumber(),
  335. request.bucket().c_str(), request.filter().client().value().c_str(),
  336. request.filter().user().value().c_str(), request.filter().privilege().value().c_str());
  337. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  338. ProtocolSerialization::serialize(frame, OpListRequest);
  339. ProtocolSerialization::serialize(frame, request.bucket());
  340. ProtocolSerialization::serialize(frame, request.filter().client().value());
  341. ProtocolSerialization::serialize(frame, request.filter().user().value());
  342. ProtocolSerialization::serialize(frame, request.filter().privilege().value());
  343. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  344. }
  345. void ProtocolAdmin::execute(const RequestContext &context, const RemoveBucketRequest &request) {
  346. LOGD("Serializing RemoveBucketRequest: sequenceNumber [%" PRIu16 "], bucketId <%s>",
  347. request.sequenceNumber(), request.bucketId().c_str());
  348. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  349. ProtocolSerialization::serialize(frame, OpRemoveBucket);
  350. ProtocolSerialization::serialize(frame, request.bucketId());
  351. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  352. }
  353. void ProtocolAdmin::execute(const RequestContext &context, const SetPoliciesRequest &request) {
  354. LOGD("Serializing SetPoliciesRequestPtr: sequenceNumber [%" PRIu16 "], "
  355. "insertOrUpdate count [%zu], remove count [%zu]", request.sequenceNumber(),
  356. request.policiesToBeInsertedOrUpdated().size(), request.policiesToBeRemoved().size());
  357. ProtocolFrame frame =
  358. ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  359. ProtocolSerialization::serialize(frame, OpSetPolicies);
  360. ProtocolSerialization::serialize(frame,
  361. static_cast<ProtocolFrameFieldsCount>(request.policiesToBeInsertedOrUpdated().size()));
  362. for (auto policyBucket : request.policiesToBeInsertedOrUpdated()) {
  363. ProtocolSerialization::serialize(frame, policyBucket.first);
  364. ProtocolSerialization::serialize(frame,
  365. static_cast<ProtocolFrameFieldsCount>(policyBucket.second.size()));
  366. for (auto policy : policyBucket.second) {
  367. // PolicyKey
  368. ProtocolSerialization::serialize(frame, policy.key().client().value());
  369. ProtocolSerialization::serialize(frame, policy.key().user().value());
  370. ProtocolSerialization::serialize(frame, policy.key().privilege().value());
  371. // PolicyResult
  372. ProtocolSerialization::serialize(frame, policy.result().policyType());
  373. ProtocolSerialization::serialize(frame, policy.result().metadata());
  374. }
  375. }
  376. ProtocolSerialization::serialize(frame,
  377. static_cast<ProtocolFrameFieldsCount>(request.policiesToBeRemoved().size()));
  378. for (auto policyBucket : request.policiesToBeRemoved()) {
  379. ProtocolSerialization::serialize(frame, policyBucket.first);
  380. ProtocolSerialization::serialize(frame,
  381. static_cast<ProtocolFrameFieldsCount>(policyBucket.second.size()));
  382. for (auto policyKey : policyBucket.second) {
  383. // PolicyKey
  384. ProtocolSerialization::serialize(frame, policyKey.client().value());
  385. ProtocolSerialization::serialize(frame, policyKey.user().value());
  386. ProtocolSerialization::serialize(frame, policyKey.privilege().value());
  387. }
  388. }
  389. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  390. }
  391. void ProtocolAdmin::execute(const RequestContext &context, const AdminCheckResponse &response) {
  392. LOGD("Serializing AdminCheckResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
  393. "policyType [%" PRIu16 "], metadata <%s>, bucketValid [%d], dbCorrupted [%d]",
  394. OpAdminCheckPolicyResponse, response.sequenceNumber(), response.result().policyType(),
  395. response.result().metadata().c_str(), static_cast<int>(response.isBucketValid()),
  396. static_cast<int>(response.isDbCorrupted()));
  397. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
  398. response.sequenceNumber());
  399. ProtocolSerialization::serialize(frame, OpAdminCheckPolicyResponse);
  400. ProtocolSerialization::serialize(frame, response.result().policyType());
  401. ProtocolSerialization::serialize(frame, response.result().metadata());
  402. ProtocolSerialization::serialize(frame, response.isBucketValid());
  403. ProtocolSerialization::serialize(frame, response.isDbCorrupted());
  404. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  405. }
  406. void ProtocolAdmin::execute(const RequestContext &context, const CodeResponse &response) {
  407. LOGD("Serializing CodeResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
  408. "code [%" PRIu16 "]", OpCodeResponse, response.sequenceNumber(), response.m_code);
  409. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
  410. response.sequenceNumber());
  411. ProtocolSerialization::serialize(frame, OpCodeResponse);
  412. ProtocolSerialization::serialize(frame, static_cast<ProtocolResponseCode>(response.m_code));
  413. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  414. }
  415. void ProtocolAdmin::execute(const RequestContext &context, const DescriptionListResponse &response)
  416. {
  417. ProtocolFrameFieldsCount descriptionsSize
  418. = static_cast<ProtocolFrameFieldsCount>(response.descriptions().size());
  419. LOGD("Serializing DescriptionListResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
  420. "number of descriptions [%" PRIu16 "], dbCorrupted [%d]", OpDescriptionListResponse,
  421. response.sequenceNumber(), descriptionsSize, static_cast<int>(response.isDbCorrupted()));
  422. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(response.sequenceNumber());
  423. ProtocolSerialization::serialize(frame, OpDescriptionListResponse);
  424. ProtocolSerialization::serialize(frame, descriptionsSize);
  425. for (auto &desc : response.descriptions()) {
  426. ProtocolSerialization::serialize(frame, desc.type);
  427. ProtocolSerialization::serialize(frame, desc.name);
  428. }
  429. ProtocolSerialization::serialize(frame, response.isDbCorrupted());
  430. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  431. }
  432. void ProtocolAdmin::execute(const RequestContext &context, const ListResponse &response) {
  433. ProtocolFrameFieldsCount policiesSize
  434. = static_cast<ProtocolFrameFieldsCount>(response.policies().size());
  435. LOGD("Serializing ListResponse: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
  436. "number of policies [%" PRIu16 "], bucketValid [%d], dbCorrupted [%d]", OpListResponse,
  437. response.sequenceNumber(), policiesSize, static_cast<int>(response.isBucketValid()),
  438. static_cast<int>(response.isDbCorrupted()));
  439. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(response.sequenceNumber());
  440. ProtocolSerialization::serialize(frame, OpListResponse);
  441. ProtocolSerialization::serialize(frame, policiesSize);
  442. for (auto &policy : response.policies()) {
  443. // PolicyKey
  444. ProtocolSerialization::serialize(frame, policy.key().client().value());
  445. ProtocolSerialization::serialize(frame, policy.key().user().value());
  446. ProtocolSerialization::serialize(frame, policy.key().privilege().value());
  447. // PolicyResult
  448. ProtocolSerialization::serialize(frame, policy.result().policyType());
  449. ProtocolSerialization::serialize(frame, policy.result().metadata());
  450. }
  451. ProtocolSerialization::serialize(frame, response.isBucketValid());
  452. ProtocolSerialization::serialize(frame, response.isDbCorrupted());
  453. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  454. }
  455. } // namespace Cynara