Enable policy-manager to use policy-storage method
authorSangwan Kwon <sangwan.kwon@samsung.com>
Wed, 2 Oct 2019 05:50:40 +0000 (14:50 +0900)
committer권상완/Security 2Lab(SR)/Engineer/삼성전자 <sangwan.kwon@samsung.com>
Thu, 10 Oct 2019 06:26:21 +0000 (15:26 +0900)
Signed-off-by: Sangwan Kwon <sangwan.kwon@samsung.com>
src/policyd/core/policy-manager.cpp
src/policyd/core/policy-manager.h
src/policyd/core/policy-storage.cpp
src/policyd/core/policy-storage.h
src/policyd/core/tests/core-tests.cpp

index 2bb55e2d186388dd4b6475a6153888738fd82d8c..4e526ae564c9c129c183b9a76a1615477fbaa729 100644 (file)
@@ -39,9 +39,9 @@ std::pair<int, int> PolicyManager::loadProviders(const std::string& path)
                        auto provider = PolicyLoader::load(iter->getPath());
                        DEBUG(DPM, "Loaded provider: " << provider->getName());
                        this->providers.emplace_back(std::move(provider));
-               } catch (const std::exception&) {
+               } catch (const std::exception& e) {
                        ++failed;
-                       ERROR(DPM, "Failed to load: " << iter->getPath());
+                       ERROR(DPM, "Failed to load: " << iter->getPath() << e.what());
                        continue;
                }
 
@@ -72,4 +72,37 @@ int PolicyManager::loadPolicies()
        return global.size() + domain.size();
 }
 
+void PolicyManager::enroll(const std::string& admin, uid_t uid)
+{
+       this->storage.enroll(admin, uid);
+}
+
+void PolicyManager::disenroll(const std::string& admin, uid_t uid)
+{
+       this->storage.disenroll(admin, uid);
+}
+
+void PolicyManager::set(const std::string& policy, const PolicyValue& value,
+                                               const std::string& admin, uid_t uid)
+{
+       storage.update(admin, uid, policy, value);
+
+       if (global.find(policy) != global.end()) {
+               global[policy]->set(value);
+               return;
+       }
+
+       if (domain.find(policy) != domain.end()) {
+               domain[policy]->set(uid, value);
+               return;
+       }
+
+       throw std::runtime_error("Cannot set policy." + policy);
+}
+
+PolicyValue PolicyManager::get(const std::string& policy, uid_t uid)
+{
+       return storage.strictest(policy, uid);
+}
+
 } // namespace policyd
index 07fdedf4e95211e9456c58eb9cc760bcde31cc40..920156546e24d425c2a86ee86a0a51ea78ba9d29 100644 (file)
@@ -17,6 +17,7 @@
 #pragma once
 
 #include <policyd/sdk/policy-provider.h>
+#include <policyd/sdk/policy-value.h>
 
 #include "policy-storage.h"
 
@@ -43,6 +44,14 @@ public:
        std::pair<int, int> loadProviders(const std::string& path);
        int loadPolicies();
 
+       void enroll(const std::string& admin, uid_t uid);
+       void disenroll(const std::string& admin, uid_t uid);
+
+       void set(const std::string& policy, const PolicyValue& value,
+                        const std::string& admin, uid_t uid);
+       PolicyValue get(const std::string& policy, uid_t uid);
+
+
 private:
        explicit PolicyManager() : storage(DB_PATH) {}
        ~PolicyManager() = default;
index b30d5e21f99e3fd7480ed2f14194da9e448e7bbf..6d9cdff4973785bb447e2fab0e7c926d4d1b2b31 100644 (file)
@@ -212,7 +212,7 @@ PolicyValue PolicyStorage::strictest(const std::string& policy, uid_t uid)
        for (auto iter = range.first; iter != range.second; iter++) {
                if (uid != 0) {
                        int ret = getUid(iter->second.aid);
-                       if (ret == -1 || ret != uid)
+                       if (ret == -1 || ret != static_cast<int>(uid))
                                continue;
                }
 
index 20112b546dd043f1265d560a658dc5d8f87e76df..31a67b79de1e8183058b802e5e69aa1ca42c6fc4 100644 (file)
@@ -63,6 +63,7 @@ private:
        std::shared_ptr<klay::database::Connection> database;
 
        /// DB Cache objects
+       /// TODO(Sangwan): add locking mechanism
        std::unordered_map<std::string, PolicyDefinition> definitions;
        std::unordered_map<std::string, Admin> admins;
        std::unordered_multimap<int, ManagedPolicy> managedPolicies;
index d86bc97918124f8d2cf77f802cc612316d76db51..81bd1368f38b8eb1b7bd4fc3e10e76d757a64e65 100644 (file)
@@ -32,3 +32,22 @@ TEST_F(PolicyCoreTests, policy_loader) {
        auto size = manager.loadPolicies();
        EXPECT_TRUE(size > 0);
 }
+
+TEST_F(PolicyCoreTests, policy_set_get) {
+       auto& manager = PolicyManager::instance();
+       manager.enroll("testAdmin", 0);
+       manager.set("bluetooth", PolicyValue(5), "testAdmin", 0);
+
+       auto policy = manager.get("bluetooth", 0);
+       EXPECT_EQ(policy.value, 5);
+
+       manager.enroll("testAdmin1", 0);
+       manager.set("bluetooth", PolicyValue(10), "testAdmin1", 0);
+
+       /// Manager should return the strongest policy.
+       policy = manager.get("bluetooth", 0);
+       EXPECT_EQ(policy.value, 5);
+
+       manager.disenroll("testAdmin", 0);
+       manager.disenroll("testAdmin1", 0);
+}