Provide support for loading privilege-group mapping 67/36467/1
authorRafal Krypa <r.krypa@samsung.com>
Fri, 6 Mar 2015 17:22:14 +0000 (18:22 +0100)
committerRafal Krypa <r.krypa@samsung.com>
Fri, 6 Mar 2015 17:22:14 +0000 (18:22 +0100)
A mapping file in policy/privilege-group.list will be contained in
security-manager-policy package. All mappings from that file will be loaded
during package installation by security-manager-policy-reload tool.
For development purposes it is also possible to modify the mapping file
on the image and re-run security-manager-policy-reload.

Change-Id: I9a7d5b16888de98013da281978e299c5b19750ce
Signed-off-by: Rafal Krypa <r.krypa@samsung.com>
db/db.sql
policy/CMakeLists.txt
policy/privilege-group.list [new file with mode: 0644]
policy/security-manager-policy-reload
src/common/include/privilege_db.h

index e9ca886..fd3e084 100644 (file)
--- a/db/db.sql
+++ b/db/db.sql
@@ -37,8 +37,8 @@ FOREIGN KEY (privilege_id) REFERENCES privilege (privilege_id)
 
 CREATE TABLE IF NOT EXISTS privilege_group (
 privilege_id INTEGER NOT NULL,
-name VARCHAR NOT NULL,
-PRIMARY KEY (privilege_id, name),
+group_name VARCHAR NOT NULL,
+PRIMARY KEY (privilege_id, group_name),
 FOREIGN KEY (privilege_id) REFERENCES privilege (privilege_id)
 );
 
@@ -106,8 +106,16 @@ CREATE VIEW privilege_group_view AS
 SELECT
     privilege_id,
     privilege.name as privilege_name,
-    privilege_group.name
+    privilege_group.group_name
 FROM privilege_group
 LEFT JOIN privilege USING (privilege_id);
 
+DROP TRIGGER IF EXISTS privilege_group_view_insert_trigger;
+CREATE TRIGGER privilege_group_view_insert_trigger
+INSTEAD OF INSERT ON privilege_group_view
+BEGIN
+    INSERT OR IGNORE INTO privilege(name) VALUES (NEW.privilege_name);
+    INSERT OR IGNORE INTO privilege_group(privilege_id, group_name) VALUES ((SELECT privilege_id FROM privilege WHERE name=NEW.privilege_name), NEW.group_name);
+END;
+
 COMMIT TRANSACTION;
index 32d6ee6..bd08edc 100644 (file)
@@ -1,4 +1,5 @@
 FILE(GLOB USERTYPE_POLICY_FILES usertype-*.profile)
 INSTALL(FILES ${USERTYPE_POLICY_FILES} DESTINATION ${SHARE_INSTALL_PREFIX}/security-manager/policy)
 INSTALL(FILES "app-rules-template.smack" DESTINATION ${SHARE_INSTALL_PREFIX}/security-manager/policy)
+INSTALL(FILES "privilege-group.list" DESTINATION ${SHARE_INSTALL_PREFIX}/security-manager/policy)
 INSTALL(PROGRAMS security-manager-policy-reload DESTINATION ${BIN_INSTALL_DIR})
diff --git a/policy/privilege-group.list b/policy/privilege-group.list
new file mode 100644 (file)
index 0000000..d679d0c
--- /dev/null
@@ -0,0 +1,6 @@
+# Configuration of groups assignment to privileges.
+# Run security-manager-policy-reload to apply.
+# Format:
+# - each line of "<PRIVILEGE> <GROUP>" describes single mapping
+# - privilege and group separated by white spaces
+# - lines starting with '#' are ignored
index d15cec5..5a78f2d 100755 (executable)
@@ -1,6 +1,8 @@
 #!/bin/sh -e
 
-USERTYPE_POLICY_PATH=/usr/share/security-manager/policy
+POLICY_PATH=/usr/share/security-manager/policy
+PRIVILEGE_GROUP_MAPPING=$POLICY_PATH/privilege-group.list
+DB_FILE=`tzplatform-get TZ_SYS_DB | cut -d= -f2`/.security-manager.db
 
 # Create default buckets
 while read bucket default_policy
@@ -28,7 +30,7 @@ PRIVACY_MANAGER MAIN
 END
 
 # Import user-type policies
-find "$USERTYPE_POLICY_PATH" -name "usertype-*.profile" |
+find "$POLICY_PATH" -name "usertype-*.profile" |
 while read file
 do
     bucket="`echo $file | sed -r 's|.*/usertype-(.*).profile$|USER_TYPE_\U\1|'`"
@@ -56,3 +58,15 @@ for client in User System
 do
     cyad --set-policy --bucket=MAIN --client="$client" --user="*" --privilege="*" --type=ALLOW
 done
+
+# Load privilege-group mappings
+(
+echo "BEGIN;"
+echo "DELETE FROM privilege_group;"
+grep -v '^#' "$PRIVILEGE_GROUP_MAPPING" |
+while read privilege group
+do
+    echo "INSERT INTO privilege_group_view (privilege_name, group_name) VALUES ('$privilege', '$group');"
+done
+echo "COMMIT;"
+) | sqlite3 "$DB_FILE"
index cf8bdcf..4d73d90 100644 (file)
@@ -80,7 +80,7 @@ private:
         { QueryType::ERemoveAppPrivileges, "DELETE FROM app_privilege_view WHERE app_name=? AND uid=?" },
         { QueryType::EPkgIdExists, "SELECT * FROM pkg WHERE name=?" },
         { QueryType::EGetPkgId, " SELECT pkg_name FROM app_pkg_view WHERE app_name = ?" },
-        { QueryType::EGetPrivilegeGroups, " SELECT name FROM privilege_group_view WHERE privilege_name = ?" },
+        { QueryType::EGetPrivilegeGroups, " SELECT group_name FROM privilege_group_view WHERE privilege_name = ?" },
         { QueryType::EGetUserApps, "SELECT name FROM app WHERE uid=?" },
         { QueryType::EGetAppsInPkg, " SELECT app_name FROM app_pkg_view WHERE pkg_name = ?" },
     };