Implement fetching group ids assigned to a privilege from data base 24/26924/5
authorRafal Krypa <r.krypa@samsung.com>
Fri, 29 Aug 2014 18:27:24 +0000 (20:27 +0200)
committerRafal Krypa <r.krypa@samsung.com>
Mon, 15 Sep 2014 11:51:53 +0000 (13:51 +0200)
Change-Id: I439a710cc203c201426c48866c4ab1d88798dcc7
Signed-off-by: Rafal Krypa <r.krypa@samsung.com>
src/server/db/db.sql
src/server/db/include/privilege_db.h
src/server/db/privilege_db.cpp

index 513a664..2a5475f 100644 (file)
@@ -101,4 +101,13 @@ BEGIN
     DELETE FROM pkg WHERE pkg_id NOT IN (SELECT DISTINCT pkg_id from app);
 END;
 
+DROP VIEW IF EXISTS privilege_gid_view;
+CREATE VIEW privilege_gid_view AS
+SELECT
+    privilege_id,
+    privilege.name as privilege_name,
+    privilege_gid.gid
+FROM privilege_gid
+LEFT JOIN privilege USING (privilege_id);
+
 COMMIT TRANSACTION;
index b508576..4b14771 100644 (file)
@@ -51,6 +51,7 @@ enum class QueryType {
     ERemoveAppPrivileges,
     EPkgIdExists,
     EGetPkgId,
+    EGetPrivilegeGids,
 };
 
 class PrivilegeDb {
@@ -68,6 +69,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::EGetPrivilegeGids, " SELECT gid FROM privilege_gid_view WHERE privilege_name = ?" },
     };
 
     /**
@@ -183,6 +185,16 @@ public:
     void UpdateAppPrivileges(const std::string &appId, uid_t uid,
             const std::vector<std::string> &privileges);
 
+    /**
+     * Retrieve list of group ids assigned to a privilege
+     *
+     * @param privilege - privilege identifier
+     * @param[out] gids - list of group ids assigned to the privilege
+     * @exception DB::SqlConnection::Exception::InternalError on internal error
+     */
+    void GetPrivilegeGids(const std::string &privilege,
+        std::vector<gid_t> &gids);
+
 };
 
 } //namespace SecurityManager
index 32e18b4..4fcce0e 100644 (file)
@@ -238,4 +238,23 @@ void PrivilegeDb::UpdateAppPrivileges(const std::string &appId, uid_t uid,
         }
     });
 }
+
+void PrivilegeDb::GetPrivilegeGids(const std::string &privilege,
+        std::vector<gid_t> &gids)
+{
+   try_catch<void>([&] {
+        DB::SqlConnection::DataCommandAutoPtr command =
+                mSqlConnection->PrepareDataCommand(
+                        Queries.at(QueryType::EGetPrivilegeGids));
+        command->BindString(1, privilege.c_str());
+
+        while (command->Step()) {
+            gid_t gid = static_cast<gid_t>(command->GetColumnInteger(0));
+            LogDebug("Privilege " << privilege << " gives access to gid " << gid);
+            gids.push_back(gid);
+        };
+    });
+}
+
+
 } //namespace SecurityManager