Change requiredPrivileges members to optional
authorChanggyu Choi <changyu.choi@samsung.com>
Mon, 28 Apr 2025 08:31:07 +0000 (17:31 +0900)
committerChanggyu Choi <changyu.choi@samsung.com>
Mon, 28 Apr 2025 08:31:07 +0000 (17:31 +0900)
Action schemas may not have requiredPrivileges.

Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
src/common/action_schema.cc
src/pkgmgr_plugin_parser/json_action_schema_parser.cc
test/unit_tests/action_schema_test.cc

index 565642e60cfcc7477e1eb3b4ef33789e6f3e233b..03e1692a20d08244ffaeca4f2add7bc95bcac037 100644 (file)
@@ -90,8 +90,13 @@ ActionSchema::ActionSchema(const std::string& json_str) {
       returns_.emplace_back(name, type, "", description, false);
     }
 
-    for (auto const& it : root.array("requiredPrivileges"))
-      privileges_.push_back(it->GetString());
+    try {
+      for (auto const& it : root.array("requiredPrivileges"))
+        privileges_.push_back(it->GetString());
+    } catch (const std::runtime_error& e) {
+      // optional
+      privileges_.clear();
+    }
 
     // details
     switch (type_) {
index bce1099925fadab15361115fa329462180af467d..ecd9cce4915aa79206a55dab34ba2747a0a9afba 100644 (file)
@@ -36,12 +36,20 @@ ActionSchema JsonActionSchemaParser::Parse(const std::string& pkgid,
   common::SafeJson root(json);
   std::string name = root.get<std::string>("name");
   std::string category = root.get<std::string>("category");
-  const auto priv_array = root.array("requiredPrivileges");
   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->GetString(); });
+
+  try {
+    const auto priv_array = root.array("requiredPrivileges");
+    privs.reserve(priv_array.size());
+    std::transform(priv_array.begin(), priv_array.end(),
+                   std::back_inserter(privs),
+                   [](const auto& priv) { return priv->GetString(); });
+  } catch (const std::runtime_error& e) {
+    // optional
+    LOG(WARNING) << "No required privileges found for action: " << name;
+    privs.clear();
+  }
+
   LOG(DEBUG) << "Parased action for pkgid[ " << pkgid << " ] : " << name;
   LOG(DEBUG) << json;
 
index 29e14e6d8cedee9e720ec106ac58e4233c68a5ce..f08be2f435636c2e870dd06836cf46db4c15fc12 100644 (file)
@@ -29,7 +29,6 @@ class ActionSchemaTest : public ::testing::Test {
               "desc": "Return 1"
             }
           },
-          "requiredPrivileges": ["priv1", "priv2"],
           "details": {
             "appid": "com.example.app"
           }
@@ -89,9 +88,7 @@ TEST_F(ActionSchemaTest, ValidAppControlActionJsonParsing) {
   EXPECT_EQ(returns[0].GetType(), ParameterType::NumberType);
 
   const auto& privileges = schema.GetPrivileges();
-  EXPECT_EQ(privileges.size(), 2);
-  EXPECT_EQ(privileges[0], "priv1");
-  EXPECT_EQ(privileges[1], "priv2");
+  EXPECT_EQ(privileges.size(), 0);
 }
 
 TEST_F(ActionSchemaTest, ValidPluginActionJsonParsing) {