Add parsing required-privileges
authorSangyoon Jang <jeremy.jang@samsung.com>
Fri, 18 Apr 2025 02:04:38 +0000 (11:04 +0900)
committer장상윤/Tizen Platform Lab(SR)/삼성전자 <jeremy.jang@samsung.com>
Fri, 18 Apr 2025 04:21:10 +0000 (13:21 +0900)
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/pkgmgr_plugin_parser/action_schema.hh
src/pkgmgr_plugin_parser/json_action_schema_parser.cc
src/pkgmgr_plugin_parser/sqlite_db.cc
src/pkgmgr_plugin_parser/sqlite_db.hh

index a1c0af52ce3932684d1c3fd21142753cc3bd542f..bfe9a1a1be8201b80a2f6cc5dcf7cf2ed2e4082b 100644 (file)
 
 #include <string>
 #include <utility>
+#include <vector>
 
 namespace parser {
 
 class ActionSchema {
  public:
   explicit ActionSchema(std::string pkgid, std::string name,
-      std::string category, std::string json_str)
+      std::string category, std::vector<std::string> privileges,
+      std::string json_str)
       : pkgid_(std::move(pkgid)), name_(std::move(name)),
-        category_(std::move(category)), json_str_(std::move(json_str)) {}
+        category_(std::move(category)), privielges_(std::move(privileges)),
+        json_str_(std::move(json_str)) {}
   ActionSchema() = default;
   ~ActionSchema() = default;
 
   std::string GetPkgId() const { return pkgid_; }
   std::string GetName() const { return name_; }
   std::string GetCategory() const { return category_; }
+  std::vector<std::string> GetPrivileges() const { return privielges_; }
   std::string GetJsonStr() const { return json_str_; }
 
  private:
   std::string pkgid_;
   std::string name_;
   std::string category_;
+  std::vector<std::string> privielges_;
   std::string json_str_;
 };
 
index d24c980e3d267e9adea94c8b2640fd5088fe31d1..df7d4e1a5d29b1757d95fa36fe5030d32481a975 100644 (file)
 
 #include <json/json.h>
 
+#include <algorithm>
 #include <fstream>
 #include <string>
+#include <vector>
 
 #include "common/utils/logging.hh"
 #include "pkgmgr_plugin_parser/action_schema.hh"
@@ -53,12 +55,18 @@ ActionSchema JsonActionSchemaParser::Parse(const std::string& pkgid,
   // TODO
   std::string name = root["name"].asString();
   std::string category = root["category"].asString();
+  const auto priv_array = root["required-privileges"];
+  std::vector<std::string> privs;
+  privs.reserve(priv_array.size());
+  std::transform(priv_array.begin(), priv_array.end(),
+      std::back_inserter(privs),
+      [](const auto& priv) { return priv.asString(); });
   std::string json_str = JsonToString(root);
 
   LOG(DEBUG) << "Parased action for pkgid[ " << pkgid << " ] : " << name;
   LOG(DEBUG) << json_str;
 
-  return ActionSchema(pkgid, name, category, json_str);
+  return ActionSchema(pkgid, name, category, privs, json_str);
 }
 
 }  // namespace parser
index 9b688c9a2e8e861f3de24dec6ca34e5abf442b34..0f88e3373237d3299fab578d14949f2469503f44 100644 (file)
@@ -30,6 +30,13 @@ constexpr char kCreateActionTableQuery[] =
     "  category    TEXT,\n"
     "  json_str    TEXT,\n"
     "  PRIMARY KEY (pkgid, action_name))";
+constexpr char kCreatePrivilegeTableQuery[] =
+    "CREATE TABLE IF NOT EXISTS privilege (\n"
+    "  pkgid       TEXT,\n"
+    "  action_name TEXT,\n"
+    "  privilege   TEXT,\n"
+    "  PRIMARY KEY (pkgid, action_name, privilege)\n"
+    "  FOREIGN KEY (pkgid, action_name) REFERENCES action (pkgid, action_name) ON DELETE CASCADE)";
 constexpr char kInsertQuery[] =
     "INSERT INTO action (pkgid, action_name, category, json_str) "
     "VALUES (?, ?, ?, ?)";
@@ -37,6 +44,8 @@ constexpr char kDeleteQuery[] =
     "DELETE FROM action WHERE pkgid = ?";
 constexpr char kSelectQuery[] =
     "SELECT json_str FROM action WHERE pkgid = ?";
+constexpr char kInsertPrivQuery[] =
+    "INSERT INTO privilege (pkgid, action_name, privilege) VALUES (?, ?, ?)";
 
 }  // namespace
 
@@ -44,8 +53,11 @@ namespace parser {
 
 SqliteDb::SqliteDb()
     : conn_(kDbPath, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) {
+  conn_.OneStepExec({ "PRAGMA foreign_keys=ON" });
   if (!static_cast<bool>(conn_.Exec({ kCreateActionTableQuery })))
     LOG(ERROR) << "Failed to create action table";
+  if (!static_cast<bool>(conn_.Exec({ kCreatePrivilegeTableQuery })))
+    LOG(ERROR) << "Failed to create privilege table";
 }
 
 bool SqliteDb::Install(const std::string& pkgid, const std::vector<ActionSchema>& schemas) {
@@ -63,6 +75,9 @@ bool SqliteDb::Install(const std::string& pkgid, const std::vector<ActionSchema>
             << ", error: " << static_cast<const char*>(result);
         return false;
       }
+
+      if (!InsertPrivileges(pkgid, schema.GetName(), schema.GetPrivileges()))
+        return false;
     }
   } catch (const tizen_base::DbException& e) {
     LOG(ERROR) << "Exception occurred: " << e.what();
@@ -97,6 +112,9 @@ bool SqliteDb::Update(const std::string& pkgid, const std::vector<ActionSchema>&
             << ", error: " << static_cast<const char*>(result);
         return false;
       }
+
+      if (!InsertPrivileges(pkgid, schema.GetName(), schema.GetPrivileges()))
+        return false;
     }
   } catch (const tizen_base::DbException& e) {
     LOG(ERROR) << "Exception occurred: " << e.what();
@@ -124,4 +142,28 @@ bool SqliteDb::Uninstall(const std::string& pkgid) {
   return true;
 }
 
+bool SqliteDb::InsertPrivileges(const std::string& pkgid,
+    const std::string& action_name,
+    const std::vector<std::string>& privileges) {
+  try {
+    auto sql = tizen_base::Database::Sql(kInsertPrivQuery);
+    for (const auto& priv : privileges) {
+      sql.Reset()
+          .Bind(pkgid)
+          .Bind(action_name)
+          .Bind(priv);
+      auto result = conn_.Exec(sql);
+      if (!result) {
+        LOG(ERROR) << "Failed to insert privileges: " << action_name
+            << ", error: " << static_cast<const char*>(result);
+        return false;
+      }
+    }
+  } catch (const tizen_base::DbException& e) {
+    LOG(ERROR) << "Exception occurred: " << e.what();
+    return false;
+  }
+  return true;
+}
+
 }  // namespace parser
index 0211b38fc692a7b2c5f25c3ca9ed9b7775d3260f..ccbc070099d0cff0b0da735060c38be9b452bc97 100644 (file)
@@ -37,6 +37,10 @@ class SqliteDb : public IActionRegistry {
   bool Uninstall(const std::string& pkgid) override;
 
  private:
+  bool InsertPrivileges(const std::string& pkgid,
+      const std::string& action_name,
+      const std::vector<std::string>& privileges);
+
   tizen_base::Database conn_;
 };