Add appdefined privilege feature 28/136928/25
authorjongmyeongko <jongmyeong.ko@samsung.com>
Mon, 3 Jul 2017 13:22:27 +0000 (22:22 +0900)
committerjongmyeongko <jongmyeong.ko@samsung.com>
Thu, 27 Jul 2017 11:29:25 +0000 (20:29 +0900)
1. for consumer
<privileges>
<privilege/>
<privilege/>
<appdefined-privilege license="{path}">http://{pkgid}/appdefined/{user-defined}</>
<appdefined-privilege license="{path}">http://{pkgid}/appdefined/{user-defined}</>
</privileges>

2. for provider
<provides-appdefined-privileges>
<appdefined-privilege license="{path}">http://{pkgid}/appdefined/{user-defined}</>
<appdefined-privilege license="{path}">http://{pkgid}/appdefined/{user-defined}</>
</provides-appdefined-privileges>

How to verify :
1. install tpk-backend-tests rpm
2. run /usr/bin/tpk-backend-ut/manifest-test

Change-Id: Ibd2418b16bb5d45277d0aac32d4c4f9e7f0e3c49
Signed-off-by: jongmyeongko <jongmyeong.ko@samsung.com>
src/tpk_manifest_handlers/application_manifest_constants.cc
src/tpk_manifest_handlers/application_manifest_constants.h
src/tpk_manifest_handlers/common/appdefined_privilege_handler.cc [new file with mode: 0644]
src/tpk_manifest_handlers/common/appdefined_privilege_handler.h [new file with mode: 0644]
src/tpk_manifest_handlers/privileges_handler.cc
src/tpk_manifest_handlers/privileges_handler.h
src/tpk_manifest_handlers/provides_appdefined_privileges_handler.cc [new file with mode: 0644]
src/tpk_manifest_handlers/provides_appdefined_privileges_handler.h [new file with mode: 0644]
src/tpk_manifest_handlers/tpk_config_parser.cc

index 5561557d3e1bf6aa4493c3ffa1140942ac0b3346..65d464bcde95114c0f6e144f685cb101c7935972 100644 (file)
@@ -13,6 +13,10 @@ const char kManifestKey[] = "manifest";
 // privileges
 const char kPrivilegesKey[] = "manifest.privileges";
 
+// provides appdefined privileges
+const char kProvidesAppDefinedPrivilegesKey[] =
+    "manifest.provides-appdefined-privileges";
+
 // service-application
 const char kServiceApplicationKey[] = "manifest.service-application";
 
index 901b3feb8de3f514b4865d222dca5d1552ad3c66..eb1c3c171190709ae97ac5d4817cd13520eeac16 100644 (file)
@@ -15,6 +15,9 @@ extern const char kManifestKey[];
 // privileges
 extern const char kPrivilegesKey[];
 
+// provides appdefined privileges
+extern const char kProvidesAppDefinedPrivilegesKey[];
+
 // service-application
 extern const char kServiceApplicationKey[];
 
