From 26292c6d2c73e258a50a0f60a457ab5ec151c7f4 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Wed, 3 Aug 2016 10:44:31 +0200 Subject: [PATCH 01/16] Reorder step for consistency Change-Id: Idd921dbb7bd9f8250371ac7049f11f772ce1ed81 --- src/wgt/wgt_installer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index 6007743..b079097 100755 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -129,8 +129,8 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep( ci::Plugin::ActionType::Install); - AddStep(); AddStep(); + AddStep(); AddStep(); break; } -- 2.7.4 From cfdb9b1cb9f89dabe9388c02418e4ef883c144d3 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Wed, 3 Aug 2016 14:10:38 +0200 Subject: [PATCH 02/16] Fix preload request for wgt This commit should allow to install preload wgt package with command: - wgt-backend --preload -i $package Submit together: - https://review.tizen.org/gerrit/82424 - https://review.tizen.org/gerrit/82496 - https://review.tizen.org/gerrit/82497 Change-Id: Iafdd60cd6b4cee166dcc5177c605dad316adfc27 --- src/hybrid/hybrid_installer.cc | 7 +++++++ src/wgt/step/configuration/step_parse.cc | 5 ++++- src/wgt/wgt_installer.cc | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 7c187c2..4619ed1 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -101,6 +102,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( wgt::configuration::StepParse::ConfigLocation::RESOURCE_WGT, true); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -140,6 +142,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( wgt::configuration::StepParse::ConfigLocation::RESOURCE_WGT, true); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -278,6 +281,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( wgt::configuration::StepParse::ConfigLocation::RESOURCE_WGT, true); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -317,6 +321,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( wgt::configuration::StepParse::ConfigLocation::RESOURCE_WGT, true); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -358,6 +363,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( wgt::configuration::StepParse::ConfigLocation::INSTALLED, true); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -382,6 +388,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( wgt::configuration::StepParse::ConfigLocation::INSTALLED, true); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); diff --git a/src/wgt/step/configuration/step_parse.cc b/src/wgt/step/configuration/step_parse.cc index 0295903..77f63a2 100644 --- a/src/wgt/step/configuration/step_parse.cc +++ b/src/wgt/step/configuration/step_parse.cc @@ -200,7 +200,10 @@ bool StepParse::FillWidgetInfo(manifest_x* manifest) { manifest->type = strdup("wgt"); manifest->appsetting = strdup("false"); manifest->nodisplay_setting = strdup("false"); - manifest->preload = strdup("false"); + if (context_->is_preload_request.get()) + manifest->preload = strdup("true"); + else + manifest->preload = strdup("false"); manifest->installed_storage = strdup("installed_internal"); // For wgt package use the long name diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index b079097..33ba966 100755 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -104,6 +105,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep( wgt::configuration::StepParse::ConfigLocation::PACKAGE, true); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -139,6 +141,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep( wgt::configuration::StepParse::ConfigLocation::PACKAGE, true); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -290,6 +293,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep( wgt::configuration::StepParse::ConfigLocation::PACKAGE, true); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -324,6 +328,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep( wgt::configuration::StepParse::ConfigLocation::PACKAGE, true); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -359,6 +364,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(pkgmgr_); AddStep( wgt::configuration::StepParse::ConfigLocation::INSTALLED, true); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -377,6 +383,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(pkgmgr_); AddStep( wgt::configuration::StepParse::ConfigLocation::INSTALLED, true); + AddStep(); AddStep(); AddStep(); AddStep(); -- 2.7.4 From e75eb2f973ed3e7c89091e7004aa2270723c0b78 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Mon, 8 Aug 2016 16:48:10 +0900 Subject: [PATCH 03/16] remove unit-test code for extra icon path. Change-Id: I895b6ca06c97222ce3d4ccce881c3c4e575b1450 Signed-off-by: jongmyeongko --- src/unit_tests/smoke_test.cc | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index e95a092..e8e9a02 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -168,11 +168,6 @@ void ValidatePackageFS(const std::string& pkgid, for (auto& appid : appids) { bf::path binary_path = package_path / "bin" / appid; ASSERT_TRUE(bf::exists(binary_path)); - bf::path icon_path = - bf::path(getIconPath(getuid(), false)) / (appid + ".png"); - ASSERT_TRUE(bf::exists(icon_path)); - bf::path icon_backup = ci::GetBackupPathForIconFile(icon_path); - ASSERT_FALSE(bf::exists(icon_backup)); } bf::path widget_root_path = package_path / "res" / "wgt"; @@ -200,14 +195,6 @@ void PackageCheckCleanup(const std::string& pkgid, bf::path(getUserManifestPath(getuid(), false)) / (pkgid + ".xml"); ASSERT_FALSE(bf::exists(manifest_path)); - for (auto& appid : appids) { - bf::path icon_path = - bf::path(getIconPath(getuid(), false)) / (appid + ".png"); - ASSERT_FALSE(bf::exists(icon_path)); - bf::path icon_backup = ci::GetBackupPathForIconFile(icon_path); - ASSERT_FALSE(bf::exists(icon_backup)); - } - // backups should not exist bf::path package_backup = ci::GetBackupPathForPackagePath(package_path); bf::path manifest_backup = ci::GetBackupPathForManifestFile(manifest_path); -- 2.7.4 From d0bbf6ce2764031b175cc73b66ba84e135907103 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Mon, 8 Aug 2016 22:45:35 +0900 Subject: [PATCH 04/16] modify smoke-test setup for consideration of user-db change. Change-Id: Ia19906f4561e92f5d20df056cbae64caa8ad2312 Signed-off-by: jongmyeongko --- packaging/wgt-backend.spec | 3 +++ src/unit_tests/smoke_test.cc | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packaging/wgt-backend.spec b/packaging/wgt-backend.spec index ba0b65b..9d9f89a 100644 --- a/packaging/wgt-backend.spec +++ b/packaging/wgt-backend.spec @@ -52,6 +52,9 @@ make %{?_smp_mflags} mkdir -p %{buildroot}/etc/package-manager/backend ln -s %{_bindir}/wgt-backend %{buildroot}%{_sysconfdir}/package-manager/backend/wgt +%post tests +/usr/sbin/setcap cap_dac_override=eip %{_bindir}/wgt-backend-ut/smoke-test + %files %manifest wgt-backend.manifest %license LICENSE diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index e8e9a02..97a8d22 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -45,6 +45,7 @@ const char kApplicationDir[] = ".applications"; const char kApplicationDirBackup[] = ".applications.bck"; const char KUserAppsDir[] = "apps_rw"; const char KUserAppsDirBackup[] = "apps_rw.bck"; +const char kUserDataBaseDir[] = "/opt/dbspace/user"; enum class RequestResult { NORMAL, @@ -186,7 +187,7 @@ void ValidatePackageFS(const std::string& pkgid, } void PackageCheckCleanup(const std::string& pkgid, - const std::vector& appids) { + const std::vector&) { bf::path root_path = ci::GetRootAppPath(false); bf::path package_path = root_path / pkgid; ASSERT_FALSE(bf::exists(package_path)); @@ -374,9 +375,13 @@ class SmokeEnvironment : public testing::Environment { explicit SmokeEnvironment(const bf::path& home) : home_(home) { } void SetUp() override { + bf::path UserDBDir = bf::path(kUserDataBaseDir) / std::to_string(getuid()); + bf::path UserDBDirBackup = UserDBDir.string() + std::string(".bck"); + bs::error_code error; bf::remove_all(home_ / kApplicationDirBackup, error); bf::remove_all(home_ / KUserAppsDirBackup, error); + bf::remove_all(UserDBDirBackup, error); if (bf::exists(home_ / KUserAppsDir)) { bf::rename(home_ / KUserAppsDir, home_ / KUserAppsDirBackup, error); if (error) @@ -393,15 +398,29 @@ class SmokeEnvironment : public testing::Environment { << (home_ / kApplicationDirBackup) << " should not exist."; assert(!error); } + if (bf::exists(UserDBDir)) { + bf::rename(UserDBDir, UserDBDirBackup, error); + if (error) + LOG(ERROR) << "Failed to setup test environment. Does some previous" + << " test crashed? Directory: " + << UserDBDirBackup << " should not exist."; + assert(!error); + } } void TearDown() override { + bf::path UserDBDir = bf::path(kUserDataBaseDir) / std::to_string(getuid()); + bf::path UserDBDirBackup = UserDBDir.string() + std::string(".bck"); + bs::error_code error; bf::remove_all(home_ / kApplicationDir, error); bf::remove_all(home_ / KUserAppsDir, error); + bf::remove_all(UserDBDir, error); if (bf::exists(home_ / KUserAppsDirBackup)) bf::rename(home_ / KUserAppsDirBackup, home_ / KUserAppsDir, error); if (bf::exists(home_ / kApplicationDirBackup)) bf::rename(home_ / kApplicationDirBackup, home_ / kApplicationDir, error); + if (bf::exists(UserDBDirBackup)) + bf::rename(UserDBDirBackup, UserDBDir, error); } private: -- 2.7.4 From e4a987d09a707ad181babe2dad0a36793fffea4b Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Wed, 10 Aug 2016 14:14:28 +0900 Subject: [PATCH 05/16] Adjust to change in StepAcquireExternalStorage Requires: - https://review.tizen.org/gerrit/83296 Change-Id: I57dd72defc1cb512115cb9e054a8cb9ffa9beccf Signed-off-by: Sangyoon Jang --- src/hybrid/hybrid_installer.cc | 8 ++++---- src/wgt/wgt_installer.cc | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 4619ed1..4d0d4e2 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -113,7 +113,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(false); AddStep(); AddStep(); AddStep(); @@ -159,7 +159,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(true); AddStep(); AddStep(); AddStep(); @@ -186,7 +186,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( ci::Plugin::ActionType::Uninstall); AddStep(); - AddStep(); + AddStep(true); AddStep(); AddStep(); AddStep(); @@ -232,7 +232,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(true); AddStep(); AddStep(); AddStep(); diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index 33ba966..01f2440 100755 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -117,7 +117,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(false); AddStep(); AddStep(); AddStep(); @@ -159,7 +159,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(true); AddStep(); AddStep(); AddStep(); @@ -184,7 +184,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, ci::configuration::StepParseManifest::StoreLocation::NORMAL); AddStep(); - AddStep(); + AddStep(true); AddStep( ci::Plugin::ActionType::Uninstall); AddStep(); @@ -247,7 +247,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(true); AddStep(); AddStep(); AddStep(); -- 2.7.4 From 263f554d8d222cc4f863fa187fdd887d57971ba1 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Fri, 22 Jul 2016 14:07:34 +0900 Subject: [PATCH 06/16] tpk/wgt backend will run as system session Related changes [slp-pkgmgr] https://review.tizen.org/gerrit/#/c/80764/ [pkgmgr-server] https://review.tizen.org/gerrit/#/c/78205/ [app-installers] https://review.tizen.org/gerrit/#/c/78206/ [tpk-backend] https://review.tizen.org/gerrit/#/c/80787/ Change-Id: Ia44020806701b668feaf7e1f5c5048dfc6643951 Signed-off-by: Junghyun Yeon --- packaging/wgt-backend.manifest | 2 +- src/unit_tests/manifest_test.cc | 2 +- src/unit_tests/smoke_test.cc | 52 +++++++++++++++------- src/wgt/step/encryption/step_encrypt_resources.cc | 30 ++++++++----- .../step/encryption/step_remove_encryption_data.cc | 13 +++--- src/wgt/wgt_app_query_interface.cc | 25 +++++++++-- 6 files changed, 85 insertions(+), 39 deletions(-) diff --git a/packaging/wgt-backend.manifest b/packaging/wgt-backend.manifest index 18893ce..85f79f1 100644 --- a/packaging/wgt-backend.manifest +++ b/packaging/wgt-backend.manifest @@ -3,6 +3,6 @@ - + diff --git a/src/unit_tests/manifest_test.cc b/src/unit_tests/manifest_test.cc index ab26141..46a8e36 100644 --- a/src/unit_tests/manifest_test.cc +++ b/src/unit_tests/manifest_test.cc @@ -65,7 +65,7 @@ class StepParseRunner { private: void PrepareContext() { context_.reset(new ci::InstallerContext()); - context_->root_application_path.set(ci::GetRootAppPath(false)); + context_->root_application_path.set(ci::GetRootAppPath(false, getuid())); context_->unpacked_dir_path.set( bf::path(kManifestTestcaseData) / dir_suffix_); context_->backend_data.set(new wgt::WgtBackendData()); diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index 97a8d22..3e80354 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -55,7 +55,8 @@ enum class RequestResult { class ScopedTzipInterface { public: explicit ScopedTzipInterface(const std::string& pkgid) - : pkg_path_(bf::path(ci::GetRootAppPath(false)) / pkgid), + : pkg_path_(bf::path(ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER))) / pkgid), interface_(ci::GetMountLocation(pkg_path_)) { interface_.MountZip(ci::GetZipPackageLocation(pkg_path_, pkgid)); } @@ -99,7 +100,8 @@ bool TouchFile(const bf::path& path) { } void RemoveAllRecoveryFiles() { - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); if (!bf::exists(root_path)) return; for (auto& dir_entry : boost::make_iterator_range( @@ -114,7 +116,8 @@ void RemoveAllRecoveryFiles() { } bf::path FindRecoveryFile() { - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); for (auto& dir_entry : boost::make_iterator_range( bf::directory_iterator(root_path), bf::directory_iterator())) { if (bf::is_regular_file(dir_entry)) { @@ -129,7 +132,8 @@ bf::path FindRecoveryFile() { bool ValidateFileContentInPackage(const std::string& pkgid, const std::string& relative, const std::string& expected) { - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); bf::path file_path = root_path / pkgid / relative; if (!bf::exists(file_path)) { LOG(ERROR) << file_path << " doesn't exist"; @@ -151,7 +155,8 @@ bool ValidateFileContentInPackage(const std::string& pkgid, void ValidatePackageFS(const std::string& pkgid, const std::vector& appids) { - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); bf::path package_path = root_path / pkgid; bf::path data_path = package_path / "data"; bf::path shared_path = package_path / "shared"; @@ -163,7 +168,8 @@ void ValidatePackageFS(const std::string& pkgid, ASSERT_TRUE(bf::exists(cache_path)); bf::path manifest_path = - bf::path(getUserManifestPath(getuid(), false)) / (pkgid + ".xml"); + bf::path(getUserManifestPath( + tzplatform_getuid(TZ_SYS_DEFAULT_USER), false)) / (pkgid + ".xml"); ASSERT_TRUE(bf::exists(manifest_path)); for (auto& appid : appids) { @@ -188,12 +194,14 @@ void ValidatePackageFS(const std::string& pkgid, void PackageCheckCleanup(const std::string& pkgid, const std::vector&) { - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath( + false, tzplatform_getuid(TZ_SYS_DEFAULT_USER)); bf::path package_path = root_path / pkgid; ASSERT_FALSE(bf::exists(package_path)); bf::path manifest_path = - bf::path(getUserManifestPath(getuid(), false)) / (pkgid + ".xml"); + bf::path(getUserManifestPath( + tzplatform_getuid(TZ_SYS_DEFAULT_USER), false)) / (pkgid + ".xml"); ASSERT_FALSE(bf::exists(manifest_path)); // backups should not exist @@ -205,13 +213,17 @@ void PackageCheckCleanup(const std::string& pkgid, void ValidatePackage(const std::string& pkgid, const std::vector& appids) { - ASSERT_TRUE(ci::QueryIsPackageInstalled(pkgid, ci::GetRequestMode())); + ASSERT_TRUE(ci::QueryIsPackageInstalled( + pkgid, ci::GetRequestMode(tzplatform_getuid(TZ_SYS_DEFAULT_USER)), + tzplatform_getuid(TZ_SYS_DEFAULT_USER))); ValidatePackageFS(pkgid, appids); } void CheckPackageNonExistance(const std::string& pkgid, const std::vector& appids) { - ASSERT_FALSE(ci::QueryIsPackageInstalled(pkgid, ci::GetRequestMode())); + ASSERT_FALSE(ci::QueryIsPackageInstalled( + pkgid, ci::GetRequestMode(tzplatform_getuid(TZ_SYS_DEFAULT_USER)), + tzplatform_getuid(TZ_SYS_DEFAULT_USER))); PackageCheckCleanup(pkgid, appids); } @@ -470,7 +482,8 @@ TEST_F(SmokeTest, RDSMode) { ValidatePackage(pkgid, {appid}); // Check delta modifications - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "DELETED")); ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "ADDED")); ValidateFileContentInPackage(pkgid, "res/wgt/MODIFIED", "2\n"); @@ -486,7 +499,9 @@ TEST_F(SmokeTest, EnablePkg) { ASSERT_EQ(EnablePackage(pkgid, PackageType::WGT), ci::AppInstaller::Result::OK); - ASSERT_TRUE(ci::QueryIsPackageInstalled(pkgid, ci::GetRequestMode())); + ASSERT_TRUE(ci::QueryIsPackageInstalled(pkgid, + ci::GetRequestMode(tzplatform_getuid(TZ_SYS_DEFAULT_USER)), + tzplatform_getuid(TZ_SYS_DEFAULT_USER))); } TEST_F(SmokeTest, DisablePkg) { @@ -497,7 +512,9 @@ TEST_F(SmokeTest, DisablePkg) { ci::AppInstaller::Result::OK); ASSERT_EQ(DisablePackage(pkgid, PackageType::WGT), ci::AppInstaller::Result::OK); - ASSERT_FALSE(ci::QueryIsPackageInstalled(pkgid, ci::GetRequestMode())); + ASSERT_FALSE(ci::QueryIsPackageInstalled(pkgid, + ci::GetRequestMode(tzplatform_getuid(TZ_SYS_DEFAULT_USER)), + tzplatform_getuid(TZ_SYS_DEFAULT_USER))); ValidatePackageFS(pkgid, {appid}); } @@ -507,7 +524,8 @@ TEST_F(SmokeTest, ClearMode) { std::string appid = "smokeapp20.ClearMode"; ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::OK); - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); bs::error_code error; bf::create_directory(root_path / pkgid / "data" / "dir", error); ASSERT_FALSE(error); @@ -529,7 +547,8 @@ TEST_F(SmokeTest, DeltaMode) { ValidatePackage(pkgid, {appid}); // Check delta modifications - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "DELETED")); ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "ADDED")); ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "css" / "style.css")); // NOLINT @@ -651,7 +670,8 @@ TEST_F(SmokeTest, DeltaMode_Hybrid) { ValidatePackage(pkgid, {appid1, appid2}); // Check delta modifications - bf::path root_path = ci::GetRootAppPath(false); + bf::path root_path = ci::GetRootAppPath(false, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "DELETED")); ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "ADDED")); ASSERT_FALSE(bf::exists(root_path / pkgid / "lib" / "DELETED")); diff --git a/src/wgt/step/encryption/step_encrypt_resources.cc b/src/wgt/step/encryption/step_encrypt_resources.cc index 8528ca9..c5e8d7a 100644 --- a/src/wgt/step/encryption/step_encrypt_resources.cc +++ b/src/wgt/step/encryption/step_encrypt_resources.cc @@ -135,18 +135,24 @@ bool StepEncryptResources::EncryptFile(const bf::path &src) { unsigned char* encrypted_data = nullptr; size_t enc_data_len = 0; // TODO(p.sikorski) check if it is Preloaded - wae_app_type_e enc_type = - context_->request_mode.get() == common_installer::RequestMode::GLOBAL ? - WAE_DOWNLOADED_GLOBAL_APP : WAE_DOWNLOADED_NORMAL_APP; - - - int ret = wae_encrypt_web_application( - context_->pkgid.get().c_str(), - enc_type, - reinterpret_cast(input_buffer), - length, - &encrypted_data, - &enc_data_len); + int ret; + if (context_->request_mode.get() == common_installer::RequestMode::GLOBAL) + ret = wae_encrypt_global_web_application( + context_->pkgid.get().c_str(), + context_->is_preload_request.get() ? + true : false, + reinterpret_cast(input_buffer), + length, + &encrypted_data, + &enc_data_len); + else + ret = wae_encrypt_web_application( + context_->uid.get(), + context_->pkgid.get().c_str(), + reinterpret_cast(input_buffer), + length, + &encrypted_data, + &enc_data_len); delete []input_buffer; if (WAE_ERROR_NONE != ret) { switch (ret) { diff --git a/src/wgt/step/encryption/step_remove_encryption_data.cc b/src/wgt/step/encryption/step_remove_encryption_data.cc index 4baa502..e398b23 100644 --- a/src/wgt/step/encryption/step_remove_encryption_data.cc +++ b/src/wgt/step/encryption/step_remove_encryption_data.cc @@ -12,14 +12,17 @@ namespace wgt { namespace encryption { common_installer::Step::Status StepRemoveEncryptionData::process() { - wae_app_type_e enc_type = - context_->request_mode.get() == common_installer::RequestMode::GLOBAL ? - WAE_DOWNLOADED_GLOBAL_APP : WAE_DOWNLOADED_NORMAL_APP; - // There is no check, if application was encrypted or not // (it is not saved anywhere in tizen manifest) // so, if WAE_ERROR_NO_KEY error, then application was not encrypted - int ret = wae_remove_app_dek(context_->pkgid.get().c_str(), enc_type); + int ret; + if (context_->request_mode.get() == common_installer::RequestMode::GLOBAL) + ret = wae_remove_global_app_dek(context_->pkgid.get().c_str(), + context_->is_preload_request.get() ? + true : false); + else + ret = wae_remove_app_dek(context_->uid.get(), + context_->pkgid.get().c_str()); if (WAE_ERROR_NONE == ret || WAE_ERROR_NO_KEY == ret) { LOG(DEBUG) << "Encryption data removed (if existed)"; return common_installer::Step::Status::OK; diff --git a/src/wgt/wgt_app_query_interface.cc b/src/wgt/wgt_app_query_interface.cc index 912c861..90adc45 100644 --- a/src/wgt/wgt_app_query_interface.cc +++ b/src/wgt/wgt_app_query_interface.cc @@ -36,6 +36,20 @@ namespace { const char kHybridConfigLocation[] = "res/wgt/config.xml"; const char kTizenManifestLocation[] = "tizen-manifest.xml"; +uid_t GetUid(int argc, char** argv) { + uid_t uid = 0; + for (int i = 0; i < argc; ++i) { + if (!strcmp(argv[i], "-u")) { + if (i + 1 < argc) { + uid = atoi(argv[i + 1]); + break; + } + } + } + + return uid; +} + std::string GetInstallationRequestInfo(int argc, char** argv) { std::string path; for (int i = 0; i < argc; ++i) { @@ -106,23 +120,26 @@ bool WgtAppQueryInterface::IsAppInstalledByArgv(int argc, char** argv) { if (arg.empty()) return false; + uid_t uid = GetUid(argc, argv); // argument from commandline is package id - if (ci::QueryIsPackageInstalled(arg, ci::GetRequestMode())) + if (ci::QueryIsPackageInstalled(arg, ci::GetRequestMode(uid), uid)) return true; // argument from commandline is path to file std::string pkg_id = GetPkgIdFromPath(arg); if (pkg_id.empty()) return false; - return ci::QueryIsPackageInstalled(pkg_id, ci::GetRequestMode()); + return ci::QueryIsPackageInstalled(pkg_id, ci::GetRequestMode(uid), uid); } bool WgtAppQueryInterface::IsHybridApplication(int argc, char** argv) { std::string arg = GetInstallationRequestInfo(argc, argv); if (arg.find("apps_rw/recovery-") != std::string::npos) arg = ReadPkgidFromRecovery(arg); - if (ci::QueryIsPackageInstalled(arg, ci::GetRequestMode())) { - bf::path package_directory(ci::GetRootAppPath(false)); + + uid_t uid = GetUid(argc, argv); + if (ci::QueryIsPackageInstalled(arg, ci::GetRequestMode(uid), uid)) { + bf::path package_directory(ci::GetRootAppPath(false, uid)); if (bf::exists(package_directory / arg / kTizenManifestLocation) && bf::exists(package_directory / arg / kHybridConfigLocation)) return true; -- 2.7.4 From 44675bd7493466f726936af6e6c18848433ecbe1 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Tue, 26 Jul 2016 21:51:59 +0900 Subject: [PATCH 07/16] symlink control for read-only files of global app. this is for new concept to support legacy app_path for backward compatibility. Requires: https://review.tizen.org/gerrit/#/c/81493/ Change-Id: I1ca76edc6dfe1c11a15a06e13b29c631779bf34e Signed-off-by: jongmyeongko Signed-off-by: Semun Lee Signed-off-by: jongmyeongko --- src/hybrid/hybrid_installer.cc | 24 +++++++++++++++------ src/wgt/step/encryption/step_encrypt_resources.cc | 2 +- .../step_wgt_prepare_package_directory.cc | 2 +- src/wgt/wgt_installer.cc | 25 +++++++++++++++++----- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 4d0d4e2..8d3060f 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -19,8 +19,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -32,8 +32,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -113,6 +113,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(false); AddStep(); AddStep(); @@ -130,7 +131,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); break; case ci::RequestType::Update: AddStep(pkgmgr_); @@ -159,6 +160,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(true); AddStep(); AddStep(); @@ -175,6 +177,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); + AddStep(); break; case ci::RequestType::Uninstall: AddStep(pkgmgr_); @@ -186,18 +189,19 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( ci::Plugin::ActionType::Uninstall); AddStep(); + AddStep(); AddStep(true); AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); - AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); + AddStep(); break; case ci::RequestType::Reinstall: // RDS is not supported for hybrid apps @@ -232,6 +236,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(true); AddStep(); AddStep(); @@ -248,6 +253,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); + AddStep(); break; case ci::RequestType::Recovery: AddStep(pkgmgr_); @@ -292,6 +298,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -309,7 +316,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); break; case ci::RequestType::MountUpdate: AddStep(pkgmgr_); @@ -338,6 +345,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -353,6 +361,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); + AddStep(); break; case ci::RequestType::ManifestDirectInstall: AddStep(pkgmgr_); @@ -370,13 +379,14 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); AddStep( ci::Plugin::ActionType::Install); AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); break; case ci::RequestType::ManifestDirectUpdate: AddStep(pkgmgr_); @@ -400,10 +410,12 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) ci::configuration::StepParseManifest::StoreLocation::BACKUP); AddStep(); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); + AddStep(); break; case ci::RequestType::EnablePkg: AddStep(pkgmgr_); diff --git a/src/wgt/step/encryption/step_encrypt_resources.cc b/src/wgt/step/encryption/step_encrypt_resources.cc index c5e8d7a..f8d5640 100644 --- a/src/wgt/step/encryption/step_encrypt_resources.cc +++ b/src/wgt/step/encryption/step_encrypt_resources.cc @@ -88,7 +88,7 @@ bool StepEncryptResources::Encrypt(const bf::path &src) { continue; } - bool is_sym = bf::is_symlink(current, error_code); + bool is_sym = bf::is_symlink(symlink_status(current, error_code)); if (error_code) return false; if (is_sym) diff --git a/src/wgt/step/filesystem/step_wgt_prepare_package_directory.cc b/src/wgt/step/filesystem/step_wgt_prepare_package_directory.cc index a4e1d6a..f4a1e6d 100644 --- a/src/wgt/step/filesystem/step_wgt_prepare_package_directory.cc +++ b/src/wgt/step/filesystem/step_wgt_prepare_package_directory.cc @@ -29,7 +29,7 @@ ci::Step::Status StepWgtPreparePackageDirectory::CreateSymlinkToMountPoint() { bf::path mount_point = ci::GetMountLocation(context_->pkg_path.get()); bf::path res_wgt_link = context_->pkg_path.get() / kResWgtDirectory; if (bf::exists(res_wgt_link)) { - if (!bf::is_symlink(res_wgt_link)) { + if (!bf::is_symlink(symlink_status(res_wgt_link))) { LOG(ERROR) << res_wgt_link << " is not symlink. Cannot proceed"; return Status::APP_DIR_ERROR; } diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index 01f2440..276fb30 100755 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -21,8 +21,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -35,8 +35,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -117,6 +117,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(false); AddStep(); AddStep(); @@ -133,7 +134,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) ci::Plugin::ActionType::Install); AddStep(); AddStep(); - AddStep(); + AddStep(); break; } case ci::RequestType::Update: { @@ -159,6 +160,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(true); AddStep(); AddStep(); @@ -174,6 +176,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); + AddStep(); break; } case ci::RequestType::Uninstall: { @@ -184,6 +187,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, ci::configuration::StepParseManifest::StoreLocation::NORMAL); AddStep(); + AddStep(); AddStep(true); AddStep( ci::Plugin::ActionType::Uninstall); @@ -192,12 +196,12 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); + AddStep(); break; } case ci::RequestType::Reinstall: { @@ -211,11 +215,13 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) ci::configuration::StepParseManifest::ManifestLocation::INSTALLED, ci::configuration::StepParseManifest::StoreLocation::BACKUP); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); + AddStep(); break; } case ci::RequestType::Delta: { @@ -247,6 +253,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(true); AddStep(); AddStep(); @@ -262,6 +269,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); + AddStep(); break; } case ci::RequestType::Recovery: { @@ -304,6 +312,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -320,7 +329,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); break; } case ci::RequestType::MountUpdate: { @@ -344,6 +353,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -358,6 +368,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); + AddStep(); break; } case ci::RequestType::ManifestDirectInstall: { @@ -373,10 +384,12 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(ci::Plugin::ActionType::Install); AddStep(); + AddStep(); break; } case ci::RequestType::ManifestDirectUpdate: { @@ -397,10 +410,12 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); + AddStep(); break; } case ci::RequestType::Move: { -- 2.7.4 From 5de284d28099719776d2462a7a3a1be83b0e7225 Mon Sep 17 00:00:00 2001 From: Piotr Ganicz Date: Tue, 16 Aug 2016 12:45:38 +0200 Subject: [PATCH 08/16] Prevent generating invalid manifest. This patch removes empty labels from manifest when generating. Change-Id: Iade7cbfefb7d282a6645d389b25c3bc713e5a87d --- src/wgt/step/pkgmgr/step_generate_xml.cc | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/wgt/step/pkgmgr/step_generate_xml.cc b/src/wgt/step/pkgmgr/step_generate_xml.cc index 262acb9..879c7fd 100644 --- a/src/wgt/step/pkgmgr/step_generate_xml.cc +++ b/src/wgt/step/pkgmgr/step_generate_xml.cc @@ -198,13 +198,15 @@ common_installer::Step::Status StepGenerateXml::GenerateApplicationCommonXml( } for (label_x* label : GListRange(app->label)) { - xmlTextWriterStartElement(writer, BAD_CAST "label"); - if (label->lang && strcmp(DEFAULT_LOCALE, label->lang) != 0) { - xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", - BAD_CAST label->lang); + if (label->name && strcmp(label->name, "") != 0) { + xmlTextWriterStartElement(writer, BAD_CAST "label"); + if (label->lang && strcmp(DEFAULT_LOCALE, label->lang) != 0) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", + BAD_CAST label->lang); + } + xmlTextWriterWriteString(writer, BAD_CAST label->name); + xmlTextWriterEndElement(writer); } - xmlTextWriterWriteString(writer, BAD_CAST label->name); - xmlTextWriterEndElement(writer); } if (app->icon) { @@ -413,13 +415,15 @@ void StepGenerateXml::GenerateManifestElementAttributes( void StepGenerateXml::GenerateLangLabels(xmlTextWriterPtr writer) { for (label_x* label : GListRange(context_->manifest_data.get()->label)) { - xmlTextWriterStartElement(writer, BAD_CAST "label"); - if (label->lang && strcmp(DEFAULT_LOCALE, label->lang) != 0) { + if (label->name && strcmp(label->name, "") != 0) { + xmlTextWriterStartElement(writer, BAD_CAST "label"); + if (label->lang && strcmp(DEFAULT_LOCALE, label->lang) != 0) { xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", - BAD_CAST label->lang); + BAD_CAST label->lang); + } + xmlTextWriterWriteString(writer, BAD_CAST label->name); + xmlTextWriterEndElement(writer); } - xmlTextWriterWriteString(writer, BAD_CAST label->name); - xmlTextWriterEndElement(writer); } } -- 2.7.4 From 742b001dc3cd0370926f7dbd858f1c5fe553bbbe Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Wed, 17 Aug 2016 16:12:48 +0900 Subject: [PATCH 09/16] Add step to change owner Change-Id: I57776874ed6680e58b6f9c3f4fc5dafb6f427152 Signed-off-by: Hwankyu Jhun --- src/wgt/wgt_installer.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index 276fb30..68d6775 100755 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -134,6 +135,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) ci::Plugin::ActionType::Install); AddStep(); AddStep(); + AddStep(); AddStep(); break; } @@ -176,6 +178,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); + AddStep(); AddStep(); break; } @@ -221,6 +224,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); break; } @@ -269,6 +273,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); + AddStep(); AddStep(); break; } @@ -329,6 +334,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); break; } @@ -368,6 +374,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); + AddStep(); AddStep(); break; } @@ -389,6 +396,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(ci::Plugin::ActionType::Install); AddStep(); + AddStep(); AddStep(); break; } @@ -415,6 +423,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep( ci::Plugin::ActionType::Upgrade); AddStep(); + AddStep(); AddStep(); break; } -- 2.7.4 From 3fd428f99e72065c31bdcdbd1c8d75e4e1c1e36e Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Fri, 19 Aug 2016 10:49:17 +0200 Subject: [PATCH 10/16] User 'app_fw' for smoke tests To verify, run: app_fw@localhost:~$ /usr/bin/wgt-backend-ut/smoke-test Fail expected: 'SmokeTest.RecoveryMode_Update' (on second run) This will be fixed separately. Tests: - SmokeTest.MountInstallationMode - SmokeTest.MountUpdateMode are expected to fail as well. Requires: - https://review.tizen.org/gerrit/#/c/84457/ Change-Id: Id08ad6bc3f294522e6c01d652194ebd248b7510b --- packaging/wgt-backend-tests.manifest | 4 +- packaging/wgt-backend.spec | 3 +- src/unit_tests/smoke_test.cc | 81 ++++++++++++----------- src/unit_tests/test_samples/smoke/DisablePkg.wgt | Bin 38015 -> 37645 bytes 4 files changed, 45 insertions(+), 43 deletions(-) diff --git a/packaging/wgt-backend-tests.manifest b/packaging/wgt-backend-tests.manifest index 9e728be..0d58b09 100644 --- a/packaging/wgt-backend-tests.manifest +++ b/packaging/wgt-backend-tests.manifest @@ -3,7 +3,7 @@ - - + + diff --git a/packaging/wgt-backend.spec b/packaging/wgt-backend.spec index 9d9f89a..9741293 100644 --- a/packaging/wgt-backend.spec +++ b/packaging/wgt-backend.spec @@ -53,7 +53,8 @@ mkdir -p %{buildroot}/etc/package-manager/backend ln -s %{_bindir}/wgt-backend %{buildroot}%{_sysconfdir}/package-manager/backend/wgt %post tests -/usr/sbin/setcap cap_dac_override=eip %{_bindir}/wgt-backend-ut/smoke-test +/usr/sbin/setcap cap_chown,cap_dac_override,cap_fowner=eip %{_bindir}/wgt-backend-ut/smoke-test +/usr/sbin/setcap cap_chown,cap_dac_override,cap_fowner=eip %{_bindir}/wgt-backend-ut/smoke-test-helper %files %manifest wgt-backend.manifest diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index 3e80354..c56ebbd 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -38,6 +38,10 @@ namespace ci = common_installer; namespace { +const uid_t kTestUserId = tzplatform_getuid(TZ_SYS_DEFAULT_USER); +const std::string kTestUserIdStr = + std::to_string(kTestUserId); + const bf::path kSmokePackagesDirectory = "/usr/share/wgt-backend-ut/test_samples/smoke/"; @@ -56,7 +60,7 @@ class ScopedTzipInterface { public: explicit ScopedTzipInterface(const std::string& pkgid) : pkg_path_(bf::path(ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER))) / pkgid), + kTestUserId)) / pkgid), interface_(ci::GetMountLocation(pkg_path_)) { interface_.MountZip(ci::GetZipPackageLocation(pkg_path_, pkgid)); } @@ -101,7 +105,7 @@ bool TouchFile(const bf::path& path) { void RemoveAllRecoveryFiles() { bf::path root_path = ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + kTestUserId); if (!bf::exists(root_path)) return; for (auto& dir_entry : boost::make_iterator_range( @@ -117,7 +121,7 @@ void RemoveAllRecoveryFiles() { bf::path FindRecoveryFile() { bf::path root_path = ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + kTestUserId); for (auto& dir_entry : boost::make_iterator_range( bf::directory_iterator(root_path), bf::directory_iterator())) { if (bf::is_regular_file(dir_entry)) { @@ -133,7 +137,7 @@ bool ValidateFileContentInPackage(const std::string& pkgid, const std::string& relative, const std::string& expected) { bf::path root_path = ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + kTestUserId); bf::path file_path = root_path / pkgid / relative; if (!bf::exists(file_path)) { LOG(ERROR) << file_path << " doesn't exist"; @@ -156,7 +160,7 @@ bool ValidateFileContentInPackage(const std::string& pkgid, void ValidatePackageFS(const std::string& pkgid, const std::vector& appids) { bf::path root_path = ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + kTestUserId); bf::path package_path = root_path / pkgid; bf::path data_path = package_path / "data"; bf::path shared_path = package_path / "shared"; @@ -169,7 +173,7 @@ void ValidatePackageFS(const std::string& pkgid, bf::path manifest_path = bf::path(getUserManifestPath( - tzplatform_getuid(TZ_SYS_DEFAULT_USER), false)) / (pkgid + ".xml"); + kTestUserId, false)) / (pkgid + ".xml"); ASSERT_TRUE(bf::exists(manifest_path)); for (auto& appid : appids) { @@ -195,13 +199,13 @@ void ValidatePackageFS(const std::string& pkgid, void PackageCheckCleanup(const std::string& pkgid, const std::vector&) { bf::path root_path = ci::GetRootAppPath( - false, tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + false, kTestUserId); bf::path package_path = root_path / pkgid; ASSERT_FALSE(bf::exists(package_path)); bf::path manifest_path = bf::path(getUserManifestPath( - tzplatform_getuid(TZ_SYS_DEFAULT_USER), false)) / (pkgid + ".xml"); + kTestUserId, false)) / (pkgid + ".xml"); ASSERT_FALSE(bf::exists(manifest_path)); // backups should not exist @@ -214,16 +218,16 @@ void PackageCheckCleanup(const std::string& pkgid, void ValidatePackage(const std::string& pkgid, const std::vector& appids) { ASSERT_TRUE(ci::QueryIsPackageInstalled( - pkgid, ci::GetRequestMode(tzplatform_getuid(TZ_SYS_DEFAULT_USER)), - tzplatform_getuid(TZ_SYS_DEFAULT_USER))); + pkgid, ci::GetRequestMode(kTestUserId), + kTestUserId)); ValidatePackageFS(pkgid, appids); } void CheckPackageNonExistance(const std::string& pkgid, const std::vector& appids) { ASSERT_FALSE(ci::QueryIsPackageInstalled( - pkgid, ci::GetRequestMode(tzplatform_getuid(TZ_SYS_DEFAULT_USER)), - tzplatform_getuid(TZ_SYS_DEFAULT_USER))); + pkgid, ci::GetRequestMode(kTestUserId), + kTestUserId)); PackageCheckCleanup(pkgid, appids); } @@ -281,7 +285,7 @@ ci::AppInstaller::Result CallBackend(int argc, ci::AppInstaller::Result Install(const bf::path& path, PackageType type, RequestResult mode = RequestResult::NORMAL) { - const char* argv[] = {"", "-i", path.c_str()}; + const char* argv[] = {"", "-i", path.c_str(), "-u", kTestUserIdStr.c_str()}; return CallBackend(SIZEOFARRAY(argv), argv, type, mode); } @@ -298,7 +302,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()}; + const char* argv[] = {"", "-w", path.c_str(), "-u", kTestUserIdStr.c_str()}; return CallBackend(SIZEOFARRAY(argv), argv, type, mode); } @@ -315,7 +319,7 @@ ci::AppInstaller::Result MountUpdate(const bf::path& path_old, ci::AppInstaller::Result Uninstall(const std::string& pkgid, PackageType type, RequestResult mode = RequestResult::NORMAL) { - const char* argv[] = {"", "-d", pkgid.c_str()}; + const char* argv[] = {"", "-d", pkgid.c_str(), "-u", kTestUserIdStr.c_str()}; return CallBackend(SIZEOFARRAY(argv), argv, type, mode); } @@ -327,7 +331,8 @@ ci::AppInstaller::Result Reinstall(const bf::path& path, LOG(ERROR) << "Failed to install application. Cannot perform RDS"; return ci::AppInstaller::Result::UNKNOWN; } - const char* argv[] = {"", "-r", delta_dir.c_str()}; + const char* argv[] = {"", "-r", delta_dir.c_str(), "-u", + kTestUserIdStr.c_str()}; return CallBackend(SIZEOFARRAY(argv), argv, type, mode); } @@ -343,28 +348,29 @@ ci::AppInstaller::Result DeltaInstall(const bf::path& path, ci::AppInstaller::Result Clear(const std::string& pkgid, PackageType type, RequestResult mode = RequestResult::NORMAL) { - const char* argv[] = {"", "-c", pkgid.c_str()}; + const char* argv[] = {"", "-c", pkgid.c_str(), "-u", kTestUserIdStr.c_str()}; 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()}; + const char* argv[] = {"", "-A", pkgid.c_str(), "-u", kTestUserIdStr.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()}; + const char* argv[] = {"", "-D", pkgid.c_str(), "-u", kTestUserIdStr.c_str()}; return CallBackend(SIZEOFARRAY(argv), argv, type, mode); } ci::AppInstaller::Result Recover(const bf::path& recovery_file, PackageType type, RequestResult mode = RequestResult::NORMAL) { - const char* argv[] = {"", "-b", recovery_file.c_str()}; + const char* argv[] = {"", "-b", recovery_file.c_str(), "-u", + kTestUserIdStr.c_str()}; TestPkgmgrInstaller pkgmgr_installer; std::unique_ptr query_interface = CreateQueryInterface(); @@ -387,7 +393,7 @@ class SmokeEnvironment : public testing::Environment { explicit SmokeEnvironment(const bf::path& home) : home_(home) { } void SetUp() override { - bf::path UserDBDir = bf::path(kUserDataBaseDir) / std::to_string(getuid()); + bf::path UserDBDir = bf::path(kUserDataBaseDir) / kTestUserIdStr; bf::path UserDBDirBackup = UserDBDir.string() + std::string(".bck"); bs::error_code error; @@ -420,7 +426,7 @@ class SmokeEnvironment : public testing::Environment { } } void TearDown() override { - bf::path UserDBDir = bf::path(kUserDataBaseDir) / std::to_string(getuid()); + bf::path UserDBDir = bf::path(kUserDataBaseDir) / kTestUserIdStr; bf::path UserDBDirBackup = UserDBDir.string() + std::string(".bck"); bs::error_code error; @@ -483,7 +489,7 @@ TEST_F(SmokeTest, RDSMode) { // Check delta modifications bf::path root_path = ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + kTestUserId); ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "DELETED")); ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "ADDED")); ValidateFileContentInPackage(pkgid, "res/wgt/MODIFIED", "2\n"); @@ -500,8 +506,8 @@ TEST_F(SmokeTest, EnablePkg) { ci::AppInstaller::Result::OK); ASSERT_TRUE(ci::QueryIsPackageInstalled(pkgid, - ci::GetRequestMode(tzplatform_getuid(TZ_SYS_DEFAULT_USER)), - tzplatform_getuid(TZ_SYS_DEFAULT_USER))); + ci::GetRequestMode(kTestUserId), + kTestUserId)); } TEST_F(SmokeTest, DisablePkg) { @@ -513,8 +519,8 @@ TEST_F(SmokeTest, DisablePkg) { ASSERT_EQ(DisablePackage(pkgid, PackageType::WGT), ci::AppInstaller::Result::OK); ASSERT_FALSE(ci::QueryIsPackageInstalled(pkgid, - ci::GetRequestMode(tzplatform_getuid(TZ_SYS_DEFAULT_USER)), - tzplatform_getuid(TZ_SYS_DEFAULT_USER))); + ci::GetRequestMode(kTestUserId), + kTestUserId)); ValidatePackageFS(pkgid, {appid}); } @@ -525,7 +531,7 @@ TEST_F(SmokeTest, ClearMode) { ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::OK); bf::path root_path = ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + kTestUserId); bs::error_code error; bf::create_directory(root_path / pkgid / "data" / "dir", error); ASSERT_FALSE(error); @@ -548,7 +554,7 @@ TEST_F(SmokeTest, DeltaMode) { // Check delta modifications bf::path root_path = ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + kTestUserId); ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "DELETED")); ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "ADDED")); ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "css" / "style.css")); // NOLINT @@ -560,7 +566,7 @@ TEST_F(SmokeTest, DeltaMode) { TEST_F(SmokeTest, RecoveryMode_ForInstallation) { bf::path path = kSmokePackagesDirectory / "RecoveryMode_ForInstallation.wgt"; Subprocess backend_crash("/usr/bin/wgt-backend-ut/smoke-test-helper"); - backend_crash.Run("-i", path.string()); + backend_crash.Run("-i", path.string(), "-u", kTestUserIdStr.c_str()); ASSERT_NE(backend_crash.Wait(), 0); std::string pkgid = "smokeapp09"; @@ -576,11 +582,9 @@ TEST_F(SmokeTest, RecoveryMode_ForUpdate) { bf::path path_old = kSmokePackagesDirectory / "RecoveryMode_ForUpdate.wgt"; bf::path path_new = kSmokePackagesDirectory / "RecoveryMode_ForUpdate_2.wgt"; RemoveAllRecoveryFiles(); - Subprocess backend_test("/usr/bin/wgt-backend"); - backend_test.Run("-i", path_old.string()); - ASSERT_EQ(backend_test.Wait(), 0); + ASSERT_EQ(Install(path_old, PackageType::WGT), ci::AppInstaller::Result::OK); Subprocess backend_crash("/usr/bin/wgt-backend-ut/smoke-test-helper"); - backend_crash.Run("-i", path_new.string()); + backend_crash.Run("-i", path_new.string(), "-u", kTestUserIdStr.c_str()); ASSERT_NE(backend_crash.Wait(), 0); std::string pkgid = "smokeapp10"; @@ -671,7 +675,7 @@ TEST_F(SmokeTest, DeltaMode_Hybrid) { // Check delta modifications bf::path root_path = ci::GetRootAppPath(false, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + kTestUserId); ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "DELETED")); ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "ADDED")); ASSERT_FALSE(bf::exists(root_path / pkgid / "lib" / "DELETED")); @@ -709,11 +713,8 @@ TEST_F(SmokeTest, MountUpdateMode) { int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); - const char* directory = getenv("HOME"); - if (!directory) { - LOG(ERROR) << "Cannot get $HOME value"; - return 1; - } + bf::path directory = + bf::path("/home") / tzplatform_getenv(TZ_SYS_DEFAULT_USER); testing::AddGlobalTestEnvironment( new common_installer::SmokeEnvironment(directory)); return RUN_ALL_TESTS(); diff --git a/src/unit_tests/test_samples/smoke/DisablePkg.wgt b/src/unit_tests/test_samples/smoke/DisablePkg.wgt index 3245443fdd54a4557dc6877b64e6c4032ef1b7c3..905c527d8af0e23de542a87b1b13a5b400c37d5e 100644 GIT binary patch delta 4860 zcmZu#WmFVgw;n=r=mtS*NC8n8kd8qekWjiofng{ShK`|AKxU+*rCUPjZfOAl8FDCT zBqikX#&_3yzxSTA&RYBI^_*wNkF%b&uM2Tw@^Q(v)bQ|W0YpSZ0C58vD0(D90Lkok zS`i`Dps5!=L>h~F(jANQlD@jx#Io&f&-O({YaM#`hn3WO_>W;3gZth3>&C^yMRDgJ zx-Hkhj�^PH;V>U&Q+{9c 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 -- 2.7.4 From a971a0f39e9454da5f787cf33e8d0609eb1d86e6 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Wed, 17 Aug 2016 10:33:53 +0200 Subject: [PATCH 11/16] Remove TODOs These TODOs won't be fixed or are already fixed. Change-Id: I78138e9120b1720986dddb44ab16d55e96432b0e --- src/wgt/step/configuration/step_parse.cc | 27 ++++++++++++++--------- src/wgt/step/configuration/step_parse.h | 1 + src/wgt/step/encryption/step_encrypt_resources.cc | 3 +-- src/wgt/step/pkgmgr/step_generate_xml.cc | 1 - 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/wgt/step/configuration/step_parse.cc b/src/wgt/step/configuration/step_parse.cc index 77f63a2..5b9fc7a 100644 --- a/src/wgt/step/configuration/step_parse.cc +++ b/src/wgt/step/configuration/step_parse.cc @@ -354,8 +354,6 @@ bool StepParse::FillServiceApplicationInfo(manifest_x* manifest) { application->icon = g_list_append(application->icon, icon); } - // TODO(t.iwanek): what about description, how is it different from name? - for (auto& category : service_info.categories()) { application->category = g_list_append(application->category, strdup(category.c_str())); @@ -560,6 +558,7 @@ bool StepParse::FillExtraManifestInfo(manifest_x* manifest) { } bool StepParse::FillManifestX(manifest_x* manifest) { + // Fill data for main application if (!FillIconPaths(manifest)) return false; if (!FillMainApplicationInfo(manifest)) @@ -576,18 +575,26 @@ bool StepParse::FillManifestX(manifest_x* manifest) { return false; if (!FillMetadata(manifest)) return false; - // TODO(t.iwanek): fix adding ui application element - // for now adding application service is added here because rest of code - // assumes that there is one application at manifest->application - // so this must execute last. Don't move it above any item - if (!FillServiceApplicationInfo(manifest)) - return false; - if (!FillWidgetApplicationInfo(manifest)) - return false; if (!FillBackgroundCategoryInfo(manifest)) return false; + + // Fill data for other applications + if (!FillAdditionalApplications(manifest)) + return false; + + // Fill extra data, other than manifest_x structure if (!FillExtraManifestInfo(manifest)) return false; + + return true; +} + + +bool StepParse::FillAdditionalApplications(manifest_x* manifest) { + if (!FillServiceApplicationInfo(manifest)) + return false; + if (!FillWidgetApplicationInfo(manifest)) + return false; return true; } diff --git a/src/wgt/step/configuration/step_parse.h b/src/wgt/step/configuration/step_parse.h index 69015fc..0effc8f 100644 --- a/src/wgt/step/configuration/step_parse.h +++ b/src/wgt/step/configuration/step_parse.h @@ -70,6 +70,7 @@ class StepParse : public common_installer::Step { bool FillImeInfo(); bool FillAppWidget(); bool FillBackgroundCategoryInfo(manifest_x* manifest); + bool FillAdditionalApplications(manifest_x* manifest); bool FillManifestX(manifest_x* manifest); std::unique_ptr parser_; diff --git a/src/wgt/step/encryption/step_encrypt_resources.cc b/src/wgt/step/encryption/step_encrypt_resources.cc index f8d5640..ad5485f 100644 --- a/src/wgt/step/encryption/step_encrypt_resources.cc +++ b/src/wgt/step/encryption/step_encrypt_resources.cc @@ -92,7 +92,7 @@ bool StepEncryptResources::Encrypt(const bf::path &src) { if (error_code) return false; if (is_sym) - continue; // TODO(p.sikorski) is it enough? + continue; // it is regular file (not dir, not symlink) if (ToBeEncrypted(current)) { @@ -134,7 +134,6 @@ bool StepEncryptResources::EncryptFile(const bf::path &src) { unsigned char* encrypted_data = nullptr; size_t enc_data_len = 0; - // TODO(p.sikorski) check if it is Preloaded int ret; if (context_->request_mode.get() == common_installer::RequestMode::GLOBAL) ret = wae_encrypt_global_web_application( diff --git a/src/wgt/step/pkgmgr/step_generate_xml.cc b/src/wgt/step/pkgmgr/step_generate_xml.cc index 879c7fd..16b27a0 100644 --- a/src/wgt/step/pkgmgr/step_generate_xml.cc +++ b/src/wgt/step/pkgmgr/step_generate_xml.cc @@ -324,7 +324,6 @@ common_installer::Step::Status StepGenerateXml::precheck() { LOG(ERROR) << "No application in package"; return Step::Status::INVALID_VALUE; } - // TODO(p.sikorski) check context_->uid.get() return Step::Status::OK; } -- 2.7.4 From 18927bf3b074235761c7366b18876ac913e9f22c Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Fri, 19 Aug 2016 12:46:58 +0200 Subject: [PATCH 12/16] StepWgtRecoverSignature To verify, run test: app_fw$ /usr/bin/wgt-backend-ut/smoke-test --gtest_filter=SmokeTest.RecoveryMode_ForUpdate Requires: - https://review.tizen.org/gerrit/84596 - https://review.tizen.org/gerrit/84598 Change-Id: I1046976f841a14c6b68d428e9604b29318b6bf80 --- src/hybrid/hybrid_installer.cc | 4 +++- src/wgt/CMakeLists.txt | 1 + .../step/security/step_wgt_recover_signature.cc | 23 ++++++++++++++++++ src/wgt/step/security/step_wgt_recover_signature.h | 27 ++++++++++++++++++++++ src/wgt/wgt_installer.cc | 4 +++- 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/wgt/step/security/step_wgt_recover_signature.cc create mode 100644 src/wgt/step/security/step_wgt_recover_signature.h diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 8d3060f..9099883 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -66,6 +66,7 @@ #include #include #include +#include #include "hybrid/hybrid_backend_data.h" #include "hybrid/step/configuration/step_merge_tpk_config.h" @@ -261,13 +262,14 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep( ci::configuration::StepParseManifest::ManifestLocation::RECOVERY, ci::configuration::StepParseManifest::StoreLocation::NORMAL); - AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); + AddStep(); + AddStep(); AddStep(); break; case ci::RequestType::Clear: diff --git a/src/wgt/CMakeLists.txt b/src/wgt/CMakeLists.txt index 2e70267..fece9b1 100755 --- a/src/wgt/CMakeLists.txt +++ b/src/wgt/CMakeLists.txt @@ -19,6 +19,7 @@ SET(SRCS step/security/step_check_wgt_ime_privilege.cc step/security/step_direct_manifest_check_signature.cc step/security/step_check_extension_privileges.cc + step/security/step_wgt_recover_signature.cc wgt_app_query_interface.cc wgt_installer.cc extension_config_parser.cc diff --git a/src/wgt/step/security/step_wgt_recover_signature.cc b/src/wgt/step/security/step_wgt_recover_signature.cc new file mode 100644 index 0000000..d18d172 --- /dev/null +++ b/src/wgt/step/security/step_wgt_recover_signature.cc @@ -0,0 +1,23 @@ +// Copyright (c) 2016 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 "wgt/step/security/step_wgt_recover_signature.h" + +namespace bf = boost::filesystem; + +namespace { + +const char kResWgt[] = "res/wgt"; + +} // namespace + +namespace wgt { +namespace security { + +bf::path StepWgtRecoverSignature::GetSignatureRoot() { + return context_->pkg_path.get() / kResWgt; +} + +} // namespace security +} // namespace wgt diff --git a/src/wgt/step/security/step_wgt_recover_signature.h b/src/wgt/step/security/step_wgt_recover_signature.h new file mode 100644 index 0000000..66545d7 --- /dev/null +++ b/src/wgt/step/security/step_wgt_recover_signature.h @@ -0,0 +1,27 @@ +// Copyright (c) 2016 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 WGT_STEP_SECURITY_STEP_WGT_RECOVER_SIGNATURE_H_ +#define WGT_STEP_SECURITY_STEP_WGT_RECOVER_SIGNATURE_H_ + +#include + +#include + +namespace wgt { +namespace security { + +class StepWgtRecoverSignature + : public common_installer::security::StepRecoverSignature { + public: + using StepRecoverSignature::StepRecoverSignature; + + private: + boost::filesystem::path GetSignatureRoot() override; +}; + +} // namespace security +} // namespace wgt + +#endif // WGT_STEP_SECURITY_STEP_WGT_RECOVER_SIGNATURE_H_ diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index 68d6775..ea96cf2 100755 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -90,6 +90,7 @@ #include "wgt/step/security/step_check_wgt_ime_privilege.h" #include "wgt/step/security/step_direct_manifest_check_signature.h" #include "wgt/step/security/step_check_extension_privileges.h" +#include "wgt/step/security/step_wgt_recover_signature.h" namespace ci = common_installer; @@ -283,13 +284,14 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep( ci::configuration::StepParseManifest::ManifestLocation::RECOVERY, ci::configuration::StepParseManifest::StoreLocation::NORMAL); - AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); AddStep(); + AddStep(); + AddStep(); AddStep(); break; } -- 2.7.4 From 0a8d924a174720c1c77f9a47aedf251fe4e3b7df Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Fri, 19 Aug 2016 13:09:03 +0200 Subject: [PATCH 13/16] Fix mount install smoke tests Repacking zips. It seems that tzip is not working properly if zip package doesn't have empty entries per each directory in package. New zips have entries for all directories in widgets. To verify, run: app_fw$ /usr/bin/wgt-backend-ut/smoke-test --gtest_filter=SmokeTest.MountInstallationMode app_fw$ /usr/bin/wgt-backend-ut/smoke-test --gtest_filter=SmokeTest.MountUpdateMode Change-Id: Icbe007ccf5524d2a2326f4dbe5c05466d174e5c2 --- .../test_samples/smoke/MountInstallationMode.wgt | Bin 37645 -> 38615 bytes .../test_samples/smoke/MountUpdateMode.wgt | Bin 37842 -> 38848 bytes .../test_samples/smoke/MountUpdateMode_2.wgt | Bin 37846 -> 38850 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/unit_tests/test_samples/smoke/MountInstallationMode.wgt b/src/unit_tests/test_samples/smoke/MountInstallationMode.wgt index ba9d1ea66cbb39e6afd55a9c133df1057918dbd7..56b7ce5f14b537bd5f9fcabec8a2da2a557cf4e6 100644 GIT binary patch delta 24843 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

