From 8bdf473ae221b4ee3862fb6101b540fc9bdaf809 Mon Sep 17 00:00:00 2001
From: Piotr Ganicz
Date: Mon, 11 Jul 2016 08:56:15 +0200
Subject: [PATCH 01/16] Fix memory leak in CheckPrivilegeLevel
This patch fixes also typo in the function name.
Change-Id: If118e0fd8d220e0d5dbb65a88b3a8f55a8cd343b
---
src/wgt/step/security/step_check_extension_privileges.cc | 7 ++++---
src/wgt/step/security/step_check_extension_privileges.h | 2 +-
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/wgt/step/security/step_check_extension_privileges.cc b/src/wgt/step/security/step_check_extension_privileges.cc
index f75c832..d2de923 100755
--- a/src/wgt/step/security/step_check_extension_privileges.cc
+++ b/src/wgt/step/security/step_check_extension_privileges.cc
@@ -65,7 +65,7 @@ common_installer::Step::Status StepCheckExtensionPrivileges::process() {
}
if (!privileges.empty()) {
- if (!CheckPriviligeLevel(privileges)) {
+ if (!CheckPrivilegeLevel(privileges)) {
LOG(DEBUG) << "Fail to validation of privilege";
return Status::ERROR;
}
@@ -103,7 +103,7 @@ std::string StepCheckExtensionPrivileges::GetExtensionPath() {
return app_ext_config_pattern;
}
-bool StepCheckExtensionPrivileges::CheckPriviligeLevel(
+bool StepCheckExtensionPrivileges::CheckPrivilegeLevel(
std::set priv_set) {
GList* privileges = nullptr;
for (auto it = priv_set.begin(); it != priv_set.end(); ++it) {
@@ -119,12 +119,13 @@ bool StepCheckExtensionPrivileges::CheckPriviligeLevel(
context_->manifest_data.get()->api_version,
privileges,
&error_message)) {
+ g_list_free_full(privileges, free);
if (!error_message.empty()) {
LOG(ERROR) << "error_message: " << error_message;
- return false;
}
return false;
}
+ g_list_free_full(privileges, free);
return true;
}
diff --git a/src/wgt/step/security/step_check_extension_privileges.h b/src/wgt/step/security/step_check_extension_privileges.h
index 0c27abc..837f564 100755
--- a/src/wgt/step/security/step_check_extension_privileges.h
+++ b/src/wgt/step/security/step_check_extension_privileges.h
@@ -45,7 +45,7 @@ class StepCheckExtensionPrivileges : public common_installer::Step {
Status precheck() override;
private:
std::string GetExtensionPath();
- bool CheckPriviligeLevel(std::set priv_set);
+ bool CheckPrivilegeLevel(std::set priv_set);
STEP_NAME(CheckExtensionPrivileges)
};
--
2.7.4
From eaf194e5b44c0d34cffce08b94307e97581c9100 Mon Sep 17 00:00:00 2001
From: Tomasz Iwanek
Date: Tue, 12 Jul 2016 11:46:04 +0200
Subject: [PATCH 02/16] Implement pkg enable/disable
Requires:
- https://review.tizen.org/gerrit/78919
Change-Id: Ic5c001fe2b91e81d35a66891f17cfafb2de3f9a1
---
src/hybrid/hybrid_installer.cc | 23 +++++++++++++++++++++++
src/wgt/wgt_installer.cc | 25 +++++++++++++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc
index 9b8be50..763d420 100644
--- a/src/hybrid/hybrid_installer.cc
+++ b/src/hybrid/hybrid_installer.cc
@@ -46,6 +46,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -387,6 +388,28 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
AddStep(
ci::Plugin::ActionType::Upgrade);
break;
+ case ci::RequestType::EnablePkg:
+ AddStep(pkgmgr_);
+ AddStep(
+ ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
+ ci::configuration::StepParseManifest::StoreLocation::NORMAL);
+ AddStep();
+ AddStep(
+ ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Enable);
+ AddStep(
+ ci::Plugin::ActionType::Uninstall);
+ break;
+ case ci::RequestType::DisablePkg:
+ AddStep(pkgmgr_);
+ AddStep(
+ ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
+ ci::configuration::StepParseManifest::StoreLocation::NORMAL);
+ AddStep();
+ AddStep(
+ ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Disable);
+ AddStep(
+ ci::Plugin::ActionType::Uninstall);
+ break;
default:
AddStep();
break;
diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc
index ee5f62c..d1dc7e9 100755
--- a/src/wgt/wgt_installer.cc
+++ b/src/wgt/wgt_installer.cc
@@ -49,6 +49,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -397,6 +398,30 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr)
AddStep();
break;
}
+ case ci::RequestType::EnablePkg: {
+ AddStep(pkgmgr_);
+ AddStep(
+ ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
+ ci::configuration::StepParseManifest::StoreLocation::NORMAL);
+ AddStep();
+ AddStep(
+ ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Enable);
+ AddStep(
+ ci::Plugin::ActionType::Uninstall);
+ break;
+ }
+ case ci::RequestType::DisablePkg: {
+ AddStep(pkgmgr_);
+ AddStep(
+ ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
+ ci::configuration::StepParseManifest::StoreLocation::NORMAL);
+ AddStep();
+ AddStep(
+ ci::pkgmgr::StepUpdatePkgDisableInfo::ActionType::Disable);
+ AddStep(
+ ci::Plugin::ActionType::Uninstall);
+ break;
+ }
default: {
AddStep();
}
--
2.7.4
From db67a40cddd61d3e4dc9f932b152bf6f9de5f754 Mon Sep 17 00:00:00 2001
From: jongmyeongko
Date: Sat, 16 Jul 2016 17:57:59 +0900
Subject: [PATCH 03/16] support of legacy app directories.
Requires:
https://review.tizen.org/gerrit/#/c/80319/4
Change-Id: I9cfa081c634dba4a173d1bcabfb6f2c03eeabe18
Signed-off-by: jongmyeongko
---
src/hybrid/hybrid_installer.cc | 6 ++++++
src/wgt/wgt_installer.cc | 5 +++++
2 files changed, 11 insertions(+)
diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc
index 763d420..0e91262 100644
--- a/src/hybrid/hybrid_installer.cc
+++ b/src/hybrid/hybrid_installer.cc
@@ -19,6 +19,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -29,6 +30,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -124,6 +126,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
AddStep();
AddStep();
AddStep();
+ AddStep();
break;
case ci::RequestType::Update:
AddStep(pkgmgr_);
@@ -184,6 +187,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
AddStep();
AddStep();
AddStep();
+ AddStep();
AddStep();
AddStep();
AddStep();
@@ -297,6 +301,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
AddStep();
AddStep();
AddStep();
+ AddStep();
break;
case ci::RequestType::MountUpdate:
AddStep(pkgmgr_);
@@ -361,6 +366,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
AddStep();
AddStep();
AddStep();
+ AddStep();
break;
case ci::RequestType::ManifestDirectUpdate:
AddStep(pkgmgr_);
diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc
index d1dc7e9..1da34de 100755
--- a/src/wgt/wgt_installer.cc
+++ b/src/wgt/wgt_installer.cc
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -32,6 +33,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -127,6 +129,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr)
ci::Plugin::ActionType::Install);
AddStep();
AddStep();
+ AddStep();
break;
}
case ci::RequestType::Update: {
@@ -184,6 +187,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr)
AddStep();
AddStep();
AddStep();
+ AddStep();
AddStep();
AddStep();
AddStep();
@@ -309,6 +313,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr)
AddStep();
AddStep();
AddStep();
+ AddStep();
break;
}
case ci::RequestType::MountUpdate: {
--
2.7.4
From ea281f23451f2812f8f63464d594182dea08b09c Mon Sep 17 00:00:00 2001
From: Sangyoon Jang
Date: Wed, 27 Jul 2016 19:44:21 +0900
Subject: [PATCH 04/16] Fix build warning
Change-Id: I9bf2df3544921fe9a5fde76434f2f7597cbdd21a
Signed-off-by: Sangyoon Jang
---
src/wgt/step/security/step_check_extension_privileges.cc | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/wgt/step/security/step_check_extension_privileges.cc b/src/wgt/step/security/step_check_extension_privileges.cc
index d2de923..15b305a 100755
--- a/src/wgt/step/security/step_check_extension_privileges.cc
+++ b/src/wgt/step/security/step_check_extension_privileges.cc
@@ -57,9 +57,9 @@ common_installer::Step::Status StepCheckExtensionPrivileges::process() {
LOG(DEBUG) << "start to parse extension xml : " << *it;
ExtensionConfigParser extensionParser(*it);
std::vector list = extensionParser.GetExtensionPrivilegeList();
- for (int i = 0 ; i < list.size() ; i++) {
- if (current_privileges.find(list[i]) == current_privileges.end()) {
- privileges.insert(list[i]);
+ for (std::string priv : list) {
+ if (current_privileges.find(priv) == current_privileges.end()) {
+ privileges.emplace(priv);
}
}
}
--
2.7.4
From 9fcd3e003b4a0b0b0b56beb83884bde047e0ee33 Mon Sep 17 00:00:00 2001
From: Tomasz Iwanek
Date: Fri, 15 Jul 2016 14:54:57 +0200
Subject: [PATCH 05/16] Reorder steps for delta update for external
installation
Requires:
- https://review.tizen.org/gerrit/80277
To verify, check that delta update mode works for external storage.
Change-Id: I43433d8fc44136341c084e552042d4195ba2d1b5
---
src/hybrid/hybrid_installer.cc | 4 ++++
src/wgt/wgt_installer.cc | 4 ++++
2 files changed, 8 insertions(+)
diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc
index 0e91262..7c187c2 100644
--- a/src/hybrid/hybrid_installer.cc
+++ b/src/hybrid/hybrid_installer.cc
@@ -22,6 +22,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -208,7 +210,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr)
AddStep(
ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
ci::configuration::StepParseManifest::StoreLocation::BACKUP);
+ AddStep();
AddStep();
+ AddStep();
AddStep(
wgt::configuration::StepParse::ConfigLocation::RESOURCE_WGT, true);
AddStep();
diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc
index 1da34de..17f7b90 100755
--- a/src/wgt/wgt_installer.cc
+++ b/src/wgt/wgt_installer.cc
@@ -24,6 +24,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -225,7 +227,9 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr)
ci::configuration::StepParseManifest::ManifestLocation::INSTALLED,
ci::configuration::StepParseManifest::StoreLocation::BACKUP);
AddStep();
+ AddStep();
AddStep("res/wgt/");
+ AddStep();
AddStep(
wgt::configuration::StepParse::ConfigLocation::PACKAGE, true);
AddStep();
--
2.7.4
From 1f63ad35e3845da4354d3a4860c92bdc1518a84f Mon Sep 17 00:00:00 2001
From: Piotr Ganicz
Date: Thu, 28 Jul 2016 12:40:35 +0200
Subject: [PATCH 06/16] Smoke test for enable/disable pkg
I've made also small refactor
Change-Id: I7a4a5083d7d92872fe531016efc53f3c05590a2f
---
src/unit_tests/smoke_test.cc | 106 ++++++++++++-----------
src/unit_tests/test_samples/smoke/DisablePkg.wgt | Bin 0 -> 38015 bytes
src/unit_tests/test_samples/smoke/EnablePkg.wgt | Bin 0 -> 38017 bytes
3 files changed, 56 insertions(+), 50 deletions(-)
create mode 100644 src/unit_tests/test_samples/smoke/DisablePkg.wgt
create mode 100644 src/unit_tests/test_samples/smoke/EnablePkg.wgt
diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc
index 56dfb15..e95a092 100644
--- a/src/unit_tests/smoke_test.cc
+++ b/src/unit_tests/smoke_test.cc
@@ -260,16 +260,16 @@ ci::AppInstaller::Result RunInstallerWithPkgrmgr(ci::PkgMgrPtr pkgmgr,
}
return installer->Run();
}
-
-ci::AppInstaller::Result Install(const bf::path& path,
- PackageType type,
- RequestResult mode = RequestResult::NORMAL) {
- const char* argv[] = {"", "-i", path.c_str()};
+ci::AppInstaller::Result CallBackend(int argc,
+ const char* argv[],
+ PackageType type,
+ RequestResult mode = RequestResult::NORMAL
+ ) {
TestPkgmgrInstaller pkgmgr_installer;
std::unique_ptr query_interface =
CreateQueryInterface();
auto pkgmgr =
- ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv),
+ ci::PkgMgrInterface::Create(argc, const_cast(argv),
&pkgmgr_installer, query_interface.get());
if (!pkgmgr) {
LOG(ERROR) << "Failed to initialize pkgmgr interface";
@@ -278,6 +278,13 @@ ci::AppInstaller::Result Install(const bf::path& path,
return RunInstallerWithPkgrmgr(pkgmgr, type, mode);
}
+ci::AppInstaller::Result Install(const bf::path& path,
+ PackageType type,
+ RequestResult mode = RequestResult::NORMAL) {
+ const char* argv[] = {"", "-i", path.c_str()};
+ return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
+}
+
ci::AppInstaller::Result Update(const bf::path& path_old,
const bf::path& path_new,
PackageType type,
@@ -292,17 +299,7 @@ ci::AppInstaller::Result Update(const bf::path& path_old,
ci::AppInstaller::Result MountInstall(const bf::path& path,
PackageType type, RequestResult mode = RequestResult::NORMAL) {
const char* argv[] = {"", "-w", path.c_str()};
- TestPkgmgrInstaller pkgmgr_installer;
- std::unique_ptr query_interface =
- CreateQueryInterface();
- auto pkgmgr =
- ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv),
- &pkgmgr_installer, query_interface.get());
- if (!pkgmgr) {
- LOG(ERROR) << "Failed to initialize pkgmgr interface";
- return ci::AppInstaller::Result::UNKNOWN;
- }
- return RunInstallerWithPkgrmgr(pkgmgr, type, mode);
+ return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
}
ci::AppInstaller::Result MountUpdate(const bf::path& path_old,
@@ -319,17 +316,7 @@ ci::AppInstaller::Result Uninstall(const std::string& pkgid,
PackageType type,
RequestResult mode = RequestResult::NORMAL) {
const char* argv[] = {"", "-d", pkgid.c_str()};
- TestPkgmgrInstaller pkgmgr_installer;
- std::unique_ptr query_interface =
- CreateQueryInterface();
- auto pkgmgr =
- ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv),
- &pkgmgr_installer, query_interface.get());
- if (!pkgmgr) {
- LOG(ERROR) << "Failed to initialize pkgmgr interface";
- return ci::AppInstaller::Result::UNKNOWN;
- }
- return RunInstallerWithPkgrmgr(pkgmgr, type, mode);
+ return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
}
ci::AppInstaller::Result Reinstall(const bf::path& path,
@@ -341,17 +328,7 @@ ci::AppInstaller::Result Reinstall(const bf::path& path,
return ci::AppInstaller::Result::UNKNOWN;
}
const char* argv[] = {"", "-r", delta_dir.c_str()};
- TestPkgmgrInstaller pkgmgr_installer;
- std::unique_ptr query_interface =
- CreateQueryInterface();
- auto pkgmgr =
- ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv),
- &pkgmgr_installer, query_interface.get());
- if (!pkgmgr) {
- LOG(ERROR) << "Failed to initialize pkgmgr interface";
- return ci::AppInstaller::Result::UNKNOWN;
- }
- return RunInstallerWithPkgrmgr(pkgmgr, type, mode);
+ return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
}
ci::AppInstaller::Result DeltaInstall(const bf::path& path,
@@ -367,17 +344,21 @@ ci::AppInstaller::Result Clear(const std::string& pkgid,
PackageType type,
RequestResult mode = RequestResult::NORMAL) {
const char* argv[] = {"", "-c", pkgid.c_str()};
- TestPkgmgrInstaller pkgmgr_installer;
- std::unique_ptr query_interface =
- CreateQueryInterface();
- auto pkgmgr =
- ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv),
- &pkgmgr_installer, query_interface.get());
- if (!pkgmgr) {
- LOG(ERROR) << "Failed to initialize pkgmgr interface";
- return ci::AppInstaller::Result::UNKNOWN;
- }
- return RunInstallerWithPkgrmgr(pkgmgr, type, mode);
+ return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
+}
+
+ci::AppInstaller::Result EnablePackage(const std::string& pkgid,
+ PackageType type,
+ RequestResult mode = RequestResult::NORMAL) {
+ const char* argv[] = {"", "-A", pkgid.c_str()};
+ return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
+}
+
+ci::AppInstaller::Result DisablePackage(const std::string& pkgid,
+ PackageType type,
+ RequestResult mode = RequestResult::NORMAL) {
+ const char* argv[] = {"", "-D", pkgid.c_str()};
+ return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
}
ci::AppInstaller::Result Recover(const bf::path& recovery_file,
@@ -489,6 +470,31 @@ TEST_F(SmokeTest, RDSMode) {
ValidateFileContentInPackage(pkgid, "res/wgt/MODIFIED", "2\n");
}
+TEST_F(SmokeTest, EnablePkg) {
+ bf::path path = kSmokePackagesDirectory / "EnablePkg.wgt";
+ std::string pkgid = "smokeapp22";
+ ASSERT_EQ(Install(path, PackageType::WGT),
+ ci::AppInstaller::Result::OK);
+ ASSERT_EQ(DisablePackage(pkgid, PackageType::WGT),
+ ci::AppInstaller::Result::OK);
+ ASSERT_EQ(EnablePackage(pkgid, PackageType::WGT),
+ ci::AppInstaller::Result::OK);
+
+ ASSERT_TRUE(ci::QueryIsPackageInstalled(pkgid, ci::GetRequestMode()));
+}
+
+TEST_F(SmokeTest, DisablePkg) {
+ bf::path path = kSmokePackagesDirectory / "DisablePkg.wgt";
+ std::string pkgid = "smokeapp21";
+ std::string appid = "smokeapp21.DisablePkg";
+ ASSERT_EQ(Install(path, PackageType::WGT),
+ ci::AppInstaller::Result::OK);
+ ASSERT_EQ(DisablePackage(pkgid, PackageType::WGT),
+ ci::AppInstaller::Result::OK);
+ ASSERT_FALSE(ci::QueryIsPackageInstalled(pkgid, ci::GetRequestMode()));
+ ValidatePackageFS(pkgid, {appid});
+}
+
TEST_F(SmokeTest, ClearMode) {
bf::path path = kSmokePackagesDirectory / "ClearMode.wgt";
std::string pkgid = "smokeapp20";
diff --git a/src/unit_tests/test_samples/smoke/DisablePkg.wgt b/src/unit_tests/test_samples/smoke/DisablePkg.wgt
new file mode 100644
index 0000000000000000000000000000000000000000..3245443fdd54a4557dc6877b64e6c4032ef1b7c3
GIT binary patch
literal 38015
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