diff --git a/src/tpk_manifest_handlers/common/appdefined_privilege_handler.cc b/src/tpk_manifest_handlers/common/appdefined_privilege_handler.cc
new file mode 100644 (file)
index 0000000..fba7753
--- /dev/null
@@ -0,0 +1,71 @@
+// Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+// Use of this source code is governed by an apache 2.0 license that can be
+// found in the LICENSE file.
+
+#include "tpk_manifest_handlers/common/appdefined_privilege_handler.h"
+
+#include <utility>
+
+#include "manifest_parser/manifest_util.h"
+#include "manifest_parser/utils/iri_util.h"
+#include "manifest_parser/utils/logging.h"
+#include "manifest_parser/values.h"
+#include "tpk_manifest_handlers/application_manifest_constants.h"
+#include "tpk_manifest_handlers/package_handler.h"
+
+namespace {
+
+const char kAppDefinedPrivilegeKey[] = "appdefined-privilege";
+const char kPrivilegeTextKey[] = "#text";
+const char kPrivilegeTypeKey[] = "@type";
+const char kPrivilegeLicenseKey[] = "@license";
+const char kPrivilegeTypeDefault[] = "tpk";
+const unsigned int kMaxAppDefinedLength = 512;
+
+}  // namespace
+
+namespace tpk {
+namespace parse {
+
+bool ParseAppDefinedPrivilege(const parser::DictionaryValue* value,
+  std::shared_ptr<AppDefinedPrivilegeInfo> info, std::string*) {
+  std::string privilege;
+  std::string type = kPrivilegeTypeDefault;
+  std::string license;
+  if (!value->GetString(kPrivilegeTextKey, &privilege) ||
+      privilege.empty())
+    return true;
+  value->GetString(kPrivilegeTypeKey, &type);
+  value->GetString(kPrivilegeLicenseKey, &license);
+  AppDefinedPrivilegeSingleEntry appdef_entry;
+  appdef_entry.privilege = privilege;
+  appdef_entry.type = type;
+  appdef_entry.license = license;
+  info->SetAppDefinedPrivilege(appdef_entry);
+  return true;
+}
+
+bool AppDefinedPrivilegeValidation(const AppDefinedPrivilegeInfo& info,
+    std::string package_name, std::string* error) {
+  auto priv = info.GetAppDefinedPrivilege();
+  if (priv.privilege.length() > kMaxAppDefinedLength ||
+      priv.license.length() > kMaxAppDefinedLength) {
+    *error = "The length is not valid.";
+    return false;
+  }
+  if (!parser::utils::IsValidIRI(priv.privilege)) {
+    *error = "The privilege is not valid IRI.";
+    return false;
+  }
+  std::string tmpstr("http://" + package_name + "/appdefined/");
+  std::size_t found = priv.privilege.find(tmpstr);
+  if (found == std::string::npos || found != 0) {
+    *error = "The privilege is not valid prefix.";
+    LOG(ERROR) << "Invalid prefix, pos(" << found << ")";
+    return false;
+  }
+  return true;
+}
+
+}  // namespace parse
+}  // namespace tpk
diff --git a/src/tpk_manifest_handlers/common/appdefined_privilege_handler.h b/src/tpk_manifest_handlers/common/appdefined_privilege_handler.h
new file mode 100644 (file)
index 0000000..bc6e8b4
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+// Use of this source code is governed by an apache 2.0 license that can be
+// found in the LICENSE file.
+
+#ifndef TPK_MANIFEST_HANDLERS_COMMON_APPDEFINED_PRIVILEGE_HANDLER_H_
+#define TPK_MANIFEST_HANDLERS_COMMON_APPDEFINED_PRIVILEGE_HANDLER_H_
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "manifest_parser/manifest_handler.h"
+#include "manifest_parser/values.h"
+
+namespace tpk {
+namespace parse {
+
+struct AppDefinedPrivilegeSingleEntry {
+  std::string privilege;
+  std::string type;
+  std::string license;  // path of license
+};
+
+class AppDefinedPrivilegeInfo : public parser::ManifestData {
+ public:
+  /**
+   * @brief GetAppDefinedPrivilege
+   * @return AppDefinedPrivilegeSingleEntry
+   */
+  const AppDefinedPrivilegeSingleEntry& GetAppDefinedPrivilege() const {
+    return appdefined_privilege_;
+  }
+
+  /**
+   * @brief AddAppDefinedPrivilege add appdefined privilege
+   * @param AppDefinedPrivilegeSingleEntry
+   */
+  void SetAppDefinedPrivilege(AppDefinedPrivilegeSingleEntry appdef_entry) {
+    appdefined_privilege_ = appdef_entry;
+  }
+
+ private:
+  AppDefinedPrivilegeSingleEntry appdefined_privilege_;
+};
+
+bool ParseAppDefinedPrivilege(const parser::DictionaryValue* value,
+    std::shared_ptr<AppDefinedPrivilegeInfo> info, std::string* error);
+
+bool AppDefinedPrivilegeValidation(const AppDefinedPrivilegeInfo& info,
+    std::string package_name, std::string* error);
+
+}  // namespace parse
+}  // namespace tpk
+
+#endif  // TPK_MANIFEST_HANDLERS_COMMON_APPDEFINED_PRIVILEGE_HANDLER_H_
index df4cc4175f060d9de67ec8988f8c634e4f996c06..512591adcc8610336dc5c5c64b7ed586a5eabf96 100644 (file)
@@ -11,6 +11,7 @@
 #include "manifest_parser/utils/logging.h"
 #include "manifest_parser/values.h"
 #include "tpk_manifest_handlers/application_manifest_constants.h"
