Add smack-privilege parsing to PolicyConfiguration 83/231683/10
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Thu, 23 Apr 2020 09:46:21 +0000 (11:46 +0200)
committerZofia Abramowska <z.abramowska@samsung.com>
Tue, 28 Apr 2020 17:05:59 +0000 (17:05 +0000)
Change-Id: I9fa0b5b86138725cb9520379e25f71f82a3e43f7

src/security-manager-tests/common/policy_configuration.cpp
src/security-manager-tests/common/policy_configuration.h
src/security-manager-tests/common/template_parser.h

index 64e3b9a..db34767 100644 (file)
@@ -18,6 +18,7 @@
 #include <regex>
 #include <string>
 #include <vector>
+#include <stdexcept>
 
 #include <grp.h>
 #include <sys/types.h>
 
 namespace SecurityManagerTest {
 
+namespace {
+
+PolicyConfiguration::SmackPrivRulesMap parsePrivilegeSmackList() {
+    constexpr char PRIVILEGE[] = "~PRIVILEGE~";
+    PolicyConfiguration::SmackPrivRulesMap privilegeRules;
+
+    std::ifstream templateFile(CONF_DIR "privilege-smack.list");
+
+    if (templateFile.fail())
+        return privilegeRules;
+
+    try {
+        std::string line;
+        while (getline(templateFile, line)) {
+            if (line.empty() || line[0] == '#')
+                continue;
+
+            std::string privilege, label, rulesFileName;
+            std::istringstream stream(line);
+            stream >> privilege >> label >> rulesFileName;
+
+            if (rulesFileName == "default")
+                rulesFileName = "priv-rules-default-template.smack";
+
+            std::ifstream rulesFile(std::string(CONF_DIR) + "privilege-mapping/" + rulesFileName);
+            std::string object, subject, access;
+            while (rulesFile >> subject >> object >> access) {
+                if (object.empty() || subject.empty())
+                    throw std::runtime_error("Malformed rule");
+
+                // ignore
+                if (object.front() != '~' || subject.front() != '~')
+                    continue;
+
+                if (object == PRIVILEGE)
+                    object = label;
+                if (subject == PRIVILEGE)
+                    subject = label;
+                privilegeRules[privilege].emplace_back(std::move(subject),
+                                                       std::move(object),
+                                                       std::move(access));
+            }
+        }
+    } catch (const std::exception&) {
+        privilegeRules.clear();
+    }
+    return privilegeRules;
+}
+
+} // namespace anonymous
+
 gid_t nameToGid(const char *name) {
     struct group entry, *gresult;
     char buffer[1024];
@@ -181,5 +233,10 @@ std::string PolicyConfiguration::getAppRulesFilePath() {
     return CONF_DIR "app-rules-template.smack";
 }
 
+const PolicyConfiguration::SmackPrivRulesMap& PolicyConfiguration::getSmackPrivRulesMap() {
+    const static auto smackPrivRulesMap = parsePrivilegeSmackList();
+    return smackPrivRulesMap;
+}
+
 } // namespace SecurityManagerTest
 
index 3d2c1a0..cd89dc9 100644 (file)
 #include <map>
 #include <string>
 #include <vector>
+#include <unordered_map>
 
 #include <sys/types.h>
 
+#include <template_parser.h>
+
 namespace SecurityManagerTest {
 
 gid_t nameToGid(const char *name);
@@ -32,6 +35,7 @@ public:
     typedef std::vector<std::string> GroupVector;
     typedef std::vector<std::string> PrivVector;
     typedef std::map<std::string, std::string> PrivGroupMap;
+    typedef std::unordered_map<std::string, std::vector<AccessRequest>> SmackPrivRulesMap;
 
     struct UserDescription {
         PrivVector privVector;
@@ -59,6 +63,7 @@ public:
     static bool getIsAskuserEnabled();
     static std::string getPkgRulesFilePath();
     static std::string getAppRulesFilePath();
+    static const SmackPrivRulesMap& getSmackPrivRulesMap();
 
 private:
     UserDescription loadUserDescription(UserType userType);
index 81a3674..a1bad46 100644 (file)
@@ -18,6 +18,8 @@
  * @author      Alicja Kluczek <a.kluczek@samsung.com>
  * @brief       Parsing function for smack rules templates
  */
+#pragma once
+
 #include <vector>
 #include <string>