PageRenderTime 75ms CodeModel.GetById 4ms RepoModel.GetById 1ms app.codeStats 1ms

/src/admin/logic/OfflineLogic.cpp

https://gitlab.com/admin-github-cloud/cynara
C++ | 227 lines | 176 code | 28 blank | 23 comment | 15 complexity | 0f56f15d2cccb681ead76e52918a81ee 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/admin/logic/OfflineLogic.cpp
  18. * @author Aleksander Zdyb <a.zdyb@samsung.com>
  19. * @author Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
  20. * @author Pawel Wieczorek <p.wieczorek2@samsung.com>
  21. * @version 1.0
  22. * @brief This file contains implementation of OfflineLogic class
  23. */
  24. #ifdef DB_FILES_SMACK_LABEL
  25. #include <dirent.h>
  26. #include <linux/xattr.h>
  27. #include <sys/smack.h>
  28. #endif
  29. #include <common.h>
  30. #include <config/PathConfig.h>
  31. #include <exceptions/BucketNotExistsException.h>
  32. #include <exceptions/DatabaseBusyException.h>
  33. #include <exceptions/DatabaseCorruptedException.h>
  34. #include <exceptions/DatabaseException.h>
  35. #include <exceptions/DefaultBucketDeletionException.h>
  36. #include <exceptions/DefaultBucketSetNoneException.h>
  37. #include <exceptions/InvalidBucketIdException.h>
  38. #include <exceptions/UnknownPolicyTypeException.h>
  39. #include <log/log.h>
  40. #include <plugin/PluginManager.h>
  41. #include <types/PolicyDescription.h>
  42. #include <storage/InMemoryStorageBackend.h>
  43. #include <storage/Storage.h>
  44. #include <cynara-error.h>
  45. #include "OfflineLogic.h"
  46. namespace Cynara {
  47. OfflineLogic::OfflineLogic() {}
  48. void OfflineLogic::acquireDatabase(void) {
  49. m_storageBackend.reset(new InMemoryStorageBackend(PathConfig::StoragePath::dbDir));
  50. m_storage.reset(new Storage(*m_storageBackend));
  51. m_storage->load();
  52. }
  53. void OfflineLogic::acquirePlugins(void) {
  54. m_pluginManager.reset(new PluginManager(PathConfig::PluginPath::serviceDir));
  55. m_pluginManager->loadPlugins();
  56. }
  57. void OfflineLogic::checkPoliciesTypes(const ApiInterface::PoliciesByBucket &policies,
  58. bool allowBucket, bool allowNone) {
  59. for (const auto &group : policies) {
  60. for (const auto &policy : group.second) {
  61. checkSinglePolicyType(policy.result().policyType(), allowBucket, allowNone);
  62. }
  63. }
  64. }
  65. void OfflineLogic::checkSinglePolicyType(const PolicyType &policyType, bool allowBucket,
  66. bool allowNone) {
  67. if (allowBucket && policyType == PredefinedPolicyType::BUCKET)
  68. return;
  69. if (allowNone && policyType == PredefinedPolicyType::NONE)
  70. return;
  71. for (const auto &descr : predefinedPolicyDescr) {
  72. if (descr.type == policyType)
  73. return;
  74. }
  75. m_pluginManager->checkPolicyType(policyType);
  76. }
  77. int OfflineLogic::setPolicies(const ApiInterface::PoliciesByBucket &insertOrUpdate,
  78. const ApiInterface::KeysByBucket &remove) {
  79. try {
  80. acquireDatabase();
  81. acquirePlugins();
  82. checkPoliciesTypes(insertOrUpdate, true, false);
  83. m_storage->insertPolicies(insertOrUpdate);
  84. m_storage->deletePolicies(remove);
  85. onPoliciesChanged();
  86. } catch (const BucketNotExistsException &) {
  87. return CYNARA_API_BUCKET_NOT_FOUND;
  88. } catch (const DatabaseException &) {
  89. return CYNARA_API_OPERATION_FAILED;
  90. } catch (const DatabaseCorruptedException &) {
  91. return CYNARA_API_DATABASE_CORRUPTED;
  92. } catch (const UnknownPolicyTypeException &ex) {
  93. return CYNARA_API_INVALID_PARAM;
  94. }
  95. return CYNARA_API_SUCCESS;
  96. }
  97. int OfflineLogic::insertOrUpdateBucket(const PolicyBucketId &bucket,
  98. const PolicyResult &policyResult) {
  99. try {
  100. acquireDatabase();
  101. acquirePlugins();
  102. checkSinglePolicyType(policyResult.policyType(), true, true);
  103. m_storage->addOrUpdateBucket(bucket, policyResult);
  104. onPoliciesChanged();
  105. } catch (const DefaultBucketSetNoneException &) {
  106. return CYNARA_API_OPERATION_NOT_ALLOWED;
  107. } catch (const InvalidBucketIdException &ex) {
  108. return CYNARA_API_OPERATION_NOT_ALLOWED;
  109. } catch (const DatabaseException &) {
  110. return CYNARA_API_OPERATION_FAILED;
  111. } catch (const DatabaseCorruptedException &) {
  112. return CYNARA_API_DATABASE_CORRUPTED;
  113. } catch (const UnknownPolicyTypeException &ex) {
  114. return CYNARA_API_INVALID_PARAM;
  115. }
  116. return CYNARA_API_SUCCESS;
  117. }
  118. int OfflineLogic::removeBucket(const PolicyBucketId &bucket) {
  119. try {
  120. acquireDatabase();
  121. m_storage->deleteBucket(bucket);
  122. onPoliciesChanged();
  123. } catch (const BucketNotExistsException &) {
  124. return CYNARA_API_BUCKET_NOT_FOUND;
  125. } catch (const DefaultBucketDeletionException &) {
  126. return CYNARA_API_OPERATION_NOT_ALLOWED;
  127. } catch (const DatabaseException &) {
  128. return CYNARA_API_OPERATION_FAILED;
  129. } catch (const DatabaseCorruptedException &) {
  130. return CYNARA_API_DATABASE_CORRUPTED;
  131. }
  132. return CYNARA_API_SUCCESS;
  133. }
  134. int OfflineLogic::adminCheck(const PolicyBucketId &startBucket, bool recursive,
  135. const PolicyKey &key, PolicyResult &result) {
  136. try {
  137. acquireDatabase();
  138. result = m_storage->checkPolicy(key, startBucket, recursive);
  139. } catch (const BucketNotExistsException &ex) {
  140. return CYNARA_API_BUCKET_NOT_FOUND;
  141. } catch (const DatabaseCorruptedException &) {
  142. return CYNARA_API_DATABASE_CORRUPTED;
  143. }
  144. return CYNARA_API_SUCCESS;
  145. }
  146. int OfflineLogic::listDescriptions(std::vector<PolicyDescription> &descriptions) {
  147. acquirePlugins();
  148. descriptions = m_pluginManager->getPolicyDescriptions();
  149. descriptions.insert(descriptions.begin(), predefinedPolicyDescr.begin(),
  150. predefinedPolicyDescr.end());
  151. return CYNARA_API_SUCCESS;
  152. }
  153. int OfflineLogic::listPolicies(const PolicyBucketId &bucket, const PolicyKey &filter,
  154. std::vector<Policy> &policies) {
  155. try {
  156. acquireDatabase();
  157. policies = m_storage->listPolicies(bucket, filter);
  158. } catch (const BucketNotExistsException &ex) {
  159. return CYNARA_API_BUCKET_NOT_FOUND;
  160. } catch (const DatabaseCorruptedException &) {
  161. return CYNARA_API_DATABASE_CORRUPTED;
  162. }
  163. return CYNARA_API_SUCCESS;
  164. }
  165. int OfflineLogic::erasePolicies(const PolicyBucketId &startBucket, bool recursive,
  166. const PolicyKey &filter) {
  167. try {
  168. acquireDatabase();
  169. m_storage->erasePolicies(startBucket, recursive, filter);
  170. onPoliciesChanged();
  171. } catch (const BucketNotExistsException &) {
  172. return CYNARA_API_BUCKET_NOT_FOUND;
  173. } catch (const DatabaseCorruptedException &) {
  174. return CYNARA_API_DATABASE_CORRUPTED;
  175. }
  176. return CYNARA_API_SUCCESS;
  177. }
  178. void OfflineLogic::labelDatabaseFiles(void)
  179. {
  180. #ifdef DB_FILES_SMACK_LABEL
  181. DIR *dbDirectory;
  182. struct dirent *directoryEntry;
  183. dbDirectory = opendir(PathConfig::StoragePath::dbDir.c_str());
  184. if (dbDirectory) {
  185. while ((directoryEntry = readdir(dbDirectory)) != NULL) {
  186. std::string f = PathConfig::StoragePath::dbDir + directoryEntry->d_name;
  187. if (smack_set_label_for_path(f.c_str(), XATTR_NAME_SMACK, 1, DB_FILES_SMACK_LABEL) < 0) {
  188. LOGE("Failed to set label for database file: " << f);
  189. }
  190. }
  191. closedir(dbDirectory);
  192. }
  193. #endif
  194. }
  195. void OfflineLogic::onPoliciesChanged(void) {
  196. m_storage->save();
  197. labelDatabaseFiles();
  198. }
  199. } /* namespace Cynara */