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

/src/common/protocol/ProtocolClient.cpp

https://gitlab.com/admin-github-cloud/cynara
C++ | 366 lines | 263 code | 80 blank | 23 comment | 6 complexity | cb97a8b8d3976154d12892b0471733c5 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/ProtocolClient.cpp
  18. * @author Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
  19. * @author Adam Malinowski <a.malinowsk2@partner.samsung.com>
  20. * @author Zofia Abramowska <z.abramowska@samsung.com>
  21. * @version 1.0
  22. * @brief This file implements protocol class for communication with client
  23. */
  24. #include <cinttypes>
  25. #include <memory>
  26. #include <common.h>
  27. #include <exceptions/InvalidProtocolException.h>
  28. #include <exceptions/OutOfDataException.h>
  29. #include <log/log.h>
  30. #include <protocol/ProtocolFrameSerializer.h>
  31. #include <protocol/ProtocolOpCode.h>
  32. #include <protocol/ProtocolSerialization.h>
  33. #include <request/CancelRequest.h>
  34. #include <request/CheckRequest.h>
  35. #include <request/MonitorEntriesPutRequest.h>
  36. #include <request/MonitorEntryPutRequest.h>
  37. #include <request/RequestContext.h>
  38. #include <request/SimpleCheckRequest.h>
  39. #include <response/CancelResponse.h>
  40. #include <response/CheckResponse.h>
  41. #include <response/SimpleCheckResponse.h>
  42. #include <types/MonitorEntry.h>
  43. #include <types/PolicyKey.h>
  44. #include <types/PolicyResult.h>
  45. #include <types/PolicyType.h>
  46. #include "ProtocolClient.h"
  47. namespace Cynara {
  48. ProtocolClient::ProtocolClient() {
  49. }
  50. ProtocolClient::~ProtocolClient() {
  51. }
  52. ProtocolPtr ProtocolClient::clone(void) {
  53. return std::make_shared<ProtocolClient>();
  54. }
  55. RequestPtr ProtocolClient::deserializeCancelRequest(void) {
  56. LOGD("Deserialized CancelRequest");
  57. return std::make_shared<CancelRequest>(m_frameHeader.sequenceNumber());
  58. }
  59. RequestPtr ProtocolClient::deserializeCheckRequest(void) {
  60. std::string clientId, userId, privilegeId;
  61. ProtocolDeserialization::deserialize(m_frameHeader, clientId);
  62. ProtocolDeserialization::deserialize(m_frameHeader, userId);
  63. ProtocolDeserialization::deserialize(m_frameHeader, privilegeId);
  64. LOGD("Deserialized CheckRequest: client <%s>, user <%s>, privilege <%s>",
  65. clientId.c_str(), userId.c_str(), privilegeId.c_str());
  66. return std::make_shared<CheckRequest>(PolicyKey(clientId, userId, privilegeId),
  67. m_frameHeader.sequenceNumber());
  68. }
  69. RequestPtr ProtocolClient::deserializeSimpleCheckRequest(void) {
  70. std::string clientId, userId, privilegeId;
  71. ProtocolDeserialization::deserialize(m_frameHeader, clientId);
  72. ProtocolDeserialization::deserialize(m_frameHeader, userId);
  73. ProtocolDeserialization::deserialize(m_frameHeader, privilegeId);
  74. LOGD("Deserialized SimpleCheckRequest: client <%s>, user <%s>, privilege <%s>",
  75. clientId.c_str(), userId.c_str(), privilegeId.c_str());
  76. return std::make_shared<SimpleCheckRequest>(PolicyKey(clientId, userId, privilegeId),
  77. m_frameHeader.sequenceNumber());
  78. }
  79. RequestPtr ProtocolClient::deserializeMonitorEntriesPutRequest(void) {
  80. ProtocolFrameFieldsCount entriesCount;
  81. ProtocolDeserialization::deserialize(m_frameHeader, entriesCount);
  82. std::vector<MonitorEntry> entries;
  83. entries.reserve(entriesCount);
  84. for (ProtocolFrameFieldsCount fields = 0; fields < entriesCount; fields++) {
  85. std::string clientId, userId, privilegeId;
  86. int64_t result, tv_sec, tv_nsec;
  87. ProtocolDeserialization::deserialize(m_frameHeader, clientId);
  88. ProtocolDeserialization::deserialize(m_frameHeader, userId);
  89. ProtocolDeserialization::deserialize(m_frameHeader, privilegeId);
  90. ProtocolDeserialization::deserialize(m_frameHeader, result);
  91. ProtocolDeserialization::deserialize(m_frameHeader, tv_sec);
  92. ProtocolDeserialization::deserialize(m_frameHeader, tv_nsec);
  93. PolicyKey key(clientId, userId, privilegeId);
  94. struct timespec timestamp;
  95. timestamp.tv_sec = static_cast<__time_t>(tv_sec);
  96. timestamp.tv_nsec = static_cast<__syscall_slong_t>(tv_nsec);
  97. entries.emplace_back(MonitorEntry(key, static_cast<size_t>(result), timestamp));
  98. }
  99. LOGD("Deserialized MonitorEntriesPutRequest: number of entries [%" PRIu16 "]", entriesCount);
  100. return std::make_shared<MonitorEntriesPutRequest>(entries, m_frameHeader.sequenceNumber());
  101. }
  102. RequestPtr ProtocolClient::deserializeMonitorEntryPutRequest(void) {
  103. std::string clientId, userId, privilegeId;
  104. int64_t result, tv_sec, tv_nsec;
  105. ProtocolDeserialization::deserialize(m_frameHeader, clientId);
  106. ProtocolDeserialization::deserialize(m_frameHeader, userId);
  107. ProtocolDeserialization::deserialize(m_frameHeader, privilegeId);
  108. ProtocolDeserialization::deserialize(m_frameHeader, result);
  109. ProtocolDeserialization::deserialize(m_frameHeader, tv_sec);
  110. ProtocolDeserialization::deserialize(m_frameHeader, tv_nsec);
  111. PolicyKey key(clientId, userId, privilegeId);
  112. struct timespec timestamp;
  113. timestamp.tv_sec = static_cast<__time_t>(tv_sec);
  114. timestamp.tv_nsec = static_cast<__syscall_slong_t>(tv_nsec);
  115. LOGD("Deserialized MonitorEntryPutRequest: client <%s>, user <%s>, privilege <%s>",
  116. clientId.c_str(), userId.c_str(), privilegeId.c_str());
  117. return std::make_shared<MonitorEntryPutRequest>(MonitorEntry(key, static_cast<size_t>(result),
  118. timestamp),
  119. m_frameHeader.sequenceNumber());
  120. }
  121. RequestPtr ProtocolClient::extractRequestFromBuffer(BinaryQueuePtr bufferQueue) {
  122. ProtocolFrameSerializer::deserializeHeader(m_frameHeader, bufferQueue);
  123. if (m_frameHeader.isFrameComplete()) {
  124. ProtocolOpCode opCode;
  125. m_frameHeader.resetState();
  126. ProtocolDeserialization::deserialize(m_frameHeader, opCode);
  127. LOGD("Deserialized opCode [%" PRIu8 "]", opCode);
  128. switch (opCode) {
  129. case OpCheckPolicyRequest:
  130. return deserializeCheckRequest();
  131. case OpCancelRequest:
  132. return deserializeCancelRequest();
  133. case OpSimpleCheckPolicyRequest:
  134. return deserializeSimpleCheckRequest();
  135. case OpMonitorEntriesPutRequest:
  136. return deserializeMonitorEntriesPutRequest();
  137. case OpMonitorEntryPutRequest:
  138. return deserializeMonitorEntryPutRequest();
  139. default:
  140. throw InvalidProtocolException(InvalidProtocolException::WrongOpCode);
  141. break;
  142. }
  143. }
  144. return nullptr;
  145. }
  146. ResponsePtr ProtocolClient::deserializeCancelResponse(void) {
  147. LOGD("Deserialized CancelResponse");
  148. return std::make_shared<CancelResponse>(m_frameHeader.sequenceNumber());
  149. }
  150. ResponsePtr ProtocolClient::deserializeCheckResponse(void) {
  151. PolicyType result;
  152. PolicyResult::PolicyMetadata additionalInfo;
  153. ProtocolDeserialization::deserialize(m_frameHeader, result);
  154. ProtocolDeserialization::deserialize(m_frameHeader, additionalInfo);
  155. const PolicyResult policyResult(result, additionalInfo);
  156. LOGD("Deserialized CheckResponse: result [%" PRIu16 "], metadata <%s>",
  157. policyResult.policyType(), policyResult.metadata().c_str());
  158. return std::make_shared<CheckResponse>(policyResult, m_frameHeader.sequenceNumber());
  159. }
  160. ResponsePtr ProtocolClient::deserializeSimpleCheckResponse() {
  161. int32_t retValue;
  162. PolicyType result;
  163. PolicyResult::PolicyMetadata additionalInfo;
  164. ProtocolDeserialization::deserialize(m_frameHeader, retValue);
  165. ProtocolDeserialization::deserialize(m_frameHeader, result);
  166. ProtocolDeserialization::deserialize(m_frameHeader, additionalInfo);
  167. const PolicyResult policyResult(result, additionalInfo);
  168. LOGD("Deserialized SimpleCheckResponse: retVal [%" PRIi32 "%] result [%" PRIu16 "],"
  169. " metadata <%s>", retValue, policyResult.policyType(), policyResult.metadata().c_str());
  170. return std::make_shared<SimpleCheckResponse>(retValue, policyResult,
  171. m_frameHeader.sequenceNumber());
  172. }
  173. ResponsePtr ProtocolClient::extractResponseFromBuffer(BinaryQueuePtr bufferQueue) {
  174. ProtocolFrameSerializer::deserializeHeader(m_frameHeader, bufferQueue);
  175. if (m_frameHeader.isFrameComplete()) {
  176. ProtocolOpCode opCode;
  177. m_frameHeader.resetState();
  178. ProtocolDeserialization::deserialize(m_frameHeader, opCode);
  179. LOGD("Deserialized opCode [%" PRIu8 "]", opCode);
  180. switch (opCode) {
  181. case OpCheckPolicyResponse:
  182. return deserializeCheckResponse();
  183. case OpCancelResponse:
  184. return deserializeCancelResponse();
  185. case OpSimpleCheckPolicyResponse:
  186. return deserializeSimpleCheckResponse();
  187. default:
  188. throw InvalidProtocolException(InvalidProtocolException::WrongOpCode);
  189. break;
  190. }
  191. }
  192. return nullptr;
  193. }
  194. void ProtocolClient::execute(const RequestContext &context, const CancelRequest &request) {
  195. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  196. LOGD("Serializing CancelRequest op [%" PRIu8 "]", OpCancelRequest);
  197. ProtocolSerialization::serialize(frame, OpCancelRequest);
  198. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  199. }
  200. void ProtocolClient::execute(const RequestContext &context, const CheckRequest &request) {
  201. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  202. LOGD("Serializing CheckRequest: client <%s>, user <%s>, privilege <%s>",
  203. request.key().client().value().c_str(), request.key().user().value().c_str(),
  204. request.key().privilege().value().c_str());
  205. ProtocolSerialization::serialize(frame, OpCheckPolicyRequest);
  206. ProtocolSerialization::serialize(frame, request.key().client().value());
  207. ProtocolSerialization::serialize(frame, request.key().user().value());
  208. ProtocolSerialization::serialize(frame, request.key().privilege().value());
  209. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  210. }
  211. void ProtocolClient::execute(const RequestContext &context, const SimpleCheckRequest &request) {
  212. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  213. LOGD("Serializing SimpleCheckRequest: client <%s>, user <%s>, privilege <%s>",
  214. request.key().client().value().c_str(), request.key().user().value().c_str(),
  215. request.key().privilege().value().c_str());
  216. ProtocolSerialization::serialize(frame, OpSimpleCheckPolicyRequest);
  217. ProtocolSerialization::serialize(frame, request.key().client().value());
  218. ProtocolSerialization::serialize(frame, request.key().user().value());
  219. ProtocolSerialization::serialize(frame, request.key().privilege().value());
  220. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  221. }
  222. void ProtocolClient::execute(const RequestContext &context,
  223. const MonitorEntriesPutRequest &request) {
  224. ProtocolFrameFieldsCount entriesCount
  225. = static_cast<ProtocolFrameFieldsCount>(request.monitorEntries().size());
  226. LOGD("Serializing MonitorEntriesPutRequest: op [%" PRIu8 "], sequenceNumber [%" PRIu16 "], "
  227. "number of entries [%" PRIu16 "]",
  228. OpMonitorEntriesPutRequest, request.sequenceNumber(), entriesCount);
  229. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  230. ProtocolSerialization::serialize(frame, OpMonitorEntriesPutRequest);
  231. ProtocolSerialization::serialize(frame, entriesCount);
  232. for (const auto &entry : request.monitorEntries()) {
  233. ProtocolSerialization::serialize(frame, entry.key().client().toString());
  234. ProtocolSerialization::serialize(frame, entry.key().user().toString());
  235. ProtocolSerialization::serialize(frame, entry.key().privilege().toString());
  236. ProtocolSerialization::serialize(frame, static_cast<int64_t>(entry.result()));
  237. ProtocolSerialization::serialize(frame, static_cast<int64_t>(entry.timestamp().tv_sec));
  238. ProtocolSerialization::serialize(frame, static_cast<int64_t>(entry.timestamp().tv_nsec));
  239. }
  240. ProtocolFrameSerializer::finishSerialization(frame, *context.responseQueue());
  241. }
  242. void ProtocolClient::execute(const RequestContext &context, const MonitorEntryPutRequest &request) {
  243. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(request.sequenceNumber());
  244. LOGD("Serializing MonitorEntryPutRequest op [%" PRIu8 "]", OpMonitorEntryPutRequest);
  245. const auto &entry = request.monitorEntry();
  246. ProtocolSerialization::serialize(frame, OpMonitorEntryPutRequest);
  247. ProtocolSerialization::serialize(frame, entry.key().client().toString());
  248. ProtocolSerialization::serialize(frame, entry.key().user().toString());
  249. ProtocolSerialization::serialize(frame, entry.key().privilege().toString());
  250. ProtocolSerialization::serialize(frame, static_cast<int64_t>(entry.result()));
  251. ProtocolSerialization::serialize(frame, static_cast<int64_t>(entry.timestamp().tv_sec));
  252. ProtocolSerialization::serialize(frame, static_cast<int64_t>(entry.timestamp().tv_nsec));
  253. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  254. }
  255. void ProtocolClient::execute(const RequestContext &context, const CancelResponse &response) {
  256. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
  257. response.sequenceNumber());
  258. LOGD("Serializing CancelResponse: op [%" PRIu8 "]", OpCancelResponse);
  259. ProtocolSerialization::serialize(frame, OpCancelResponse);
  260. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  261. }
  262. void ProtocolClient::execute(const RequestContext &context, const CheckResponse &response) {
  263. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
  264. response.sequenceNumber());
  265. LOGD("Serializing CheckResponse: op [%" PRIu8 "], policyType [%" PRIu16 "], metadata <%s>",
  266. OpCheckPolicyResponse, response.m_resultRef.policyType(),
  267. response.m_resultRef.metadata().c_str());
  268. ProtocolSerialization::serialize(frame, OpCheckPolicyResponse);
  269. ProtocolSerialization::serialize(frame, response.m_resultRef.policyType());
  270. ProtocolSerialization::serialize(frame, response.m_resultRef.metadata());
  271. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  272. }
  273. void ProtocolClient::execute(const RequestContext &context, const SimpleCheckResponse &response) {
  274. ProtocolFrame frame = ProtocolFrameSerializer::startSerialization(
  275. response.sequenceNumber());
  276. LOGD("Serializing SimpleCheckResponse: op [%" PRIu8 "], retVal [%" PRIi32 "],"
  277. " policyType [%" PRIu16 "], metadata <%s>", OpCheckPolicyResponse,
  278. response.getReturnValue(), response.getResult().policyType(),
  279. response.getResult().metadata().c_str());
  280. ProtocolSerialization::serialize(frame, OpSimpleCheckPolicyResponse);
  281. ProtocolSerialization::serialize(frame, response.getReturnValue());
  282. ProtocolSerialization::serialize(frame, response.getResult().policyType());
  283. ProtocolSerialization::serialize(frame, response.getResult().metadata());
  284. ProtocolFrameSerializer::finishSerialization(frame, *(context.responseQueue()));
  285. }
  286. } // namespace Cynara