Block the possibility of privilege redefinition 24/128624/3
authorDariusz Michaluk <d.michaluk@samsung.com>
Wed, 10 May 2017 14:12:44 +0000 (16:12 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Fri, 12 May 2017 13:22:20 +0000 (15:22 +0200)
Change-Id: I897915c799ab03ad93d8f9f191ecbd96da885f60

db/db.sql
test/test_privilege_db_app_defined_privileges.cpp

index abc6258..726ddc1 100644 (file)
--- a/db/db.sql
+++ b/db/db.sql
@@ -250,6 +250,10 @@ BEGIN
     WHERE NOT EXISTS (SELECT 1 FROM user_app_pkg_view
                       WHERE uid=NEW.uid AND app_name=NEW.app_name);
 
+    SELECT RAISE(ABORT, 'App defined privilege already defined')
+    WHERE EXISTS (SELECT 1 FROM app_defined_privilege_view
+                  WHERE uid=NEW.uid AND app_name=NEW.app_name AND privilege=NEW.privilege);
+
     INSERT OR IGNORE INTO app_defined_privilege (app_id, uid, privilege, type, license)
     VALUES ((SELECT app_id FROM app WHERE name=NEW.app_name), NEW.uid, NEW.privilege, NEW.type, NEW.license);
 END;
@@ -280,6 +284,10 @@ BEGIN
     WHERE NOT EXISTS (SELECT 1 FROM user_app_pkg_view
                       WHERE uid=NEW.uid AND app_name=NEW.app_name);
 
+    SELECT RAISE(ABORT, 'Client privilege license already defined')
+    WHERE EXISTS (SELECT 1 FROM client_license_view
+                  WHERE uid=NEW.uid AND app_name=NEW.app_name AND privilege=NEW.privilege);
+
     INSERT OR IGNORE INTO client_license (app_id, uid, privilege, license)
     VALUES ((SELECT app_id FROM app WHERE name=NEW.app_name), NEW.uid, NEW.privilege, NEW.license);
 END;
index b1c4a5a..2f3853a 100644 (file)
@@ -97,6 +97,10 @@ BOOST_AUTO_TEST_CASE(T1300_app_defined_privileges)
     // first application defines first privilege
     BOOST_REQUIRE_NO_THROW(testPrivDb->AddAppDefinedPrivilege(app(1), uid(1), privileges[0]));
 
+    // privilege already defined
+    BOOST_REQUIRE_THROW(testPrivDb->AddAppDefinedPrivilege(app(1), uid(1), privileges[0]),
+                        PrivilegeDb::Exception::ConstraintError);
+
     // check non-existing privilege
     std::string appName, license;
     BOOST_REQUIRE_NO_THROW(
@@ -183,6 +187,10 @@ BOOST_AUTO_TEST_CASE(T1400_client_license)
     // first application use first privilege/license
     BOOST_REQUIRE_NO_THROW(testPrivDb->AddClientPrivilege(app(1), uid(1), privilegesA[0].first, privilegesA[0].second));
 
+    // privilege license already defined
+    BOOST_REQUIRE_THROW(testPrivDb->AddClientPrivilege(app(1), uid(1), privilegesA[0].first, privilegesA[1].second),
+                        PrivilegeDb::Exception::ConstraintError);
+
     // check non-existing privilege
     std::string license;
     BOOST_REQUIRE_NO_THROW(testPrivDb->GetLicenseForClientPrivilege(app(1), uid(1), privilegesA[1].first, license));