Fix installing privileges of hybrid package 00/215800/3
authorSangyoon Jang <jeremy.jang@samsung.com>
Tue, 15 Oct 2019 07:02:04 +0000 (16:02 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Mon, 21 Oct 2019 08:58:12 +0000 (17:58 +0900)
Change-Id: Ic8db846e8ffd2b09327f81778036e62c751584be
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/hybrid/hybrid_installer.cc
src/hybrid/step/pkgmgr/step_generate_xml.cc
src/hybrid/step/pkgmgr/step_generate_xml.h

index 01266aa..4748781 100644 (file)
@@ -130,9 +130,6 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<ci::configuration::StepCheckTizenVersion>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
-      AddStep<ci::security::StepPrivilegeCompatibility>(
-          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::security::StepCheckSettingsLevel>();
       AddStep<wgt::security::StepCheckWgtBackgroundCategory>();
       AddStep<wgt::security::StepCheckWgtNotificationCategory>();
@@ -154,6 +151,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<tpk::pkgmgr::StepManifestAdjustment>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
+      AddStep<ci::security::StepPrivilegeCompatibility>(
+          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::filesystem::StepCreateSymbolicLink>();
       AddStep<tpk::filesystem::StepCreateSymbolicLink>();
       AddStep<ci::pkgmgr::StepRegisterApplication>();
@@ -182,9 +182,6 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<ci::configuration::StepCheckTizenVersion>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
-      AddStep<ci::security::StepPrivilegeCompatibility>(
-          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::security::StepCheckSettingsLevel>();
       AddStep<wgt::security::StepCheckWgtBackgroundCategory>();
       AddStep<wgt::security::StepCheckWgtNotificationCategory>();
@@ -213,6 +210,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<tpk::pkgmgr::StepManifestAdjustment>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
+      AddStep<ci::security::StepPrivilegeCompatibility>(
+          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::filesystem::StepCreateSymbolicLink>();
       AddStep<tpk::filesystem::StepCreateSymbolicLink>();
       AddStep<ci::pkgmgr::StepUpdateApplication>();
@@ -278,9 +278,6 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<ci::configuration::StepCheckTizenVersion>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
-      AddStep<ci::security::StepPrivilegeCompatibility>(
-          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::security::StepCheckSettingsLevel>();
       AddStep<wgt::security::StepCheckWgtBackgroundCategory>();
       AddStep<wgt::security::StepCheckWgtNotificationCategory>();
@@ -306,6 +303,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<tpk::pkgmgr::StepManifestAdjustment>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
+      AddStep<ci::security::StepPrivilegeCompatibility>(
+          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::filesystem::StepCreateSymbolicLink>();
       AddStep<tpk::filesystem::StepCreateSymbolicLink>();
       AddStep<ci::security::StepRegisterTrustAnchor>(
@@ -356,9 +356,6 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<ci::configuration::StepCheckTizenVersion>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
-      AddStep<ci::security::StepPrivilegeCompatibility>(
-          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::security::StepCheckSettingsLevel>();
       AddStep<wgt::security::StepCheckWgtBackgroundCategory>();
       AddStep<wgt::security::StepCheckWgtNotificationCategory>();
@@ -380,6 +377,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<tpk::pkgmgr::StepManifestAdjustment>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
+      AddStep<ci::security::StepPrivilegeCompatibility>(
+          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::filesystem::StepCreateSymbolicLink>();
       AddStep<tpk::filesystem::StepCreateSymbolicLink>();
       AddStep<ci::pkgmgr::StepRegisterApplication>();
@@ -408,9 +408,6 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<ci::configuration::StepCheckTizenVersion>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
-      AddStep<ci::security::StepPrivilegeCompatibility>(
-          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::security::StepCheckSettingsLevel>();
       AddStep<wgt::security::StepCheckWgtBackgroundCategory>();
       AddStep<wgt::security::StepCheckWgtNotificationCategory>();
@@ -438,6 +435,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<tpk::pkgmgr::StepManifestAdjustment>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
+      AddStep<ci::security::StepPrivilegeCompatibility>(
+          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::filesystem::StepCreateSymbolicLink>();
       AddStep<tpk::filesystem::StepCreateSymbolicLink>();
       AddStep<ci::pkgmgr::StepUpdateApplication>();
@@ -465,9 +465,6 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<ci::configuration::StepCheckTizenVersion>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
-      AddStep<ci::security::StepPrivilegeCompatibility>(
-          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::security::StepCheckSettingsLevel>();
       AddStep<wgt::security::StepCheckWgtBackgroundCategory>();
       AddStep<ci::security::StepRollbackInstallationSecurity>();
@@ -479,6 +476,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<tpk::pkgmgr::StepManifestAdjustment>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
+      AddStep<ci::security::StepPrivilegeCompatibility>(
+          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<ci::pkgmgr::StepRegisterApplication>();
       AddStep<ci::security::StepRegisterTrustAnchor>(
           ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
@@ -504,9 +504,6 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<ci::configuration::StepCheckTizenVersion>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
-      AddStep<ci::security::StepPrivilegeCompatibility>(
-          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::security::StepCheckSettingsLevel>();
       AddStep<wgt::security::StepCheckWgtBackgroundCategory>();
       AddStep<ci::configuration::StepParseManifest>(
@@ -521,6 +518,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<tpk::pkgmgr::StepManifestAdjustment>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
+      AddStep<ci::security::StepPrivilegeCompatibility>(
+          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<ci::pkgmgr::StepUpdateApplication>();
       AddStep<ci::security::StepRegisterTrustAnchor>(
           ci::security::StepRegisterTrustAnchor::RegisterType::UPDATE);
@@ -541,9 +541,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<hybrid::configuration::StepStashTpkConfig>();
       AddStep<wgt::configuration::StepParse>(
           wgt::configuration::StepParse::ConfigLocation::INSTALLED, true);
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
       AddStep<ci::configuration::StepParsePreload>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
@@ -571,9 +571,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<hybrid::configuration::StepStashTpkConfig>();
       AddStep<wgt::configuration::StepParse>(
           wgt::configuration::StepParse::ConfigLocation::INSTALLED, true);
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
       AddStep<ci::configuration::StepParsePreload>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
@@ -630,9 +630,6 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<ci::configuration::StepCheckTizenVersion>();
       AddStep<ci::security::StepCheckSignature>();
       AddStep<ci::security::StepSaveSignature>();
-      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
-      AddStep<ci::security::StepPrivilegeCompatibility>(
-          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::security::StepCheckSettingsLevel>();
       AddStep<wgt::security::StepCheckWgtBackgroundCategory>();
       AddStep<wgt::security::StepCheckWgtNotificationCategory>();
@@ -658,6 +655,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
       AddStep<tpk::pkgmgr::StepManifestAdjustment>();
       AddStep<hybrid::configuration::StepMergeTpkConfig>(
           hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+      AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
+      AddStep<ci::security::StepPrivilegeCompatibility>(
+          ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
       AddStep<wgt::filesystem::StepCreateSymbolicLink>();
       AddStep<tpk::filesystem::StepCreateSymbolicLink>();
       AddStep<ci::pkgmgr::StepUpdateApplication>();
index 89772c2..2972909 100644 (file)
@@ -32,12 +32,12 @@ const std::vector<std::string> kBlackListNodes = {
   {"author"},
   {"description"},
   {"profile"},
-  {"privileges"},
-  {"provides-appdefined-privileges"},
   {"trust-anchor"},
 };
 const std::vector<std::string> kNeedMergeNodes = {
   {"manifest"},
+  {"privileges"},
+  {"provides-appdefined-privileges"},
 };
 const std::vector<std::pair<std::string, std::string>> kApplicationNodeNames = {
   {"ui-application", "uiapp"},
@@ -46,6 +46,9 @@ const std::vector<std::pair<std::string, std::string>> kApplicationNodeNames = {
   {"watch-application", "watchapp"},
 };
 
+const xmlChar kPrivilegeTypeAttributeKey[] = "type";
+const char kXmlXPrivilegeExpr[] = "//*[local-name()='privilege']";
+
 }  // namespace
 
 namespace hybrid {
@@ -122,6 +125,27 @@ void StepGenerateXml::SetXmlNodeAttribute(xmlNodePtr node,
       reinterpret_cast<const xmlChar*>(attr_val.c_str()));
 }
 
+bool StepGenerateXml::SetTpkPrivilegeType() {
+  xmlXPathContextPtr xpath_ctx = xmlXPathNewContext(tpk_doc_);
+  if (!xpath_ctx) {
+    LOG(ERROR) << "Failed to create XPath context";
+    return false;
+  }
+
+  xmlXPathObjectPtr xpath_obj = xmlXPathEvalExpression(
+      (const xmlChar*)kXmlXPrivilegeExpr, xpath_ctx);
+  if (xpath_obj && !xmlXPathNodeSetIsEmpty(xpath_obj->nodesetval)) {
+    for (int i = 0; i < xpath_obj->nodesetval->nodeNr; i++) {
+      xmlNodePtr node = xpath_obj->nodesetval->nodeTab[i];
+      xmlSetProp(node, kPrivilegeTypeAttributeKey, (const xmlChar*)"tpk");
+    }
+  }
+
+  xmlXPathFreeContext(xpath_ctx);
+
+  return true;
+}
+
 ci::Step::Status StepGenerateXml::process() {
   bf::path wgt_xml_path = context_->xml_path.get();
   bf::path tpk_xml_path = context_->pkg_path.get() / "tizen-manifest.xml";
@@ -129,6 +153,9 @@ ci::Step::Status StepGenerateXml::process() {
   if (!LoadXmlDocument(wgt_xml_path, tpk_xml_path))
     return Step::Status::MANIFEST_ERROR;
 
+  if (!SetTpkPrivilegeType())
+    return Step::Status::MANIFEST_ERROR;
+
   for (auto& entry : kNeedMergeNodes) {
     xmlNodePtr tpk_node = GetXmlNode(tpk_doc_, entry);
     if (tpk_node == nullptr)
index 8fce64d..3d22b78 100644 (file)
@@ -34,6 +34,7 @@ class StepGenerateXml : public common_installer::Step {
   void MergeXmlNode(xmlNodePtr node1, xmlNodePtr node2);
   void SetXmlNodeAttribute(xmlNodePtr node, const std::string& attr,
       const std::string& attr_val);
+  bool SetTpkPrivilegeType();
 
   xmlDocPtr wgt_doc_;
   xmlDocPtr tpk_doc_;