+^sCI5?mGr(k2zM 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⪼@U0PrE;vjUZ6>Vbok? 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 OMJ-Dx56B4nv-dykQ*E38 diff --git a/src/unit_tests/test_samples/smoke/MountUpdateMode.wgt b/src/unit_tests/test_samples/smoke/MountUpdateMode.wgt index 872ae62c20a9586343e64b0ca5c14af33d89c0cb..cdf556ddecef80bee935e80fc47e673a38c0b289 100644 GIT binary patch delta 24848 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 delta 23837 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 <9h}jaYuk9SvfIz;z(7w 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 delta 23837 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 bhIib5S}k1-9MGSW_~?Zg%{6aI{d4p`rL}gc -- 2.7.4 From ffed2fb48a6b6e2a030bd2bc352f8a632af5ac0e Mon Sep 17 00:00:00 2001 From: Bartlomiej Kunikowski Date: Wed, 24 Aug 2016 14:59:02 +0200 Subject: [PATCH 14/16] Implement long-polling setting - check privilege Requires: - https://review.tizen.org/gerrit/#/c/85303/ Change-Id: I9e856727bf240d6d407cea03976024ee18f643d0 --- src/wgt/step/security/step_check_settings_level.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/wgt/step/security/step_check_settings_level.cc b/src/wgt/step/security/step_check_settings_level.cc index 270eb04..87f7702 100644 --- a/src/wgt/step/security/step_check_settings_level.cc +++ b/src/wgt/step/security/step_check_settings_level.cc @@ -25,6 +25,17 @@ bool ValidateSettingsForLevel(common_installer::PrivilegeLevel level, } LOG(INFO) << "Setting: 'background-vibration' allowed"; } + + if (settings.long_polling()) { + common_installer::PrivilegeLevel required_level = + common_installer::PrivilegeLevel::PARTNER; + if (!common_installer::SatifiesPrivilegeLevel(required_level, level)) { + LOG(ERROR) << "long-polling requires visibility level: " + << common_installer::PrivilegeLevelToString(required_level); + return false; + } + LOG(INFO) << "Setting: 'long-polling' allowed"; + } return true; } -- 2.7.4 From 2f85b1a3cb78e3b26ea98bfe30d90b221b302a0e Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Tue, 23 Aug 2016 11:51:27 +0200 Subject: [PATCH 15/16] Modify getting icon list Installer (now) provides xml:lang localization of icon items in platform manifest. This information is generated from folder based localization of wgt package. From now: - icon list returned by handler contains only valid tag related positions, this will prevent parser from modifing constant data, - client will need to pass icon list from handler to utility function (together with base path) to get localized custom and default icon list that can be used in runtime or for platform manifest tag assignment, - installer generates list of localized icons and for each available locale icon element in manifest_x is created. Submit together: - https://review.tizen.org/gerrit/85076 - https://review.tizen.org/gerrit/85078 Change-Id: I8797bfa57f185d679dd5b6cbea4278658bedd7a2 --- CMakeLists.txt | 1 + data/CMakeLists.txt | 1 + data/default.png | Bin 0 -> 57662 bytes packaging/wgt-backend.spec | 1 + src/wgt/step/configuration/step_parse.cc | 43 ++++++++++++++------ src/wgt/step/filesystem/step_wgt_patch_icons.cc | 51 ++++++++++++++++++------ src/wgt/step/pkgmgr/step_generate_xml.cc | 15 +++---- 7 files changed, 79 insertions(+), 33 deletions(-) create mode 100644 data/CMakeLists.txt create mode 100644 data/default.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 20eafb2..f39937d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,4 +52,5 @@ PKG_CHECK_MODULES(TPK_INSTALLER_DEPS REQUIRED tpk-installer) FIND_PACKAGE(Boost REQUIRED COMPONENTS system filesystem regex program_options) FIND_PACKAGE(GTest REQUIRED) +ADD_SUBDIRECTORY(data) ADD_SUBDIRECTORY(src) diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt new file mode 100644 index 0000000..ea0766f --- /dev/null +++ b/data/CMakeLists.txt @@ -0,0 +1 @@ +INSTALL(FILES "default.png" DESTINATION "${SHAREDIR}/wgt-backend/") diff --git a/data/default.png b/data/default.png new file mode 100644 index 0000000000000000000000000000000000000000..9765b1bda7e5bddf0925555ab204b887a873bf24 GIT binary patch literal 57662 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 kZ}gYfNaCF}xV$|1>H6z0+kD #include #include +#include #include #include #include #include #include -#include +#include #include @@ -154,17 +155,34 @@ bool StepParse::FillIconPaths(manifest_x* manifest) { return false; } auto icons_info = - GetManifestDataForKey( - app_keys::kIconsKey); - if (icons_info.get()) { - for (auto& application_icon : icons_info->icons()) { - icon_x* icon = reinterpret_cast (calloc(1, sizeof(icon_x))); - bf::path icon_path = context_->root_application_path.get() - / app_info->package() / "res" / "wgt" / application_icon.path(); - icon->text = strdup(icon_path.c_str()); + GetManifestDataForKey( + app_keys::kIconsKey); + if (!icons_info) { + icons_info.reset(new wgt::parse::ApplicationIconsInfo()); + } + wgt::parse::LocalizedApplicationIconsInfo localized_list = + wgt::parse::GetLocalizedIconList(*icons_info, + context_->unpacked_dir_path.get()); + // We need to generate icon for each locale and icons are already set into + // lookup order. There isn't said that all icons should be received from + // one tag position so we iterate utils we run out of icons creating + // any icon element that are possible for given locale. + std::set found_locales; + for (auto& application_icon : localized_list) { + const std::string& locale = application_icon.locale(); + if (found_locales.find(locale) != found_locales.end()) + continue; + found_locales.insert(locale); + + icon_x* icon = reinterpret_cast(calloc(1, sizeof(icon_x))); + bf::path icon_path = context_->root_application_path.get() + / app_info->package() / "res" / "wgt" / application_icon.path(); + icon->text = strdup(icon_path.c_str()); + if (!locale.empty()) + icon->lang = strdup(locale.c_str()); + else icon->lang = strdup(DEFAULT_LOCALE); - manifest->icon = g_list_append(manifest->icon, icon); - } + manifest->icon = g_list_append(manifest->icon, icon); } return true; } @@ -300,8 +318,7 @@ bool StepParse::FillMainApplicationInfo(manifest_x* manifest) { application->autorestart = strdup("false"); application->launch_mode = strdup(app_info->launch_mode().c_str()); - if (manifest->icon) { - icon_x* icon = reinterpret_cast(manifest->icon->data); + for (auto& icon : GListRange(manifest->icon)) { icon_x* app_icon = reinterpret_cast(calloc(1, sizeof(icon_x))); app_icon->text = strdup(icon->text); app_icon->lang = strdup(icon->lang); diff --git a/src/wgt/step/filesystem/step_wgt_patch_icons.cc b/src/wgt/step/filesystem/step_wgt_patch_icons.cc index 5bcb229..2a995b2 100644 --- a/src/wgt/step/filesystem/step_wgt_patch_icons.cc +++ b/src/wgt/step/filesystem/step_wgt_patch_icons.cc @@ -13,6 +13,12 @@ namespace bf = boost::filesystem; namespace bs = boost::system; namespace ci = common_installer; +namespace { + +const char kDefaultIconPath[] = "/usr/share/wgt-backend/default.png"; + +} // namespace + namespace wgt { namespace filesystem { @@ -25,24 +31,43 @@ common_installer::Step::Status StepWgtPatchIcons::process() { if (strcmp(app->type, "webapp") != 0) continue; if (app->icon) { - icon_x* icon = reinterpret_cast(app->icon->data); - bf::path icon_text(icon->text); - bf::path icon_path = common_icon_location / app->appid; - if (icon_text.has_extension()) - icon_path += icon_text.extension(); - else - icon_path += ".png"; + // edit icon->text and copy icons to common location + for (auto& icon : GListRange(app->icon)) { + bf::path icon_text(icon->text); + bf::path icon_path = common_icon_location / app->appid; + if (strcmp(icon->lang, DEFAULT_LOCALE)) { + icon_path += "."; + icon_path += icon->lang; + } + if (icon_text.has_extension()) + icon_path += icon_text.extension(); + else + icon_path += ".png"; - bf::copy_file(icon->text, icon_path, - bf::copy_option::overwrite_if_exists, error); + bf::copy_file(icon->text, icon_path, + bf::copy_option::overwrite_if_exists, error); + if (error) { + LOG(ERROR) << "Failed to move icon from " << icon->text << " to " + << icon_path; + return Status::ICON_ERROR; + } + if (icon->text) + free(const_cast(icon->text)); + icon->text = strdup(icon_path.c_str()); + } + } else { + // create default icon if there is no icon at all + bf::path icon_path = common_icon_location / app->appid; + icon_path += ".png"; + bf::copy_file(kDefaultIconPath, icon_path, error); if (error) { - LOG(ERROR) << "Failed to move icon from " << icon->text << " to " - << icon_path; + LOG(ERROR) << "Failed to create default icon for web application"; return Status::ICON_ERROR; } - if (icon->text) - free(const_cast(icon->text)); + icon_x* icon = reinterpret_cast(calloc(1, sizeof(icon_x))); icon->text = strdup(icon_path.c_str()); + icon->lang = strdup(DEFAULT_LOCALE); + app->icon = g_list_append(app->icon, icon); } } return Status::OK; diff --git a/src/wgt/step/pkgmgr/step_generate_xml.cc b/src/wgt/step/pkgmgr/step_generate_xml.cc index 16b27a0..8094412 100644 --- a/src/wgt/step/pkgmgr/step_generate_xml.cc +++ b/src/wgt/step/pkgmgr/step_generate_xml.cc @@ -209,13 +209,14 @@ common_installer::Step::Status StepGenerateXml::GenerateApplicationCommonXml( } } - if (app->icon) { - icon_x* iconx = reinterpret_cast(app->icon->data); - xmlTextWriterWriteFormatElement( - writer, BAD_CAST "icon", "%s", BAD_CAST iconx->text); - } else { - // Default icon setting is role of the platform - LOG(DEBUG) << "Icon was not found in application"; + for (auto& icon : GListRange(app->icon)) { + xmlTextWriterStartElement(writer, BAD_CAST "icon"); + if (icon->lang && strcmp(DEFAULT_LOCALE, icon->lang) != 0) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", + BAD_CAST icon->lang); + } + xmlTextWriterWriteString(writer, BAD_CAST icon->text); + xmlTextWriterEndElement(writer); } for (image_x* image : GListRange(app->image)) { -- 2.7.4 From 8e4378497ce80451d613ac4f627452ed29dc21b1 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Wed, 17 Aug 2016 10:06:08 +0200 Subject: [PATCH 16/16] Add StepChangeOwner for HybridInstaller Complementary changes to: https://review.tizen.org/gerrit/#/c/84185/ To verify, install hybrid package and check that files of installed package have owner's ownership. Change-Id: I8a644be5567acd1a6ce800225cb9050043c32f76 --- src/hybrid/hybrid_installer.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 9099883..00bfcb3 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -132,6 +133,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); break; case ci::RequestType::Update: @@ -178,6 +180,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); + AddStep(); AddStep(); break; case ci::RequestType::Uninstall: @@ -254,6 +257,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); + AddStep(); AddStep(); break; case ci::RequestType::Recovery: @@ -318,6 +322,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); break; case ci::RequestType::MountUpdate: @@ -363,6 +368,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); + AddStep(); AddStep(); break; case ci::RequestType::ManifestDirectInstall: @@ -388,6 +394,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); AddStep(); break; case ci::RequestType::ManifestDirectUpdate: @@ -417,6 +424,7 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep( ci::Plugin::ActionType::Upgrade); + AddStep(); AddStep(); break; case ci::RequestType::EnablePkg: -- 2.7.4