Basic re-implement allowed_package_handler
authorJunghyun Yeon <jungh.yeon@samsung.com>
Mon, 10 May 2021 02:10:59 +0000 (11:10 +0900)
committer연정현/Tizen Platform Lab(SR)/Staff Engineer/삼성전자 <jungh.yeon@samsung.com>
Mon, 10 May 2021 07:28:23 +0000 (16:28 +0900)
- required-privileges element should be located under allowed-packages.

Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/rpk_manifest_handlers/allowed_package_handler.cc
src/rpk_manifest_handlers/allowed_package_handler.h
test/unit_tests/test_rpk_manifest_handlers.cc

index fdca06e..5962343 100755 (executable)
@@ -22,20 +22,43 @@ namespace {
 const char kAllowedPackageKey[] = "manifest.allowed-package";
 const char kAllowedPackageIdKey[] = "@id";
 
+const char kRequiredPrivilegesKey[] = "required-privileges";
+const char kPrivilegeKey[] = "privilege";
+const char kPrivilegeTextKey[] = "#text";
+const char kPrivilegeTypeKey[] = "@type";
+const char kPrivilegeTypeDefault[] = "rpk";
+
 }  // namespace
 
 bool AllowedPackageHandler::Parse(
     const parser::Manifest& manifest,
     std::shared_ptr<parser::ManifestData>* output,
     std::string* /*error*/) {
-  auto data = std::make_shared<AllowedPackageInfo>();
+  auto data_list = std::make_shared<AllowedPackageInfoList>();
   for (auto& allowed_package_dict :
       parser::GetOneOrMany(manifest.value(), kAllowedPackageKey, "")) {
+    auto data = std::make_shared<AllowedPackageInfo>();
     std::string id;
     allowed_package_dict->GetString(kAllowedPackageIdKey, &id);
-    data->Add(id);
+    data->set_pkgid(id);
+
+    for (auto& required_privileges_dict :
+        parser::GetOneOrMany(allowed_package_dict, kRequiredPrivilegesKey, "")) {
+      for (auto& privilege_dict :
+          parser::GetOneOrMany(required_privileges_dict, kPrivilegeKey, "")) {
+        std::string privilege;
+        std::string type = kPrivilegeTypeDefault;
+        if (!privilege_dict->GetString(kPrivilegeTextKey, &privilege) ||
+            privilege.empty())
+          continue;
+        privilege_dict->GetString(kPrivilegeTypeKey, &type);
+        data->add_privilege(privilege, type);
+      }
+    }
+
+    data_list->Add(data);
   }
-  *output = std::static_pointer_cast<parser::ManifestData>(data);
+  *output = std::static_pointer_cast<parser::ManifestData>(data_list);
   return true;
 }
 
index 9db768c..fb7df8b 100755 (executable)
@@ -19,16 +19,42 @@ class AllowedPackageInfo : public parser::ManifestData {
  public:
   static std::string Key();
 
-  const std::vector<std::string>& allowed_packages() const {
+  void set_pkgid(std::string pkgid) {
+    pkgid_ = std::move(pkgid);
+  }
+
+  void add_privilege(const std::string& privilege, const std::string& type) {
+    privileges_.insert(std::make_pair(privilege, type));
+  }
+
+  const std::string& get_pkgid() const {
+    return pkgid_;
+  }
+
+  const std::set<std::pair<std::string, std::string>>& get_privileges() const {
+    return privileges_;
+  }
+
+ private:
+  std::string pkgid_;
+  std::set<std::pair<std::string, std::string>> privileges_;
+};
+
+
+class AllowedPackageInfoList : public parser::ManifestData {
+ public:
+  static std::string Key();
+
+  const std::vector<std::shared_ptr<AllowedPackageInfo>>& allowed_packages() const {
     return allowed_packages_;
   }
 
-  void Add(const std::string& id) {
-    allowed_packages_.push_back(id);
+  void Add(std::shared_ptr<AllowedPackageInfo> data) {
+    allowed_packages_.push_back(std::move(data));
   }
 
  private:
-  std::vector<std::string> allowed_packages_;
+  std::vector<std::shared_ptr<AllowedPackageInfo>> allowed_packages_;
 };
 
 /**
index 6a7f5bd..0e41b49 100644 (file)
@@ -65,12 +65,12 @@ TEST_F(RpkManifestHandlerTest, PkgInfoParsing) {
   EXPECT_EQ(dep.pkgid(), "org.tizen.testid");
   EXPECT_EQ(dep.type(), "wants");
 
-  std::shared_ptr<const rpk::parse::AllowedPackageInfo> allowed_pkg_info =
-      std::static_pointer_cast<const rpk::parse::AllowedPackageInfo>(
+  std::shared_ptr<const rpk::parse::AllowedPackageInfoList> allowed_pkg_list =
+      std::static_pointer_cast<const rpk::parse::AllowedPackageInfoList>(
           parser->GetManifestData(kAllowedPackageKey));
-  EXPECT_NE(allowed_pkg_info, nullptr);
-  EXPECT_EQ(allowed_pkg_info->allowed_packages().size(), 3);
-  const auto& allowed_pkg_id = allowed_pkg_info->allowed_packages().at(0);
+  EXPECT_NE(allowed_pkg_list, nullptr);
+  EXPECT_EQ(allowed_pkg_list->allowed_packages().size(), 3);
+  const auto& allowed_pkg_id = allowed_pkg_list->allowed_packages().at(0)->get_pkgid();
   EXPECT_EQ(allowed_pkg_id, "org.tizen.testuser");
 }