+#include "tpk_manifest_handlers/package_handler.h"
 
 namespace tpk {
 namespace parse {
@@ -21,6 +22,7 @@ namespace {
 
 const char kPrivilegesKey[] = "manifest.privileges";
 const char kPrivilegeKey[] = "privilege";
+const char kAppDefinedPrivilegeKey[] = "appdefined-privilege";
 const char kPrivilegeTextKey[] = "#text";
 const char kPrivilegeTypeKey[] = "@type";
 
@@ -50,10 +52,39 @@ bool PrivilegesHandler::Parse(
     item->GetString(kPrivilegeTypeKey, &type);
     privileges_info->AddPrivilege(privilege, type);
   }
+  for (auto& item : parser::GetOneOrMany(privileges_dict,
+      kAppDefinedPrivilegeKey, "")) {
+    std::shared_ptr<AppDefinedPrivilegeInfo> appdef_info(
+        new AppDefinedPrivilegeInfo());
+    if (!ParseAppDefinedPrivilege(item, appdef_info, error))
+      return false;
+    privileges_info->AddAppDefinedPrivilegeInfo(*appdef_info.get());
+  }
+
   *output = std::static_pointer_cast<parser::ManifestData>(privileges_info);
   return true;
 }
 
+bool PrivilegesHandler::Validate(
+    const parser::ManifestData& data,
+    const parser::ManifestDataMap& handlers_output,
+    std::string* error) const {
+  std::shared_ptr<const PackageInfo> package_info =
+      std::static_pointer_cast<const PackageInfo>(
+          handlers_output.find(PackageInfo::key())->second);
+  const PrivilegesInfo& privileges_info =
+      static_cast<const PrivilegesInfo&>(data);
+  auto appdef_privileges = privileges_info.GetAppDefinedPrivilegeInfoList();
+  for (auto priv : appdef_privileges) {
+    const AppDefinedPrivilegeInfo& info =
+      static_cast<const AppDefinedPrivilegeInfo&>(priv);
+    if (!AppDefinedPrivilegeValidation(info, package_info->package(), error))
+      return false;
+  }
+
+  return true;
+}
+
 std::string PrivilegesInfo::key() {
   return kPrivilegesKey;
 }
index 92c0f8f2df13122c4efbdd95e926f86d32bf9479..034254243633c103eb7df5924070f01e06a7f176 100644 (file)
@@ -15,6 +15,7 @@
 #include "manifest_parser/permission_types.h"
 #include "manifest_parser/values.h"
 #include "tpk_manifest_handlers/application_manifest_constants.h"
+#include "tpk_manifest_handlers/common/appdefined_privilege_handler.h"
 
 namespace tpk {
 namespace parse {
@@ -42,9 +43,25 @@ class PrivilegesInfo : public parser::ManifestData {
   void AddPrivilege(const std::string& privilege, const std::string& type) {
     privileges_.insert(std::make_pair(privilege, type));
   }
+  /**
+   * @brief GetAppDefinedPrivilegeInfoList
+   * @return std::vector<AppDefinedPrivilegeInfo>
+   */
+  const std::vector<AppDefinedPrivilegeInfo> GetAppDefinedPrivilegeInfoList()
+     const {
+    return appdefined_info_list_;
+  }
+  /**
+   * @brief AddAppDefinedPrivilegeInfo
+   * @param AppDefinedPrivilegeInfo
+   */
+  void AddAppDefinedPrivilegeInfo(AppDefinedPrivilegeInfo info) {
+    appdefined_info_list_.push_back(std::move(info));
+  }
 
  private:
   PrivilegesSet privileges_;
+  std::vector<AppDefinedPrivilegeInfo> appdefined_info_list_;
 };
 
 /**
@@ -53,6 +70,7 @@ class PrivilegesInfo : public parser::ManifestData {
  * Handler of tizen-manifest.xml for xml elements:
  *  <privileges>
  *  \_  <privilege>
+ *  \_  <appdefined-privilege>
  */
 class PrivilegesHandler : public parser::ManifestHandler {
  public:
@@ -60,6 +78,10 @@ class PrivilegesHandler : public parser::ManifestHandler {
       const parser::Manifest& manifest,
       std::shared_ptr<parser::ManifestData>* output,
       std::string* error) override;
+  bool Validate(
+      const parser::ManifestData& data,
+      const parser::ManifestDataMap& handlers_output,
+      std::string* error) const override;
   std::string Key() const override;
 };
 
diff --git a/src/tpk_manifest_handlers/provides_appdefined_privileges_handler.cc b/src/tpk_manifest_handlers/provides_appdefined_privileges_handler.cc
new file mode 100644 (file)
index 0000000..128882d
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+// Use of this source code is governed by an apache 2.0 license that can be
+// found in the LICENSE file.
+
+#include "tpk_manifest_handlers/provides_appdefined_privileges_handler.h"
+
+#include <utility>
+
+#include "manifest_parser/manifest_util.h"
+#include "manifest_parser/utils/logging.h"
+#include "manifest_parser/values.h"
+#include "tpk_manifest_handlers/application_manifest_constants.h"
+#include "tpk_manifest_handlers/package_handler.h"
+
+namespace {
+
+const char kProvidesAppDefinedPrivilegesKey[] =
+    "manifest.provides-appdefined-privileges";
+const char kAppDefinedPrivilegeKey[] = "appdefined-privilege";
+
+}  // namespace
+
+namespace tpk {
+namespace parse {
+
+bool ProvidesAppDefinedPrivilegesHandler::Parse(
+    const parser::Manifest& manifest,
+    std::shared_ptr<parser::ManifestData>* output,
+    std::string* error) {
+  parser::Value* value = nullptr;
+  if (!manifest.Get(kProvidesAppDefinedPrivilegesKey, &value))
+    return true;
+  parser::DictionaryValue* dict = nullptr;
+  if (!value->GetAsDictionary(&dict)) {
+    *error = "Failed to parse <provides-appdefined-privileges> tag";
+    return false;
+  }
+  std::shared_ptr<ProvidesAppDefinedPrivilegesInfo> privileges_info(
+      new ProvidesAppDefinedPrivilegesInfo());
+  for (auto& item : parser::GetOneOrMany(dict, kAppDefinedPrivilegeKey, "")) {
+    std::shared_ptr<AppDefinedPrivilegeInfo> appdef_info(
+        new AppDefinedPrivilegeInfo());
+    if (!ParseAppDefinedPrivilege(item, appdef_info, error))
+      return false;
+    privileges_info->AddAppDefinedPrivilegeInfo(*appdef_info.get());
+  }
+
+  *output = std::static_pointer_cast<parser::ManifestData>(privileges_info);
+  return true;
+}
+
+bool ProvidesAppDefinedPrivilegesHandler::Validate(
+    const parser::ManifestData& data,
+    const parser::ManifestDataMap& handlers_output,
+    std::string* error) const {
+  std::shared_ptr<const PackageInfo> package_info =
+      std::static_pointer_cast<const PackageInfo>(
+          handlers_output.find(PackageInfo::key())->second);
+  const ProvidesAppDefinedPrivilegesInfo& privileges_info =
+      static_cast<const ProvidesAppDefinedPrivilegesInfo&>(data);
+  auto appdef_privileges = privileges_info.GetAppDefinedPrivilegeInfoList();
+  for (auto priv : appdef_privileges) {
+    const AppDefinedPrivilegeInfo& info =
+      static_cast<const AppDefinedPrivilegeInfo&>(priv);
+    if (!AppDefinedPrivilegeValidation(info, package_info->package(), error))
+      return false;
+  }
+
+  return true;
+}
+
+std::string ProvidesAppDefinedPrivilegesInfo::key() {
+  return kProvidesAppDefinedPrivilegesKey;
+}
+
+std::string ProvidesAppDefinedPrivilegesHandler::Key() const {
+  return kProvidesAppDefinedPrivilegesKey;
+}
+
+}  // namespace parse
+}  // namespace tpk
diff --git a/src/tpk_manifest_handlers/provides_appdefined_privileges_handler.h b/src/tpk_manifest_handlers/provides_appdefined_privileges_handler.h
new file mode 100644 (file)
index 0000000..0cfbd70
--- /dev/null
@@ -0,0 +1,71 @@
+// Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+// Use of this source code is governed by an apache 2.0 license that can be
+// found in the LICENSE file.
+
+#ifndef TPK_MANIFEST_HANDLERS_PROVIDES_APPDEFINED_PRIVILEGES_HANDLER_H_
+#define TPK_MANIFEST_HANDLERS_PROVIDES_APPDEFINED_PRIVILEGES_HANDLER_H_
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "manifest_parser/manifest_handler.h"
+#include "manifest_parser/values.h"
+#include "tpk_manifest_handlers/application_manifest_constants.h"
+#include "tpk_manifest_handlers/common/appdefined_privilege_handler.h"
+
+namespace tpk {
+namespace parse {
+
+class ProvidesAppDefinedPrivilegesInfo : public parser::ManifestData {
+ public:
+  /**
+   * @brief key
+   * @param key string
+   */
+  static std::string key();
+  /**
+   * @brief GetAppDefinedPrivilegeInfoList
+   * @return std::vector<AppDefinedPrivilegeInfo>
+   */
+  const std::vector<AppDefinedPrivilegeInfo> GetAppDefinedPrivilegeInfoList()
+     const {
+    return appdefined_info_list_;
+  }
+  /**
+   * @brief AddAppDefinedPrivilegeInfo
+   * @param AppDefinedPrivilegeInfo
+   */
+  void AddAppDefinedPrivilegeInfo(AppDefinedPrivilegeInfo info) {
+    appdefined_info_list_.push_back(std::move(info));
+  }
+
+ private:
+  std::vector<AppDefinedPrivilegeInfo> appdefined_info_list_;
+};
+
+/**
+ * @brief The ProvidesAppDefinedPrivilegesHandler class
+ *
+ * Handler of tizen-manifest.xml for xml elements:
+ *  <provides-appdefined-privileges>
+ *  \_  <appdefined-privilege>
+ */
+class ProvidesAppDefinedPrivilegesHandler : public parser::ManifestHandler {
+ public:
+  bool Parse(
+      const parser::Manifest& manifest,
+      std::shared_ptr<parser::ManifestData>* output,
+      std::string* error) override;
+  bool Validate(
+      const parser::ManifestData& data,
+      const parser::ManifestDataMap& handlers_output,
+      std::string* error) const override;
+  std::string Key() const override;
+};
+
+}  // namespace parse
+}  // namespace tpk
+
+#endif  // TPK_MANIFEST_HANDLERS_PROVIDES_APPDEFINED_PRIVILEGES_HANDLER_H_
index 36db3ea90a2e44eca0b2aea44888a06415498156..1f5d21b31e6564fb66640994727d69c89d4ce97f 100644 (file)
@@ -21,6 +21,7 @@
 #include "tpk_manifest_handlers/package_handler.h"
 #include "tpk_manifest_handlers/privileges_handler.h"
 #include "tpk_manifest_handlers/profile_handler.h"
+#include "tpk_manifest_handlers/provides_appdefined_privileges_handler.h"
 #include "tpk_manifest_handlers/service_application_handler.h"
 #include "tpk_manifest_handlers/shortcut_handler.h"
 #include "tpk_manifest_handlers/ui_application_handler.h"
@@ -45,6 +46,7 @@ TPKConfigParser::TPKConfigParser() {
     std::make_shared<DescriptionHandler>(),
     std::make_shared<PackageHandler>(),
     std::make_shared<PrivilegesHandler>(),
+    std::make_shared<ProvidesAppDefinedPrivilegesHandler>(),
     std::make_shared<ProfileHandler>(),
     std::make_shared<WidgetApplicationHandler>(),
     std::make_shared<WatchApplicationHandler>(),