Fix installing privileges of hybrid package 40/215740/2
authorSangyoon Jang <jeremy.jang@samsung.com>
Tue, 15 Oct 2019 07:02:04 +0000 (16:02 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Tue, 15 Oct 2019 07:03:25 +0000 (16:03 +0900)
Change-Id: Ic8db846e8ffd2b09327f81778036e62c751584be
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/hybrid/hybrid_installer.cc
src/hybrid/step/pkgmgr/step_merge_xml.cc
src/hybrid/step/pkgmgr/step_merge_xml.h

index 2e0efe3..31028d0 100644 (file)
@@ -132,9 +132,6 @@ void HybridInstaller::InstallSteps() {
   AddStep<ci::pkgmgr::StepCheckRestriction>();
   AddStep<ci::configuration::StepCheckTizenVersion>();
   AddStep<ci::security::StepSignature>(true);
-  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>();
@@ -155,6 +152,9 @@ void HybridInstaller::InstallSteps() {
   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>();
@@ -185,9 +185,6 @@ void HybridInstaller::UpdateSteps() {
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<ci::configuration::StepCheckTizenVersion>();
   AddStep<ci::security::StepSignature>(true);
-  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>();
@@ -215,6 +212,9 @@ void HybridInstaller::UpdateSteps() {
   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>();
@@ -284,9 +284,6 @@ void HybridInstaller::DeltaSteps() {
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<ci::configuration::StepCheckTizenVersion>();
   AddStep<ci::security::StepSignature>(true);
-  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>();
@@ -311,6 +308,9 @@ void HybridInstaller::DeltaSteps() {
   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>(
@@ -363,9 +363,6 @@ void HybridInstaller::MountInstallSteps() {
   AddStep<ci::pkgmgr::StepCheckRestriction>();
   AddStep<ci::configuration::StepCheckTizenVersion>();
   AddStep<ci::security::StepSignature>(true);
-  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>();
@@ -386,6 +383,9 @@ void HybridInstaller::MountInstallSteps() {
   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>();
@@ -416,9 +416,6 @@ void HybridInstaller::MountUpdateSteps() {
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<ci::configuration::StepCheckTizenVersion>();
   AddStep<ci::security::StepSignature>(true);
-  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>();
@@ -445,6 +442,9 @@ void HybridInstaller::MountUpdateSteps() {
   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>();
@@ -472,9 +472,6 @@ void HybridInstaller::ManifestDirectInstallSteps() {
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<ci::configuration::StepCheckTizenVersion>();
   AddStep<ci::security::StepSignature>(true);
-  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>();
@@ -486,6 +483,9 @@ void HybridInstaller::ManifestDirectInstallSteps() {
   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);
@@ -512,9 +512,6 @@ void HybridInstaller::ManifestDirectUpdateSteps() {
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<ci::configuration::StepCheckTizenVersion>();
   AddStep<ci::security::StepSignature>(true);
-  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>(
@@ -529,6 +526,9 @@ void HybridInstaller::ManifestDirectUpdateSteps() {
   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);
@@ -550,11 +550,11 @@ void HybridInstaller::ManifestPartialInstallSteps() {
   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<ci::configuration::StepParsePreload>();
   AddStep<ci::security::StepSignature>(false);
+  AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
   AddStep<ci::filesystem::StepRemoveGlobalAppSymlinks>();
@@ -580,7 +580,6 @@ void HybridInstaller::ManifestPartialUpdateSteps() {
   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<ci::configuration::StepParsePreload>();
@@ -588,6 +587,7 @@ void HybridInstaller::ManifestPartialUpdateSteps() {
   AddStep<ci::configuration::StepParseManifest>(
       ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
       ci::configuration::StepParseManifest::StoreLocation::BACKUP);
+  AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
   AddStep<ci::pkgmgr::StepKillApps>();
@@ -640,9 +640,6 @@ void HybridInstaller::ReadonlyUpdateInstallSteps() {
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<ci::configuration::StepCheckTizenVersion>();
   AddStep<ci::security::StepSignature>(true);
-  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>();
@@ -668,6 +665,9 @@ void HybridInstaller::ReadonlyUpdateInstallSteps() {
   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>();
@@ -759,13 +759,13 @@ void HybridInstaller::RecoverDBSteps() {
   AddStep<wgt::configuration::StepParse>(
       wgt::configuration::StepParse::ConfigLocation::INSTALLED, true);
   AddStep<ci::configuration::StepParsePreload>();
+  AddStep<wgt::security::StepCheckSettingsLevel>();
+  AddStep<hybrid::configuration::StepMergeTpkConfig>(
+      hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepGetPrivilegeLevel>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
-  AddStep<wgt::security::StepCheckSettingsLevel>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
   AddStep<ci::pkgmgr::StepRegisterApplication>();
 }
 
index 0c87c0d..e36e542 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 StepMergeXml::SetXmlNodeAttribute(xmlNodePtr node,
       reinterpret_cast<const xmlChar*>(attr_val.c_str()));
 }
 
+bool StepMergeXml::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 StepMergeXml::process() {
   bf::path wgt_xml_path = context_->xml_path.get();
   bf::path tpk_xml_path = context_->GetPkgPath() / "tizen-manifest.xml";
@@ -129,6 +153,9 @@ ci::Step::Status StepMergeXml::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 7f75295..a373bcf 100644 (file)
@@ -34,6 +34,7 @@ class StepMergeXml : 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_;