From c6e1bd9a28d18c88b335c07e4da1e4246f704bd8 Mon Sep 17 00:00:00 2001 From: Pawel Sikorski Date: Fri, 18 Dec 2015 10:50:50 +0100 Subject: [PATCH 02/11] Adding initial files to repository Adding: * LICENSE, AUTHORS * check-coding-style tool * packaging spec file (now empty) Change-Id: I15e52b9c6af8741fc06513290ca93210f703a8c6 --- AUTHORS | 1 + LICENSE | 203 +++++++++++++++++++++++++++++++++++++++++++++ packaging/wgt-backend.spec | 17 ++++ tools/check-coding-style | 28 +++++++ 4 files changed, 249 insertions(+) create mode 100644 AUTHORS create mode 100644 LICENSE create mode 100644 packaging/wgt-backend.spec create mode 100755 tools/check-coding-style diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..d115209 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +p.sikorski@samsung.com diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..53779e4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,203 @@ +// 2015, Copyright (c) Samsung Electronics Co., Ltd All Rights Reserved + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packaging/wgt-backend.spec b/packaging/wgt-backend.spec new file mode 100644 index 0000000..3c17083 --- /dev/null +++ b/packaging/wgt-backend.spec @@ -0,0 +1,17 @@ +#Available values for profile: mobile, wearable, tv, ivi, common +%{!?profile:%define profile tv} + +Name: wgt-backend +Summary: Application installer backend for WGT +Version: 0.1 +Release: 1 +Group: Application Framework/Package Management +License: Apache-2.0 +Source0: %{name}-%{version}.tar.gz + + +%changelog +* Thu Dec 18 2015 Pawel Sikorski 0.1-1 +- initial files creation + + diff --git a/tools/check-coding-style b/tools/check-coding-style new file mode 100755 index 0000000..fd60481 --- /dev/null +++ b/tools/check-coding-style @@ -0,0 +1,28 @@ +#!/bin/bash +# Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +if [ ! `which cpplint.py` ]; then + echo -e "\nPlease make sure cpplint.py is in your PATH. It is part of depot_tools inside Chromium repository." + exit 1 +fi + +OLDPWD=$PWD +BASE=`dirname $0` +cd $BASE/.. + +# filters +FILTERS="-readability/streams,-build/c++11" + +cpplint.py --root=src --filter="$FILTERS" $(find . \( -name '*.h' -o -name '*.cc' \) ) +RET=$? + +JS_RET_VAL=$? +cd $OLDPWD + +if [ "x$RET" == "x0" ]; then + exit 0 +else + exit 1 +fi -- 2.7.4 From 19dd0a66cfd6569cf120233e7d8e3672e7f97670 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Mon, 14 Dec 2015 13:58:10 +0100 Subject: [PATCH 03/11] Move wgt-backend implementation from app-installers Requires to be submitted with: - https://review.tizen.org/gerrit/#/c/54291/ Aligned with app-installer's commit: 532a4707928d6d137c2cb93ae3523f25f0ac06ee Change-Id: I30347bd6ca66026d3e363bb16000a44e2d791f39 --- CMakeLists.txt | 48 ++ cmake/Modules/ApplyPkgConfig.cmake | 35 ++ packaging/wgt-backend-tests.manifest | 8 + packaging/wgt-backend.manifest | 8 + packaging/wgt-backend.spec | 54 +- src/CMakeLists.txt | 2 + src/unit_tests/CMakeLists.txt | 22 + src/unit_tests/smoke_test.cc | 473 +++++++++++++++++ .../test_samples/smoke/DeinstallationMode.wgt | Bin 0 -> 33312 bytes .../smoke/DeinstallationMode_Rollback.wgt | Bin 0 -> 33320 bytes src/unit_tests/test_samples/smoke/DeltaMode.delta | Bin 0 -> 1070 bytes src/unit_tests/test_samples/smoke/DeltaMode.wgt | Bin 0 -> 34283 bytes .../test_samples/smoke/InstallationMode.wgt | Bin 0 -> 33311 bytes .../smoke/InstallationMode_GoodSignature.wgt | Bin 0 -> 38029 bytes .../smoke/InstallationMode_Rollback.wgt | Bin 0 -> 33320 bytes .../smoke/InstallationMode_WrongSignature.wgt | Bin 0 -> 37906 bytes src/unit_tests/test_samples/smoke/RDSMode.wgt | Bin 0 -> 34275 bytes .../smoke/RecoveryMode_ForInstallation.wgt | Bin 0 -> 33322 bytes .../test_samples/smoke/RecoveryMode_ForUpdate.wgt | Bin 0 -> 34140 bytes .../smoke/RecoveryMode_ForUpdate_2.wgt | Bin 0 -> 34140 bytes src/unit_tests/test_samples/smoke/UpdateMode.wgt | Bin 0 -> 34134 bytes src/unit_tests/test_samples/smoke/UpdateMode_2.wgt | Bin 0 -> 34134 bytes .../test_samples/smoke/UpdateMode_Rollback.wgt | Bin 0 -> 34141 bytes .../test_samples/smoke/UpdateMode_Rollback_2.wgt | Bin 0 -> 34141 bytes .../test_samples/smoke/delta_dir/.rds_delta | 6 + src/unit_tests/test_samples/smoke/delta_dir/ADDED | 0 .../test_samples/smoke/delta_dir/MODIFIED | 1 + .../test_samples/smoke/delta_dir/config.xml | 9 + src/wgt/CMakeLists.txt | 51 ++ src/wgt/rds_parser.cc | 61 +++ src/wgt/rds_parser.h | 63 +++ src/wgt/step/step_add_default_privileges.cc | 38 ++ src/wgt/step/step_add_default_privileges.h | 59 +++ src/wgt/step/step_check_settings_level.cc | 47 ++ src/wgt/step/step_check_settings_level.h | 59 +++ src/wgt/step/step_check_wgt_background_category.cc | 30 ++ src/wgt/step/step_check_wgt_background_category.h | 31 ++ src/wgt/step/step_create_symbolic_link.cc | 71 +++ src/wgt/step/step_create_symbolic_link.h | 61 +++ src/wgt/step/step_encrypt_resources.cc | 215 ++++++++ src/wgt/step/step_encrypt_resources.h | 66 +++ src/wgt/step/step_generate_xml.cc | 494 ++++++++++++++++++ src/wgt/step/step_generate_xml.h | 45 ++ src/wgt/step/step_parse.cc | 574 +++++++++++++++++++++ src/wgt/step/step_parse.h | 100 ++++ src/wgt/step/step_parse_recovery.cc | 56 ++ src/wgt/step/step_parse_recovery.h | 63 +++ src/wgt/step/step_rds_modify.cc | 226 ++++++++ src/wgt/step/step_rds_modify.h | 87 ++++ src/wgt/step/step_rds_parse.cc | 50 ++ src/wgt/step/step_rds_parse.h | 61 +++ src/wgt/step/step_remove_encryption_data.cc | 54 ++ src/wgt/step/step_remove_encryption_data.h | 57 ++ src/wgt/step/step_wgt_copy_storage_directories.cc | 172 ++++++ src/wgt/step/step_wgt_copy_storage_directories.h | 58 +++ src/wgt/step/step_wgt_create_icons.cc | 22 + src/wgt/step/step_wgt_create_icons.h | 36 ++ .../step/step_wgt_create_storage_directories.cc | 102 ++++ src/wgt/step/step_wgt_create_storage_directories.h | 77 +++ src/wgt/step/step_wgt_resource_directory.cc | 44 ++ src/wgt/step/step_wgt_resource_directory.h | 62 +++ src/wgt/wgt_app_query_interface.cc | 101 ++++ src/wgt/wgt_app_query_interface.h | 33 ++ src/wgt/wgt_backend.cc | 23 + src/wgt/wgt_backend_data.h | 47 ++ src/wgt/wgt_installer.cc | 179 +++++++ src/wgt/wgt_installer.h | 31 ++ 67 files changed, 4370 insertions(+), 2 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 cmake/Modules/ApplyPkgConfig.cmake create mode 100644 packaging/wgt-backend-tests.manifest create mode 100644 packaging/wgt-backend.manifest create mode 100644 src/CMakeLists.txt create mode 100644 src/unit_tests/CMakeLists.txt create mode 100644 src/unit_tests/smoke_test.cc create mode 100644 src/unit_tests/test_samples/smoke/DeinstallationMode.wgt create mode 100644 src/unit_tests/test_samples/smoke/DeinstallationMode_Rollback.wgt create mode 100644 src/unit_tests/test_samples/smoke/DeltaMode.delta create mode 100644 src/unit_tests/test_samples/smoke/DeltaMode.wgt create mode 100644 src/unit_tests/test_samples/smoke/InstallationMode.wgt create mode 100644 src/unit_tests/test_samples/smoke/InstallationMode_GoodSignature.wgt create mode 100644 src/unit_tests/test_samples/smoke/InstallationMode_Rollback.wgt create mode 100644 src/unit_tests/test_samples/smoke/InstallationMode_WrongSignature.wgt create mode 100644 src/unit_tests/test_samples/smoke/RDSMode.wgt create mode 100644 src/unit_tests/test_samples/smoke/RecoveryMode_ForInstallation.wgt create mode 100644 src/unit_tests/test_samples/smoke/RecoveryMode_ForUpdate.wgt create mode 100644 src/unit_tests/test_samples/smoke/RecoveryMode_ForUpdate_2.wgt create mode 100644 src/unit_tests/test_samples/smoke/UpdateMode.wgt create mode 100644 src/unit_tests/test_samples/smoke/UpdateMode_2.wgt create mode 100644 src/unit_tests/test_samples/smoke/UpdateMode_Rollback.wgt create mode 100644 src/unit_tests/test_samples/smoke/UpdateMode_Rollback_2.wgt create mode 100644 src/unit_tests/test_samples/smoke/delta_dir/.rds_delta create mode 100644 src/unit_tests/test_samples/smoke/delta_dir/ADDED create mode 100644 src/unit_tests/test_samples/smoke/delta_dir/MODIFIED create mode 100644 src/unit_tests/test_samples/smoke/delta_dir/config.xml create mode 100644 src/wgt/CMakeLists.txt create mode 100644 src/wgt/rds_parser.cc create mode 100644 src/wgt/rds_parser.h create mode 100644 src/wgt/step/step_add_default_privileges.cc create mode 100644 src/wgt/step/step_add_default_privileges.h create mode 100644 src/wgt/step/step_check_settings_level.cc create mode 100644 src/wgt/step/step_check_settings_level.h create mode 100644 src/wgt/step/step_check_wgt_background_category.cc create mode 100644 src/wgt/step/step_check_wgt_background_category.h create mode 100644 src/wgt/step/step_create_symbolic_link.cc create mode 100644 src/wgt/step/step_create_symbolic_link.h create mode 100644 src/wgt/step/step_encrypt_resources.cc create mode 100644 src/wgt/step/step_encrypt_resources.h create mode 100644 src/wgt/step/step_generate_xml.cc create mode 100644 src/wgt/step/step_generate_xml.h create mode 100644 src/wgt/step/step_parse.cc create mode 100644 src/wgt/step/step_parse.h create mode 100644 src/wgt/step/step_parse_recovery.cc create mode 100644 src/wgt/step/step_parse_recovery.h create mode 100644 src/wgt/step/step_rds_modify.cc create mode 100644 src/wgt/step/step_rds_modify.h create mode 100644 src/wgt/step/step_rds_parse.cc create mode 100644 src/wgt/step/step_rds_parse.h create mode 100644 src/wgt/step/step_remove_encryption_data.cc create mode 100644 src/wgt/step/step_remove_encryption_data.h create mode 100644 src/wgt/step/step_wgt_copy_storage_directories.cc create mode 100644 src/wgt/step/step_wgt_copy_storage_directories.h create mode 100644 src/wgt/step/step_wgt_create_icons.cc create mode 100644 src/wgt/step/step_wgt_create_icons.h create mode 100644 src/wgt/step/step_wgt_create_storage_directories.cc create mode 100644 src/wgt/step/step_wgt_create_storage_directories.h create mode 100644 src/wgt/step/step_wgt_resource_directory.cc create mode 100644 src/wgt/step/step_wgt_resource_directory.h create mode 100644 src/wgt/wgt_app_query_interface.cc create mode 100644 src/wgt/wgt_app_query_interface.h create mode 100644 src/wgt/wgt_backend.cc create mode 100644 src/wgt/wgt_backend_data.h create mode 100644 src/wgt/wgt_installer.cc create mode 100644 src/wgt/wgt_installer.h diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..565d531 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,48 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12) +PROJECT(WgtBackend) +SET(PREFIX "${CMAKE_INSTALL_PREFIX}") +SET(BINDIR "${CMAKE_INSTALL_PREFIX}/bin") +SET(LIBDIR "${CMAKE_INSTALL_LIBDIR}") +SET(SHAREDIR "${CMAKE_INSTALL_PREFIX}/share") +SET(INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include") +SET(VERSION_MAJOR 0) +SET(VERSION "${VERSION_MAJOR}.1.0") + +IF(NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE "Release") +ENDIF(NOT CMAKE_BUILD_TYPE) + +# Compiler flags +SET(CMAKE_C_FLAGS_PROFILING "-O2") +SET(CMAKE_CXX_FLAGS_PROFILING "-O2 -std=c++11") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -std=c++11 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2 -g") +SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -std=c++11 -g") +SET(CMAKE_CXX_FLAGS_CCOV "-O0 -std=c++11 -g --coverage") + +# Targets +SET(TARGET_LIBNAME_WGT "wgt-installer") +SET(TARGET_WGT_BACKEND "wgt-backend") +SET(TARGET_SMOKE_TEST "smoke_test") + +ADD_DEFINITIONS("-Wall") +ADD_DEFINITIONS("-Wextra") +ADD_DEFINITIONS("-fPIE") +ADD_DEFINITIONS("-fPIC") + +SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") +INCLUDE(FindPkgConfig) +INCLUDE(ApplyPkgConfig) + +# Find all needed packages once +PKG_CHECK_MODULES(APP_INSTALLERS_DEPS REQUIRED app-installers) +PKG_CHECK_MODULES(MANIFEST_HANDLERS_DEPS REQUIRED manifest-handlers) +PKG_CHECK_MODULES(MANIFEST_PARSER_DEPS REQUIRED manifest-parser) +PKG_CHECK_MODULES(PKGMGR_INSTALLER_DEPS REQUIRED pkgmgr-installer) +PKG_CHECK_MODULES(ENCRYPTION_DEPS REQUIRED libwebappenc) + +FIND_PACKAGE(Boost REQUIRED COMPONENTS system filesystem regex program_options) +FIND_PACKAGE(GTest REQUIRED) + +ADD_SUBDIRECTORY(src) diff --git a/cmake/Modules/ApplyPkgConfig.cmake b/cmake/Modules/ApplyPkgConfig.cmake new file mode 100644 index 0000000..97679d7 --- /dev/null +++ b/cmake/Modules/ApplyPkgConfig.cmake @@ -0,0 +1,35 @@ +# Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# +# This function applies external (out of source tree) dependencies +# to given target. Arguments are: +# TARGET - valid cmake target +# PRIVACY - dependency can be inherited by dependent targets or not: +# PUBLIC - this should be used by default, cause compile/link flags passing +# PRIVATE - do not passes any settings to dependent targets, +# may be usefull for static libraries from the inside of the project +# Argument ARGV2 and following are supposed to be names of checked pkg config +# packages. This function will use variables created by check_pkg_modules(). +# - ${DEP_NAME}_LIBRARIES +# - ${DEP_NAME}_INCLUDE_DIRS +# - ${DEP_NAME}_CFLAGS +# +FUNCTION(APPLY_PKG_CONFIG TARGET PRIVACY) + MATH(EXPR DEST_INDEX "${ARGC}-1") + FOREACH(I RANGE 2 ${DEST_INDEX}) + IF(NOT ${ARGV${I}}_FOUND) + MESSAGE(FATAL_ERROR "Not found dependency - ${ARGV${I}}_FOUND") + ENDIF(NOT ${ARGV${I}}_FOUND) + TARGET_LINK_LIBRARIES(${TARGET} ${PRIVACY} "${${ARGV${I}}_LIBRARIES}") + TARGET_INCLUDE_DIRECTORIES(${TARGET} ${PRIVACY} SYSTEM "${${ARGV${I}}_INCLUDE_DIRS}") + STRING(REPLACE ";" " " CFLAGS_STR "${${ARGV${I}}_CFLAGS}") + SET(CFLAGS_LIST ${CFLAGS_STR}) + SEPARATE_ARGUMENTS(CFLAGS_LIST) + FOREACH(OPTION ${CFLAGS_LIST}) + TARGET_COMPILE_OPTIONS(${TARGET} ${PRIVACY} ${OPTION}) + ENDFOREACH(OPTION) + SET_TARGET_PROPERTIES(${TARGET} PROPERTIES SKIP_BUILD_RPATH true) + ENDFOREACH(I RANGE 2 ${DEST_INDEX}) +ENDFUNCTION(APPLY_PKG_CONFIG TARGET PRIVACY) diff --git a/packaging/wgt-backend-tests.manifest b/packaging/wgt-backend-tests.manifest new file mode 100644 index 0000000..6c0eb4f --- /dev/null +++ b/packaging/wgt-backend-tests.manifest @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packaging/wgt-backend.manifest b/packaging/wgt-backend.manifest new file mode 100644 index 0000000..55125da --- /dev/null +++ b/packaging/wgt-backend.manifest @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packaging/wgt-backend.spec b/packaging/wgt-backend.spec index 3c17083..9c001e1 100644 --- a/packaging/wgt-backend.spec +++ b/packaging/wgt-backend.spec @@ -9,9 +9,59 @@ Group: Application Framework/Package Management License: Apache-2.0 Source0: %{name}-%{version}.tar.gz +Source1000: wgt-backend.manifest +Source1001: wgt-backend-tests.manifest + +BuildRequires: boost-devel +BuildRequires: cmake +BuildRequires: gtest-devel +BuildRequires: pkgconfig(app-installers) +BuildRequires: pkgconfig(manifest-parser) +BuildRequires: pkgconfig(manifest-handlers) +BuildRequires: pkgconfig(pkgmgr-installer) +BuildRequires: pkgconfig(libwebappenc) + +%description +This is a package that installs the WGT backend of pkgmgr. + +%package tests +Summary: Unit tests for wgt-backend +Requires: %{name} = %{version} + +%description tests +Unit tests for wgt-backend + +%prep +%setup -q + +cp %{SOURCE1000} . +cp %{SOURCE1001} . + +%build +#Variable for setting symlink to runtime +runtime_path=%{_bindir}/xwalk-launcher +%if "%{profile}" == "mobile" || "%{profile}" == "wearable" || "%{profile}" == "tv" +runtime_path=%{_bindir}/wrt +%endif +%cmake . -DCMAKE_BUILD_TYPE=%{?build_type:%build_type} -DWRT_LAUNCHER=${runtime_path} +make %{?_smp_mflags} + +%install +%make_install +mkdir -p %{buildroot}/etc/package-manager/backend +ln -s %{_bindir}/wgt-backend %{buildroot}%{_sysconfdir}/package-manager/backend/wgt + +%files +%manifest wgt-backend.manifest +%license LICENSE +%{_sysconfdir}/package-manager/backend/wgt +%{_bindir}/wgt-backend + +%files tests +%manifest wgt-backend-tests.manifest +%{_bindir}/wgt-backend-ut/* +%{_datadir}/wgt-backend-ut/* %changelog * Thu Dec 18 2015 Pawel Sikorski 0.1-1 - initial files creation - - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..f0e3653 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,2 @@ +ADD_SUBDIRECTORY(wgt) +ADD_SUBDIRECTORY(unit_tests) diff --git a/src/unit_tests/CMakeLists.txt b/src/unit_tests/CMakeLists.txt new file mode 100644 index 0000000..9c92d11 --- /dev/null +++ b/src/unit_tests/CMakeLists.txt @@ -0,0 +1,22 @@ +SET(DESTINATION_DIR wgt-backend-ut) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../) + +# Executables +ADD_EXECUTABLE(${TARGET_SMOKE_TEST} + smoke_test.cc +) + +INSTALL(DIRECTORY test_samples/ DESTINATION ${SHAREDIR}/${DESTINATION_DIR}/test_samples) + +APPLY_PKG_CONFIG(smoke_test PUBLIC + Boost + GTEST +) + +# FindGTest module do not sets all needed libraries in GTEST_LIBRARIES and +# GTest main libraries is still missing, so additional linking of +# GTEST_MAIN_LIBRARIES is needed. +target_link_libraries(smoke_test PRIVATE ${TARGET_LIBNAME_WGT} ${GTEST_MAIN_LIBRARIES}) + +INSTALL(TARGETS smoke_test DESTINATION ${BINDIR}/${DESTINATION_DIR}) diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc new file mode 100644 index 0000000..38f8e33 --- /dev/null +++ b/src/unit_tests/smoke_test.cc @@ -0,0 +1,473 @@ +// Copyright (c) 2015 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "wgt/wgt_app_query_interface.h" +#include "wgt/wgt_installer.h" + +#define SIZEOFARRAY(ARR) \ + sizeof(ARR) / sizeof(ARR[0]) \ + +namespace bf = boost::filesystem; +namespace bs = boost::system; +namespace ci = common_installer; + +namespace { + +const char kApplicationDir[] = ".applications"; +const char kApplicationDirBackup[] = ".applications.bck"; +const char KUserAppsDir[] = "apps_rw"; +const char KUserAppsDirBackup[] = "apps_rw.bck"; + +enum class RequestResult { + NORMAL, + FAIL, + CRASH +}; + +class StepCrash : public ci::Step { + public: + using Step::Step; + + ci::Step::Status process() override { + raise(SIGSEGV); + return Status::OK; + } + ci::Step::Status clean() override { return ci::Step::Status::OK; } + ci::Step::Status undo() override { return ci::Step::Status::OK; } + ci::Step::Status precheck() override { return ci::Step::Status::OK; } +}; + +void RemoveAllRecoveryFiles() { + bf::path root_path = ci::GetRootAppPath(); + for (auto& dir_entry : boost::make_iterator_range( + bf::directory_iterator(root_path), bf::directory_iterator())) { + if (bf::is_regular_file(dir_entry)) { + if (dir_entry.path().string().find("/recovery") != std::string::npos) { + bs::error_code error; + bf::remove(dir_entry.path(), error); + } + } + } +} + +bf::path FindRecoveryFile() { + bf::path root_path = ci::GetRootAppPath(); + for (auto& dir_entry : boost::make_iterator_range( + bf::directory_iterator(root_path), bf::directory_iterator())) { + if (bf::is_regular_file(dir_entry)) { + if (dir_entry.path().string().find("/recovery") != std::string::npos) { + return dir_entry.path(); + } + } + } + return {}; +} + +bool ValidateFileContentInPackage(const std::string& pkgid, + const std::string& relative, + const std::string& expected) { + bf::path root_path = ci::GetRootAppPath(); + bf::path file_path = root_path / pkgid / relative; + if (!bf::exists(file_path)) { + LOG(ERROR) << file_path << " doesn't exist"; + return false; + } + FILE* handle = fopen(file_path.c_str(), "r"); + if (!handle) { + LOG(ERROR) << file_path << " cannot be open"; + return false; + } + std::string content; + std::array buffer; + while (fgets(buffer.data(), buffer.size(), handle)) { + content += buffer.data(); + } + fclose(handle); + return content == expected; +} + +void ValidatePackageFS(const std::string& pkgid, const std::string& appid) { + bf::path root_path = ci::GetRootAppPath(); + bf::path package_path = root_path / pkgid; + bf::path binary_path = package_path / "bin" / appid; + bf::path data_path = package_path / "data"; + bf::path shared_path = package_path / "shared"; + bf::path cache_path = package_path / "cache"; + ASSERT_TRUE(bf::exists(root_path)); + ASSERT_TRUE(bf::exists(package_path)); + ASSERT_TRUE(bf::exists(binary_path)); + ASSERT_TRUE(bf::exists(data_path)); + ASSERT_TRUE(bf::exists(shared_path)); + ASSERT_TRUE(bf::exists(cache_path)); + + bf::path manifest_path = + bf::path(getUserManifestPath(getuid())) / (pkgid + ".xml"); + bf::path icon_path = bf::path(getIconPath(getuid())) / (appid + ".png"); + ASSERT_TRUE(bf::exists(manifest_path)); + ASSERT_TRUE(bf::exists(icon_path)); + + bf::path widget_root_path = package_path / "res" / "wgt"; + bf::path config_path = widget_root_path / "config.xml"; + ASSERT_TRUE(bf::exists(widget_root_path)); + ASSERT_TRUE(bf::exists(config_path)); + + bf::path private_tmp_path = package_path / "tmp"; + ASSERT_TRUE(bf::exists(private_tmp_path)); + + // backups should not exist + bf::path package_backup = ci::GetBackupPathForPackagePath(package_path); + bf::path manifest_backup = ci::GetBackupPathForManifestFile(manifest_path); + bf::path icon_backup = ci::GetBackupPathForIconFile(icon_path); + ASSERT_FALSE(bf::exists(package_backup)); + ASSERT_FALSE(bf::exists(manifest_backup)); + ASSERT_FALSE(bf::exists(icon_backup)); +} + +void PackageCheckCleanup(const std::string& pkgid, const std::string& appid) { + bf::path root_path = ci::GetRootAppPath(); + bf::path package_path = root_path / pkgid; + ASSERT_FALSE(bf::exists(package_path)); + + bf::path manifest_path = + bf::path(getUserManifestPath(getuid())) / (pkgid + ".xml"); + bf::path icon_path = bf::path(getIconPath(getuid())) / (appid + ".png"); + ASSERT_FALSE(bf::exists(manifest_path)); + ASSERT_FALSE(bf::exists(icon_path)); + + // backups should not exist + bf::path package_backup = ci::GetBackupPathForPackagePath(package_path); + bf::path manifest_backup = ci::GetBackupPathForManifestFile(manifest_path); + bf::path icon_backup = ci::GetBackupPathForIconFile(icon_path); + ASSERT_FALSE(bf::exists(package_backup)); + ASSERT_FALSE(bf::exists(manifest_backup)); + ASSERT_FALSE(bf::exists(icon_backup)); +} + +void ValidatePackage(const std::string& pkgid, const std::string& appid) { + ASSERT_TRUE(ci::IsPackageInstalled(pkgid, ci::GetRequestMode())); + ValidatePackageFS(pkgid, appid); +} + +void CheckPackageNonExistance(const std::string& pkgid, + const std::string& appid) { + ASSERT_FALSE(ci::IsPackageInstalled(pkgid, ci::GetRequestMode())); + PackageCheckCleanup(pkgid, appid); +} + +std::unique_ptr CreateQueryInterface() { + std::unique_ptr query_interface( + new wgt::WgtAppQueryInterface()); + return query_interface; +} + +std::unique_ptr CreateInstaller(ci::PkgMgrPtr pkgmgr) { + std::unique_ptr installer(new wgt::WgtInstaller(pkgmgr)); + return installer; +} + +ci::AppInstaller::Result RunInstallerWithPkgrmgr(ci::PkgMgrPtr pkgmgr, + RequestResult mode) { + std::unique_ptr installer = CreateInstaller(pkgmgr); + switch (mode) { + case RequestResult::FAIL: + installer->AddStep(); + break; + case RequestResult::CRASH: + installer->AddStep(); + default: + break; + } + return installer->Run(); +} + +ci::AppInstaller::Result Install(const bf::path& path, + RequestResult mode = RequestResult::NORMAL) { + const char* argv[] = {"", "-i", path.c_str()}; + std::unique_ptr query_interface = + CreateQueryInterface(); + auto pkgmgr = + ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv), + query_interface.get()); + if (!pkgmgr) { + LOG(ERROR) << "Failed to initialize pkgmgr interface"; + return ci::AppInstaller::Result::UNKNOWN; + } + return RunInstallerWithPkgrmgr(pkgmgr, mode); +} + +ci::AppInstaller::Result Update(const bf::path& path_old, + const bf::path& path_new, + RequestResult mode = RequestResult::NORMAL) { + if (Install(path_old) != ci::AppInstaller::Result::OK) { + LOG(ERROR) << "Failed to install application. Cannot update"; + return ci::AppInstaller::Result::UNKNOWN; + } + return Install(path_new, mode); +} + +ci::AppInstaller::Result Uninstall(const std::string& pkgid, + RequestResult mode = RequestResult::NORMAL) { + const char* argv[] = {"", "-d", pkgid.c_str()}; + std::unique_ptr query_interface = + CreateQueryInterface(); + auto pkgmgr = + ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv), + query_interface.get()); + if (!pkgmgr) { + LOG(ERROR) << "Failed to initialize pkgmgr interface"; + return ci::AppInstaller::Result::UNKNOWN; + } + return RunInstallerWithPkgrmgr(pkgmgr, mode); +} + +ci::AppInstaller::Result Reinstall(const bf::path& path, + const bf::path& delta_dir, + RequestResult mode = RequestResult::NORMAL) { + if (Install(path) != ci::AppInstaller::Result::OK) { + LOG(ERROR) << "Failed to install application. Cannot perform RDS"; + return ci::AppInstaller::Result::UNKNOWN; + } + const char* argv[] = {"", "-r", delta_dir.c_str()}; + std::unique_ptr query_interface = + CreateQueryInterface(); + auto pkgmgr = + ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv), + query_interface.get()); + if (!pkgmgr) { + LOG(ERROR) << "Failed to initialize pkgmgr interface"; + return ci::AppInstaller::Result::UNKNOWN; + } + return RunInstallerWithPkgrmgr(pkgmgr, mode); +} + +ci::AppInstaller::Result DeltaInstall(const bf::path& path, + const bf::path& delta_package) { + if (Install(path) != ci::AppInstaller::Result::OK) { + LOG(ERROR) << "Failed to install application. Cannot perform RDS"; + return ci::AppInstaller::Result::UNKNOWN; + } + return Install(delta_package); +} + +ci::AppInstaller::Result Recover(const bf::path& recovery_file, + RequestResult mode = RequestResult::NORMAL) { + const char* argv[] = {"", "-e", recovery_file.c_str()}; + std::unique_ptr query_interface = + CreateQueryInterface(); + auto pkgmgr = + ci::PkgMgrInterface::Create(SIZEOFARRAY(argv), const_cast(argv), + query_interface.get()); + if (!pkgmgr) { + LOG(ERROR) << "Failed to initialize pkgmgr interface"; + return ci::AppInstaller::Result::UNKNOWN; + } + return RunInstallerWithPkgrmgr(pkgmgr, mode); +} + +} // namespace + +namespace common_installer { + +class SmokeEnvironment : public testing::Environment { + public: + explicit SmokeEnvironment(const bf::path& home) : home_(home) { + } + void SetUp() override { + bs::error_code error; + bf::remove_all(home_ / kApplicationDirBackup, error); + bf::remove_all(home_ / KUserAppsDirBackup, error); + if (bf::exists(home_ / KUserAppsDir)) { + bf::rename(home_ / KUserAppsDir, home_ / KUserAppsDirBackup, error); + assert(!error); + } + if (bf::exists(home_ / kApplicationDir)) { + bf::rename(home_ / kApplicationDir, home_ / kApplicationDirBackup, error); + assert(!error); + } + } + void TearDown() override { + bs::error_code error; + bf::remove_all(home_ / kApplicationDir, error); + bf::remove_all(home_ / KUserAppsDir, 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); + } + + private: + bf::path home_; +}; + +class SmokeTest : public testing::Test { +}; + +TEST_F(SmokeTest, InstallationMode) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/InstallationMode.wgt"; // NOLINT + std::string pkgid = "smokeapp03"; + std::string appid = "smokeapp03.InstallationMode"; + ASSERT_EQ(Install(path), ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, appid); +} + +TEST_F(SmokeTest, UpdateMode) { + bf::path path_old = "/usr/share/app-installers-ut/test_samples/smoke/UpdateMode.wgt"; // NOLINT + bf::path path_new = "/usr/share/app-installers-ut/test_samples/smoke/UpdateMode_2.wgt"; // NOLINT + std::string pkgid = "smokeapp04"; + std::string appid = "smokeapp04.UpdateMode"; + ASSERT_EQ(Update(path_old, path_new), ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, appid); + + ASSERT_TRUE(ValidateFileContentInPackage(pkgid, "res/wgt/VERSION", "2\n")); +} + +TEST_F(SmokeTest, DeinstallationMode) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/DeinstallationMode.wgt"; // NOLINT + std::string pkgid = "smokeapp05"; + std::string appid = "smokeapp05.DeinstallationMode"; + ASSERT_EQ(Install(path), + ci::AppInstaller::Result::OK); + ASSERT_EQ(Uninstall(pkgid), ci::AppInstaller::Result::OK); + CheckPackageNonExistance(pkgid, appid); +} + +TEST_F(SmokeTest, RDSMode) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/RDSMode.wgt"; // NOLINT + std::string delta_directory = "/usr/share/app-installers-ut/test_samples/smoke/delta_dir/"; // NOLINT + std::string pkgid = "smokeapp11"; + std::string appid = "smokeapp11.RDSMode"; + ASSERT_EQ(Reinstall(path, delta_directory), + ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, appid); + + // Check delta modifications + bf::path root_path = ci::GetRootAppPath(); + 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"); +} + +TEST_F(SmokeTest, DeltaMode) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/DeltaMode.wgt"; // NOLINT + std::string delta_package = "/usr/share/app-installers-ut/test_samples/smoke/DeltaMode.delta"; // NOLINT + std::string pkgid = "smokeapp17"; + std::string appid = "smokeapp17.DeltaMode"; + ASSERT_EQ(DeltaInstall(path, delta_package), + ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, appid); + + // Check delta modifications + bf::path root_path = ci::GetRootAppPath(); + 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 + ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "images" / "tizen_32.png")); // NOLINT + ASSERT_TRUE(bf::exists(root_path / pkgid / "res" / "wgt" / "js" / "main.js")); + ValidateFileContentInPackage(pkgid, "res/wgt/MODIFIED", "version 2\n"); +} + +TEST_F(SmokeTest, RecoveryMode_ForInstallation) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/RecoveryMode_ForInstallation.wgt"; // NOLINT + ASSERT_DEATH(Install(path, RequestResult::CRASH), ".*"); + + std::string pkgid = "smokeapp09"; + std::string appid = "smokeapp09.RecoveryModeForInstallation"; + bf::path recovery_file = FindRecoveryFile(); + ASSERT_FALSE(recovery_file.empty()); + ASSERT_EQ(Recover(recovery_file), + ci::AppInstaller::Result::OK); + CheckPackageNonExistance(pkgid, appid); +} + +TEST_F(SmokeTest, RecoveryMode_ForUpdate) { + bf::path path_old = "/usr/share/app-installers-ut/test_samples/smoke/RecoveryMode_ForUpdate.wgt"; // NOLINT + bf::path path_new = "/usr/share/app-installers-ut/test_samples/smoke/RecoveryMode_ForUpdate_2.wgt"; // NOLINT + RemoveAllRecoveryFiles(); + ASSERT_DEATH(Update(path_old, path_new, RequestResult::CRASH), ".*"); + + std::string pkgid = "smokeapp10"; + std::string appid = "smokeapp10.RecoveryModeForUpdate"; + bf::path recovery_file = FindRecoveryFile(); + ASSERT_FALSE(recovery_file.empty()); + ASSERT_EQ(Recover(recovery_file), + ci::AppInstaller::Result::OK); + ValidatePackage(pkgid, appid); + + ASSERT_TRUE(ValidateFileContentInPackage(pkgid, "res/wgt/VERSION", "1\n")); +} + +TEST_F(SmokeTest, InstallationMode_GoodSignature) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/InstallationMode_GoodSignature.wgt"; // NOLINT + ASSERT_EQ(Install(path), ci::AppInstaller::Result::OK); +} + +TEST_F(SmokeTest, InstallationMode_WrongSignature) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/InstallationMode_WrongSignature.wgt"; // NOLINT + ASSERT_EQ(Install(path), ci::AppInstaller::Result::ERROR); +} + +TEST_F(SmokeTest, InstallationMode_Rollback) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/InstallationMode_Rollback.wgt"; // NOLINT + std::string pkgid = "smokeapp06"; + std::string appid = "smokeapp06.InstallationModeRollback"; + ASSERT_EQ(Install(path, RequestResult::FAIL), + ci::AppInstaller::Result::ERROR); + CheckPackageNonExistance(pkgid, appid); +} + +TEST_F(SmokeTest, UpdateMode_Rollback) { + bf::path path_old = "/usr/share/app-installers-ut/test_samples/smoke/UpdateMode_Rollback.wgt"; // NOLINT + bf::path path_new = "/usr/share/app-installers-ut/test_samples/smoke/UpdateMode_Rollback_2.wgt"; // NOLINT + std::string pkgid = "smokeapp07"; + std::string appid = "smokeapp07.UpdateModeRollback"; + ASSERT_EQ(Update(path_old, path_new, RequestResult::FAIL), + ci::AppInstaller::Result::ERROR); + ValidatePackage(pkgid, appid); + + ASSERT_TRUE(ValidateFileContentInPackage(pkgid, "res/wgt/VERSION", "1\n")); +} + +TEST_F(SmokeTest, DeinstallationMode_Rollback) { + bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/DeinstallationMode_Rollback.wgt"; // NOLINT + std::string pkgid = "smokeapp08"; + std::string appid = "smokeapp08.DeinstallationModeRollback"; + ASSERT_EQ(Install(path), ci::AppInstaller::Result::OK); + ASSERT_EQ(Uninstall(pkgid, RequestResult::FAIL), + ci::AppInstaller::Result::ERROR); + ValidatePackage(pkgid, appid); +} + +} // namespace common_installer + +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; + } + testing::AddGlobalTestEnvironment( + new common_installer::SmokeEnvironment(directory)); + return RUN_ALL_TESTS(); +} diff --git a/src/unit_tests/test_samples/smoke/DeinstallationMode.wgt b/src/unit_tests/test_samples/smoke/DeinstallationMode.wgt new file mode 100644 index 0000000000000000000000000000000000000000..bf5b7d09b866ae23921708bc071ffe32536cb8cc GIT binary patch literal 33312 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

egx4!dORJ>p=~%BDFL<-^~#hcLj4vi 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

egx4!dORJ>p=~%BDFL<-^~#hcLj4vi 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 literal 0 HcmV?d00001 diff --git a/src/unit_tests/test_samples/smoke/DeltaMode.wgt b/src/unit_tests/test_samples/smoke/DeltaMode.wgt new file mode 100644 index 0000000000000000000000000000000000000000..283700050272e10ca310cb82d75ee1794da7dd59 GIT binary patch literal 34283 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

BT%}l%Zycqo% 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 mWC-&b8daJYkg^=mG*Fhq2slKItI!d7T< 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

egx4!dORJ>p=~%BDFL<-^~#hcLj4vi zRED;PdUC{~Rw(Nb7<@OTeBj?jmm_u}nij}bkv${O2rSl4$jHc`_wbo{4u5f-Q(j`H z;}NN`Teogb%~&i;+Y~kNpyGStJ0&M4!`7`^om#3|S$El-w8&CL)-1jQZ>v%+Yqxtc z-!F~>9aFOzMT!|)YUz4Z_~-0{`m~8OTie2EzBa{-X~bgf;8c_txah>ia1@iU^iAz?q(#MH$>mOcPQd zf{I)NLB;Q=`QqSGdk1kwOw7dNvj${#HgC5&tQE?6>3{e@7rv0AEI&rZ9-NAT`8pUc z7ea|oG`MN(4IZT?Sg=*e8znrKj3`Hpkt2xA4AtRX!2d#aljUq!C!o@UJIY4{6U`v3 zDkgeo_<_hG_QVbsO^c?06`eACoqaTOuu=^UGJX<6jPVkcGFfFC(R0LSM)2m5GA-%C z&(i2bU$3m8;siGX9vc*ty9=^AMT1^vqtx2SMs4IibO7uK#I_@ga0HE6tTeMtOVF+f zN^Denmub6V$FK={1~4l+$==hkR*kE)Exf$F6&8E5^Y{+<_fW~|)CrZnZ2BH3LYR3Y zdbh;NX|k0%oFY!hS(42-k$%-NFkOi9F`b;$@`k?1YQ>p%v7nXxatU1RbQfH=0Ij*e zsFAT+vjVW)?nrXdQFiNKxpY^)Q($cxaJ!TZ`Z@(`Iklq|WK$v5WP z#SK|CvR_oHPzGXL6h5nK*RHHkRg*OwWHu=F7qWkptw~8quzmaXM&;sVHIzgV(UkLE zmUqL0Y_-}}}}Kp)h626i7`?rDfpwP!3`h6k{{8#uU_cg)>{QJWBcm4HFMH(35$FB*ESUpGjpBI@BXe4a zMMdb0m(^+{ZTQfkC~36U$w@D@RCvBXqpWflJLhiDLF%C|;fJ=5gQXUu(OIsG&2eO) zqLz)|VPw4mDy3AL19%Og;&T@Oyxp6DXKfh;DLJ_-bno7cIt9>P6~%!#x{>l&{f0Uv zeFSY>q(n4@7A#mm&!eB1P0S;e;Y2;QZRgINuzvk|YWt#(w`0eSl#)GM2_5KMX$p(Y zdZX5ie-j4+aspJCP_{CzA`*ox_?;gdO|fgyepQI8hAB#zntP4BOfx?4SuN^Mtb=re z0em(K9*Numi|u{DrX}*w4IDt>u4uW8-Rd}&Yd4wUYGoamt{G`OP=Kc%dJnx12FAET zpPoIy&C?5HGGC0HVjIrBunBnVpaBC0z@$l&oY#>>zVgZ|w4Epek#d<9%@iI4AGZSs z4#1WzTL}2R1lUAKP8|U$9SHbZy);z=0mOla0}u;vGCPu=G!R**$kt`coUut3wJAHh z&4ytsHa%sIHhYD56O*Z;>Mqvic)B5HaM-LU0#E_N!GiCBpLy!!xs5oH!ps^5q^JS&eUJB0m!zHIXm@~W zw_T7`7ZJ?x^(-KX;5-3SJNN$@5UD_vtwM8&kJc1y=%NJUOdP8K8Cy`m+(%fg-7|_yK9~qFMD-X}1 z8G}AyMiHzssVL9*_D!EY9VSeeK<~u?fU;1{X+eQ#(FrteuF%ZG4K$%%1SlIEzhZ=p zUy9)4&1Yc{q10GBx0accZ+EhZesON|Uwi+;?-?8$ijlO-e zu&{74num!Rm8f0GygGayDt`|P;KGReE0-=nX6|W-^wmJ3cOA40Hb7*EFSrv{MSZ{4 z8(FJbfK^l1-hTUSrSu}Z2apCPud|#wuRE}`=#?Ey-Pf08;*+jJY@(vGz z&Bc`nE+uo^pa*wv!lDB`!OhDRGS6LyW&18b)+L*@7qVZ_>qqiqy z=jOwivdd6K^s(~F>olETr#CqAQ6wgU8Yhqeyk^ZBS~Hg|mcX-Q1O#VbL{QlgwPJKw zpu<4Jm1Sqo$3cP5x!$ZDR7Z5DfZA!&F##6K0$?-*QXml>-b4@3d%MHYf*M#;V1<-u zckp+$!QqT!H%&cJb4NDyov#p1+WvZZdHF>xmTk$*%*?k~Ep@yH=0?Aw?FJ7MZ%)XP zr`U!ahG8Q}wbiwC)F{u&%AyetIQfmhvz3ZPCxa|=oljK8@Aw>iCUY5z@l~>&uj`Nd z3opDt6&sdiz`qA;OI1`?un@2<1UxI*Ev^RTy9-#!K(M&FfDxl1yxbwMwI7rdMtI-8 z0I2b50fC{-ZwOTp>kaeip`!Ol&BMi>Wwlu9NI&E&^-CP@O-|eMM3nQ-jbF&f&5iU=xMEc;CcstjCYuOEEy0i`Y$mcl0%@#TMH z!1CXbedF`+Ij9`5HRITVN7o{g!9wIIVQXL}03wKH0<4*w!yUmjyOG_UC}xC3`-XXf ziP-M5N@F0QM}KFZu>e1{Wj)0hCQ&IBqa+kLoyQW7nbanjS~AGPlK5KhGOv-WCZSkN ziqAvkRdRebb`;KwBGuye&6_tEzy|BJu=Zf`^i`^=IRbs{(6~e`*Xy)e3{E?G z`rF{jH3OUoA4qOqMW4mIRk9L0vPF5-T!y^6l)PsKtAfTrwV5rJUF5HhSDTrUIhT3= zux#FskB$=qu#hs*Q-sS>qFI4cRkz)Cn`0p!VpHOIT0}$9TzTqe9kF4<1}aCH<6Nz- zpcvdG+gY11F9(CW(c!>(YM>$^jZh^wGssqr62~hE$2Z(qd(iKLi%TLy&4&)E=+=;C-0P#443F1tK%fn*x;w_x<oTjEnK;LM@O z87)Ly{MraqRF<&hX!GXbndI+v;vdHBJvDaFRPjarn#|?JHneLI9HdTU&FHm3A1%fa zF>u+uCBXhqWF)GzY(-LmO)N zD-%!ve3d=rx?KSmHRCIu(T+-Ol8)^KIu@Vh< zhlkF+6U!+P3q^@pSG+?)R_U5An5Y)i#u|beCjyE-SKNR9{ddX+F+39$sFp2Tfq!5C z%~5%eP!duz%F$b?S5ISTu?VzA>#Us8lx)SlYxnLnKL?!|S6lW5gHEFWr*YORbpi>% zS9fppnNhZtj0ls5FZd9VV&x|Gc|c_qO2x1h(F{@)#B|`QiZ%k3jQVd}3RdInJ~6U#aT#tAEZ&OX z`-<;>rn%SGo9x%G*L>ajet44BypW}N*A??TJD z*4LY*(G61PM%4vK=-dsqY4n&X2nLN^phOJ^s=W~#rWDOlavkY%_nOOKGS)eL(oJy| z**TtCnN>lalbe&1oy!Y(J=f7FS8?UtpY(deOIR>Njb+L}QS$`J0>IQ*E1F zUamKoH8N^IE`iCv=<(X}%X)AjV1!qlh04+_u(W8`pdd*B)Hu#-G|ubn8p>pk>N2n@ z!Ek)Nel>-N*K+wm;IzRlW-}S|pMy}PTQA5V8@c%sQB=}NhYXaBB9T4FA|k}=JhiGt z&WRn)N}y8>wskUSQy!o!wn0up1F#xL`5P@)3P-EdWze$0)`U66z{J6Wb}vrFp$*JL z0dA3NXF%B#UxUTdj{}e~UEt&=$95Id6}d_XvC3@6(;Gcgq(m{u)H)D2<6F(4uI7XnXYko*lZC;E+0(eO)iAU!ZeSia+hO1<+1eUl zWf!o10+wC{t{hH7(JJ2EqXBu?D_d0x6)&8J#b9tuaYPLq!A4sZ-w7AjGp?BhmE%8b zFk>3AUl}`QvQ`7WRb^0DcBWAo9Z@mjE6k~Z>C}kHk#Mq)K~nEm=0&g(QzG4LGG(c; z2HC>!e5AN+9Th>Sw;0$Ed;LQ{XC@@mi<;JmA3u( z@#D)(_4T>H8Nz(YH*uXeu^gP3_O4ctir03rquI2Vtyv7{Monvwq0qp7os`ORS$szg z15?+iIvE<6zOGtl4JiB@XbYq4JaOU#owh?@(S*X8BvyBqd8F8mESeTl{?|*m2Bt!x zn#L50pS2Fkb)GX;f%fc4kj;Y0ig~d?&98mK(L`P9b^Kte;6um*6s@6b?V#-?$Umt&PaO@zw52>)y0 zuczV%fkAH+&cR|J_r{GIDP^MBgjCy9!~t9W)1RtKM6TCPR7j+`k zdVuIWE8)*9HpI!+7YV4_w93MD zpd7Jtv_zmyS=&uxcYkW;T-%%%={4&Y+hrx~sMbz34+%`rJeY)U>9k^k$UGG~s>q zCes>Tj*4YfdAY-?nXyy{z8EAgE105!*HOMvo7BSx0w;gqq)KPeDMqo-*rZ{6w}F~9 zO0{fG_}X;PIouU$%FjW@@k}^$=nxGf#b9;41y~%-xBrPd1Q^`i-Q67q2@>30gL|;x z?(QBSxVyVUaCZytw)5Wq-u>PC?rt^Jz%zZi>glPPsXpg?zRiB8K{}oay%K%~9j1c) z^g${rs?6=D9mH_Jp--h+tCpQ9T75d2u;>*xc}o}MhdT?2GS0E71Cu=ZM;@D52uS21 zi&UL7N<`&17!#i^-9a!Yc-|VDt=^B52@QnIbmb$|991{%oLQzQ#wb*_&R#*u3DA$* z*Ff?9LQn$O!T|(x(Rf7s=a<|&=Sj>=5b0@oErIZ@_?`ry-u|p0RG*ikXAFcRzk>0G_>4R!MZg;;f+cY8kBL zNJ_~XpjlOkLXJxI@q>)&kQ+!V-CRU7nncxCN5$o^*}cqRj6#~DG~Yhj5_!!@s2S?^kvu;!`{W|J z$8!d{v3=ySl-95C+-7dwHy1pKP7VV{A=C#ym(m3#raE7()};_yE}iROL^FUx@WltI zGOvXnWxRB3{PdZubW6CbTwS!mtV-omaCCU)GwZQH$8p`l1a&{;%C_Nl7vyjVryKQ% z+rr-Owca(%ZKGSok(C8He`18SZXkrSV!%DDJcQm?;b2>H8YX^dhND;C4(@y6GK zT8vhM>Nf)?k#KoSd#PD*A^09h^VWEvWx>!T3|HiaTbOuzI1%&Nw9#RDrUy~p*Kc~x zmc3}0X!Fu7j+c@T0)7Q7FJR;|nB_LZSPER06n`I7`!aMZnFLLqKX$rV0Y2t}<+Q1| z`3gM0)G=$HvRFSQpnjA_qZ9`@!LZSb_l#!iDI)88v4^AVG&K7SImLfi;ad7alKPx7 z)Yu3TVoD`L@1c=LE=mcTRKa->sZuhckj!G+O0{EIC@Cy%>-Z9Nj3bJudf{1*PtP}q zzpa(wa5gG5F`&ss5w^iUwvkF9P(x~7qiIk|NfjF}BYY~3fjx7Plkc$xU#xz}=+6?v zB!kQAuQIZ-Iufez&6 lTjMd;t92VIbcA1#}Mbt7%SbupT=NsiePDbxgvlm%BNQb z{u!^^vQMceN73XwfaxZ$8TmWwT?|t;VRXsRYEx?qx`FQd+BuY2yU~rL2E&jqlp7Wn z#<*|RHm0AIt179iKU^`7!Hg zedX#WgS<7b)sHZCDJv@SK%Jd)81;FU7gZ-JLj)B#WaJGg8ZOz%drF%yTSE1C1T#gj z+GS%^jAEDwyyd!b*2Wlsv-~1m*@&3+;%@s0yAmoW?dJLRh<=3gjF`~hPeTQrzgLb( zTNI2?Vjt(LZ9?T?yY?m}^ZXMIfg_M0efD?LbtC!{3*Kgf@~f|^kZq$6mda}?CFjPS zugWEfKYA_eaV*$NDy^I~20jrHk%;LiOqIq`@(_ZofAZu)8L;3sdoihx490Z)Z!+(J z!yo~G@G@F%7h%ctEHYAd(0G)93ycx#EMGpA2}N>xgBbdb*`k}QMq&L8zjz&->s}PxZ#V1nm zM^zr%!Kfii%i!>^pQ1mGv|DsbR%(VU=~w>=H(R>eGTKRvlC-i>-IcsJ=x>qJU+2F_ zD7R8DH;AX2TUZE7Dv<0EJ2JgViymAoKU}N{i*sx=&)gPiJY1O9lLKkBtf|JT8l+8A z3ogG!{jogdwT2XTW2W9ZgO97WFgO3<#m;{R0>EHFzJAht=2}T?G}Hpkz&hJ^%-Z@z zu+%DhSNbs-RWu*qO0hA~@njMeCo@_miL!CS6mIm;FkJ9oC_KN9Bk=dwz+Z2yZ8B>0 z=950*qxGoY_9>(1ug0A>qQoSV4T@N_{#Izup6C?oat^oQg;^v1i3n0MY8D109yk{4 zXh1O5yj;3}_+hBQ^AjogXUlelMwELSTZba0Wvbh$&~t34aplmkFTS<0%{*Q1l3-5K zS1h`P(?~dE@i_X7c8}YCqUGJF;p5`sikz=Z%a+EFApeP==jBk}(ts(_mi}c`Xnm8Y z#29}NJw~Gmlt!JS4tuuJlRuv>ozZ=+D7z&F|0UBX@#lf8&JD%N=Ud6_ugU4LCFE3_ z7PgeilK6-lJ*+;uNOJVS(24YdktuNrx2~kb#QMkTk|{roGJ?gg-vI!CGyrgHHizrj zkv*ye@(L8;$=i*Us3*o35Yp-(N=-tKmL|u!3rljWJ=WLNY50=|Zkm7M^FM>y9!bFT zd<6r4#ASFcOlkamNS6eBd`APOS#(-2(5n6#;KSa3q#mh1L}Tez?P*y3gaipRK&Zno z<*#Ev{B_<}L&(<;(iBraT>mUQR8VzNIYdK;MMU&f@t0`IuxCp@MCZx`k$$(t$iIFv zo)s1riu?HZUkjYhwj;cL0V_t01u575SwO2WELFNGoVn1hWY%Ch* z4LU}Xv|=yCPipvmDPR>U@=vWvg+|qG7{T8VJdS4~NqczecH!sqs&kKAejb|%(QKyy zs0^E;cb*M(IiXzgI<{2H->`@X2u_$+w&#|gp>9bSYPC&oe)CexB*Zh-m@&FfkI^q^ z?hW+Y*V6na*sp%F#OrW$PU!DTXxP->6!PRn*M+_>`!|;FZN2z`{cmv}ke&}1#6LSw zfdy47J0lA-XJ*L%ahS6ojC6fod>H~r#py4oB7hNqfh2&;tt^;4>}=K5;K3l}Ec?~P zLDkg*5eyva7!oA+^v}*tnO~`&1$Fb4p5bztQA;_gNQV-JD=j{}`lS2^)S4AUcaD69 zw&eEc(d9|SLn7xn1Zjag=TS8eO^soL1N5wXv*6UM2@T1WH76@^X3E;$NUf(pL_g zLa2>;J&oQq8e686Tq>F zS7m5o$g)uuc~3UBImt9lSD0;8V>uB}Pm;GQ$AK)zRVpuzO-i{9-{_|?RVan%ZPGiB z)Al!(XFr`oeJLT2EfJ}l(&JXZR~J9tK{y1&^2XTR zD^yV@=;X=!T+x!}_U+E|(ciwj@^>xcn`ie?hm^L7&h{!fl8USUywd^?Vn*eZjGPLG zR0Q6(Ou6t?)1n9*+<2>6ozarllOLUWrwzB$3sThjxPItXc-L2j2vR$)V3Zq8Pqka6T5e9L*MsxdXdMJ;|im)QXvh*T7np z;t-YPGJg@{A*~VjC+@SCE4EL07dlwnidl_)I=O3s{3frB=LZ(ywF@Ht>N!BOi|9<}fUW}%L< z9DBeM*~4t>dbtd3dq|ux$Sf!VMf_1o3M8cVv!KvH|5DU}l6Cwp-?RPp-lu;5op)~i zWk0&tGx4Zvlf78pcKT<<{nGhwYjc}mPIuFPZCn#p`xL&8t)E- z*VbE1E5^jcD8@!ajO7S;-b@>R#yx(@?%mR=mb^_&w@g=R)hAE`Gcd+4QHTUuAY%tj zg#Mnr7}Vb%&lWcDG>n4capWby%qFw9r|T7Rsi+=*aL6lAYNEK1^l%K}Y^$@yaGTpj z1e0D{o@%M$)awiG*8DUmZ$I3j>lp?VI2|ZcDI@_iSIXvd9ZzF5A@g9$xpg#n^jmxw z#5PbP>DE*2JOd+41#4X$vYXqCfNtF^M3Lq*wKP{|13|m&I7tkCMxB z-Bag8MxUyZEzWeadU>FzD*2uyG>gelR1&Fp2+}sEfW7d?P9{%lo~{e?NmXb%&kSu- zp#p4%A}1sB4YsWxK1H+1%Ik@9Q+mRr4eHSSE~lV<_XlaFsX0*MCBdWC?Xpo6@gbd$ zX<5jVHCf=6=dd=gv$QAP5q&Q~f-6(N{`12=Q%2TIHg`A{BnU-XUn|nN!Wb}vQxw~j zbnOaKESN2l1#sA};~?X4h`hhtXAg%U;}>Yvn~MUF6Ggdr?7v#&X2wRfv;Fp_=?}c_ z_%nQQxz#YLSzdnEbJ6Mj=$1^xkI7AlW+{AoUz+>l6il)QPI(W-De9hj=EtTshxNjU z=jRd&)AG@w#}v?q1kBQv ztn0RvrTd|Rs(_djou0cU8`3IFD1A6HLMHu!WhSckX|#1dX6r z7lc>M!|TaqiQ)OX*2x|bLZ#f$(9lnG&=QaFsQRYm8m?`0@Ebr&#`JkODQy?mWJ%XeVW0GJWlaNYQl#%N@YWi`xh2TMGOVj5^d zMc*3&oiq{-pr(rGQ}bSLX|bOhS=}3oUK=N}LeZUk!WiLo^I=IZRkQ|WJ|{|82C8ry z3t3-$qTQo>goT9u5KAQYlfE_alcoo+nvAiT5<*BL^gj2n9G2y8ec}{Hx)sz=7>XtC zPVMqse-fyZ?Z*p;Dq0Sg)DP_Ryf&|#c}#=OsQqQHN$=D0o%z@03lZ_1%f~Net(UM1 zyjSFSPa-y5_jSZ9++0wQOw2(}fxR&pl?3KphmMrEvY3k=9eMwJ$Z(|>gRd$Ot=|d9 zH5~sqbc9P8qUZZe43jKt+Y!=V_aUyf^Y!P3UwsJm@H-M`w)FlCX?yKdu&H~#AxA>w zLP5Oi%2b1aSc~d6x8NZ5v?Gh9MV}{%6^Ib8kX`LcMS)*fyV0g?CKRi|D1(W{+so!{ zSN6Fl6i9Y~owjRuh99sH);1p+3ppxgF4Tb#`e{8`mv1BwxatZkln+6wm>pR z)u~=QT{buy?f}NL=JrWsZG8V+2|BWzzg{$^RzbFYn4yW>HY7dBtiCNjTynk!%Y*j; zN?_bRe>X#?EW-m|3D9s)W%+pBMBEUHV(FT|B#_|pmLbs_qi4^`i^}53D@0FTAQ$du zJ;po{L8WQGl3f1U>y_EroiUaNsK+AuX<@`AM{Sz__RAKwVeAa5L4w(m*}fz68`oAp zz7A%?CBcj}RgOE3lcdTKzRyhFiLT_#N<8RCJ4dH(LHt(ulMq7wXCj-DSZvwcg@ zx1V+nwymMf!FHE_J^W*rvTlc2+EvqK(@`F<=% zz}W-^!G7t&qzQmag2}wG@Uxc#YHFtK9jD~FiN!;w?xcGYLhrIE(+B|up&Ak(w6(yi z`c4_t9)jHPnR)Uy2G4|MepU0G3C2Wi*tQ~LI6Qa#H4$nXWaM_Hw`m0*ytTv+K_T># ze|R;qj;)l4#IWbCII`~?RuHqb;&^mzM;#)RGpeqw-%j^J%Sodr3tx)&yGF)9-;RL) zPMNwTp%p)ZPyyAzspa9c!6=aEf;jEa!kD+wYm<4oyYX`#MIN)pkbQy5Kj1elcg;Fq zRdyT{AB->E*v;#==TIbEww$l#`eFK&D>hD4m3k|rxrg=#Gv&DOP zvEzlMie|y8^5C@t!B0p1^FJDg~cZlqeD7y~( zFnNL>fp}?IWyOG499FVXl(GP+`+z`O`$%(5YKs20AJ3T9O6w5Q%Ptrho-oh_%sdLW zfo{mpSbEaEl-$ZLRxol5;}YqZ+|Uh~9%3RDbm-46#$5VZ35T&pCAS>UMmoz{X%Fo7 zZ0yCg$Q-w=U4L*PZrQsI$z#nb!Z%bPke!ou?yfKE*7N*6KRPuBCgkCVkSEsXEZ$KF zMKzF!xR3B6Mu3peeJn8w@yXv*Z#Ih<8^23mDQPE>UnT&4eKDF})Ky%JNA_3%n83#6n ztf_tp(1+FG&v(}Cc#?E3F`noHUfl`%qsL3DB;`%=L_???q46n+IHSi`z@cp;Fm%O` zIWDOPe89*tPsf>30Fu9LNSw6D{|G&G0tX=FgcAO=65h+=i@pAtofs)+6$JC8@4S4E zmBpB@4QLQ~=L9E=r5ox7Nj_5v6x=$iZX<+0g6O!G=Hac+A6BU#oi+a)4MXj+~P>CNW2`Phrg7+*I-8ja3shHQ@xTXk$><) z$-yO?Rq14i%wOV6!!p=7|natNRlEbap>8o#dB^>hqS z*1M-iJL4;}p)PArQ0H#+%CG4Fat^cix_FdEEaJfEJ?r&7fTE z-M(PN7N6(3j;^SRZ%lia!e&Op`7RwCKFk8|D5M4w5iV(}WRph+Pn)-g1{B$nd=VCo zFanO;*XVnP--3wZwdy9%)3_{~94r(3i$-3%f7Jep8t_)FJ9p8;1<=65YrwOZWbleC zVk+r!rKBbO%q244v3ya-cw>O4e7O`!SAkWwK1ajIjN46=sk>khgKmk#p`!SP+ICDQ zH^~;b`3hP^jTvqEeF_o@`5ZT2cD+v3dO!Z%`Mc5H;&=JGek-IO8*R>xT)^N$ zr2JZ1#nc)PK}H%roBrsQQpD6v1-x>h4xgr544ovrP-$ejMth$v+!>i*n*+sZWS48{ zNJBKA0dd^xQ@cY9>O_wUr>C{aB1> zBBV!dXeYih(oZAAI(R~oZ<^YFIzB?|jTxM(D}G(PMCrCEA{m~ouCbMrFNu|-G&Yp! zSYEc$G)``7B9*Z;Bev!JV^aHrNYLx2iqb|2C@swf8t=M2+GfFpE|}IsSC`TsqD0DJa#c&oA1G7gC!SDd8Mvk8S zstD|1y^W!xK?t$hVPa@4v;KNCZ}i8EOLh@s{Nc|sJOHtgwq_1^qCQ?>c%MV9h#3ix z&*g0}(zt1)XSzkq6V&b{q4cG2GQ3hIRML4TJSOZV`piQ?Lrv8kXyUUO3*xz)?yOTw znV(#HFeLNi9mImcK*m?wM9GAd-pi>aI49vb!wpgsIH&27ykv2^jgkmaJRl&1zhT9; zQ^`&ttI3SSO>h8|s$0X40QFa=Fh4xy3I#zU=2ij+$9kj+Ei7QZY{`ag(l!LwFWa@1z^jNu_ zQ4ca7embPhaPAigUfYYM>Rji~G&l6RWdDtBzbywU4}`qHr@~8tpxv0>d0X5ZoQC-m z49a05HyqvXCErj4KQuj|B~x@=m(?|v?|;@*{Hi(AGFyVFJLB5ia)TwlXo=M3zs&!8 zSW)(9<|k~aeN@!8oZi?)1yiT=_pub7uzfyWAkB)(83GyX;_*UllPLAdS+APa^;C^O z$Oos{e#42NoFOkBGdF4(Mrn^n?KttLcJ3EfkzKu{wl|$vV2Fyf!&X-`NGXa(YG^J^ zcLr`3v=SNk%Rjv3rBF9nV@C5nNu`F57PjWixzj&b=8cZVA2YH&V(xlL z`Ny-XG)k_1cKFfK#sK}9!!B}szdP5K*u7n|ia1zB=NSVC%ijZ=j0X{@FG|?$ zYMwlHt&8x8W@D$kLPa2Fjg$uO59 zD@NW#$^9!9sBD)7keX!!)nt*udSszysd~czdi%W7Uq}MX$TM2B#KuI76# zp(2969g$w`m-*M5u$Dirz_kfKP^!>T@>e1i&4p^jEDeJn&vZmOQvIDQ|&GELZyA;xfGqi)M zL6Igduo-(qnWx#ZC)5F|Q3RzyK}D&1o^}(KHfT>Cp@>u!QTzSr|B~@%zCoZran|ZE zs!k`Q40>y)Khy-|4p6-0?lsOL)l8~gdpqCJiy{)7GYC5fURA|~N?Q8<{^Gjc;@E!z z#Q|X%gwyR3@0`e&m~xtnEIufzqbwDIN;$;JZ~DeZxsv}4bmmIzc) ztwK=LmTQa)tByMRSHDMg1b@OCRwXLtU)&X2&evBv>+5$n>6oMm z9lheM6|qY~K`G#M4l<&omnDi4y6IwB`%w!Xg0B)`*$L5fS`Hd<5D-VUWp{ngvMQ;y z&bploIeEhd#Uy7POVWR+BEaLAAomtz#gjtWF8$UkQ!S18Y%%YlN;Az&$fl1P4@nWdNIOV31!l6Xz6qsYyTE4T!KCgKL+m53(46}j(RtlD>5=Nf>w>t z6Y>Di;@{oB^7>f>Bijp#6unyvy0SpXEjh9~f*PuZI#_QSpr}iv1zN1dbIiKy2uenc$rfN??JiJ*d2tvGcXtp?<6>{*bKFloqz_f$w`=J z&nwc&d~+3J`Lc#jiBpXoovQz2ey-9%*os8#dPaSIGj=eByXSZ@Cn>C%VVdSBpFYSV z!8=d)dc8ONK8ixT!bJzhd~24myc82P_8pE~I>rT^W=P_diKv;i0zL;(6)l)m1ahbOBaNIl`eLO3YAhnVVev{OlrEjyCWFN zQ95da_SR!EoKiUZ9-N(bpSqQIIMQ0S!i)~&_c}{v2t^|qqNqz?vw;AF^#&}AD@rWv z>yoeIV9EP0f6o}@0PyG`&X(CI8L4quqn1@^m32K+Z33j!*LuLR0=S{dz5yinpv$oT z$Z%1L2r`PO16xAI#;Xg)>gZ`mf@a3VQwp*PoL}xv(8t}LVOx{LfNV6uQ1ZobH&Qht zWDu<86F8SpWi?TD6#TX|R7yGLVCK^)iHUkMYMlFD-E!t=t`}$$kSlEqvf<>XKyOV<^yO& zLGC$_;~byB&=$9$_iN$AHP313F+yE z%C@O9U{SorX6ZL8!17oj=#}H2 z9MHVvjeDN~b|1lVDhYn-2_7+5Dx!`qrH-062CrP4$|BhnW?X9=$+R1-_)fTDG_ma> zgxJ>Rmb+bL&`o4zW%YyBRG|*H;rotQC@EC%mRU_{KaG|xGx&iG;d+JDeb#lTJQPi* zDOV_(X&XEa|MaiLigzvM=~NwAMPIy;>cb;@Db9a-mKZrowE0f}zoHrAA3zzLj zgehHlHH;J}A!~AP?!D3*A(~+jrV6CP*%*8hnz`?PUoT`0|aLO2E}|-6+#ABN;V|R^X@cW zyMk837yBH4?01cGG-l<#vLmRnQo!%LUo5}a0wTJ9-au$*K{Td`z!yT5^+Biw;QWr| z360~mK;?UmHH)Aht%>18s1nYwvp`chRqX@`?{J+0UgJbc*@ z{gMZk5gz7gIJTTgj)hS8dpjL7^?E--9%6wqTs2i$6h|^o4pEtsKq^}r4gA;koAZe9 zW#s@cB?wLHTcc!JMSOWi1#ZM%P z04n7}(Uo>Q*AIwff|K^2axltfP-O{`OmKx$g_aY%!pfvja+;WI{2SmEJqs8Z>EEG} zUzi`5KN`|6xS&N#YLg_=iwNoj%~846WS`0M5K=ObakPeTu;5tmwn`ZicIYAna@T(T zULz>bOM`<+3#58|XNNVs*%5|JmRYyf_YyPLtsWo{n;j(c6Uvi=R~|HhrZG}80;hK& zDqZdriC2Gys+_?sr{Ou^K~NHiD2Rtu@$z6heS(=kykW_HT6kvHYp`NMSzMHT5W}`B zWd8oiBhzy5Y~DDQX*+uF=W!RWhYj zmn%~bVmR<-4c5V;e4m2k3Z~X3QMS1$iNok zn3mTlEtfM^FvRLSm$)YZG0rpMh+{%NeZlp{YQ`AH{9Go)9erU2dr(L~T}m;A?ROZ8 zknt>lPej zo3_)5>Iq3EuF-(({1Af_6jW3&pa9P;e~t;)k0Iat;l7E>M0isgvxRTUu04DHn&7G_ zt>7gLh1a|Qz!c6E&Z<7&x8&g@=lZ>6NjUazEVyM8s);6t3Vcvmwg7eC-&n_jc9s>Q zd)w)rFwZoevnLP>v_Iiwo`0%9(Yc&D$}+{|UqP8AgK^qY%YBiRTDht!n{gn|IZh12 zbL}uA1@_W%Ls@;iJ)_8&LW>$h7~u`utQ(BWA+SYH)20i=C^{T7PdN5Wi9Uc5jNVrY zrt-@f64cu|{Qc1sa-2sKD5n}TX}buA&$aUzGtHYU>!y5|wkFg6jAPFMrD(?|mIBJE zOmc_nxqH|@Fa+kIinPi{m`}XQMu@f4HPIu<_D~9Nv^b4ZYpmPB8lf>?9i*Ox&Qy-; z)vp#}L>p`VqUgYceCYwnQDdLYW z1OXh(8HOth>Lyr2!`k!E4YeJf+dMascbGZf;Uvkvz$tsH1d1T91+WD*<*RK)!=2EP zG=_=Gobhx#-D|sKbP$enpAVHcBz~;srxZ>gz=D&G4Cj>Oe-P{M|BIvBH?u{3*>T(Wmk&39$75HkZ;Ljw!H^s--p3HZAA%zGmW zY$R@<(2z9h#fW7Cl*^{PlA9EJGD| zoYr|Dq3xKHXwQ;?`O(T>H4XQoRWKt4K<7P3f3 z$0?TxH<;$@U+EspCOSHe>*!y=`7Ex#b@B8uu6$>2o{)lF*G9X%k!1G4MT@ovq!u0& zO_p&p;Z{*m7H++5q}83GHW3Kijv!EJHw{E0nfx8ks^kDSDad0m(Je^i3|=xI1^o;B)B;chVr1WXLLDw|mvcea7N33!WwDuCnR_ z-QHv;w*M5aNWER_`GXw>`nC{0D$`1ujLRPB%6*sk=R z-D|2^qnLwlh>&rf=nSDsQIG)yHj{m?0SQP!#3;_=uEk`x8@?UygyjgXwQ9vEE|dcT z3l$2}Bkf#d!HQKb_vXUo&0SrZh7>siMUUt;&3Waboyw*-hwa{&dS7acaOBvhQ1U4Y z7q;#66PKd84`A&@yNJTcF6gf}%j{&dll{Y33*Saz-;1)Br(V{F%uD=$!Kxv$bxF?Q zV4nxlU0Eh*F}zjAbt6@LRhOCf!l&&YQi8d+DP$V!Ux);bd2$V*ASQLO4C|uKcdzfJ zohIr~6A|6864kZ27tA2D&Wwj-Qcf-*ZgJYCJ`d~*Rg9k$F^F672PswPxa5ee$lZCX z<)fCvzutJ38?Eh})Z$`-aA55Ph=r<4vr^h-u6A3twA|JM~wpky_O z$@CRhHobG%CRX1PRbIQkq)cw%nf%rO^C=zx$CRVh;->Cx+4y<`Qn9lcLQ*SBD4}$= z{BRjTf-5G>Z;|-gS2G-^p3(1! z3q_tIv9=NTANG9`JmA(T1p`!cosC?9Aky69Iv6`H%@U>uX}PX#qKE;K`IuO9$Vxg6 zp?pn)!T?loGEB*a3j^)}3|{dyDCuL0cbRs5wfCXU9S~+Ha`GZEMn$Lq@-O(*j+5+X z<^-a4XMc~nOi%G!b*u&ohRo1P?}Q5k_Ce^sGIw83^Bv!3{$MSwxntGzVs^suC~vw8 zo2zq{%43+VYHm?4ocyYgr!F4FPEeV^=ra|}q02t9Vmg-F3ZoBB&dw`UM-N}}c07p+ zB@gZlDgO}$oxMRm*fp}>&F7qyD z0z!$*LoTyoKr+{Np`O4kq@75UYc~X9%Py+sa-8P-9}hrZP|8{t8XOfRD7Cb&$!^Wb ze<%S>tGps{qEa1_i#T1zB^BlS!+EPeiB(nHS8qKWL9aVY2e;)GXauR!=PD5wI@7^F#F`ca9ONAza4eQ;bL}I){ljP#}ZEU(d%h zya_pF${Qr6u}~h#&3EsbrfzFb7cqBOR1h|eFkjHA5k>`ug+Wh(#g|D{nVAt0OZD3c z9eb!|{S9rxNBA}871_4~sG5~)Wx;BH&r~m+);PSrtC#1Sw&7?vE+-p1%}4Gwra6(( z4Cb2A)B}s0k?+-iD1_)tw3Yg}&{2I*?=^|~r!mz3`{45=@+}oysESbD-2-`JYi;E9 zZeHt%Fg0@VVXjl<{u@V9R%!@(2xjgXXP~x%X!aTOB0D=Wv4ZA_LBh7i&zgSexS7Oe z9dqBjK`6fP%=+88ypF(;OP2T2x9fsjJf1K402JN?HJ%rWo9QHfX3?%ZQ>WnJbJ1Ef zer4kkjU?O}w1ZblvZ9Tz9m@`cZ0tNV-5<;+0QO4&`-QDF!r??tFyH$S8OI^P7_)+V z<$9kgO*6?xZ5^UwzU>5U5*j@)(*cZs8nM#ifp#G(%+@D{TqoVvXB@yVw~( z7qUWICNFZAxuH7olL9n7(8nF)r;G#_-TCAOvaqC!3x3}1_NhSN6kBANngh&qIoztj zngEor4w5S$_{uvrvN)?uQqfnO5L2$7aXlTiN5k`_s6)OCRDQ)t_eSTlmoQgfR#*`#b@Fg zvsU1D4a92DO_eNl1r3d!uS_2SEo(mC@-!XFXRBY0Fzs)OH|^1n<^V)S3VB4BWsZlA zY2~a|Wu)*uw~_M$D!WKyUy&$}C?X;#u+k>gUU+VRf)Nk^2`uu5yr-)R8eSQ&vrH(Z zR~{cS|C8*L5;Pj~=t^cMAj~(R>y9?LG!*l<$~9+_90M=B>Dk?mhstGkV~~(4UayaJ zEw(~aeS!az*Mhy@d0j68)>m5q@B5;#-u@d;8iBx|X#jq)oroosvq9;JjP7%C&XQ6zu=4 z&7^3(PC`kx##@fq)~9ukPablOJgwi)6T$H)J>omu$ZsjRu33FK3Mb_?B)~u)x`=6B zTE}y!8#K`B`!Lr>!qibXA__~3plwoCK!7lHC(%guM@`z4O>Y|dh{vEpk~mzT+2 zO%?ZcC!n6VnmTLHhQ8y04!An>(An`8MXcP|cG31y@oAqwV0UhPDW3bOW9XQ;t)-$Y zY)ggTJ9oQYG?Su0{Qhp1kH@&SSCzbr(fWj4bR<+yL8u;Vgo#~LF!7cMV>k?5V=}^h z0EZycq$#tj={Qt-1w=7)4WWjw_`S25EU&neN?8Sxl;o|*g2RB_O6nCk`?kzf>b3P7 z@T-b1wE5fI6rY_pd#{Z{SZ9~m1=41e;5o7PN-f_^8_EUA5JJV)17xbuj905(noiS` z4RA@T25kJ~^)&Je|CA@t>r%e2#v<4VBsNmRkpzm%!5KY932~+g27m zDiQ#CRtF2`_a`BiF|!nf4`fIXhZuZSAY9=^^vwg{wX+?Dci%aWuK!x+R`JEULk(D` z_;TXsp!iWsYi8>7v%el4I|5E^g+$ zt=`OgSXs4!rNmHU7w0FiRAzx`SWm%YM9YbS6ZZ?K#*%awJwj7_c^ zt|;**W-%~0^MxqRmSPdDWvU9L>%EO0syOs>}0+uuHCrj^W6bm zoN#sf+O1U5Pa)yCiD-47)|$`&JVWM?1t}=&BBhFK^cdBzFV-|d`bVxJoZ#oKL!nPD z0@VJ3lt>i}{>j)qa?^qV#t@plS`1BI;N#Tc(!Gwa%BK4$7{wGnnh+5GT!^lIRHgAc zr>K?|?ZKyLJm2yODw(WQ%FdgYC4Yy=rO0uw3|SuLu)38tCLSid+43}Tv&P41zAj~E z5GacE!>(}wz=9-uRBCbnl^MM`WsTh#(HVJDFNiUa%blpZS$H{r5`zEjpcL-|ofT#U%<(vs5%5XL63qIO7^SWzV_#stC}8 zmXIzOS$ax>+)+gDq$(-n%aRAUw>-|nX`M?4jlUo{QU#sAI!4bJf*~bz4H<;y@q`JS zN)Od}sKphN0IMlLDkd`mCA(9&S`l|5TGW#^`?~$5ooLcHan|LQk^{}AL)P{}mgDX{ z@vHs>9oBk*(kE(-OJXIfuGb*5Kx-$#_#Zzk(Fq#%G$(1V|S(S=P^~Yt7>`42b;4lNHxmBFJ zu*)j zqVajot@#sc~<gE_jK2AMs}SPXwNM6PtJh9@O6wdmi31M-Janv~UY z*0N;F_m#&tE#F7Zpe71Xk{OOmlXn!x(?2;puJL~R8r`aZ}RL+Pj1OJEJ6+YvX zUvvQ+`>G5Sr@y2Pz1Yt&hv$k@iFas1PFhALinzjcRrQE=Z4Pcu(CuDR>g2W zXAuj{ut70yMUhtwGZw~kF&(+bDCo04cpPhWoeK8EPoR4`wB*B)dsg^YoLt5f5G#4* z!du^pN*#x>GM=|lBv1U@3SsEClp>2yf^WI?{Pp1V6ZbPkac0^3yd_=-v$sorZ^;Mi zxYKZWZ1S9}Mz78Zl1#ahL$t`@!=z^}S}irn&w-@0eZ#`sAkBB@l!7~4#p3JcglQjR zH1|>V`m$k;Jmvgf54S#JX4U$DKaYdV-o))lFsnEU>EP*#b%cKpS@?U}Yv(^E7)fiU zP25pm8+D{>P2zR%&mW-LU|x1>DRDeE(tgW{7rK7G;QC!VOx-KT6A;+NsA``W)IGRv zK6deVJ}@-G=a>IQ`!oGBf&-OrYY6}(l&^Y#)`FGVuMFZ^y5%nW>J1!Y_Xv^jsJ}`u2+Fde4)8Ayn>^4=Y%B8q z`~))A>p!eQU1f!iDDt0M<LkcyEw!vp)`06)bj%%_9+kH+}WPadtGo>X(UNR~! z59-@I7;R3Jbh}l(ellm?UHyX4bq8nCCrB|W{S&aySY1K_ zZHzlj>&TU3XPLhATK}=yfq!|4iEB+JC?H1ABAJywnQrUaaAM1i)mkg}sVtH!PcWIX z=di=;@mu$j_QPiUb%+>ehxuWl;#+kPkH=5VO0aZ>6s8o$i6^adV&l)EQE#6QcHupt zo2=KNn|1-1*g@hX&-JDIrH6mE+`4z+uZ<|e5upwZwl8O?)#S8=g|49@OhV&1E z^luPl-E>}z0Q3?SsQz;%D|=Hj4<<_&JKK5{muq*FaHQ|*BQ&FvwR?2|D&^s{B67ri z&>(OO90CIj1N5wTIIw?k7EyO0iBu5m1O?(TL{-0j{zX3O#|FQwK0p=et1Ty-c zxEu8U!QK9ay8XKo|351$+W literal 0 HcmV?d00001 diff --git a/src/unit_tests/test_samples/smoke/InstallationMode_GoodSignature.wgt b/src/unit_tests/test_samples/smoke/InstallationMode_GoodSignature.wgt new file mode 100644 index 0000000000000000000000000000000000000000..87604e7f416521fb99b6dc381f35a5c911041bde GIT binary patch literal 38029 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⪻~V!vWscQSTVx`IZqKBW{E+z&E8$ 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%0A9@3V&;q@sN;bEzwM5rePQ;Ne5K% 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

egx4!dORJ>p=~%BDFL<-^~#hcLj4vi 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

egx4!dORJ>p=~%BDFL<-^~#hcLj4vi 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 literal 0 HcmV?d00001 diff --git a/src/unit_tests/test_samples/smoke/RecoveryMode_ForInstallation.wgt b/src/unit_tests/test_samples/smoke/RecoveryMode_ForInstallation.wgt new file mode 100644 index 0000000000000000000000000000000000000000..1244cf5c30d65c2029ae898da559ecdada788c1d GIT binary patch literal 33322 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

egx4!dORJ>p=~%BDFL<-^~#hcLj4vi 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 Qz~Dg}0;mN9|9@WnUq1Jr4*&oF literal 0 HcmV?d00001 diff --git a/src/unit_tests/test_samples/smoke/RecoveryMode_ForUpdate.wgt b/src/unit_tests/test_samples/smoke/RecoveryMode_ForUpdate.wgt new file mode 100644 index 0000000000000000000000000000000000000000..d1f0b4b68a87e3f09caa4addcad359b91a4063f3 GIT binary patch literal 34140 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 Z%z>6M0=!w-Kq-w22*sHh7&MzeJOJ)d#CHGy literal 0 HcmV?d00001 diff --git a/src/unit_tests/test_samples/smoke/UpdateMode_2.wgt b/src/unit_tests/test_samples/smoke/UpdateMode_2.wgt new file mode 100644 index 0000000000000000000000000000000000000000..39ab8a813ee94f3139f2ca63f46d21915c0ab228 GIT binary patch literal 34134 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 i*U7Z8dw0~1LThz9^iu*;VK literal 0 HcmV?d00001 diff --git a/src/unit_tests/test_samples/smoke/UpdateMode_Rollback_2.wgt b/src/unit_tests/test_samples/smoke/UpdateMode_Rollback_2.wgt new file mode 100644 index 0000000000000000000000000000000000000000..20efef268ed1eb50c834ad50e775a2cbaf935ac6 GIT binary patch literal 34141 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 + + + + + + smokeapp1 + + diff --git a/src/wgt/CMakeLists.txt b/src/wgt/CMakeLists.txt new file mode 100644 index 0000000..6bd0300 --- /dev/null +++ b/src/wgt/CMakeLists.txt @@ -0,0 +1,51 @@ +# Target - sources +SET(SRCS + rds_parser.cc + step/step_check_settings_level.cc + step/step_check_wgt_background_category.cc + step/step_create_symbolic_link.cc + step/step_encrypt_resources.cc + step/step_generate_xml.cc + step/step_parse.cc + step/step_remove_encryption_data.cc + step/step_parse_recovery.cc + step/step_rds_parse.cc + step/step_rds_modify.cc + step/step_wgt_create_icons.cc + step/step_wgt_create_storage_directories.cc + step/step_wgt_copy_storage_directories.cc + step/step_wgt_resource_directory.cc + step/step_add_default_privileges.cc + wgt_app_query_interface.cc + wgt_installer.cc +) + +IF(WRT_LAUNCHER) + ADD_DEFINITIONS("-DWRT_LAUNCHER=\"${WRT_LAUNCHER}\"") + MESSAGE( "WRT LAUNCHER binary path is set to ${WRT_LAUNCHER}") +ELSE(WRT_LAUNCHER) + MESSAGE(FATAL_ERROR, "WRT LAUNCHER binary path is not set") +ENDIF(WRT_LAUNCHER) + +# Target - definition +ADD_LIBRARY(${TARGET_LIBNAME_WGT} STATIC ${SRCS}) +ADD_EXECUTABLE(${TARGET_WGT_BACKEND} "wgt_backend.cc") +# Target - includes +TARGET_INCLUDE_DIRECTORIES(${TARGET_LIBNAME_WGT} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../") +TARGET_INCLUDE_DIRECTORIES(${TARGET_WGT_BACKEND} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../") +# Target - deps +APPLY_PKG_CONFIG(${TARGET_LIBNAME_WGT} PUBLIC + APP_INSTALLERS_DEPS + MANIFEST_HANDLERS_DEPS + MANIFEST_PARSER_DEPS + PKGMGR_INSTALLER_DEPS + ENCRYPTION_DEPS + Boost +) + +# Target - in-package deps +TARGET_LINK_LIBRARIES(${TARGET_WGT_BACKEND} PRIVATE ${TARGET_LIBNAME_WGT}) + +# Install +INSTALL(TARGETS ${TARGET_LIBNAME_WGT} DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(TARGETS ${TARGET_WGT_BACKEND} DESTINATION ${BINDIR}) diff --git a/src/wgt/rds_parser.cc b/src/wgt/rds_parser.cc new file mode 100644 index 0000000..9f2fbb7 --- /dev/null +++ b/src/wgt/rds_parser.cc @@ -0,0 +1,61 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/rds_parser.h" + +#include + +namespace { +const char kAdd[] = "#add"; +const char kModify[] = "#modify"; +const char kDelete[] = "#delete"; +} + +namespace wgt { +namespace rds_parser { + +RDSParser::RDSParser(const std::string& path_to_delta) + : path_to_delta_(path_to_delta) {} + +bool RDSParser::Parse() { + std::vector* current_container = nullptr; + std::string line; + + std::ifstream file_to_parse(path_to_delta_); + if (!file_to_parse.is_open()) + return false; + while (getline(file_to_parse, line)) { + if (line.compare(kDelete) == 0) { + current_container = &files_to_delete_; + continue; + } + if (line.compare(kAdd) == 0) { + current_container = &files_to_add_; + continue; + } + if (line.compare(kModify) == 0) { + current_container = &files_to_modify_; + continue; + } + if (current_container) + current_container->push_back(line); + } + file_to_parse.close(); + return true; +} + +const std::vector& RDSParser::files_to_modify() const { + return files_to_modify_; +} + +const std::vector& RDSParser::files_to_add() const { + return files_to_add_; +} + +const std::vector& RDSParser::files_to_delete() const { + return files_to_delete_; +} + +} // namespace rds_parser +} // namespace wgt diff --git a/src/wgt/rds_parser.h b/src/wgt/rds_parser.h new file mode 100644 index 0000000..7c412d1 --- /dev/null +++ b/src/wgt/rds_parser.h @@ -0,0 +1,63 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_RDS_PARSER_H_ +#define WGT_RDS_PARSER_H_ + +#include +#include +namespace wgt { +namespace rds_parser { + +/** + * \brief Parse RDS config file + */ +class RDSParser { + public: + /** + * \brief Explicit constructor + * + * \param path_to_delta path to directory + */ + explicit RDSParser(const std::string& path_to_delta); + + /** + * \brief Parse package xml + * + * \return true if parsing was successful + */ + bool Parse(); + + /** + * \brief Accessor to vector of files to modify + * + * \return files to modify + */ + const std::vector& files_to_modify() const; + + /** + * \brief Accessor to vector of files to add + * + * \return files to add + */ + const std::vector& files_to_add() const; + + /** + * \brief Accessor to vector of files to delete + * + * \return files to delete + */ + const std::vector& files_to_delete() const; + + private: + std::string path_to_delta_; + std::vector files_to_modify_; + std::vector files_to_add_; + std::vector files_to_delete_; +}; + +} // namespace rds_parser +} // namespace wgt + +#endif // WGT_RDS_PARSER_H_ diff --git a/src/wgt/step/step_add_default_privileges.cc b/src/wgt/step/step_add_default_privileges.cc new file mode 100644 index 0000000..18eb902 --- /dev/null +++ b/src/wgt/step/step_add_default_privileges.cc @@ -0,0 +1,38 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_add_default_privileges.h" + +#include + +#include +#include +#include + +namespace { + +const char kPrivForWebApp[] = + "http://tizen.org/privilege/internal/webappdefault"; + +} // namespace + +namespace wgt { +namespace security { + +common_installer::Step::Status StepAddDefaultPrivileges::precheck() { + if (!context_->manifest_data.get()) { + LOG(ERROR) << "Manifest data is not set"; + return Status::ERROR; + } + return Status::OK; +} + +common_installer::Step::Status StepAddDefaultPrivileges::process() { + manifest_x* m = context_->manifest_data.get(); + m->privileges = g_list_append(m->privileges, strdup(kPrivForWebApp)); + return Status::OK; +} + +} // namespace security +} // namespace wgt diff --git a/src/wgt/step/step_add_default_privileges.h b/src/wgt/step/step_add_default_privileges.h new file mode 100644 index 0000000..928ab84 --- /dev/null +++ b/src/wgt/step/step_add_default_privileges.h @@ -0,0 +1,59 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_ADD_DEFAULT_PRIVILEGES_H_ +#define WGT_STEP_STEP_ADD_DEFAULT_PRIVILEGES_H_ + +#include + +#include +#include +#include + +namespace wgt { +namespace security { + +/** + * \brief Step that add default privileges during installation + */ +class StepAddDefaultPrivileges : public common_installer::Step { + public: + using Step::Step; + + /** + * \brief Add default privileges + * + * \return Status::OK + */ + Status process() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status clean() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status undo() override { return Status::OK; } + + /** + * \brief Check requirements for this step + * + * \return Status::ERROR when rmanifest data are missing, + * Status::OK otherwise + */ + Status precheck() override; + + SCOPE_LOG_TAG(AddDefaultPrivileges) +}; + +} // namespace security +} // namespace wgt + +#endif // WGT_STEP_STEP_ADD_DEFAULT_PRIVILEGES_H_ diff --git a/src/wgt/step/step_check_settings_level.cc b/src/wgt/step/step_check_settings_level.cc new file mode 100644 index 0000000..664e376 --- /dev/null +++ b/src/wgt/step/step_check_settings_level.cc @@ -0,0 +1,47 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_check_settings_level.h" + +#include +#include + +#include + +#include "wgt/wgt_backend_data.h" + +namespace { + +bool ValidateSettingsForLevel(common_installer::PrivilegeLevel level, + const wgt::parse::SettingInfo& settings) { + if (settings.background_vibration()) { + common_installer::PrivilegeLevel required_level = + common_installer::PrivilegeLevel::PARTNER; + if (!common_installer::SatifiesPrivilegeLevel(required_level, level)) { + LOG(ERROR) << "background_vibration requires visibility level: " + << common_installer::PrivilegeLevelToString(required_level); + return false; + } + LOG(INFO) << "Setting: 'background-vibration' allowed"; + } + return true; +} + +} // namespace + +namespace wgt { +namespace security { + +common_installer::Step::Status StepCheckSettingsLevel::process() { + if (!ValidateSettingsForLevel(context_->privilege_level.get(), + static_cast( + context_->backend_data.get())->settings.get())) { + return Status::ERROR; + } + LOG(INFO) << "Settings privilege level checked"; + return Status::OK; +} + +} // namespace security +} // namespace wgt diff --git a/src/wgt/step/step_check_settings_level.h b/src/wgt/step/step_check_settings_level.h new file mode 100644 index 0000000..bac5bf2 --- /dev/null +++ b/src/wgt/step/step_check_settings_level.h @@ -0,0 +1,59 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_CHECK_SETTINGS_LEVEL_H_ +#define WGT_STEP_STEP_CHECK_SETTINGS_LEVEL_H_ + +#include + +#include +#include +#include + +namespace wgt { +namespace security { + +/** + * \brief Step that check privileges level for settings + */ +class StepCheckSettingsLevel : public common_installer::Step { + public: + using Step::Step; + + /** + * \brief Check privileges level for settings + * + * \return Status::ERROR when invalid privileges detected, + * Status::OK otherwise + */ + Status process() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status clean() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status undo() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status precheck() override { return Status::OK; } + + SCOPE_LOG_TAG(CheckSettingsLevel) +}; + +} // namespace security +} // namespace wgt + +#endif // WGT_STEP_STEP_CHECK_SETTINGS_LEVEL_H_ diff --git a/src/wgt/step/step_check_wgt_background_category.cc b/src/wgt/step/step_check_wgt_background_category.cc new file mode 100644 index 0000000..c652fc2 --- /dev/null +++ b/src/wgt/step/step_check_wgt_background_category.cc @@ -0,0 +1,30 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_check_wgt_background_category.h" + +#include +#include + +#include "wgt/wgt_backend_data.h" + +namespace { +namespace ci_sec = common_installer::security; +} // namespace + +namespace wgt { +namespace security { + +StepCheckWgtBackgroundCategory::StepCheckWgtBackgroundCategory( + common_installer::InstallerContext* context) : + ci_sec::StepCheckBackgroundCategory(context) {} + +bool StepCheckWgtBackgroundCategory::GetBackgroundSupport() { + const wgt::parse::SettingInfo& settings = static_cast( + context_->backend_data.get())->settings.get(); + return settings.background_support_enabled(); +} + +} // namespace security +} // namespace wgt diff --git a/src/wgt/step/step_check_wgt_background_category.h b/src/wgt/step/step_check_wgt_background_category.h new file mode 100644 index 0000000..33b5b23 --- /dev/null +++ b/src/wgt/step/step_check_wgt_background_category.h @@ -0,0 +1,31 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_CHECK_WGT_BACKGROUND_CATEGORY_H_ +#define WGT_STEP_STEP_CHECK_WGT_BACKGROUND_CATEGORY_H_ + +#include +#include + +namespace wgt { +namespace security { + +/** + * \brief This step check background category value and modify it depending on + * required version, cert level, background support, and value itself + */ +class StepCheckWgtBackgroundCategory : + public common_installer::security::StepCheckBackgroundCategory { + public: + explicit StepCheckWgtBackgroundCategory( + common_installer::InstallerContext* context); + + protected: + bool GetBackgroundSupport() override; +}; + +} // namespace security +} // namespace wgt + +#endif // WGT_STEP_STEP_CHECK_WGT_BACKGROUND_CATEGORY_H_ diff --git a/src/wgt/step/step_create_symbolic_link.cc b/src/wgt/step/step_create_symbolic_link.cc new file mode 100644 index 0000000..1a3eda2 --- /dev/null +++ b/src/wgt/step/step_create_symbolic_link.cc @@ -0,0 +1,71 @@ +/* 2014, Copyright © Eurogiciel Coporation, APACHE-2.0, see LICENSE file */ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_create_symbolic_link.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +namespace { + +const char kWrtServiceBinaryPath[] = "/usr/bin/wrt-service"; + +} // namespace + +namespace wgt { +namespace filesystem { + +namespace bf = boost::filesystem; + +common_installer::Step::Status StepCreateSymbolicLink::process() { + assert(context_->manifest_data.get()); + boost::system::error_code error; + for (application_x* app : + GListRange(context_->manifest_data.get()->application)) { + // binary is a symbolic link named and is located in / + bf::path exec_path = + context_->pkg_path.get() + / bf::path("bin"); + common_installer::CreateDir(exec_path); + + exec_path /= bf::path(app->appid); + + if (strcmp(app->component_type, "uiapp") == 0) { + bf::create_symlink(bf::path(WRT_LAUNCHER), exec_path, error); + } else { + bf::create_symlink(kWrtServiceBinaryPath, exec_path, error); + } + if (error) { + LOG(ERROR) << "Failed to set symbolic link " + << boost::system::system_error(error).what(); + return Step::Status::ERROR; + } + } + LOG(DEBUG) << "Successfully parse tizen manifest xml"; + + return Status::OK; +} + +common_installer::Step::Status StepCreateSymbolicLink::undo() { + for (application_x* app : + GListRange(context_->manifest_data.get()->application)) { + bf::path exec_path = context_->pkg_path.get() / "bin" / app->appid; + if (bf::exists(exec_path)) + bf::remove_all(exec_path); + } + return Status::OK; +} + +} // namespace filesystem +} // namespace wgt diff --git a/src/wgt/step/step_create_symbolic_link.h b/src/wgt/step/step_create_symbolic_link.h new file mode 100644 index 0000000..df51fde --- /dev/null +++ b/src/wgt/step/step_create_symbolic_link.h @@ -0,0 +1,61 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_CREATE_SYMBOLIC_LINK_H_ +#define WGT_STEP_STEP_CREATE_SYMBOLIC_LINK_H_ + +#include + +#include + +#include +#include +#include + +namespace wgt { +namespace filesystem { + +/** + * \brief Step that create symbolic link to application + */ +class StepCreateSymbolicLink : public common_installer::Step { + public: + using Step::Step; + + /** + * \brief Create symbolic link + * + * \return Status::ERROR when failed to create symbolic link, + * Status::OK otherwise + */ + Status process() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status clean() override { return Status::OK; } + + /** + * \brief Delete created symbolic link + * + * \return Status::OK + */ + Status undo() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status precheck() override { return Status::OK; } + + SCOPE_LOG_TAG(SymbolicLink) +}; + +} // namespace filesystem +} // namespace wgt + +#endif // WGT_STEP_STEP_CREATE_SYMBOLIC_LINK_H_ diff --git a/src/wgt/step/step_encrypt_resources.cc b/src/wgt/step/step_encrypt_resources.cc new file mode 100644 index 0000000..08f659d --- /dev/null +++ b/src/wgt/step/step_encrypt_resources.cc @@ -0,0 +1,215 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_encrypt_resources.h" + +#include + +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include + + +namespace { + +const std::set encryptSet { ".html", ".htm", ".css", ".js"}; + +} // namespace + + +namespace wgt { +namespace encrypt { + +namespace bf = boost::filesystem; +namespace bs = boost::system; + +common_installer::Step::Status StepEncryptResources::precheck() { + backend_data_ = static_cast(context_->backend_data.get()); + if (!backend_data_) { + LOG(ERROR) << "no backend data"; + return common_installer::Step::Status::ERROR; + } + + input_ = context_->unpacked_dir_path.get(); + + if (input_.empty()) { + LOG(ERROR) << "unpacked_dir_path attribute is empty"; + return Step::Status::INVALID_VALUE; + } + if (!bf::exists(input_)) { + LOG(ERROR) << "unpacked_dir_path (" << input_ << ") path does not exist"; + return Step::Status::INVALID_VALUE; + } + + return common_installer::Step::Status::OK; +} + +common_installer::Step::Status StepEncryptResources::process() { + if (!backend_data_->settings.get().encryption_enabled()) { + LOG(DEBUG) << "no encryption"; + return common_installer::Step::Status::OK; + } + LOG(DEBUG) << "Encrypting"; + + if (!Encrypt(input_)) { + LOG(ERROR) << "Error during encryption"; + return common_installer::Step::Status::ERROR; + } + + return common_installer::Step::Status::OK; +} + +bool StepEncryptResources::Encrypt(const bf::path &src) { + // traversing through src dir (recurrence if subdir found) + // for every file found, check if it should be encrypted (ToBeEncrypted) + // if yes, encrypt it (and replace original one) + // if not, leave it + for (bf::directory_iterator file(src); + file != bf::directory_iterator(); + ++file) { + bs::error_code error_code; + bf::path current(file->path()); + + bool is_dir = bf::is_directory(current, error_code); + if (error_code) + return false; + if (is_dir) { + if (!Encrypt(current)) + return false; + continue; + } + + bool is_sym = bf::is_symlink(current, error_code); + if (error_code) + return false; + if (is_sym) + continue; // TODO(p.sikorski) is it enough? + + // it is regular file (not dir, not symlink) + if (ToBeEncrypted(current)) { + LOG(INFO) << "File for encryption: " << current; + if (!EncryptFile(current)) + return false; + } + } + return true; +} + +bool StepEncryptResources::EncryptFile(const bf::path &src) { + FILE *input = fopen(src.string().c_str(), "rb"); + if (!input) { + LOG(ERROR) << "Cannot open file for encryption: " << src; + return false; + } + + // read size + fseek(input , 0 , SEEK_END); + size_t length = ftell(input); + + // don't encrypt empty files because libwebappenc doesn't support it + if (length == 0) { + fclose(input); + return true; + } + + rewind(input); + + char *input_buffer = new char[length]; + if (length != fread(input_buffer, sizeof(char), length, input)) { + LOG(ERROR) << "Read error, file: " << src; + fclose(input); + delete []input_buffer; + return false; + } + fclose(input); + + 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); + delete []input_buffer; + if (WAE_ERROR_NONE != ret) { + switch (ret) { + case WAE_ERROR_INVALID_PARAMETER: + LOG(ERROR) << "Error during encrypting: WAE_ERROR_INVALID_PARAMETER"; + break; + case WAE_ERROR_PERMISSION_DENIED: + LOG(ERROR) << "Error during encrypting: WAE_ERROR_PERMISSION_DENIED"; + break; + case WAE_ERROR_NO_KEY: + LOG(ERROR) << "Error during encrypting: WAE_ERROR_NO_KEY"; + break; + case WAE_ERROR_KEY_MANAGER: + LOG(ERROR) << "Error during encrypting: WAE_ERROR_KEY_MANAGER"; + break; + case WAE_ERROR_CRYPTO: + LOG(ERROR) << "Error during encrypting: WAE_ERROR_CRYPTO"; + break; + case WAE_ERROR_UNKNOWN: + LOG(ERROR) << "Error during encrypting: WAE_ERROR_UNKNOWN"; + break; + default: + LOG(ERROR) << "Error during encrypting: UNKNOWN"; + break; + } + return false; + } + + // original file is treated as destination! + FILE *output = fopen(src.string().c_str(), "wb"); + if (!output) { + LOG(ERROR) << "Cannot create encrypted file: " << src; + free(encrypted_data); + return false; + } + + if (enc_data_len != fwrite(reinterpret_cast(encrypted_data), + sizeof(char), + enc_data_len, + output)) { + LOG(ERROR) << "Write error, file: " << src; + free(encrypted_data); + fclose(output); + return false; + } + + + fclose(output); + free(encrypted_data); + return true; +} + +bool StepEncryptResources::ToBeEncrypted(const bf::path &file) { + size_t found_key = file.string().rfind("."); + if (std::string::npos != found_key) { + std::string mimeType = file.string().substr(found_key); + std::transform(mimeType.begin(), mimeType.end(), mimeType.begin(), + ::tolower); + return encryptSet.count(mimeType) > 0; + } + return false; +} + +} // namespace encrypt +} // namespace wgt diff --git a/src/wgt/step/step_encrypt_resources.h b/src/wgt/step/step_encrypt_resources.h new file mode 100644 index 0000000..2d64a51 --- /dev/null +++ b/src/wgt/step/step_encrypt_resources.h @@ -0,0 +1,66 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_ENCRYPT_RESOURCES_H_ +#define WGT_STEP_STEP_ENCRYPT_RESOURCES_H_ + +#include + +#include +#include + +#include "wgt/wgt_backend_data.h" + +namespace wgt { +namespace encrypt { + +/** + * \brief Step that encrypt application resources files if flagged to do so + */ +class StepEncryptResources : public common_installer::Step { + public: + using Step::Step; + + /** + * \brief Encrypt files + * + * \return Status::ERROR when error occurred during encryption, + * Status::OK otherwise + */ + Status process() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status clean() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status undo() override { return Status::OK; } + + /** + * \brief Check requirements for this step + * + * \return Status::ERROR when manifest data are missing, + * Status::INVALID_VALUE when requirements are not meet, + * Status::OK otherwise + */ + Status precheck() override; + + private: + bool Encrypt(const boost::filesystem::path &src); + bool EncryptFile(const boost::filesystem::path &src); + bool ToBeEncrypted(const boost::filesystem::path &file); + WgtBackendData* backend_data_; + boost::filesystem::path input_; + SCOPE_LOG_TAG(EncryptResources) +}; +} // namespace encrypt +} // namespace wgt +#endif // WGT_STEP_STEP_ENCRYPT_RESOURCES_H_ diff --git a/src/wgt/step/step_generate_xml.cc b/src/wgt/step/step_generate_xml.cc new file mode 100644 index 0000000..055fd3f --- /dev/null +++ b/src/wgt/step/step_generate_xml.cc @@ -0,0 +1,494 @@ +/* 2014, Copyright © Intel Coporation, license APACHE-2.0, see LICENSE file */ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_generate_xml.h" + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +namespace bs = boost::system; +namespace bf = boost::filesystem; + +namespace { + +void WriteUIApplicationAttributes( + xmlTextWriterPtr writer, application_x *app) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "taskmanage", + BAD_CAST "true"); + if (app->nodisplay) + xmlTextWriterWriteAttribute(writer, BAD_CAST "nodisplay", + BAD_CAST app->nodisplay); + if (app->multiple) + xmlTextWriterWriteAttribute(writer, BAD_CAST "multiple", + BAD_CAST app->multiple); + if (app->launch_mode && strlen(app->launch_mode)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "launch_mode", + BAD_CAST app->launch_mode); + if (app->ui_gadget && strlen(app->ui_gadget)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "ui-gadget", + BAD_CAST app->ui_gadget); + if (app->submode && strlen(app->submode)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "submode", + BAD_CAST app->submode); + if (app->submode_mainid && strlen(app->submode_mainid)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "submode-mainid", + BAD_CAST app->submode_mainid); + if (app->indicatordisplay && strlen(app->indicatordisplay)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "indicatordisplay", + BAD_CAST app->indicatordisplay); + if (app->portraitimg && strlen(app->portraitimg)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "portrait-effectimage", + BAD_CAST app->portraitimg); + if (app->landscapeimg && strlen(app->landscapeimg)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "landscape-effectimage", + BAD_CAST app->landscapeimg); + if (app->effectimage_type && strlen(app->effectimage_type)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "effectimage-type", + BAD_CAST app->effectimage_type); + if (app->hwacceleration && strlen(app->hwacceleration)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "hwacceleration", + BAD_CAST app->hwacceleration); +} + +void WriteServiceApplicationAttributes( + xmlTextWriterPtr writer, application_x *app) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "auto-restart", + BAD_CAST(app->autorestart ? app->autorestart : "false")); + xmlTextWriterWriteAttribute(writer, BAD_CAST "on-boot", + BAD_CAST(app->onboot ? app->onboot : "false")); + xmlTextWriterWriteAttribute(writer, BAD_CAST "taskmanage", + BAD_CAST "false"); +} + +void WriteWidgetApplicationAttributes( + xmlTextWriterPtr writer, application_x *app) { + if (app->nodisplay) + xmlTextWriterWriteAttribute(writer, BAD_CAST "nodisplay", + BAD_CAST app->nodisplay); + if (app->multiple) + xmlTextWriterWriteAttribute(writer, BAD_CAST "multiple", + BAD_CAST app->multiple); +} + +} // namespace + +namespace wgt { +namespace pkgmgr { + +common_installer::Step::Status StepGenerateXml::GenerateApplicationCommonXml( + application_x* app, xmlTextWriterPtr writer, AppCompType type) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "appid", BAD_CAST app->appid); + + // binary is a symbolic link named and is located in / + bf::path exec_path = context_->pkg_path.get() + / bf::path("bin") / bf::path(app->appid); + xmlTextWriterWriteAttribute(writer, BAD_CAST "exec", + BAD_CAST exec_path.string().c_str()); + if (app->type) + xmlTextWriterWriteAttribute(writer, BAD_CAST "type", BAD_CAST app->type); + else + xmlTextWriterWriteAttribute(writer, BAD_CAST "type", BAD_CAST "capp"); + + if (app->process_pool && strlen(app->process_pool)) + xmlTextWriterWriteAttribute(writer, BAD_CAST "process-pool", + BAD_CAST app->process_pool); + // app-specific attributes + switch (type) { + case AppCompType::UIAPP: + WriteServiceApplicationAttributes(writer, app); + break; + case AppCompType::SVCAPP: + WriteUIApplicationAttributes(writer, app); + break; + case AppCompType::WIDGETAPP: + WriteWidgetApplicationAttributes(writer, app); + break; + } + + 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); + } + xmlTextWriterWriteString(writer, BAD_CAST label->name); + xmlTextWriterEndElement(writer); + } + + // icon is renamed to + if (app->icon) { + icon_x* iconx = reinterpret_cast(app->icon->data); + bf::path app_icon = context_->pkg_path.get(); + // TODO(t.iwanek): type should not be used here + if (context_->pkg_type.get() == "wgt") { + app_icon /= "res/wgt"; + } else { + app_icon /= "shared/res"; + } + app_icon /= iconx->text; + bf::path icon = app->appid; + if (app_icon.has_extension()) + icon += app_icon.extension(); + else + icon += bf::path(".png"); + + if (bf::exists(app_icon)) { + xmlTextWriterWriteFormatElement(writer, BAD_CAST "icon", + "%s", BAD_CAST icon.c_str()); + } + } else { + // Default icon setting is role of the platform + LOG(DEBUG) << "Icon was not found in package"; + } + + for (image_x* image : GListRange(app->image)) { + xmlTextWriterStartElement(writer, BAD_CAST "image"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "name", + BAD_CAST image->name); + if (image->lang && strcmp(DEFAULT_LOCALE, image->lang) != 0) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", + + BAD_CAST image->lang); + } + if (image->section) + xmlTextWriterWriteAttribute(writer, BAD_CAST "section", + BAD_CAST image->section); + xmlTextWriterEndElement(writer); + } + + for (appcontrol_x* appc : GListRange(app->appcontrol)) { + xmlTextWriterStartElement(writer, BAD_CAST "app-control"); + + if (appc->operation) { + xmlTextWriterStartElement(writer, BAD_CAST "operation"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "name", + BAD_CAST appc->operation); + xmlTextWriterEndElement(writer); + } + + if (appc->uri) { + xmlTextWriterStartElement(writer, BAD_CAST "uri"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "name", + BAD_CAST appc->uri); + xmlTextWriterEndElement(writer); + } + + if (appc->mime) { + xmlTextWriterStartElement(writer, BAD_CAST "mime"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "name", + BAD_CAST appc->mime); + xmlTextWriterEndElement(writer); + } + + xmlTextWriterEndElement(writer); + } + + for (datacontrol_x* datacontrol : + GListRange(app->datacontrol)) { + xmlTextWriterStartElement(writer, BAD_CAST "datacontrol"); + if (datacontrol->access) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "access", + BAD_CAST datacontrol->access); + } + if (datacontrol->providerid) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "providerid", + BAD_CAST datacontrol->providerid); + } + if (datacontrol->type) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "type", + BAD_CAST datacontrol->type); + } + xmlTextWriterEndElement(writer); + } + + for (metadata_x* meta : GListRange(app->metadata)) { + xmlTextWriterStartElement(writer, BAD_CAST "metadata"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "key", + BAD_CAST meta->key); + if (meta->value) + xmlTextWriterWriteAttribute(writer, BAD_CAST "value", + BAD_CAST meta->value); + xmlTextWriterEndElement(writer); + } + + for (const char* category : GListRange(app->category)) { + xmlTextWriterStartElement(writer, BAD_CAST "category"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "name", BAD_CAST category); + xmlTextWriterEndElement(writer); + } + + for (const char* background_category : GListRange( + app->background_category)) { + xmlTextWriterStartElement(writer, BAD_CAST "background-category"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "value", + BAD_CAST background_category); + xmlTextWriterEndElement(writer); + } + + return Step::Status::OK; +} + +common_installer::Step::Status StepGenerateXml::precheck() { + if (!context_->manifest_data.get()) { + LOG(ERROR) << "manifest_data attribute is empty"; + return Step::Status::INVALID_VALUE; + } + if (context_->pkgid.get().empty()) { + LOG(ERROR) << "pkgid attribute is empty"; + return Step::Status::INVALID_VALUE; } + + if (!context_->manifest_data.get()->application) { + LOG(ERROR) << "No application in package"; + return Step::Status::INVALID_VALUE; + } + // TODO(p.sikorski) check context_->uid.get() + + return Step::Status::OK; +} + +common_installer::Step::Status StepGenerateXml::process() { + bf::path xml_path = bf::path(getUserManifestPath(context_->uid.get())) + / bf::path(context_->pkgid.get()); + xml_path += ".xml"; + context_->xml_path.set(xml_path.string()); + + bs::error_code error; + if (!bf::exists(xml_path.parent_path(), error)) { + if (!common_installer::CreateDir(xml_path.parent_path())) { + LOG(ERROR) << + "Directory for manifest xml is missing and cannot be created"; + return Status::ERROR; + } + } + + xmlTextWriterPtr writer; + + writer = xmlNewTextWriterFilename(context_->xml_path.get().c_str(), 0); + if (!writer) { + LOG(ERROR) << "Failed to create new file"; + return Step::Status::ERROR; + } + + xmlTextWriterStartDocument(writer, nullptr, nullptr, nullptr); + + xmlTextWriterSetIndent(writer, 1); + + // add manifest Element + xmlTextWriterStartElement(writer, BAD_CAST "manifest"); + + xmlTextWriterWriteAttribute(writer, BAD_CAST "xmlns", + BAD_CAST "http://tizen.org/ns/packages"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "package", + BAD_CAST context_->manifest_data.get()->package); + xmlTextWriterWriteAttribute(writer, BAD_CAST "type", + BAD_CAST context_->manifest_data.get()->type); + xmlTextWriterWriteAttribute(writer, BAD_CAST "version", + BAD_CAST context_->manifest_data.get()->version); + xmlTextWriterWriteAttribute(writer, BAD_CAST "api-version", + BAD_CAST context_->manifest_data.get()->api_version); + xmlTextWriterWriteAttribute(writer, BAD_CAST "nodisplay-setting", + BAD_CAST context_->manifest_data.get()->nodisplay_setting); + + for (label_x* label : + GListRange(context_->manifest_data.get()->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); + } + xmlTextWriterWriteString(writer, BAD_CAST label->name); + xmlTextWriterEndElement(writer); + } + + for (author_x* author : + GListRange(context_->manifest_data.get()->author)) { + xmlTextWriterStartElement(writer, BAD_CAST "author"); + if (author->email && strlen(author->email)) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "email", + BAD_CAST author->email); + } + if (author->href && strlen(author->href)) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "href", + BAD_CAST author->href); + } + xmlTextWriterWriteString(writer, BAD_CAST author->text); + xmlTextWriterEndElement(writer); + } + + for (description_x* description : + GListRange(context_->manifest_data.get()->description)) { + xmlTextWriterStartElement(writer, BAD_CAST "description"); + if (description->lang && strcmp(DEFAULT_LOCALE, description->lang) != 0) { + xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", + BAD_CAST description->lang); + } + xmlTextWriterWriteString(writer, BAD_CAST description->text); + xmlTextWriterEndElement(writer); + } + + // add application + for (application_x* app : + GListRange(context_->manifest_data.get()->application)) { + AppCompType type; + if (strcmp(app->component_type, "uiapp") == 0) { + type = AppCompType::UIAPP; + xmlTextWriterStartElement(writer, BAD_CAST "ui-application"); + } else if (strcmp(app->component_type, "svcapp") == 0) { + type = AppCompType::SVCAPP; + xmlTextWriterStartElement(writer, BAD_CAST "service-application"); + } else if (strcmp(app->component_type, "widgetapp") == 0) { + type = AppCompType::WIDGETAPP; + xmlTextWriterStartElement(writer, BAD_CAST "widget-application"); + } else { + LOG(ERROR) << "Unknown application component_type"; + xmlFreeTextWriter(writer); + return Status::ERROR; + } + GenerateApplicationCommonXml(app, writer, type); + xmlTextWriterEndElement(writer); + } + + // add privilege element + if (context_->manifest_data.get()->privileges) { + xmlTextWriterStartElement(writer, BAD_CAST "privileges"); + for (const char* priv : + GListRange(context_->manifest_data.get()->privileges)) { + xmlTextWriterWriteFormatElement(writer, BAD_CAST "privilege", + "%s", BAD_CAST priv); + } + xmlTextWriterEndElement(writer); + } + + const auto& accounts = + context_->manifest_plugins_data.get().account_info.get().accounts(); + if (!accounts.empty()) { + xmlTextWriterStartElement(writer, BAD_CAST "account"); + // add account info + for (auto& account : accounts) { + xmlTextWriterStartElement(writer, BAD_CAST "account-provider"); + + xmlTextWriterWriteAttribute(writer, BAD_CAST "appid", + BAD_CAST account.appid.c_str()); + + if (!account.providerid.empty()) + xmlTextWriterWriteAttribute(writer, BAD_CAST "providerid", + BAD_CAST account.providerid.c_str()); + + if (account.multiple_account_support) + xmlTextWriterWriteAttribute(writer, + BAD_CAST "multiple-accounts-support", + BAD_CAST "true"); + for (auto& icon_pair : account.icon_paths) { + xmlTextWriterStartElement(writer, BAD_CAST "icon"); + if (icon_pair.first == "AccountSmall") + xmlTextWriterWriteAttribute(writer, BAD_CAST "section", + BAD_CAST "account-small"); + else + xmlTextWriterWriteAttribute(writer, BAD_CAST "section", + BAD_CAST "account"); + xmlTextWriterWriteString(writer, BAD_CAST icon_pair.second.c_str()); + xmlTextWriterEndElement(writer); + } + + for (auto& name_pair : account.names) { + xmlTextWriterStartElement(writer, BAD_CAST "label"); + if (!name_pair.second.empty()) + xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", + BAD_CAST name_pair.second.c_str()); + xmlTextWriterWriteString(writer, BAD_CAST name_pair.first.c_str()); + xmlTextWriterEndElement(writer); + } + + for (auto& capability : account.capabilities) { + xmlTextWriterWriteFormatElement(writer, BAD_CAST "capability", + "%s", BAD_CAST capability.c_str()); + } + + xmlTextWriterEndElement(writer); + } + xmlTextWriterEndElement(writer); + } + + for (const char* profile : + GListRange(context_->manifest_data.get()->deviceprofile)) { + xmlTextWriterStartElement(writer, BAD_CAST "profile"); + xmlTextWriterWriteAttribute(writer, BAD_CAST "name", + BAD_CAST profile); + xmlTextWriterEndElement(writer); + } + + const auto& shortcuts = + context_->manifest_plugins_data.get().shortcut_info.get(); + if (!shortcuts.empty()) { + xmlTextWriterStartElement(writer, BAD_CAST "shortcut-list"); + for (auto& shortcut : shortcuts) { + xmlTextWriterStartElement(writer, BAD_CAST "shortcut"); + if (!shortcut.app_id.empty()) + xmlTextWriterWriteAttribute(writer, BAD_CAST "appid", + BAD_CAST shortcut.app_id.c_str()); + if (!shortcut.app_id.empty()) + xmlTextWriterWriteAttribute(writer, BAD_CAST "extra_data", + BAD_CAST shortcut.extra_data.c_str()); + if (!shortcut.app_id.empty()) + xmlTextWriterWriteAttribute(writer, BAD_CAST "extra_key", + BAD_CAST shortcut.extra_key.c_str()); + if (!shortcut.icon.empty()) { + xmlTextWriterStartElement(writer, BAD_CAST "icon"); + xmlTextWriterWriteString(writer, BAD_CAST shortcut.icon.c_str()); + xmlTextWriterEndElement(writer); + } + for (auto& label : shortcut.labels) { + xmlTextWriterStartElement(writer, BAD_CAST "label"); + if (!label.first.empty()) + xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", + BAD_CAST label.first.c_str()); + xmlTextWriterWriteString(writer, BAD_CAST label.second.c_str()); + xmlTextWriterEndElement(writer); + } + xmlTextWriterEndElement(writer); + } + xmlTextWriterEndElement(writer); + } + + xmlTextWriterEndElement(writer); + + xmlTextWriterEndDocument(writer); + xmlFreeTextWriter(writer); + + if (pkgmgr_parser_check_manifest_validation( + context_->xml_path.get().c_str()) != 0) { + LOG(ERROR) << "Manifest is not valid"; + return Step::Status::ERROR; + } + + LOG(DEBUG) << "Successfully create manifest xml " + << context_->xml_path.get(); + return Status::OK; +} + +common_installer::Step::Status StepGenerateXml::undo() { + bs::error_code error; + if (bf::exists(context_->xml_path.get())) + bf::remove_all(context_->xml_path.get(), error); + return Status::OK; +} + +} // namespace pkgmgr +} // namespace wgt diff --git a/src/wgt/step/step_generate_xml.h b/src/wgt/step/step_generate_xml.h new file mode 100644 index 0000000..5351991 --- /dev/null +++ b/src/wgt/step/step_generate_xml.h @@ -0,0 +1,45 @@ +/* 2014, Copyright © Intel Coporation, license APACHE-2.0, see LICENSE file */ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_GENERATE_XML_H_ +#define WGT_STEP_STEP_GENERATE_XML_H_ + +#include + +#include + +#include +#include + +namespace wgt { +namespace pkgmgr { + +class StepGenerateXml : public common_installer::Step { + public: + using Step::Step; + + Status process() override; + Status clean() override { return Status::OK; } + Status undo() override; + Status precheck() override; + + private: + enum class AppCompType { + UIAPP, + SVCAPP, + WIDGETAPP + }; + + Step::Status GenerateApplicationCommonXml(application_x* app, + xmlTextWriterPtr writer, + AppCompType type); + + SCOPE_LOG_TAG(GenerateXML) +}; + +} // namespace pkgmgr +} // namespace wgt + +#endif // WGT_STEP_STEP_GENERATE_XML_H_ diff --git a/src/wgt/step/step_parse.cc b/src/wgt/step/step_parse.cc new file mode 100644 index 0000000..ac36e10 --- /dev/null +++ b/src/wgt/step/step_parse.cc @@ -0,0 +1,574 @@ +/* 2014, Copyright © Intel Coporation, license APACHE-2.0, see LICENSE file */ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_parse.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "wgt/wgt_backend_data.h" + +namespace { + +const std::string kManifestVersion = "1.0.0"; +const char kTizenPackageXmlNamespace[] = "http://tizen.org/ns/packages"; + +GList* GenerateMetadataListX(const wgt::parse::MetaDataInfo& meta_info) { + GList* list = nullptr; + for (auto& meta : meta_info.metadata()) { + metadata_x* new_meta = + static_cast(calloc(1, sizeof(metadata_x))); + new_meta->key = strdup(meta.first.c_str()); + if (!meta.second.empty()) + new_meta->value = strdup(meta.second.c_str()); + list = g_list_append(list, new_meta); + } + return list; +} + +void SetApplicationXDefaults(application_x* application) { + application->ambient_support = strdup("false"); + application->effectimage_type = strdup("image"); + application->enabled = strdup("true"); + application->guestmode_visibility = strdup("true"); + application->hwacceleration = strdup("default"); + application->indicatordisplay = strdup("true"); + application->launchcondition = strdup("false"); + application->permission_type = strdup("normal"); + application->process_pool = strdup("false"); + application->recentimage = strdup("false"); + application->screenreader = strdup("use-system-setting"); + application->submode = strdup("false"); + application->support_disable = strdup("false"); + application->taskmanage = strdup("true"); + application->ui_gadget = strdup("false"); +} + +} // namespace + +namespace wgt { +namespace parse { + +namespace app_keys = wgt::application_widget_keys; +namespace sc = std::chrono; + +StepParse::StepParse(common_installer::InstallerContext* context, + bool check_start_file) + : Step(context), + check_start_file_(check_start_file) { +} + +std::set StepParse::ExtractPrivileges( + std::shared_ptr perm_info) const { + return perm_info->GetAPIPermissions(); +} + +const std::string& StepParse::GetPackageVersion( + const std::string& manifest_version) { + if (!manifest_version.empty()) + return manifest_version; + return kManifestVersion; +} + +bool StepParse::FillInstallationInfo(manifest_x* manifest) { + manifest->root_path = strdup( + (context_->root_application_path.get() / manifest->package).c_str()); + manifest->installed_time = + strdup(std::to_string(sc::system_clock::to_time_t( + sc::system_clock::now())).c_str()); + return true; +} + +bool StepParse::FillIconPaths(manifest_x* manifest) { + std::shared_ptr icons_info = + std::static_pointer_cast( + parser_->GetManifestData(app_keys::kIconsKey)); + if (icons_info.get()) { + for (auto& application_icon : icons_info->icons()) { + icon_x* icon = reinterpret_cast (calloc(1, sizeof(icon_x))); + icon->text = strdup(application_icon.path().c_str()); + icon->lang = strdup(DEFAULT_LOCALE); + manifest->icon = g_list_append(manifest->icon, icon); + } + } + return true; +} + +bool StepParse::FillWidgetInfo(manifest_x* manifest) { + std::shared_ptr wgt_info = + std::static_pointer_cast(parser_->GetManifestData( + app_keys::kWidgetKey)); + if (!wgt_info.get()) { + LOG(ERROR) << "Widget info manifest data has not been found."; + return false; + } + + const std::string& version = wgt_info->version(); + + manifest->ns = strdup(kTizenPackageXmlNamespace); + manifest->version = strdup(GetPackageVersion(version).c_str()); + + for (auto& item : wgt_info->description_set()) { + description_x* description = reinterpret_cast + (calloc(1, sizeof(description_x))); + description->text = strdup(item.second.c_str()); + description->lang = !item.first.empty() ? + strdup(item.first.c_str()) : strdup(DEFAULT_LOCALE); + manifest->description = g_list_append(manifest->description, description); + } + + for (auto& item : wgt_info->name_set()) { + label_x* label = reinterpret_cast(calloc(1, sizeof(label_x))); + label->name = strdup(item.second.c_str()); + label->text = strdup(item.second.c_str()); + label->lang = !item.first.empty() ? + strdup(item.first.c_str()) : strdup(DEFAULT_LOCALE); + manifest->label = g_list_append(manifest->label, label); + } + + manifest->type = strdup("wgt"); + manifest->appsetting = strdup("false"); + manifest->nodisplay_setting = strdup("false"); + + // For wgt package use the long name + for (auto& item : wgt_info->name_set()) { + application_x* app = + reinterpret_cast(manifest->application->data); + label_x* label = reinterpret_cast(calloc(1, sizeof(label_x))); + label->name = strdup(item.second.c_str()); + label->text = strdup(item.second.c_str()); + label->lang = !item.first.empty() ? + strdup(item.first.c_str()) : strdup(DEFAULT_LOCALE); + app->label = g_list_append(app->label, label); + } + + author_x* author = reinterpret_cast(calloc(1, sizeof(author_x))); + if (!wgt_info->author().empty()) + author->text = strdup(wgt_info->author().c_str()); + if (!wgt_info->author_email().empty()) + author->email = strdup(wgt_info->author_email().c_str()); + if (!wgt_info->author_href().empty()) + author->href = strdup(wgt_info->author_href().c_str()); + author->lang = strdup(DEFAULT_LOCALE); + manifest->author = g_list_append(manifest->author, author); + + std::shared_ptr settings_info = + std::static_pointer_cast( + parser_->GetManifestData( + wgt::application_widget_keys::kTizenSettingKey)); + if (settings_info) { + switch (settings_info->install_location()) { + case wgt::parse::SettingInfo::InstallLocation::AUTO: { + manifest->installlocation = strdup("auto"); + break; + } + case wgt::parse::SettingInfo::InstallLocation::INTERNAL: { + manifest->installlocation = strdup("internal-only"); + break; + } + case wgt::parse::SettingInfo::InstallLocation::EXTERNAL: { + manifest->installlocation = strdup("prefer-external"); + break; + } + } + } else { + manifest->installlocation = strdup("auto"); + } + + return true; +} + +bool StepParse::FillUIApplicationInfo(manifest_x* manifest) { + std::shared_ptr app_info = + std::static_pointer_cast( + parser_->GetManifestData(app_keys::kTizenApplicationKey)); + if (!app_info) { + LOG(ERROR) << "Application info manifest data has not been found."; + return false; + } + // application data + application_x* application = reinterpret_cast( + calloc(1, sizeof(application_x))); + application->component_type = strdup("uiapp"); + application->mainapp = strdup("true"); + application->nodisplay = strdup("false"); + application->multiple = strdup("false"); + application->appid = strdup(app_info->id().c_str()); + SetApplicationXDefaults(application); + application->package = strdup(app_info->package().c_str()); + + application->exec = + strdup((context_->root_application_path.get() / app_info->package() + / "bin" / application->appid).c_str()); + application->type = strdup("webapp"); + application->onboot = strdup("false"); + 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); + icon_x* app_icon = reinterpret_cast(calloc(1, sizeof(icon_x))); + app_icon->text = strdup(icon->text); + app_icon->lang = strdup(icon->lang); + application->icon = g_list_append(application->icon, app_icon); + } + manifest->application = g_list_append(manifest->application, application); + + manifest->package = strdup(app_info->package().c_str()); + manifest->mainapp_id = strdup(app_info->id().c_str()); + return true; +} + +bool StepParse::FillServiceApplicationInfo(manifest_x* manifest) { + std::shared_ptr service_list = + std::static_pointer_cast( + parser_->GetManifestData(app_keys::kTizenServiceKey)); + if (!service_list) + return true; + for (auto& service_info : service_list->services) { + application_x* application = reinterpret_cast + (calloc(1, sizeof(application_x))); + application->component_type = strdup("svcapp"); + application->mainapp = strdup("false"); + application->nodisplay = strdup("false"); + application->multiple = strdup("false"); + application->appid = strdup(service_info.id().c_str()); + application->exec = + strdup((context_->root_application_path.get() / manifest->package + / "bin" / application->appid).c_str()); + application->type = strdup("webapp"); + application->onboot = + service_info.on_boot() ? strdup("true") : strdup("false"); + application->autorestart = + service_info.auto_restart() ? strdup("true") : strdup("false"); + SetApplicationXDefaults(application); + application->package = strdup(manifest->package); + + for (auto& pair : service_info.names()) { + label_x* label = reinterpret_cast(calloc(1, sizeof(label_x))); + label->lang = !pair.first.empty() ? + strdup(pair.first.c_str()) : strdup(DEFAULT_LOCALE); + label->name = strdup(pair.second.c_str()); + label->text = strdup(pair.second.c_str()); + application->label = g_list_append(application->label, label); + } + + if (!service_info.icon().empty()) { + icon_x* icon = reinterpret_cast(calloc(1, sizeof(icon_x))); + icon->text = strdup(service_info.icon().c_str()); + icon->lang = strdup(DEFAULT_LOCALE); + 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())); + } + + for (auto& pair : service_info.metadata_set()) { + metadata_x* item = reinterpret_cast( + calloc(1, sizeof(metadata_x))); + item->key = strdup(pair.first.c_str()); + if (!pair.second.empty()) + item->value = strdup(pair.second.c_str()); + application->metadata = g_list_append(application->metadata, item); + } + + manifest->application = g_list_append(manifest->application, application); + } + return true; +} + +bool StepParse::FillBackgroundCategoryInfo(manifest_x* manifest) { + auto manifest_data = parser_->GetManifestData( + app_keys::kTizenBackgroundCategoryKey); + std::shared_ptr bc_list = + std::static_pointer_cast(manifest_data); + + if (!bc_list) + return true; + + application_x* app = + reinterpret_cast(manifest->application->data); + + for (auto& background_category : bc_list->background_categories) { + app->background_category = g_list_append( + app->background_category, strdup(background_category.value().c_str())); + } + + return true; +} + +bool StepParse::FillAppControl(manifest_x* manifest) { + std::shared_ptr app_info_list = + std::static_pointer_cast( + parser_->GetManifestData(app_keys::kTizenApplicationAppControlsKey)); + + application_x* app = + reinterpret_cast(manifest->application->data); + if (app_info_list) { + for (const auto& control : app_info_list->controls) { + appcontrol_x* app_control = + static_cast(calloc(1, sizeof(appcontrol_x))); + app_control->operation = strdup(control.operation().c_str()); + app_control->mime = strdup(control.mime().c_str()); + app_control->uri = strdup(control.uri().c_str()); + app->appcontrol = g_list_append(app->appcontrol, app_control); + } + } + return true; +} + +bool StepParse::FillPrivileges(manifest_x* manifest) { + std::shared_ptr perm_info = + std::static_pointer_cast(parser_->GetManifestData( + app_keys::kTizenPermissionsKey)); + std::set privileges; + if (perm_info) + privileges = ExtractPrivileges(perm_info); + + for (auto& priv : privileges) { + manifest->privileges = + g_list_append(manifest->privileges, strdup(priv.c_str())); + } + return true; +} + +bool StepParse::FillCategories(manifest_x* manifest) { + std::shared_ptr category_info = + std::static_pointer_cast(parser_->GetManifestData( + app_keys::kTizenCategoryKey)); + if (!category_info) + return true; + + application_x* app = + reinterpret_cast(manifest->application->data); + // there is one app atm + for (auto& category : category_info->categories) { + app->category = g_list_append(app->category, strdup(category.c_str())); + } + return true; +} + +bool StepParse::FillMetadata(manifest_x* manifest) { + std::shared_ptr meta_info = + std::static_pointer_cast(parser_->GetManifestData( + app_keys::kTizenMetaDataKey)); + if (!meta_info) + return true; + + for (application_x* app : GListRange(manifest->application)) { + app->metadata = GenerateMetadataListX(*meta_info); + } + return true; +} + +bool StepParse::FillAccounts(manifest_x* manifest) { + std::shared_ptr account_info = + std::static_pointer_cast(parser_->GetManifestData( + app_keys::kAccountKey)); + if (!account_info) + return true; + common_installer::AccountInfo info; + for (auto& account : account_info->accounts()) { + common_installer::SingleAccountInfo single_info; + single_info.capabilities = account.capabilities; + single_info.icon_paths = account.icon_paths; + single_info.multiple_account_support = account.multiple_account_support; + single_info.names = account.names; + // wgt can contain only one app so this assumes mainapp_id is valid here + single_info.appid = manifest->mainapp_id; + info.set_account(single_info); + } + context_->manifest_plugins_data.get().account_info.set(info); + return true; +} + +bool StepParse::FillExtraManifestInfo(manifest_x* manifest) { + return FillAccounts(manifest); +} + +bool StepParse::FillManifestX(manifest_x* manifest) { + if (!FillIconPaths(manifest)) + return false; + if (!FillUIApplicationInfo(manifest)) + return false; + if (!FillWidgetInfo(manifest)) + return false; + if (!FillInstallationInfo(manifest)) + return false; + if (!FillPrivileges(manifest)) + return false; + if (!FillAppControl(manifest)) + return false; + if (!FillCategories(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 + if (!FillServiceApplicationInfo(manifest)) + return false; + if (!FillBackgroundCategoryInfo(manifest)) + return false; + if (!FillExtraManifestInfo(manifest)) + return false; + return true; +} + +bool StepParse::LocateConfigFile() { + return StepParse::Check(context_->unpacked_dir_path.get()); +} + +common_installer::Step::Status StepParse::process() { + if (!LocateConfigFile()) { + LOG(ERROR) << "No config.xml"; + return common_installer::Step::Status::ERROR; + } + + parser_.reset(new wgt::parse::WidgetConfigParser()); + if (!parser_->ParseManifest(config_)) { + LOG(ERROR) << "[Parse] Parse failed. " << parser_->GetErrorMessage(); + return common_installer::Step::Status::ERROR; + } + if (check_start_file_) { + if (!parser_->HasValidStartFile()) { + LOG(ERROR) << parser_->GetErrorMessage(); + return common_installer::Step::Status::ERROR; + } + if (!parser_->HasValidServicesStartFiles()) { + LOG(ERROR) << parser_->GetErrorMessage(); + return common_installer::Step::Status::ERROR; + } + } + + manifest_x* manifest = + static_cast(calloc(1, sizeof(manifest_x))); + if (!FillManifestX(manifest)) { + LOG(ERROR) << "[Parse] Storing manifest_x failed. " + << parser_->GetErrorMessage(); + return common_installer::Step::Status::ERROR; + } + + // Copy data from ManifestData to InstallerContext + std::shared_ptr info = + std::static_pointer_cast( + parser_->GetManifestData( + wgt::application_widget_keys::kTizenApplicationKey)); + std::shared_ptr wgt_info = + std::static_pointer_cast( + parser_->GetManifestData( + wgt::application_widget_keys::kTizenWidgetKey)); + + std::string name; + const auto& name_set = wgt_info->name_set(); + if (name_set.find("") != name_set.end()) + name = name_set.find("")->second; + if (name_set.begin() != name_set.end()) + name = name_set.begin()->second; + + std::string short_name; + const auto& short_name_set = wgt_info->short_name_set(); + if (short_name_set.find("") != short_name_set.end()) + short_name = short_name_set.find("")->second; + if (short_name_set.begin() != short_name_set.end()) + short_name = short_name_set.begin()->second; + + const std::string& package_version = wgt_info->version(); + const std::string& required_api_version = info->required_version(); + + manifest->api_version = strdup(required_api_version.c_str()); + context_->pkgid.set(manifest->package); + + // write pkgid for recovery file + if (context_->recovery_info.get().recovery_file) { + context_->recovery_info.get().recovery_file->set_pkgid(manifest->package); + context_->recovery_info.get().recovery_file->WriteAndCommitFileContent(); + } + + std::shared_ptr perm_info = + std::static_pointer_cast( + parser_->GetManifestData( + wgt::application_widget_keys::kTizenPermissionsKey)); + parser::PermissionSet permissions; + if (perm_info) + permissions = perm_info->GetAPIPermissions(); + + std::unique_ptr backend_data(new WgtBackendData()); + + std::shared_ptr settings_info = + std::static_pointer_cast( + parser_->GetManifestData( + wgt::application_widget_keys::kTizenSettingKey)); + if (settings_info) + backend_data->settings.set(*settings_info); + + context_->backend_data.set(backend_data.release()); + + LOG(DEBUG) << " Read data -[ "; + LOG(DEBUG) << "App id: " << info->id(); + LOG(DEBUG) << " package = " << info->package(); + LOG(DEBUG) << " id = " << info->id(); + LOG(DEBUG) << " name = " << name; + LOG(DEBUG) << " short_name = " << short_name; + LOG(DEBUG) << " aplication version = " << package_version; + LOG(DEBUG) << " api_version = " << info->required_version(); + LOG(DEBUG) << " launch_mode = " << info->launch_mode(); + LOG(DEBUG) << " privileges -["; + for (const auto& p : permissions) { + LOG(DEBUG) << " " << p; + } + LOG(DEBUG) << " ]-"; + LOG(DEBUG) << "]-"; + + context_->manifest_data.set(manifest); + return common_installer::Step::Status::OK; +} + +bool StepParse::Check(const boost::filesystem::path& widget_path) { + boost::filesystem::path config = widget_path; + config /= "config.xml"; + + LOG(DEBUG) << "config.xml path: " << config; + + if (!boost::filesystem::exists(config)) + return false; + + config_ = config; + return true; +} + +} // namespace parse +} // namespace wgt diff --git a/src/wgt/step/step_parse.h b/src/wgt/step/step_parse.h new file mode 100644 index 0000000..115ccf0 --- /dev/null +++ b/src/wgt/step/step_parse.h @@ -0,0 +1,100 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_PARSE_H_ +#define WGT_STEP_STEP_PARSE_H_ + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +namespace wgt { +namespace parse { + +/** + * \brief This step parse manifest.xml document + */ +class StepParse : public common_installer::Step { + public: + /** + * \brief Explicit constructor + * + * \param context Installer context + * \param check_start_file Flag if start file should be validated + */ + explicit StepParse(common_installer::InstallerContext* context, + bool check_start_file); + + /** + * \brief + */ + Status process() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status clean() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status undo() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status precheck() override { return Status::OK; } + + protected: + virtual bool LocateConfigFile(); + bool Check(const boost::filesystem::path& widget_path); + + boost::filesystem::path config_; + + private: + std::set ExtractPrivileges( + std::shared_ptr perm_info) const; + + const std::string& GetPackageVersion(const std::string& manifest_version); + + bool FillInstallationInfo(manifest_x* manifest); + bool FillIconPaths(manifest_x* manifest); + bool FillWidgetInfo(manifest_x* manifest); + bool FillUIApplicationInfo(manifest_x* manifest); + bool FillServiceApplicationInfo(manifest_x* manifest); + bool FillAppControl(manifest_x* manifest); + bool FillPrivileges(manifest_x* manifest); + bool FillCategories(manifest_x* manifest); + bool FillMetadata(manifest_x* manifest); + bool FillExtraManifestInfo(manifest_x* manifest); + bool FillAccounts(manifest_x* manifest); + bool FillBackgroundCategoryInfo(manifest_x* manifest); + bool FillManifestX(manifest_x* manifest); + + std::unique_ptr parser_; + bool check_start_file_; + + SCOPE_LOG_TAG(Parse) +}; + +} // namespace parse +} // namespace wgt + +#endif // WGT_STEP_STEP_PARSE_H_ diff --git a/src/wgt/step/step_parse_recovery.cc b/src/wgt/step/step_parse_recovery.cc new file mode 100644 index 0000000..7fe4a10 --- /dev/null +++ b/src/wgt/step/step_parse_recovery.cc @@ -0,0 +1,56 @@ +// Copyright (c) 2015 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/step_parse_recovery.h" + +#include +#include + +namespace { + +const char kResWgtPath[] = "res/wgt"; + +} + +namespace wgt { +namespace parse { + +StepParseRecovery::StepParseRecovery( + common_installer::InstallerContext* context) + : StepParse(context, false) { +} + +common_installer::Step::Status StepParseRecovery::process() { + (void) StepParse::process(); + return Status::OK; +} + +common_installer::Step::Status StepParseRecovery::precheck() { + if (context_->root_application_path.get().empty()) { + LOG(ERROR) << "Root path of packages in not set"; + return Status::ERROR; + } + if (context_->pkgid.get().empty()) { + LOG(WARNING) << "Pkgid is not set. Parsing skipped"; + return Status::OK; + } + return Status::OK; +} + +bool StepParseRecovery::LocateConfigFile() { + context_->pkg_path.set( + context_->root_application_path.get() / context_->pkgid.get()); + + if (Check(common_installer::GetBackupPathForPackagePath( + context_->pkg_path.get()) / kResWgtPath)) + return true; + + if (Check(context_->pkg_path.get() / kResWgtPath)) + return true; + + return false; +} + +} // namespace parse +} // namespace wgt diff --git a/src/wgt/step/step_parse_recovery.h b/src/wgt/step/step_parse_recovery.h new file mode 100644 index 0000000..b5ed147 --- /dev/null +++ b/src/wgt/step/step_parse_recovery.h @@ -0,0 +1,63 @@ +// Copyright (c) 2015 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_STEP_PARSE_RECOVERY_H_ +#define WGT_STEP_STEP_PARSE_RECOVERY_H_ + +#include + +#include "wgt/step/step_parse.h" + +namespace wgt { +namespace parse { +/** + * \brief The StepParseRecovery class + * Retrievies package information from config.xml during RECOVERY. + * + * Step is used in recovery mode. + * + * Parse config.xml file by guessing possible locations: + * - backup package directory + * - package installation directory + * to get information about widget package to be recovered. + * + */ +class StepParseRecovery : public StepParse { + public: + /** + * \brief Explicit constructor + * + * \param context installer context + */ + explicit StepParseRecovery(common_installer::InstallerContext* context); + + /** + * \brief Parse config.xml + * + * \return Status::OK + */ + Status process() override; + + /** + * \brief Validate requirements for this step + * + * \return Status::ERROR when root path of packages is missing, + * Status::OK otherwise + */ + Status precheck() override; + + /** + * \brief Locate config.xml file + * + * \return true if config.xml is found + */ + bool LocateConfigFile() override; + + SCOPE_LOG_TAG(ParseRecovery) +}; + +} // namespace parse +} // namespace wgt + +#endif // WGT_STEP_STEP_PARSE_RECOVERY_H_ diff --git a/src/wgt/step/step_rds_modify.cc b/src/wgt/step/step_rds_modify.cc new file mode 100644 index 0000000..41b9bc1 --- /dev/null +++ b/src/wgt/step/step_rds_modify.cc @@ -0,0 +1,226 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_rds_modify.h" + +#include + +#include + +#include + +namespace wgt { +namespace rds { + +namespace bf = boost::filesystem; +namespace bs = boost::system; +namespace cu = common_installer; + +StepRDSModify::StepRDSModify(common_installer::InstallerContext* context) + : Step(context), + backend_data_(nullptr) {} + +common_installer::Step::Status StepRDSModify::precheck() { + if (context_->unpacked_dir_path.get().empty()) { + LOG(ERROR) << "unpacked dir path is not set"; + return common_installer::Step::Status::ERROR; + } + if (!bf::exists(context_->unpacked_dir_path.get())) { + LOG(ERROR) << "unpacked_dir_path (" + << context_->unpacked_dir_path.get() + << ") path does not exist"; + return common_installer::Step::Status::ERROR; + } + if (context_->pkgid.get().empty()) { + LOG(ERROR) << "pkgid is not set"; + return common_installer::Step::Status::ERROR; + } + if (!context_->manifest_data.get()) { + LOG(ERROR) << "no manifest info available"; + return common_installer::Step::Status::ERROR; + } + // TODO(w.kosowicz): check if config of installed app was encrypted + backend_data_ = static_cast(context_->backend_data.get()); + if (!backend_data_) { + LOG(ERROR) << "no backend data"; + return common_installer::Step::Status::ERROR; + } + return common_installer::Step::Status::OK; +} + +common_installer::Step::Status StepRDSModify::process() { + LOG(INFO) << "entered process of step modify"; + if (!SetUpTempBackupDir()) { + LOG(ERROR) << "unable to setup temp directory"; + return common_installer::Step::Status::ERROR; + } + context_->pkg_path.set( + context_->root_application_path.get() /context_->pkgid.get()); + bf::path install_path = context_->pkg_path.get() / "res" / "wgt"; + bf::path unzip_path = context_->unpacked_dir_path.get(); + if (!AddFiles(unzip_path, install_path) || + !ModifyFiles(unzip_path, install_path) || + !DeleteFiles(install_path)) { + LOG(ERROR) << "error during file operation"; + return common_installer::Step::Status::ERROR; + } + return common_installer::Step::Status::OK; +} + +common_installer::Step::Status StepRDSModify::undo() { + RestoreFiles(); + return common_installer::Step::Status::OK; +} + +common_installer::Step::Status StepRDSModify::clean() { + if (bf::exists(backup_temp_dir_)) + bf::remove_all(backup_temp_dir_); + return common_installer::Step::Status::OK; +} + +bool StepRDSModify::AddFiles(bf::path unzip_path, bf::path install_path) { + LOG(INFO) << "about to add files"; + bs::error_code error; + for (const auto& file : backend_data_->files_to_add.get()) { + if (!PerformBackup(file, Operation::ADD)) { + LOG(ERROR) << "unable to perform backup of added file"; + return false; + } + bf::path temp_install_path(install_path / file); + if (bf::is_directory(temp_install_path)) { + if (!bf::exists(temp_install_path) && + (!cu::CreateDir(temp_install_path))) { + LOG(ERROR) << "unable to create dir for temp backup data"; + return false; + } + } else { + if (!bf::exists(temp_install_path.parent_path()) && + !cu::CreateDir(temp_install_path.parent_path())) { + LOG(ERROR) << "unable to create dir for temp backup data"; + return false; + } + bf::path temp_unzip_path(unzip_path / file); + bf::copy_file(temp_unzip_path, temp_install_path, error); + if (error) { + LOG(ERROR) << "unable to add file " << error.message(); + return false; + } + } + } + return true; +} + +bool StepRDSModify::ModifyFiles(bf::path unzip_path, bf::path install_path) { + LOG(INFO) << "about to modify files"; + bs::error_code error; + for (const auto& file : backend_data_->files_to_modify.get()) { + bf::path temp_install_path(install_path / file); + bf::path temp_unzip_path(unzip_path / file); + if (!PerformBackup(file, Operation::MODIFY)) { + LOG(ERROR) << "unable to perform backup of to be modified file"; + return false; + } + bf::copy_file(temp_unzip_path, temp_install_path, + bf::copy_option::overwrite_if_exists, error); + if (error) { + LOG(ERROR) << "unable to modify file " << error.message(); + return false; + } + } + return true; +} + +bool StepRDSModify::DeleteFiles(bf::path install_path) { + LOG(INFO) << "about to delete files"; + bs::error_code error; + for (const auto& file : backend_data_->files_to_delete.get()) { + if (!PerformBackup(file, Operation::DELETE)) { + LOG(ERROR) << "unable to perform backup of to be deleted file"; + return false; + } + bf::remove(install_path / file, error); + if (error) { + LOG(ERROR) <<"unable to delete files " << error.message(); + return false; + } + } + return true; +} + +bool StepRDSModify::SetUpTempBackupDir() { + LOG(INFO) << "about to setup tmp backup dir"; + bs::error_code error; + backup_temp_dir_ = "/tmp/" / + bf::unique_path("%%%%-%%%%-%%%%-%%%%", error); + if (error || !cu::CreateDir(backup_temp_dir_)) { + LOG(ERROR) << "unable to create backup data temp dir"; + return false; + } + + return true; +} + +bool StepRDSModify::PerformBackup(std::string relative_path, + Operation operation) { + if (backup_temp_dir_.empty()) + return false; + if (operation == Operation::DELETE || operation == Operation::MODIFY) { + bf::path app_path = context_->pkg_path.get() / "res" / "wgt"; + bf::path source_path = app_path / relative_path; + if (bf::is_directory(source_path)) { + if (!cu::CreateDir(backup_temp_dir_ / relative_path)) { + LOG(ERROR) << "unable to create dir for temp backup data"; + return false; + } + } else { + bs::error_code error; + bf::path tmp_dest_path = backup_temp_dir_ / relative_path; + if (!bf::exists((tmp_dest_path).parent_path()) && + (!cu::CreateDir((tmp_dest_path).parent_path()))) { + LOG(ERROR) << "unable to create dir for temp backup data"; + return false; + } + bf::copy_file(source_path, tmp_dest_path, error); + if (error) { + LOG(ERROR) << "unable to backup file: " + << source_path << " : " << error.message(); + return false; + } + } + } + success_modifications_.push_back(std::make_pair(relative_path, operation)); + return true; +} + +void StepRDSModify::RestoreFiles() { + LOG(ERROR) << "error occured about to restore files"; + bf::path app_path(context_->pkg_path.get()); + for (std::pair& modification : + success_modifications_) { + bf::path source_path(backup_temp_dir_ / modification.first); + bf::path destination_path(app_path / modification.first); + if (modification.second == Operation::ADD) { + if (bf::is_directory(source_path)) { + bf::remove_all(destination_path); + } else { + bf::remove(destination_path); + } + } else if (modification.second == Operation::MODIFY) { + bf::copy_file(source_path, destination_path, + bf::copy_option::overwrite_if_exists); + } else { + if (bf::is_directory(source_path)) { + cu::CreateDir(destination_path); + } else { + bf::copy_file(source_path, destination_path, + bf::copy_option::overwrite_if_exists); + } + } + } + // after files are restore delete temporary location + bf::remove_all(backup_temp_dir_); +} + +} // namespace rds +} // namespace wgt diff --git a/src/wgt/step/step_rds_modify.h b/src/wgt/step/step_rds_modify.h new file mode 100644 index 0000000..4f0a289 --- /dev/null +++ b/src/wgt/step/step_rds_modify.h @@ -0,0 +1,87 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_RDS_MODIFY_H_ +#define WGT_STEP_STEP_RDS_MODIFY_H_ + +#include +#include +#include +#include +#include + +#include "wgt/wgt_backend_data.h" + +namespace wgt { +namespace rds { + +/** + * \brief Step that apply RDS modification during reinstallation process + */ +class StepRDSModify : public common_installer::Step { + public: + /** + * \brief Explicit constructor + * + * \param context Installer context + */ + explicit StepRDSModify(common_installer::InstallerContext* context); + + /** + * \brief + * + * \return + */ + Status process() override; + + /** + * \brief Remove files from temporary location + * + * \return Status::OK + */ + Status clean() override; + + /** + * \brief Restore files to the state from before RDS installation + * + * \return Status::OK + */ + Status undo() override; + + /** + * \brief + * + * \return Status::ERROR when manifest is missing, pkgid is missing, + * or when path to the unpacked directory is missing or not exist, + * Status::OK otherwise + */ + Status precheck() override; + + private: + enum class Operation { + ADD, + MODIFY, + DELETE + }; + + bool AddFiles(boost::filesystem::path unzip_path, + boost::filesystem::path install_path); + bool ModifyFiles(boost::filesystem::path unzip_path, + boost::filesystem::path install_path); + bool DeleteFiles(boost::filesystem::path install_path); + bool SetUpTempBackupDir(); + void DeleteTempBackupDir(); + bool PerformBackup(std::string relative_path, Operation operation); + void RestoreFiles(); + + WgtBackendData* backend_data_; + std::vector> success_modifications_; + boost::filesystem::path backup_temp_dir_; + std::vector files_to_modify_; + std::vector files_to_add_; + std::vector files_to_delete_; +}; +} // namespace rds +} // namespace wgt +#endif // WGT_STEP_STEP_RDS_MODIFY_H_ diff --git a/src/wgt/step/step_rds_parse.cc b/src/wgt/step/step_rds_parse.cc new file mode 100644 index 0000000..b98900e --- /dev/null +++ b/src/wgt/step/step_rds_parse.cc @@ -0,0 +1,50 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_rds_parse.h" + +#include + +#include + +#include "wgt/rds_parser.h" +#include "wgt/wgt_backend_data.h" + + +namespace wgt { +namespace rds { + +namespace bf = boost::filesystem; + +common_installer::Step::Status StepRDSParse::precheck() { + bf::path rdsPath(context_->unpacked_dir_path.get() / ".rds_delta"); + if (!bf::exists(rdsPath)) { + LOG(ERROR) << "no rds_delta file"; + return common_installer::Step::Status::ERROR; + } + rds_file_path_ = rdsPath; + return common_installer::Step::Status::OK; +} + +common_installer::Step::Status StepRDSParse::process() { + wgt::rds_parser::RDSParser parser(rds_file_path_.native()); + if (!parser.Parse()) { + LOG(ERROR) << "parsing of rds delta failed"; + return common_installer::Step::Status::ERROR; + } + + WgtBackendData* backend_data = + static_cast(context_->backend_data.get()); + if (!backend_data) { + LOG(ERROR) << "no wgt backend data available"; + return common_installer::Step::Status::ERROR; + } + backend_data->files_to_modify.set(parser.files_to_modify()); + backend_data->files_to_add.set(parser.files_to_add()); + backend_data->files_to_delete.set(parser.files_to_delete()); + return common_installer::Step::Status::OK; +} + +} // namespace rds +} // namespace wgt diff --git a/src/wgt/step/step_rds_parse.h b/src/wgt/step/step_rds_parse.h new file mode 100644 index 0000000..5aea60e --- /dev/null +++ b/src/wgt/step/step_rds_parse.h @@ -0,0 +1,61 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_RDS_PARSE_H_ +#define WGT_STEP_STEP_RDS_PARSE_H_ + +#include + +#include +#include +#include + +namespace wgt { +namespace rds { + +/** + * \brief This step parse .rds_delta file + * + * This is to prepare RDS installation process + */ +class StepRDSParse : public common_installer::Step { + public: + using Step::Step; + + /** + * \brief Parse .rds_delta file + * + * \return Status::ERROR when wgt backend data are missing, + * Status::OK otherwise + */ + Status process() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status clean() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status undo() override { return Status::OK; } + + /** + * \brief Validate if .rds_delta file exist + * + * \return Status::Error if file not exist, + * Status::OK otherwise + */ + Status precheck() override; + + private: + boost::filesystem::path rds_file_path_; +}; +} // namespace rds +} // namespace wgt +#endif // WGT_STEP_STEP_RDS_PARSE_H_ diff --git a/src/wgt/step/step_remove_encryption_data.cc b/src/wgt/step/step_remove_encryption_data.cc new file mode 100644 index 0000000..452f32b --- /dev/null +++ b/src/wgt/step/step_remove_encryption_data.cc @@ -0,0 +1,54 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_remove_encryption_data.h" + +#include + +#include + +namespace wgt { +namespace encrypt { + +common_installer::Step::Status StepRemoveEncryptionData::clean() { + 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); + if (WAE_ERROR_NONE == ret || WAE_ERROR_NO_KEY == ret) { + LOG(DEBUG) << "Encryption data removed (if existed)"; + return common_installer::Step::Status::OK; + } + + switch (ret) { + case WAE_ERROR_INVALID_PARAMETER: + LOG(ERROR) << "Error while removing encryption data: " + "WAE_ERROR_INVALID_PARAMETER"; + break; + case WAE_ERROR_PERMISSION_DENIED: + LOG(ERROR) << "Error while removing encryption data: " + "WAE_ERROR_PERMISSION_DENIED"; + break; + case WAE_ERROR_KEY_MANAGER: + LOG(ERROR) << "Error while removing encryption data: " + "WAE_ERROR_KEY_MANAGER"; + break; + case WAE_ERROR_UNKNOWN: + LOG(ERROR) << "Error while removing encryption data: " + "WAE_ERROR_UNKNOWN"; + break; + default: + LOG(ERROR) << "Error while removing encryption data: " + "UNKNOWN"; + break; + } + return common_installer::Step::Status::ERROR; +} + +} // namespace encrypt +} // namespace wgt diff --git a/src/wgt/step/step_remove_encryption_data.h b/src/wgt/step/step_remove_encryption_data.h new file mode 100644 index 0000000..291b92e --- /dev/null +++ b/src/wgt/step/step_remove_encryption_data.h @@ -0,0 +1,57 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_REMOVE_ENCRYPTION_DATA_H_ +#define WGT_STEP_STEP_REMOVE_ENCRYPTION_DATA_H_ + +#include + +#include + +namespace wgt { +namespace encrypt { + +/** + * This step remove encryption keys used for encryption during installation + * + * This step is called during uninstallation process + */ +class StepRemoveEncryptionData : public common_installer::Step { + public: + using Step::Step; + + /** + * \brief Empty method - the actual work is done in clean() to delay it + * + * \return Status::OK + */ + Status process() override { return Status::OK; } + + /** + * \brief Remove encryption keys from database + * + * \return Status::ERROR in case of failure, + * Status::OK otherwise + */ + Status clean() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status undo() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status precheck() override { return Status::OK; } + + SCOPE_LOG_TAG(RemoveEncryptionData) +}; +} // namespace encrypt +} // namespace wgt +#endif // WGT_STEP_STEP_REMOVE_ENCRYPTION_DATA_H_ diff --git a/src/wgt/step/step_wgt_copy_storage_directories.cc b/src/wgt/step/step_wgt_copy_storage_directories.cc new file mode 100644 index 0000000..c1929c7 --- /dev/null +++ b/src/wgt/step/step_wgt_copy_storage_directories.cc @@ -0,0 +1,172 @@ +// Copyright (c) 2015 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/step_wgt_copy_storage_directories.h" + +#include +#include +#include + +#include + +namespace bf = boost::filesystem; +namespace bs = boost::system; + +namespace { + +const char kDataLocation[] = "data"; +const char kSharedLocation[] = "shared"; +const char kSharedDataLocation[] = "shared/data"; +const char kSharedTrustedLocation[] = "shared/trusted"; +const char kResWgtSubPath[] = "res/wgt"; +const char kTemporaryData[] = "tmp"; +} // namespace + +namespace wgt { +namespace filesystem { + +common_installer::Step::Status StepWgtCopyStorageDirectories::process() { + Status status = CreatePrivateTmpDir(); + if (status != Status::OK) + return status; + if (!CacheDir()) + return Status::ERROR; + + int version = context_->manifest_data.get()->api_version[0] - '0'; + if (version < 3) { + LOG(DEBUG) << "Shared directory coping for tizen 2.x"; + return StepCopyStorageDirectories::process(); + } + + LOG(DEBUG) << "Shared directory coping for tizen 3.x"; + status = CopySharedDirectory(); + if (status != Status::OK) + return status; + + return CopyDataDirectory(); +} + +common_installer::Step::Status StepWgtCopyStorageDirectories::undo() { + int version = context_->manifest_data.get()->api_version[0] - '0'; + if (version < 3) { + LOG(DEBUG) << "Shared directory coping for tizen 2.x"; + return StepCopyStorageDirectories::undo(); + } + + UndoSharedDirectory(); + UndoDataDirectory(); + return Status::OK; +} + +void StepWgtCopyStorageDirectories::UndoSharedDirectory() { + if (!MoveAppStorage(context_->pkg_path.get(), + backup_path_, + kSharedDataLocation)) { + LOG(ERROR) << + "Failed to undo moving of shared/data directory for widget in update"; + } + + if (!MoveAppStorage(context_->pkg_path.get(), + backup_path_, + kSharedTrustedLocation)) { + LOG(ERROR) << "Failed to undo moving of shared/trusted directory" + << "for widget in update"; + } +} + +void StepWgtCopyStorageDirectories::UndoDataDirectory() { + if (!MoveAppStorage(context_->pkg_path.get(), + backup_path_, + kDataLocation)) { + LOG(ERROR) + << "Failed to undo moving of private directory for widget in update"; + } +} + +common_installer::Step::Status +StepWgtCopyStorageDirectories::HandleWgtSharedDirectory() { + bf::path res_wgt_path = context_->pkg_path.get() / kResWgtSubPath; + bf::path shared_source = res_wgt_path / kSharedLocation; + bf::path shared_destination = context_->pkg_path.get() / kSharedLocation; + + // Move shared if exist in wgt + if (bf::exists(shared_source)) { + if (!common_installer::MoveDir(shared_source, shared_destination)) { + LOG(ERROR) << "Failed to move shared data from res/wgt to shared"; + return Status::ERROR; + } + } + + // Create shared directory if not present yet + if (!bf::exists(shared_destination)) { + bs::error_code error_code; + bf::create_directory(shared_destination, error_code); + if (error_code) { + LOG(ERROR) << "Failed to create shared storage directory"; + return Status::ERROR; + } + } + + // Symlink created shared directory + bs::error_code error_code; + bf::create_symlink(shared_destination, shared_source, error_code); + if (error_code) { + LOG(ERROR) << "Failed to create symbolic link for shared dir" + << boost::system::system_error(error_code).what(); + return Status::ERROR; + } + return Status::OK; +} + +common_installer::Step::Status +StepWgtCopyStorageDirectories::CopySharedDirectory() { + Status status = HandleWgtSharedDirectory(); + if (status != Status::OK) + return status; + + if (!MoveAppStorage(backup_path_, + context_->pkg_path.get(), + kSharedDataLocation)) { + LOG(ERROR) << + "Failed to restore shared/data directory for widget in update"; + return Status::ERROR; + } + + if (!MoveAppStorage(backup_path_, + context_->pkg_path.get(), + kSharedTrustedLocation)) { + LOG(ERROR) << + "Failed to restore shared/trusted directory for widget in update"; + return Status::ERROR; + } + + return Status::OK; +} + +common_installer::Step::Status +StepWgtCopyStorageDirectories::CopyDataDirectory() { + if (!MoveAppStorage(backup_path_, + context_->pkg_path.get(), + kDataLocation)) { + LOG(ERROR) << "Failed to restore private directory for widget in update"; + return Status::ERROR; + } + return Status::OK; +} + +common_installer::Step::Status +StepWgtCopyStorageDirectories::CreatePrivateTmpDir() { + bs::error_code error_code; + bf::path tmp_path = context_->pkg_path.get() / kTemporaryData; + bf::create_directory(tmp_path, error_code); + if (error_code) { + LOG(ERROR) << "Failed to create private temporary directory for package"; + return Status::ERROR; + } + return Status::OK; +} + +} // namespace filesystem +} // namespace wgt + diff --git a/src/wgt/step/step_wgt_copy_storage_directories.h b/src/wgt/step/step_wgt_copy_storage_directories.h new file mode 100644 index 0000000..18eac47 --- /dev/null +++ b/src/wgt/step/step_wgt_copy_storage_directories.h @@ -0,0 +1,58 @@ +// Copyright (c) 2015 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_STEP_WGT_COPY_STORAGE_DIRECTORIES_H_ +#define WGT_STEP_STEP_WGT_COPY_STORAGE_DIRECTORIES_H_ + +#include + +#include + +namespace wgt { +namespace filesystem { + +/** + * \brief Update installation (WGT). + * Responsible for coping shared and data directories. + * It extends StepCopyStorageDirectories (it adds distinction between + * 2.x and 3.x shared dir handling + */ +class StepWgtCopyStorageDirectories + : public common_installer::filesystem::StepCopyStorageDirectories { + public: + using StepCopyStorageDirectories::StepCopyStorageDirectories; + + /** + * \brief Create shared and private directories, + * and copy/restore widget files to appropriate directory + * + * \return Status::ERROR when failed to create temporary location, + * private temporary location, or failed to restore + * shared/private directory for widget, + * Status::OK otherwise + */ + Status process() override; + + /** + * \brief Move files from shared/private directories back to source directory + * + * \return Status::OK + */ + Status undo() override; + + private: + Status CopySharedDirectory(); + Status CopyDataDirectory(); + Status HandleWgtSharedDirectory(); + void UndoSharedDirectory(); + void UndoDataDirectory(); + Status CreatePrivateTmpDir(); + + SCOPE_LOG_TAG(CopyWgtStorageDirectories) +}; + +} // namespace filesystem +} // namespace wgt + +#endif // WGT_STEP_STEP_WGT_COPY_STORAGE_DIRECTORIES_H_ diff --git a/src/wgt/step/step_wgt_create_icons.cc b/src/wgt/step/step_wgt_create_icons.cc new file mode 100644 index 0000000..f62588c --- /dev/null +++ b/src/wgt/step/step_wgt_create_icons.cc @@ -0,0 +1,22 @@ +// Copyright (c) 2015 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/step_wgt_create_icons.h" + +namespace { + +const char kResWgt[] = "res/wgt"; + +} + +namespace wgt { +namespace filesystem { + +boost::filesystem::path StepWgtCreateIcons::GetIconRoot() const { + return context_->pkg_path.get() / kResWgt; +} + +} // namespace filesystem +} // namespace wgt + diff --git a/src/wgt/step/step_wgt_create_icons.h b/src/wgt/step/step_wgt_create_icons.h new file mode 100644 index 0000000..46c3a8c --- /dev/null +++ b/src/wgt/step/step_wgt_create_icons.h @@ -0,0 +1,36 @@ +// Copyright (c) 2015 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_STEP_WGT_CREATE_ICONS_H_ +#define WGT_STEP_STEP_WGT_CREATE_ICONS_H_ + +#include + +#include + +namespace wgt { +namespace filesystem { + +/** + * \brief This step return path to widget icon + */ +class StepWgtCreateIcons + : public common_installer::filesystem::StepCreateIcons { + public: + using StepCreateIcons::StepCreateIcons; + + /** + * \brief Return path to widget icon + * + * \return path to widget icon + */ + boost::filesystem::path GetIconRoot() const override; + + SCOPE_LOG_TAG(WgtCreateIcons) +}; + +} // namespace filesystem +} // namespace wgt + +#endif // WGT_STEP_STEP_WGT_CREATE_ICONS_H_ diff --git a/src/wgt/step/step_wgt_create_storage_directories.cc b/src/wgt/step/step_wgt_create_storage_directories.cc new file mode 100644 index 0000000..708cd12 --- /dev/null +++ b/src/wgt/step/step_wgt_create_storage_directories.cc @@ -0,0 +1,102 @@ +// Copyright (c) 2015 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/step_wgt_create_storage_directories.h" + +#include +#include +#include + +#include + +namespace bf = boost::filesystem; +namespace bs = boost::system; + +namespace { + +const char kSharedLocation[] = "shared"; +const char kResWgtSubPath[] = "res/wgt"; +const char kTemporaryData[] = "tmp"; + +} // namespace + +namespace wgt { +namespace filesystem { + +common_installer::Step::Status StepWgtCreateStorageDirectories::process() { + if (!PrivateDir()) + return Status::ERROR; + + char version = context_->manifest_data.get()->api_version[0]; + + if ((version-'0') < 3) { + LOG(DEBUG) << "Shared directory preparation for tizen 2.x"; + if (!ShareDir()) + return Status::ERROR; + } else { + LOG(DEBUG) << "Shared directory preparation for tizen 3.x"; + if (!ShareDirFor3x()) + return Status::ERROR; + } + + if (!SubShareDir()) + return Status::ERROR; + + if (!CreatePrivateTmpDir()) + return Status::ERROR; + + if (!CacheDir()) + return Status::ERROR; + + return Status::OK; +} + +bool StepWgtCreateStorageDirectories::ShareDirFor2x() { + bs::error_code error_code; + bf::path shared_path = context_->pkg_path.get() / kSharedLocation; + bf::create_directory(shared_path, error_code); + if (error_code) { + LOG(ERROR) << "Failed to create shared directory for widget"; + return false; + } + return true; +} + +bool StepWgtCreateStorageDirectories::ShareDirFor3x() { + bf::path res_wgt_path = context_->pkg_path.get() / kResWgtSubPath; + if (!bf::exists(res_wgt_path / kSharedLocation)) { + if (!ShareDir()) + return false; + } else { + bf::path src = res_wgt_path / kSharedLocation; + bf::path dst = context_->pkg_path.get() / kSharedLocation; + if (!common_installer::MoveDir(src, dst)) { + LOG(ERROR) << "Failed to move shared data from res/wgt to shared"; + return false; + } + + bs::error_code error_code; + bf::create_symlink(dst, src, error_code); + if (error_code) { + LOG(ERROR) << "Failed to create symbolic link for shared dir" + << boost::system::system_error(error_code).what(); + return false; + } + } // else + return true; +} + +bool StepWgtCreateStorageDirectories::CreatePrivateTmpDir() { + bs::error_code error_code; + bf::path tmp_path = context_->pkg_path.get() / kTemporaryData; + bf::create_directory(tmp_path, error_code); + if (error_code) { + LOG(ERROR) << "Failed to create private temporary directory for package"; + return false; + } + return true; +} + +} // namespace filesystem +} // namespace wgt diff --git a/src/wgt/step/step_wgt_create_storage_directories.h b/src/wgt/step/step_wgt_create_storage_directories.h new file mode 100644 index 0000000..789c5ee --- /dev/null +++ b/src/wgt/step/step_wgt_create_storage_directories.h @@ -0,0 +1,77 @@ +// Copyright (c) 2015 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_STEP_WGT_CREATE_STORAGE_DIRECTORIES_H_ +#define WGT_STEP_STEP_WGT_CREATE_STORAGE_DIRECTORIES_H_ + +#include + +#include + +namespace wgt { +namespace filesystem { + +/** + * \brief Installation (WGT). + * Responsible for creating shared and data directories. + * It extends StepCreateStorageDirectories (it adds distinction between + * 2.x and 3.x shared dir handling + * + * process method implements creation of shared and data directories. + * Depending on tizen required version it can also move "shared" resources + * from ./res/wgt/shared to ./shared dir (and create symlink back + * to ./res/wgt/shared). + * + * StepWgtCreateStorageDirectories works on following directory: + * * TZ_SYS_RW/PKGID (/usr/apps/PKGID) + * * TZ_SER_APPS/PKGID (/{HOME}/apps_rw/PKGID) + */ +class StepWgtCreateStorageDirectories : + public common_installer::filesystem::StepCreateStorageDirectories { + public: + using StepCreateStorageDirectories::StepCreateStorageDirectories; + + /** + * \brief Create shared and private directories + * + * \return Status::ERROR when failed to create temporary location, or + * private temporary location + * Status::OK otherwise + */ + Status process() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status clean() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status undo() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status precheck() override { return Status::OK; } + + private: + bool ShareDirFor2x(); + bool ShareDirFor3x(); + + bool CreatePrivateTmpDir(); + + SCOPE_LOG_TAG(CreateWgtStorageDirectories) +}; + +} // namespace filesystem +} // namespace wgt + +#endif // WGT_STEP_STEP_WGT_CREATE_STORAGE_DIRECTORIES_H_ diff --git a/src/wgt/step/step_wgt_resource_directory.cc b/src/wgt/step/step_wgt_resource_directory.cc new file mode 100644 index 0000000..190051f --- /dev/null +++ b/src/wgt/step/step_wgt_resource_directory.cc @@ -0,0 +1,44 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_wgt_resource_directory.h" + +#include + +#include + +namespace bf = boost::filesystem; +namespace bs = boost::system; + +namespace wgt { +namespace filesystem { + +common_installer::Step::Status StepWgtResourceDirectory::process() { + bf::path temp_path = context_->unpacked_dir_path.get(); + temp_path += ".temp"; + bf::path resource_path = context_->unpacked_dir_path.get() / "res/wgt"; + + if (!common_installer::MoveDir(context_->unpacked_dir_path.get(), + temp_path)) { + LOG(ERROR) << "Failed to move: " << context_->unpacked_dir_path.get() + << " to: " << temp_path; + return Status::ERROR; + } + bs::error_code error; + bf::create_directories(resource_path.parent_path(), error); + if (error) { + LOG(ERROR) << "Failed to create proper directory structure in widget"; + return Status::ERROR; + } + if (!common_installer::MoveDir(temp_path, resource_path)) { + LOG(ERROR) << "Failed to move: " << temp_path << " to: " << resource_path; + return Status::ERROR; + } + + LOG(INFO) << "Widget content moved to res/wgt subdirectory"; + return Status::OK; +} + +} // namespace filesystem +} // namespace wgt diff --git a/src/wgt/step/step_wgt_resource_directory.h b/src/wgt/step/step_wgt_resource_directory.h new file mode 100644 index 0000000..60717ec --- /dev/null +++ b/src/wgt/step/step_wgt_resource_directory.h @@ -0,0 +1,62 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_WGT_RESOURCE_DIRECTORY_H_ +#define WGT_STEP_STEP_WGT_RESOURCE_DIRECTORY_H_ + +#include + +#include +#include +#include + +namespace wgt { +namespace filesystem { + +/** + * \brief This step fixes unpacked directory structure so that all widget + * content is moved from root path to res/wgt before we copy whole directory in + * StepCopy + */ +class StepWgtResourceDirectory : public common_installer::Step { + public: + using Step::Step; + + /** + * \brief Create directory structure and copy content of widget package + * + * \return Status::ERROR when failed to create proper directory structure or + * move source directory to destination directory, + * Status::OK otherwise + */ + Status process() override; + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status clean() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status undo() override { return Status::OK; } + + /** + * \brief Empty method + * + * \return Status::OK + */ + Status precheck() override { return Status::OK; } + + SCOPE_LOG_TAG(CreateWgtResourceDirectory) +}; + +} // namespace filesystem +} // namespace wgt + +#endif // WGT_STEP_STEP_WGT_RESOURCE_DIRECTORY_H_ diff --git a/src/wgt/wgt_app_query_interface.cc b/src/wgt/wgt_app_query_interface.cc new file mode 100644 index 0000000..2a8e046 --- /dev/null +++ b/src/wgt/wgt_app_query_interface.cc @@ -0,0 +1,101 @@ +// Copyright (c) 2015 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/wgt_app_query_interface.h" + +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + + +namespace bf = boost::filesystem; +namespace bs = boost::system; +namespace ci = common_installer; + +namespace { + +std::string GetInstallationPackagePath(int argc, char** argv) { + std::string path; + for (int i = 0; i < argc; ++i) { + if (!strcmp(argv[i], "-i")) { + if (i + 1 < argc) { + path = argv[i + 1]; + break; + } + } + } + return path; +} + +std::string GetPkgIdFromPath(const std::string& path) { + bf::path tmp_path = common_installer::GenerateTmpDir("/tmp"); + bs::error_code code; + bf::create_directories(tmp_path, code); + if (code) + return {}; + if (!common_installer::ExtractToTmpDir(path.c_str(), tmp_path, + "config.xml")) { + bf::remove_all(tmp_path, code); + return {}; + } + bf::path config_path = tmp_path / "config.xml"; + std::vector handlers = { + new wgt::parse::WidgetHandler(), + new wgt::parse::TizenApplicationHandler() + }; + std::unique_ptr registry( + new parser::ManifestHandlerRegistry(handlers)); + std::unique_ptr parser( + new parser::ManifestParser(std::move(registry))); + if (!parser->ParseManifest(config_path)) { + bf::remove_all(tmp_path, code); + return {}; + } + auto info = std::static_pointer_cast( + parser->GetManifestData( + wgt::application_widget_keys::kTizenApplicationKey)); + if (!info) { + bf::remove_all(tmp_path, code); + return {}; + } + std::string pkg_id = info->package(); + + bf::remove_all(tmp_path, code); + return pkg_id; +} + +} // namespace + +namespace wgt { + +bool WgtAppQueryInterface::IsAppInstalledByArgv(int argc, char** argv) { + std::string path = GetInstallationPackagePath(argc, argv); + if (path.empty()) { + // not the installaton + return false; + } + std::string pkg_id = GetPkgIdFromPath(path); + if (pkg_id.empty()) + return false; + return ci::IsPackageInstalled(pkg_id, ci::GetRequestMode()); +} + +} // namespace wgt diff --git a/src/wgt/wgt_app_query_interface.h b/src/wgt/wgt_app_query_interface.h new file mode 100644 index 0000000..40a9a07 --- /dev/null +++ b/src/wgt/wgt_app_query_interface.h @@ -0,0 +1,33 @@ +// Copyright (c) 2015 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_WGT_APP_QUERY_INTERFACE_H_ +#define WGT_WGT_APP_QUERY_INTERFACE_H_ + +#include + +namespace wgt { + +/** + * \brief Helper functionalities used before + * configuring app-installer steps. + * Eg. it is used to check, if package is to be installed or updated + */ +class WgtAppQueryInterface : public common_installer::AppQueryInterface { + public: + /** + * \brief method for checking if package is installed based + * on argv + * + * \param argc main() argc argument passed to the backend + * \param argv main() argv argument passed to the backend + * + * \return true if package is installed + */ + bool IsAppInstalledByArgv(int argc, char** argv) override; +}; + +} // namespace wgt + +#endif // WGT_WGT_APP_QUERY_INTERFACE_H_ diff --git a/src/wgt/wgt_backend.cc b/src/wgt/wgt_backend.cc new file mode 100644 index 0000000..576e861 --- /dev/null +++ b/src/wgt/wgt_backend.cc @@ -0,0 +1,23 @@ +/* 2014, Copyright © Intel Coporation, license APACHE-2.0, see LICENSE file */ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include +#include + +#include "wgt/wgt_app_query_interface.h" +#include "wgt/wgt_installer.h" + +namespace ci = common_installer; + +int main(int argc, char** argv) { + wgt::WgtAppQueryInterface query_interface; + auto pkgmgr = ci::PkgMgrInterface::Create(argc, argv, &query_interface); + if (!pkgmgr) { + LOG(ERROR) << "Options of pkgmgr installer cannot be parsed"; + return EINVAL; + } + wgt::WgtInstaller installer(pkgmgr); + return (installer.Run() == ci::AppInstaller::Result::OK) ? 0 : 1; +} diff --git a/src/wgt/wgt_backend_data.h b/src/wgt/wgt_backend_data.h new file mode 100644 index 0000000..e3c281b --- /dev/null +++ b/src/wgt/wgt_backend_data.h @@ -0,0 +1,47 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_WGT_BACKEND_DATA_H_ +#define WGT_WGT_BACKEND_DATA_H_ + +#include +#include + +#include + +#include +#include + +namespace wgt { + +/** + * \brief Class that is used within specific backends to keep additional + * information regarding package + */ +class WgtBackendData : public common_installer::BackendData { + public: + /** + * \brief Property of vector of files to add + */ + Property> files_to_add; + + /** + * \brief Property of vector of files to modify + */ + Property> files_to_modify; + + /** + * \brief Property of vector of files to delete + */ + Property> files_to_delete; + + /** + * \brief Property of SettingInfo + */ + Property settings; +}; + +} // namespace wgt + +#endif // WGT_WGT_BACKEND_DATA_H_ diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc new file mode 100644 index 0000000..9d494b9 --- /dev/null +++ b/src/wgt/wgt_installer.cc @@ -0,0 +1,179 @@ +// Copyright (c) 2015 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/wgt_installer.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wgt/step/step_add_default_privileges.h" +#include "wgt/step/step_check_settings_level.h" +#include "wgt/step/step_check_wgt_background_category.h" +#include "wgt/step/step_create_symbolic_link.h" +#include "wgt/step/step_encrypt_resources.h" +#include "wgt/step/step_generate_xml.h" +#include "wgt/step/step_parse.h" +#include "wgt/step/step_parse_recovery.h" +#include "wgt/step/step_rds_modify.h" +#include "wgt/step/step_rds_parse.h" +#include "wgt/step/step_remove_encryption_data.h" +#include "wgt/step/step_wgt_copy_storage_directories.h" +#include "wgt/step/step_wgt_create_icons.h" +#include "wgt/step/step_wgt_create_storage_directories.h" +#include "wgt/step/step_wgt_resource_directory.h" + +namespace ci = common_installer; + +namespace wgt { + +WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) + : AppInstaller("wgt", pkgrmgr) { + /* treat the request */ + switch (pkgmgr_->GetRequestType()) { + case ci::RequestType::Install : { + AddStep(pkgmgr_); + AddStep(); + AddStep(true); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + } + case ci::RequestType::Update: { + AddStep(pkgmgr_); + AddStep(); + AddStep(true); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + } + case ci::RequestType::Uninstall: { + AddStep(pkgmgr_); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + } + case ci::RequestType::Reinstall: { + AddStep(pkgmgr_); + AddStep(false); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + } + case ci::RequestType::Delta: { + AddStep(pkgmgr_); + AddStep(); + // TODO(t.iwanek): manifest is parsed twice... + AddStep(false); // start file may not have changed + AddStep("res/wgt/"); + AddStep(true); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + } + case ci::RequestType::Recovery: { + AddStep(pkgmgr_); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + } + default: { + AddStep(); + } + } +} + +} // namespace wgt diff --git a/src/wgt/wgt_installer.h b/src/wgt/wgt_installer.h new file mode 100644 index 0000000..7a06a31 --- /dev/null +++ b/src/wgt/wgt_installer.h @@ -0,0 +1,31 @@ +// Copyright (c) 2015 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_WGT_INSTALLER_H_ +#define WGT_WGT_INSTALLER_H_ + +#include + +namespace wgt { + +/** + * \brief The WgtInstaller class + * Subclass of AppInstaller class dedicated for handling wgt request + * + * Performs all types of requests of wgt packages and sets required sequence of + * steps + */ +class WgtInstaller : public common_installer::AppInstaller { + public: + /** + * \brief Explicit constructor + * + * \param pkgmgr pointer to pkgmgr + */ + explicit WgtInstaller(common_installer::PkgMgrPtr pkgrmgr); +}; + +} // namespace wgt + +#endif // WGT_WGT_INSTALLER_H_ -- 2.7.4 From 5fced8b90793ed8d8b84e1098c2caf3f21b31a00 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Thu, 7 Jan 2016 16:05:28 +0100 Subject: [PATCH 04/11] Fix paths in smoke tests Change-Id: Ie186f82dd997567e3850150a090f399bd717ba24 --- src/unit_tests/smoke_test.cc | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/unit_tests/smoke_test.cc b/src/unit_tests/smoke_test.cc index 38f8e33..ee47203 100644 --- a/src/unit_tests/smoke_test.cc +++ b/src/unit_tests/smoke_test.cc @@ -34,6 +34,9 @@ namespace ci = common_installer; namespace { +const bf::path kSmokePackagesDirectory = + "/usr/share/wgt-backend-ut/test_samples/smoke/"; + const char kApplicationDir[] = ".applications"; const char kApplicationDirBackup[] = ".applications.bck"; const char KUserAppsDir[] = "apps_rw"; @@ -324,7 +327,7 @@ class SmokeTest : public testing::Test { }; TEST_F(SmokeTest, InstallationMode) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/InstallationMode.wgt"; // NOLINT + bf::path path = kSmokePackagesDirectory / "InstallationMode.wgt"; std::string pkgid = "smokeapp03"; std::string appid = "smokeapp03.InstallationMode"; ASSERT_EQ(Install(path), ci::AppInstaller::Result::OK); @@ -332,8 +335,8 @@ TEST_F(SmokeTest, InstallationMode) { } TEST_F(SmokeTest, UpdateMode) { - bf::path path_old = "/usr/share/app-installers-ut/test_samples/smoke/UpdateMode.wgt"; // NOLINT - bf::path path_new = "/usr/share/app-installers-ut/test_samples/smoke/UpdateMode_2.wgt"; // NOLINT + bf::path path_old = kSmokePackagesDirectory / "UpdateMode.wgt"; + bf::path path_new = kSmokePackagesDirectory / "UpdateMode_2.wgt"; std::string pkgid = "smokeapp04"; std::string appid = "smokeapp04.UpdateMode"; ASSERT_EQ(Update(path_old, path_new), ci::AppInstaller::Result::OK); @@ -343,7 +346,7 @@ TEST_F(SmokeTest, UpdateMode) { } TEST_F(SmokeTest, DeinstallationMode) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/DeinstallationMode.wgt"; // NOLINT + bf::path path = kSmokePackagesDirectory / "DeinstallationMode.wgt"; std::string pkgid = "smokeapp05"; std::string appid = "smokeapp05.DeinstallationMode"; ASSERT_EQ(Install(path), @@ -353,8 +356,8 @@ TEST_F(SmokeTest, DeinstallationMode) { } TEST_F(SmokeTest, RDSMode) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/RDSMode.wgt"; // NOLINT - std::string delta_directory = "/usr/share/app-installers-ut/test_samples/smoke/delta_dir/"; // NOLINT + bf::path path = kSmokePackagesDirectory / "RDSMode.wgt"; + bf::path delta_directory = kSmokePackagesDirectory / "delta_dir/"; std::string pkgid = "smokeapp11"; std::string appid = "smokeapp11.RDSMode"; ASSERT_EQ(Reinstall(path, delta_directory), @@ -369,8 +372,8 @@ TEST_F(SmokeTest, RDSMode) { } TEST_F(SmokeTest, DeltaMode) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/DeltaMode.wgt"; // NOLINT - std::string delta_package = "/usr/share/app-installers-ut/test_samples/smoke/DeltaMode.delta"; // NOLINT + bf::path path = kSmokePackagesDirectory / "DeltaMode.wgt"; + bf::path delta_package = kSmokePackagesDirectory / "DeltaMode.delta"; std::string pkgid = "smokeapp17"; std::string appid = "smokeapp17.DeltaMode"; ASSERT_EQ(DeltaInstall(path, delta_package), @@ -388,7 +391,7 @@ TEST_F(SmokeTest, DeltaMode) { } TEST_F(SmokeTest, RecoveryMode_ForInstallation) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/RecoveryMode_ForInstallation.wgt"; // NOLINT + bf::path path = kSmokePackagesDirectory / "RecoveryMode_ForInstallation.wgt"; ASSERT_DEATH(Install(path, RequestResult::CRASH), ".*"); std::string pkgid = "smokeapp09"; @@ -401,8 +404,8 @@ TEST_F(SmokeTest, RecoveryMode_ForInstallation) { } TEST_F(SmokeTest, RecoveryMode_ForUpdate) { - bf::path path_old = "/usr/share/app-installers-ut/test_samples/smoke/RecoveryMode_ForUpdate.wgt"; // NOLINT - bf::path path_new = "/usr/share/app-installers-ut/test_samples/smoke/RecoveryMode_ForUpdate_2.wgt"; // NOLINT + bf::path path_old = kSmokePackagesDirectory / "RecoveryMode_ForUpdate.wgt"; + bf::path path_new = kSmokePackagesDirectory / "RecoveryMode_ForUpdate_2.wgt"; RemoveAllRecoveryFiles(); ASSERT_DEATH(Update(path_old, path_new, RequestResult::CRASH), ".*"); @@ -418,17 +421,17 @@ TEST_F(SmokeTest, RecoveryMode_ForUpdate) { } TEST_F(SmokeTest, InstallationMode_GoodSignature) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/InstallationMode_GoodSignature.wgt"; // NOLINT + bf::path path = kSmokePackagesDirectory / "InstallationMode_GoodSignature.wgt"; // NOLINT ASSERT_EQ(Install(path), ci::AppInstaller::Result::OK); } TEST_F(SmokeTest, InstallationMode_WrongSignature) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/InstallationMode_WrongSignature.wgt"; // NOLINT + bf::path path = kSmokePackagesDirectory / "InstallationMode_WrongSignature.wgt"; // NOLINT ASSERT_EQ(Install(path), ci::AppInstaller::Result::ERROR); } TEST_F(SmokeTest, InstallationMode_Rollback) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/InstallationMode_Rollback.wgt"; // NOLINT + bf::path path = kSmokePackagesDirectory / "InstallationMode_Rollback.wgt"; std::string pkgid = "smokeapp06"; std::string appid = "smokeapp06.InstallationModeRollback"; ASSERT_EQ(Install(path, RequestResult::FAIL), @@ -437,8 +440,8 @@ TEST_F(SmokeTest, InstallationMode_Rollback) { } TEST_F(SmokeTest, UpdateMode_Rollback) { - bf::path path_old = "/usr/share/app-installers-ut/test_samples/smoke/UpdateMode_Rollback.wgt"; // NOLINT - bf::path path_new = "/usr/share/app-installers-ut/test_samples/smoke/UpdateMode_Rollback_2.wgt"; // NOLINT + bf::path path_old = kSmokePackagesDirectory / "UpdateMode_Rollback.wgt"; + bf::path path_new = kSmokePackagesDirectory / "UpdateMode_Rollback_2.wgt"; std::string pkgid = "smokeapp07"; std::string appid = "smokeapp07.UpdateModeRollback"; ASSERT_EQ(Update(path_old, path_new, RequestResult::FAIL), @@ -449,7 +452,7 @@ TEST_F(SmokeTest, UpdateMode_Rollback) { } TEST_F(SmokeTest, DeinstallationMode_Rollback) { - bf::path path = "/usr/share/app-installers-ut/test_samples/smoke/DeinstallationMode_Rollback.wgt"; // NOLINT + bf::path path = kSmokePackagesDirectory / "DeinstallationMode_Rollback.wgt"; std::string pkgid = "smokeapp08"; std::string appid = "smokeapp08.DeinstallationModeRollback"; ASSERT_EQ(Install(path), ci::AppInstaller::Result::OK); -- 2.7.4 From d45e47b7a9622c9d4a89051120379c4ce7ba87bb Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Tue, 12 Jan 2016 08:24:18 +0900 Subject: [PATCH 05/11] change some returning error-codes Change-Id: I4beb6ffa93969228db64d0f8de714733ac1f747c Signed-off-by: jongmyeongko --- src/wgt/step/step_check_settings_level.cc | 2 +- src/wgt/step/step_generate_xml.cc | 8 ++++---- src/wgt/step/step_parse.cc | 10 +++++----- src/wgt/step/step_parse_recovery.cc | 2 +- src/wgt/step/step_rds_modify.cc | 8 ++++---- src/wgt/step/step_rds_parse.cc | 6 +++--- src/wgt/step/step_wgt_copy_storage_directories.cc | 2 +- src/wgt/step/step_wgt_create_storage_directories.cc | 12 ++++++------ src/wgt/step/step_wgt_resource_directory.cc | 6 +++--- 9 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/wgt/step/step_check_settings_level.cc b/src/wgt/step/step_check_settings_level.cc index 664e376..0d88bb2 100644 --- a/src/wgt/step/step_check_settings_level.cc +++ b/src/wgt/step/step_check_settings_level.cc @@ -37,7 +37,7 @@ common_installer::Step::Status StepCheckSettingsLevel::process() { if (!ValidateSettingsForLevel(context_->privilege_level.get(), static_cast( context_->backend_data.get())->settings.get())) { - return Status::ERROR; + return Status::PRIVILEGE_ERROR; } LOG(INFO) << "Settings privilege level checked"; return Status::OK; diff --git a/src/wgt/step/step_generate_xml.cc b/src/wgt/step/step_generate_xml.cc index 055fd3f..6be0750 100644 --- a/src/wgt/step/step_generate_xml.cc +++ b/src/wgt/step/step_generate_xml.cc @@ -252,7 +252,7 @@ common_installer::Step::Status StepGenerateXml::precheck() { } if (context_->pkgid.get().empty()) { LOG(ERROR) << "pkgid attribute is empty"; - return Step::Status::INVALID_VALUE; } + return Step::Status::PACKAGE_NOT_FOUND; } if (!context_->manifest_data.get()->application) { LOG(ERROR) << "No application in package"; @@ -274,7 +274,7 @@ common_installer::Step::Status StepGenerateXml::process() { if (!common_installer::CreateDir(xml_path.parent_path())) { LOG(ERROR) << "Directory for manifest xml is missing and cannot be created"; - return Status::ERROR; + return Status::MANIFEST_ERROR; } } @@ -283,7 +283,7 @@ common_installer::Step::Status StepGenerateXml::process() { writer = xmlNewTextWriterFilename(context_->xml_path.get().c_str(), 0); if (!writer) { LOG(ERROR) << "Failed to create new file"; - return Step::Status::ERROR; + return Step::Status::MANIFEST_ERROR; } xmlTextWriterStartDocument(writer, nullptr, nullptr, nullptr); @@ -475,7 +475,7 @@ common_installer::Step::Status StepGenerateXml::process() { if (pkgmgr_parser_check_manifest_validation( context_->xml_path.get().c_str()) != 0) { LOG(ERROR) << "Manifest is not valid"; - return Step::Status::ERROR; + return Step::Status::MANIFEST_ERROR; } LOG(DEBUG) << "Successfully create manifest xml " diff --git a/src/wgt/step/step_parse.cc b/src/wgt/step/step_parse.cc index ac36e10..315a46d 100644 --- a/src/wgt/step/step_parse.cc +++ b/src/wgt/step/step_parse.cc @@ -455,22 +455,22 @@ bool StepParse::LocateConfigFile() { common_installer::Step::Status StepParse::process() { if (!LocateConfigFile()) { LOG(ERROR) << "No config.xml"; - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::MANIFEST_NOT_FOUND; } parser_.reset(new wgt::parse::WidgetConfigParser()); if (!parser_->ParseManifest(config_)) { LOG(ERROR) << "[Parse] Parse failed. " << parser_->GetErrorMessage(); - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::PARSE_ERROR; } if (check_start_file_) { if (!parser_->HasValidStartFile()) { LOG(ERROR) << parser_->GetErrorMessage(); - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::PARSE_ERROR; } if (!parser_->HasValidServicesStartFiles()) { LOG(ERROR) << parser_->GetErrorMessage(); - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::PARSE_ERROR; } } @@ -479,7 +479,7 @@ common_installer::Step::Status StepParse::process() { if (!FillManifestX(manifest)) { LOG(ERROR) << "[Parse] Storing manifest_x failed. " << parser_->GetErrorMessage(); - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::PARSE_ERROR; } // Copy data from ManifestData to InstallerContext diff --git a/src/wgt/step/step_parse_recovery.cc b/src/wgt/step/step_parse_recovery.cc index 7fe4a10..218c2d5 100644 --- a/src/wgt/step/step_parse_recovery.cc +++ b/src/wgt/step/step_parse_recovery.cc @@ -29,7 +29,7 @@ common_installer::Step::Status StepParseRecovery::process() { common_installer::Step::Status StepParseRecovery::precheck() { if (context_->root_application_path.get().empty()) { LOG(ERROR) << "Root path of packages in not set"; - return Status::ERROR; + return Status::INVALID_VALUE; } if (context_->pkgid.get().empty()) { LOG(WARNING) << "Pkgid is not set. Parsing skipped"; diff --git a/src/wgt/step/step_rds_modify.cc b/src/wgt/step/step_rds_modify.cc index 41b9bc1..95fab9f 100644 --- a/src/wgt/step/step_rds_modify.cc +++ b/src/wgt/step/step_rds_modify.cc @@ -24,21 +24,21 @@ StepRDSModify::StepRDSModify(common_installer::InstallerContext* context) common_installer::Step::Status StepRDSModify::precheck() { if (context_->unpacked_dir_path.get().empty()) { LOG(ERROR) << "unpacked dir path is not set"; - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::INVALID_VALUE; } if (!bf::exists(context_->unpacked_dir_path.get())) { LOG(ERROR) << "unpacked_dir_path (" << context_->unpacked_dir_path.get() << ") path does not exist"; - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::INVALID_VALUE; } if (context_->pkgid.get().empty()) { LOG(ERROR) << "pkgid is not set"; - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::PACKAGE_NOT_FOUND; } if (!context_->manifest_data.get()) { LOG(ERROR) << "no manifest info available"; - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::INVALID_VALUE; } // TODO(w.kosowicz): check if config of installed app was encrypted backend_data_ = static_cast(context_->backend_data.get()); diff --git a/src/wgt/step/step_rds_parse.cc b/src/wgt/step/step_rds_parse.cc index b98900e..2a459a0 100644 --- a/src/wgt/step/step_rds_parse.cc +++ b/src/wgt/step/step_rds_parse.cc @@ -21,7 +21,7 @@ common_installer::Step::Status StepRDSParse::precheck() { bf::path rdsPath(context_->unpacked_dir_path.get() / ".rds_delta"); if (!bf::exists(rdsPath)) { LOG(ERROR) << "no rds_delta file"; - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::INVALID_VALUE; } rds_file_path_ = rdsPath; return common_installer::Step::Status::OK; @@ -31,14 +31,14 @@ common_installer::Step::Status StepRDSParse::process() { wgt::rds_parser::RDSParser parser(rds_file_path_.native()); if (!parser.Parse()) { LOG(ERROR) << "parsing of rds delta failed"; - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::PARSE_ERROR; } WgtBackendData* backend_data = static_cast(context_->backend_data.get()); if (!backend_data) { LOG(ERROR) << "no wgt backend data available"; - return common_installer::Step::Status::ERROR; + return common_installer::Step::Status::PARSE_ERROR; } backend_data->files_to_modify.set(parser.files_to_modify()); backend_data->files_to_add.set(parser.files_to_add()); diff --git a/src/wgt/step/step_wgt_copy_storage_directories.cc b/src/wgt/step/step_wgt_copy_storage_directories.cc index c1929c7..fc2e366 100644 --- a/src/wgt/step/step_wgt_copy_storage_directories.cc +++ b/src/wgt/step/step_wgt_copy_storage_directories.cc @@ -31,7 +31,7 @@ common_installer::Step::Status StepWgtCopyStorageDirectories::process() { if (status != Status::OK) return status; if (!CacheDir()) - return Status::ERROR; + return Status::APP_DIR_ERROR; int version = context_->manifest_data.get()->api_version[0] - '0'; if (version < 3) { diff --git a/src/wgt/step/step_wgt_create_storage_directories.cc b/src/wgt/step/step_wgt_create_storage_directories.cc index 708cd12..d50d072 100644 --- a/src/wgt/step/step_wgt_create_storage_directories.cc +++ b/src/wgt/step/step_wgt_create_storage_directories.cc @@ -26,28 +26,28 @@ namespace filesystem { common_installer::Step::Status StepWgtCreateStorageDirectories::process() { if (!PrivateDir()) - return Status::ERROR; + return Status::APP_DIR_ERROR; char version = context_->manifest_data.get()->api_version[0]; if ((version-'0') < 3) { LOG(DEBUG) << "Shared directory preparation for tizen 2.x"; if (!ShareDir()) - return Status::ERROR; + return Status::APP_DIR_ERROR; } else { LOG(DEBUG) << "Shared directory preparation for tizen 3.x"; if (!ShareDirFor3x()) - return Status::ERROR; + return Status::APP_DIR_ERROR; } if (!SubShareDir()) - return Status::ERROR; + return Status::APP_DIR_ERROR; if (!CreatePrivateTmpDir()) - return Status::ERROR; + return Status::APP_DIR_ERROR; if (!CacheDir()) - return Status::ERROR; + return Status::APP_DIR_ERROR; return Status::OK; } diff --git a/src/wgt/step/step_wgt_resource_directory.cc b/src/wgt/step/step_wgt_resource_directory.cc index 190051f..33671e7 100644 --- a/src/wgt/step/step_wgt_resource_directory.cc +++ b/src/wgt/step/step_wgt_resource_directory.cc @@ -23,17 +23,17 @@ common_installer::Step::Status StepWgtResourceDirectory::process() { temp_path)) { LOG(ERROR) << "Failed to move: " << context_->unpacked_dir_path.get() << " to: " << temp_path; - return Status::ERROR; + return Status::APP_DIR_ERROR; } bs::error_code error; bf::create_directories(resource_path.parent_path(), error); if (error) { LOG(ERROR) << "Failed to create proper directory structure in widget"; - return Status::ERROR; + return Status::APP_DIR_ERROR; } if (!common_installer::MoveDir(temp_path, resource_path)) { LOG(ERROR) << "Failed to move: " << temp_path << " to: " << resource_path; - return Status::ERROR; + return Status::APP_DIR_ERROR; } LOG(INFO) << "Widget content moved to res/wgt subdirectory"; -- 2.7.4 From 2ac7a035612a687616ce9eaa8da20f03648829cf Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Thu, 14 Jan 2016 11:31:51 +0100 Subject: [PATCH 06/11] Add overlaod for StepCreateIcons::GetAppTypeForIcons Needs to be submitted with: - https://review.tizen.org/gerrit/#/c/56920 Change-Id: Ic0f5a18513b4157df06e5c411011ef64f283127e --- src/wgt/step/step_wgt_create_icons.cc | 4 ++++ src/wgt/step/step_wgt_create_icons.h | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/wgt/step/step_wgt_create_icons.cc b/src/wgt/step/step_wgt_create_icons.cc index f62588c..936e3a8 100644 --- a/src/wgt/step/step_wgt_create_icons.cc +++ b/src/wgt/step/step_wgt_create_icons.cc @@ -17,6 +17,10 @@ boost::filesystem::path StepWgtCreateIcons::GetIconRoot() const { return context_->pkg_path.get() / kResWgt; } +std::string StepWgtCreateIcons::GetAppTypeForIcons() const { + return "webapp"; +} + } // namespace filesystem } // namespace wgt diff --git a/src/wgt/step/step_wgt_create_icons.h b/src/wgt/step/step_wgt_create_icons.h index 46c3a8c..ee71942 100644 --- a/src/wgt/step/step_wgt_create_icons.h +++ b/src/wgt/step/step_wgt_create_icons.h @@ -9,6 +9,8 @@ #include +#include + namespace wgt { namespace filesystem { @@ -27,6 +29,13 @@ class StepWgtCreateIcons */ boost::filesystem::path GetIconRoot() const override; + /** + * \brief Return type of application for which icons should be created + * + * \return application type + */ + std::string GetAppTypeForIcons() const override; + SCOPE_LOG_TAG(WgtCreateIcons) }; -- 2.7.4 From ef65dc0a416da1bf81addbdbec4231b155d1126e Mon Sep 17 00:00:00 2001 From: Lukasz Wysocki Date: Fri, 8 Jan 2016 13:00:06 +0100 Subject: [PATCH 07/11] Web app icon path change This change will copy Web app icons into {HOME}/.applications/icons , and {APP_ROOT}/shared/res directories When some projects will be changed and stop using {HOME} directory, this change can be reworked. This commit require following changes: - https://review.tizen.org/gerrit/#/c/56488/ Change-Id: I9343adf5af1228a0b8ee660f50012eb7ac9b3bee --- src/wgt/CMakeLists.txt | 2 ++ src/wgt/step/step_wgt_backup_icons.cc | 30 ++++++++++++++++++++++++++++ src/wgt/step/step_wgt_backup_icons.h | 36 ++++++++++++++++++++++++++++++++++ src/wgt/step/step_wgt_create_icons.cc | 35 ++++++++++++++++++++++++++++++--- src/wgt/step/step_wgt_create_icons.h | 2 ++ src/wgt/step/step_wgt_recover_icons.cc | 31 +++++++++++++++++++++++++++++ src/wgt/step/step_wgt_recover_icons.h | 35 +++++++++++++++++++++++++++++++++ src/wgt/wgt_installer.cc | 10 +++++----- 8 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 src/wgt/step/step_wgt_backup_icons.cc create mode 100644 src/wgt/step/step_wgt_backup_icons.h create mode 100644 src/wgt/step/step_wgt_recover_icons.cc create mode 100644 src/wgt/step/step_wgt_recover_icons.h diff --git a/src/wgt/CMakeLists.txt b/src/wgt/CMakeLists.txt index 6bd0300..d1201bb 100644 --- a/src/wgt/CMakeLists.txt +++ b/src/wgt/CMakeLists.txt @@ -11,9 +11,11 @@ SET(SRCS step/step_parse_recovery.cc step/step_rds_parse.cc step/step_rds_modify.cc + step/step_wgt_backup_icons.cc step/step_wgt_create_icons.cc step/step_wgt_create_storage_directories.cc step/step_wgt_copy_storage_directories.cc + step/step_wgt_recover_icons.cc step/step_wgt_resource_directory.cc step/step_add_default_privileges.cc wgt_app_query_interface.cc diff --git a/src/wgt/step/step_wgt_backup_icons.cc b/src/wgt/step/step_wgt_backup_icons.cc new file mode 100644 index 0000000..c1d63e0 --- /dev/null +++ b/src/wgt/step/step_wgt_backup_icons.cc @@ -0,0 +1,30 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#include "wgt/step/step_wgt_backup_icons.h" + +#include + +namespace { +const char kSharedRes[] = "shared/res"; + +namespace bf = boost::filesystem; +} // namespace + +namespace wgt { +namespace backup { + +common_installer::Step::Status StepWgtBackupIcons::process() { + // TODO (l.wysocki): As a temporary solution this will move icons into two + // destinations respectively {HOME}/.applications/icons, + // and {APP_ROOT}/shared/res, when some project will stop using old + // location ({HOME}/.applications/icons) then it can be removed from here. + std::vector paths { getIconPath(context_->uid.get()), + context_->root_application_path.get() + / context_->pkgid.get() / kSharedRes }; + return MoveIcons(paths); +} + +} // namespace backup +} // namespace wgt diff --git a/src/wgt/step/step_wgt_backup_icons.h b/src/wgt/step/step_wgt_backup_icons.h new file mode 100644 index 0000000..dc62760 --- /dev/null +++ b/src/wgt/step/step_wgt_backup_icons.h @@ -0,0 +1,36 @@ +// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved +// Use of this source code is governed by a apache 2.0 license that can be +// found in the LICENSE file. + +#ifndef WGT_STEP_STEP_WGT_BACKUP_ICONS_H_ +#define WGT_STEP_STEP_WGT_BACKUP_ICONS_H_ + +#include +#include + +namespace wgt { +namespace backup { + +/** + *\brief Step responsible for creating backup for icons during update and + * uninstallation. + * Used by WGT backend + */ +class StepWgtBackupIcons : public common_installer::backup::StepBackupIcons { + public: + using StepBackupIcons::StepBackupIcons; + + /** + * \brief main logic of backuping icons + * + * \return Status::OK, if successful backup, Status::ERROR otherwise + */ + Status process() override; + + SCOPE_LOG_TAG(WgtBackupIcons) +}; + +} // namespace backup +} // namespace wgt + +#endif // WGT_STEP_STEP_WGT_BACKUP_ICONS_H_ diff --git a/src/wgt/step/step_wgt_create_icons.cc b/src/wgt/step/step_wgt_create_icons.cc index 936e3a8..1bd73eb 100644 --- a/src/wgt/step/step_wgt_create_icons.cc +++ b/src/wgt/step/step_wgt_create_icons.cc @@ -4,15 +4,44 @@ #include "wgt/step/step_wgt_create_icons.h" -namespace { +#include -const char kResWgt[] = "res/wgt"; +#include "common/utils/glist_range.h" -} +namespace bf = boost::filesystem; +namespace ci = common_installer; + +namespace { +const char kResWgt[] = "res/wgt"; +} // namespace namespace wgt { namespace filesystem { +common_installer::Step::Status StepWgtCreateIcons::process() { + // TODO (l.wysocki): As a temporary solution this will copy icons into two + // destinations respectively {HOME}/.applications/icons, + // and {APP_ROOT}/shared/res, when some project will stop using old + // location ({HOME}/.applications/icons) then it can be removed from here. + std::vector paths { getIconPath(context_->uid.get()), + StepCreateIcons::GetIconRoot() }; + + // explicit step for wgt apps to add absolute path to icon in order to + // store it in db + ci::Step::Status result = CopyIcons(paths); + for (application_x* app : + GListRange(context_->manifest_data.get()->application)) { + if (app->icon) { + icon_x* icon = reinterpret_cast(app->icon->data); + bf::path icon_path = StepCreateIcons::GetIconRoot() / icon->text; + if (icon->text) + free((void *)icon->text); + icon->text = strdup(icon_path.c_str()); + } + } + return result; +} + boost::filesystem::path StepWgtCreateIcons::GetIconRoot() const { return context_->pkg_path.get() / kResWgt; } diff --git a/src/wgt/step/step_wgt_create_icons.h b/src/wgt/step/step_wgt_create_icons.h index ee71942..a9501a3 100644 --- a/src/wgt/step/step_wgt_create_icons.h +++ b/src/wgt/step/step_wgt_create_icons.h @@ -22,6 +22,8 @@ class StepWgtCreateIcons public: using StepCreateIcons::StepCreateIcons; + Status process() override; + /** * \brief Return path to widget icon * diff --git a/src/wgt/step/step_wgt_recover_icons.cc b/src/wgt/step/step_wgt_recover_icons.cc new file mode 100644 index 0000000..0149b78 --- /dev/null +++ b/src/wgt/step/step_wgt_recover_icons.cc @@ -0,0 +1,31 @@ +// Copyright (c) 2015 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/step_wgt_recover_icons.h" + +#include + +namespace { +const char kSharedRes[] = "shared/res"; + +namespace bf = boost::filesystem; +} // namespace + +namespace wgt { +namespace filesystem { + +std::vector StepWgtRecoverIcons::GetIconsPaths() { + // TODO (l.wysocki): As a temporary solution this will move icons into two + // destinations respectively {HOME}/.applications/icons, + // and {APP_ROOT}/shared/res, when some project will stop using old + // location ({HOME}/.applications/icons) then it can be removed from here. + std::vector paths { bf::path(getIconPath(context_->uid.get())), + context_->root_application_path.get() + / context_->pkgid.get() / kSharedRes }; + return paths; +} + +} // namespace filesystem +} // namespace wgt + diff --git a/src/wgt/step/step_wgt_recover_icons.h b/src/wgt/step/step_wgt_recover_icons.h new file mode 100644 index 0000000..cf63981 --- /dev/null +++ b/src/wgt/step/step_wgt_recover_icons.h @@ -0,0 +1,35 @@ +// Copyright (c) 2015 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_STEP_WGT_RECOVER_ICONS_H_ +#define WGT_STEP_STEP_WGT_RECOVER_ICONS_H_ + +#include + +namespace wgt { +namespace filesystem { + +/** + * @brief The StepRecoverIcons class + * Fixes state of platform icon files in recovery mode. + * + * For recovery of new installation, all icons files are removed. + * For recovery of update installation, all icons of applications of package are + * restored to its previous locations. + */ +class StepWgtRecoverIcons : + public common_installer::filesystem::StepRecoverIcons { + public: + using StepRecoverIcons::StepRecoverIcons; + + protected: + virtual std::vector GetIconsPaths(); + + SCOPE_LOG_TAG(WgtRecoverIcons) +}; + +} // namespace filesystem +} // namespace wgt + +#endif // WGT_STEP_STEP_WGT_RECOVER_ICONS_H_ diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index 9d494b9..f2be1cd 100644 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -22,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -52,9 +50,11 @@ #include "wgt/step/step_rds_modify.h" #include "wgt/step/step_rds_parse.h" #include "wgt/step/step_remove_encryption_data.h" +#include "wgt/step/step_wgt_backup_icons.h" #include "wgt/step/step_wgt_copy_storage_directories.h" #include "wgt/step/step_wgt_create_icons.h" #include "wgt/step/step_wgt_create_storage_directories.h" +#include "wgt/step/step_wgt_recover_icons.h" #include "wgt/step/step_wgt_resource_directory.h" namespace ci = common_installer; @@ -98,7 +98,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -147,7 +147,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -163,7 +163,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); -- 2.7.4 From 67141727d94473b2e09ea68214405b638b3e13f4 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Fri, 8 Jan 2016 12:32:18 +0100 Subject: [PATCH 08/11] Implement hybrid webapplication installation Implemenation of hybrid package installation uses both tpk and wgt steps, composing information from tizen manifest file and w3c config.xml file. Installation of hybrid has different flow so there is new installer class introduced to avoid branching in steps. Instead there is "hacky" branch in wgt-backend main() to choose which step sequence to choose. Requires: - https://review.tizen.org/gerrit/56503 - https://review.tizen.org/gerrit/56506 - https://review.tizen.org/gerrit/56795 - https://review.tizen.org/gerrit/56918 - https://review.tizen.org/gerrit/56920 - https://review.tizen.org/gerrit/56921 - https://review.tizen.org/gerrit/56724 Graph of targets (dependencies) changed to following: common_lib <-- tpk_lib common_lib <-- wgt_lib tpk_lib <-- hybrid_lib wgt_lib <-- hybrid_lib wgt_lib <-- wgt_backend hybrid_lib <-- wgt_backend tpk_lib <-- tpk_backend Recovery for hybrid package will be added later if possible. Change-Id: I433f6030630f47c9f49025d89e267e5912bc78d9 --- CMakeLists.txt | 2 + packaging/wgt-backend.spec | 1 + src/CMakeLists.txt | 2 + src/hybrid/CMakeLists.txt | 19 ++++ src/hybrid/hybrid_backend_data.h | 34 ++++++ src/hybrid/hybrid_installer.cc | 168 ++++++++++++++++++++++++++++++ src/hybrid/hybrid_installer.h | 31 ++++++ src/hybrid/step/step_encrypt_resources.cc | 16 +++ src/hybrid/step/step_encrypt_resources.h | 33 ++++++ src/hybrid/step/step_merge_tpk_config.cc | 32 ++++++ src/hybrid/step/step_merge_tpk_config.h | 34 ++++++ src/hybrid/step/step_parse.cc | 22 ++++ src/hybrid/step/step_parse.h | 33 ++++++ src/hybrid/step/step_stash_tpk_config.cc | 22 ++++ src/hybrid/step/step_stash_tpk_config.h | 34 ++++++ src/wgt/CMakeLists.txt | 9 -- src/wgt/step/step_create_symbolic_link.cc | 9 +- src/wgt/step/step_encrypt_resources.cc | 7 +- src/wgt/step/step_encrypt_resources.h | 8 +- src/wgt/step/step_parse.cc | 12 ++- src/wgt/step/step_parse.h | 29 +----- src/wgt/wgt_app_query_interface.cc | 38 +++++-- src/wgt/wgt_app_query_interface.h | 11 ++ src/wgt/wgt_installer.cc | 2 + src/wgt_backend/CMakeLists.txt | 11 ++ src/{wgt => wgt_backend}/wgt_backend.cc | 14 ++- 26 files changed, 576 insertions(+), 57 deletions(-) create mode 100644 src/hybrid/CMakeLists.txt create mode 100644 src/hybrid/hybrid_backend_data.h create mode 100644 src/hybrid/hybrid_installer.cc create mode 100644 src/hybrid/hybrid_installer.h create mode 100644 src/hybrid/step/step_encrypt_resources.cc create mode 100644 src/hybrid/step/step_encrypt_resources.h create mode 100644 src/hybrid/step/step_merge_tpk_config.cc create mode 100644 src/hybrid/step/step_merge_tpk_config.h create mode 100644 src/hybrid/step/step_parse.cc create mode 100644 src/hybrid/step/step_parse.h create mode 100644 src/hybrid/step/step_stash_tpk_config.cc create mode 100644 src/hybrid/step/step_stash_tpk_config.h create mode 100644 src/wgt_backend/CMakeLists.txt rename src/{wgt => wgt_backend}/wgt_backend.cc (56%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 565d531..b9a8224 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ SET(CMAKE_CXX_FLAGS_CCOV "-O0 -std=c++11 -g --coverage") SET(TARGET_LIBNAME_WGT "wgt-installer") SET(TARGET_WGT_BACKEND "wgt-backend") SET(TARGET_SMOKE_TEST "smoke_test") +SET(TARGET_LIBNAME_HYBRID "hybrid-installer") ADD_DEFINITIONS("-Wall") ADD_DEFINITIONS("-Wextra") @@ -41,6 +42,7 @@ PKG_CHECK_MODULES(MANIFEST_HANDLERS_DEPS REQUIRED manifest-handlers) PKG_CHECK_MODULES(MANIFEST_PARSER_DEPS REQUIRED manifest-parser) PKG_CHECK_MODULES(PKGMGR_INSTALLER_DEPS REQUIRED pkgmgr-installer) PKG_CHECK_MODULES(ENCRYPTION_DEPS REQUIRED libwebappenc) +PKG_CHECK_MODULES(TPK_INSTALLER_DEPS REQUIRED tpk-installer) FIND_PACKAGE(Boost REQUIRED COMPONENTS system filesystem regex program_options) FIND_PACKAGE(GTest REQUIRED) diff --git a/packaging/wgt-backend.spec b/packaging/wgt-backend.spec index 9c001e1..fadbca2 100644 --- a/packaging/wgt-backend.spec +++ b/packaging/wgt-backend.spec @@ -20,6 +20,7 @@ BuildRequires: pkgconfig(manifest-parser) BuildRequires: pkgconfig(manifest-handlers) BuildRequires: pkgconfig(pkgmgr-installer) BuildRequires: pkgconfig(libwebappenc) +BuildRequires: pkgconfig(tpk-installer) %description This is a package that installs the WGT backend of pkgmgr. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f0e3653..0136fd6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,2 +1,4 @@ +ADD_SUBDIRECTORY(hybrid) ADD_SUBDIRECTORY(wgt) +ADD_SUBDIRECTORY(wgt_backend) ADD_SUBDIRECTORY(unit_tests) diff --git a/src/hybrid/CMakeLists.txt b/src/hybrid/CMakeLists.txt new file mode 100644 index 0000000..040d9fc --- /dev/null +++ b/src/hybrid/CMakeLists.txt @@ -0,0 +1,19 @@ +SET(SRCS + step/step_encrypt_resources.cc + step/step_merge_tpk_config.cc + step/step_parse.cc + step/step_stash_tpk_config.cc + hybrid_installer.cc +) +ADD_LIBRARY(${TARGET_LIBNAME_HYBRID} STATIC ${SRCS}) + +TARGET_INCLUDE_DIRECTORIES(${TARGET_LIBNAME_HYBRID} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../") + +# Target - deps +APPLY_PKG_CONFIG(${TARGET_LIBNAME_HYBRID} PUBLIC + TPK_INSTALLER_DEPS + Boost +) + +# Target - in-package deps +TARGET_LINK_LIBRARIES(${TARGET_LIBNAME_HYBRID} PRIVATE ${TARGET_LIBNAME_WGT}) diff --git a/src/hybrid/hybrid_backend_data.h b/src/hybrid/hybrid_backend_data.h new file mode 100644 index 0000000..c3a7d8b --- /dev/null +++ b/src/hybrid/hybrid_backend_data.h @@ -0,0 +1,34 @@ +// Copyright (c) 2015 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 HYBRID_HYBRID_BACKEND_DATA_H_ +#define HYBRID_HYBRID_BACKEND_DATA_H_ + +#include +#include +#include +#include + +#include +#include + +#include "wgt/wgt_backend_data.h" + +namespace hybrid { + +class HybridBackendData : public wgt::WgtBackendData { + public: + HybridBackendData() { } + ~HybridBackendData() override { + if (tpk_manifest_data.get()) + pkgmgr_parser_free_manifest_xml(tpk_manifest_data.get()); + } + + Property tpk_manifest_data; +}; + +} // namespace hybrid + +#endif // HYBRID_HYBRID_BACKEND_DATA_H_ + diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc new file mode 100644 index 0000000..7e75a28 --- /dev/null +++ b/src/hybrid/hybrid_installer.cc @@ -0,0 +1,168 @@ +// Copyright (c) 2015 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 "hybrid/hybrid_installer.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "hybrid/hybrid_backend_data.h" +#include "hybrid/step/step_encrypt_resources.h" +#include "hybrid/step/step_merge_tpk_config.h" +#include "hybrid/step/step_stash_tpk_config.h" +#include "hybrid/step/step_parse.h" +#include "wgt/step/step_check_settings_level.h" +#include "wgt/step/step_check_wgt_background_category.h" +#include "wgt/step/step_create_symbolic_link.h" +#include "wgt/step/step_generate_xml.h" +#include "wgt/step/step_remove_encryption_data.h" +#include "wgt/step/step_wgt_create_icons.h" +#include "wgt/step/step_wgt_create_storage_directories.h" +#include "wgt/step/step_wgt_copy_storage_directories.h" + +namespace ci = common_installer; + +namespace hybrid { + +HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) + : AppInstaller("wgt", pkgmgr) { + context_->backend_data.set(new HybridBackendData()); + + switch (pkgmgr_->GetRequestType()) { + case ci::RequestType::Install: + AddStep(pkgmgr_); + AddStep(); + AddStep(); + AddStep(); + AddStep(true); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + case ci::RequestType::Update: + AddStep(pkgmgr_); + AddStep(); + AddStep(); + AddStep(); + AddStep(true); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + case ci::RequestType::Uninstall: + AddStep(pkgmgr_); + // TODO(t.iwanek): this parses both configuration files + // tpk and wgt, removing pkgmgr-parser should change this code + // that it will still support parsing both files + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + case ci::RequestType::Reinstall: + // RDS is not supported for hybrid apps + AddStep(); + break; + case ci::RequestType::Delta: + AddStep(pkgmgr_); + AddStep(); + // TODO(t.iwanek): manifest is parsed twice... + AddStep(); + AddStep(); + AddStep(false); + AddStep(); + AddStep(); + AddStep(true); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); + break; + case ci::RequestType::Recovery: + // TODO(t.iwanek): implement recovery for hybrid apps if possible + AddStep(); + break; + default: + AddStep(); + break; + } +} + +} // namespace hybrid + diff --git a/src/hybrid/hybrid_installer.h b/src/hybrid/hybrid_installer.h new file mode 100644 index 0000000..9824d21 --- /dev/null +++ b/src/hybrid/hybrid_installer.h @@ -0,0 +1,31 @@ +// Copyright (c) 2015 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 HYBRID_HYBRID_INSTALLER_H_ +#define HYBRID_HYBRID_INSTALLER_H_ + +#include "common/app_installer.h" +#include "common/pkgmgr_interface.h" + +namespace hybrid { + +/** + * @brief The TpkInstaller class + * Handles request of installation of native part of hybrid package. + * + * Pkgmgr request is parsed within and sequence of steps is built to be run. + * + * This backend is called by wgt-backend if it encounters hybrid package to + * install native part of that package. + */ +class HybridInstaller : public common_installer::AppInstaller { + public: + explicit HybridInstaller(common_installer::PkgMgrPtr pkgmgr); + + SCOPE_LOG_TAG(HybridInstaller) +}; + +} // namespace hybrid + +#endif // HYBRID_HYBRID_INSTALLER_H_ diff --git a/src/hybrid/step/step_encrypt_resources.cc b/src/hybrid/step/step_encrypt_resources.cc new file mode 100644 index 0000000..a4411b6 --- /dev/null +++ b/src/hybrid/step/step_encrypt_resources.cc @@ -0,0 +1,16 @@ +// Copyright (c) 2015 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 "hybrid/step/step_encrypt_resources.h" + +namespace hybrid { +namespace encrypt { + +void StepEncryptResources::SetEncryptionRoot() { + input_ = context_->unpacked_dir_path.get() / "res/wgt"; +} + +} // namespace encrypt +} // namespace hybrid + diff --git a/src/hybrid/step/step_encrypt_resources.h b/src/hybrid/step/step_encrypt_resources.h new file mode 100644 index 0000000..c86e510 --- /dev/null +++ b/src/hybrid/step/step_encrypt_resources.h @@ -0,0 +1,33 @@ +// Copyright (c) 2015 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 HYBRID_STEP_STEP_ENCRYPT_RESOURCES_H_ +#define HYBRID_STEP_STEP_ENCRYPT_RESOURCES_H_ + +#include + +#include "wgt/step/step_encrypt_resources.h" + +namespace hybrid { +namespace encrypt { + +/** + * \brief Step that encrypt application resources files if flagged to do so + * + * This is variant for hybrid package + */ +class StepEncryptResources : public wgt::encrypt::StepEncryptResources { + public: + using wgt::encrypt::StepEncryptResources::StepEncryptResources; + + private: + void SetEncryptionRoot() override; + + SCOPE_LOG_TAG(EncryptResources) +}; + +} // namespace encrypt +} // namespace hybrid + +#endif // HYBRID_STEP_STEP_ENCRYPT_RESOURCES_H_ diff --git a/src/hybrid/step/step_merge_tpk_config.cc b/src/hybrid/step/step_merge_tpk_config.cc new file mode 100644 index 0000000..77f8407 --- /dev/null +++ b/src/hybrid/step/step_merge_tpk_config.cc @@ -0,0 +1,32 @@ +// Copyright (c) 2015 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 "hybrid/step/step_merge_tpk_config.h" + +#include + +#include "hybrid/hybrid_backend_data.h" + +namespace hybrid { +namespace parse { + +common_installer::Step::Status StepMergeTpkConfig::process() { + HybridBackendData* data = + static_cast(context_->backend_data.get()); + manifest_x* tpk_data = data->tpk_manifest_data.get(); + manifest_x* wgt_data = context_->manifest_data.get(); + + wgt_data->application = + g_list_concat(wgt_data->application, tpk_data->application); + tpk_data->application = nullptr; + + wgt_data->privileges = + g_list_concat(wgt_data->privileges, tpk_data->privileges); + tpk_data->privileges = nullptr; + + return Status::OK; +} + +} // namespace parse +} // namespace hybrid diff --git a/src/hybrid/step/step_merge_tpk_config.h b/src/hybrid/step/step_merge_tpk_config.h new file mode 100644 index 0000000..e8476ef --- /dev/null +++ b/src/hybrid/step/step_merge_tpk_config.h @@ -0,0 +1,34 @@ +// Copyright (c) 2015 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 HYBRID_STEP_STEP_MERGE_TPK_CONFIG_H_ +#define HYBRID_STEP_STEP_MERGE_TPK_CONFIG_H_ + +#include +#include + +namespace hybrid { +namespace parse { + +/** + * \brief MergeTpkConfig + * Merges information from tpk manifest into information from widget + * configuration for hybrid package. + */ +class StepMergeTpkConfig : public common_installer::Step { + public: + using Step::Step; + + Status process() override; + Status clean() override { return Status::OK; } + Status undo() override { return Status::OK; } + Status precheck() override { return Status::OK; } + + SCOPE_LOG_TAG(MergeTpkConfig) +}; + +} // namespace parse +} // namespace hybrid + +#endif // HYBRID_STEP_STEP_MERGE_TPK_CONFIG_H_ diff --git a/src/hybrid/step/step_parse.cc b/src/hybrid/step/step_parse.cc new file mode 100644 index 0000000..c15fa2a --- /dev/null +++ b/src/hybrid/step/step_parse.cc @@ -0,0 +1,22 @@ +// Copyright (c) 2015 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 "hybrid/step/step_parse.h" + +namespace { + +const char kResWgtPath[] = "res/wgt"; + +} + +namespace hybrid { +namespace parse { + +bool StepParse::LocateConfigFile() { + return Check(context_->unpacked_dir_path.get() / kResWgtPath); +} + +} // namespace parse +} // namespace hybrid + diff --git a/src/hybrid/step/step_parse.h b/src/hybrid/step/step_parse.h new file mode 100644 index 0000000..aff8a71 --- /dev/null +++ b/src/hybrid/step/step_parse.h @@ -0,0 +1,33 @@ +// Copyright (c) 2015 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 HYBRID_STEP_STEP_PARSE_H_ +#define HYBRID_STEP_STEP_PARSE_H_ + +#include + +#include "wgt/step/step_parse.h" + +namespace hybrid { +namespace parse { + +/** + * \brief This step parse config.xml configuration file of widget + * + * This subclass overrides location of file and it is used when hybrid package + * is installed. + */ +class StepParse : public wgt::parse::StepParse { + public: + using wgt::parse::StepParse::StepParse; + + bool LocateConfigFile() override; + + SCOPE_LOG_TAG(Parse) +}; + +} // namespace parse +} // namespace hybrid + +#endif // HYBRID_STEP_STEP_PARSE_H_ diff --git a/src/hybrid/step/step_stash_tpk_config.cc b/src/hybrid/step/step_stash_tpk_config.cc new file mode 100644 index 0000000..c409a44 --- /dev/null +++ b/src/hybrid/step/step_stash_tpk_config.cc @@ -0,0 +1,22 @@ +// Copyright (c) 2015 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 "hybrid/step/step_stash_tpk_config.h" + +#include "hybrid/hybrid_backend_data.h" + +namespace hybrid { +namespace parse { + +common_installer::Step::Status StepStashTpkConfig::process() { + HybridBackendData* data = + static_cast(context_->backend_data.get()); + data->tpk_manifest_data.set(context_->manifest_data.get()); + context_->manifest_data.set(nullptr); + + return Status::OK; +} + +} // namespace parse +} // namespace hybrid diff --git a/src/hybrid/step/step_stash_tpk_config.h b/src/hybrid/step/step_stash_tpk_config.h new file mode 100644 index 0000000..7db654c --- /dev/null +++ b/src/hybrid/step/step_stash_tpk_config.h @@ -0,0 +1,34 @@ +// Copyright (c) 2015 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 HYBRID_STEP_STEP_STASH_TPK_CONFIG_H_ +#define HYBRID_STEP_STEP_STASH_TPK_CONFIG_H_ + +#include +#include + +namespace hybrid { +namespace parse { + +/** + * \brief StepCheckHybrid + * Backups information about parsing tpk manifest file in backend_data + * structure. + */ +class StepStashTpkConfig : public common_installer::Step { + public: + using Step::Step; + + Status process() override; + Status clean() override { return Status::OK; } + Status undo() override { return Status::OK; } + Status precheck() override { return Status::OK; } + + SCOPE_LOG_TAG(StashTpkConfig) +}; + +} // namespace parse +} // namespace hybrid + +#endif // HYBRID_STEP_STEP_STASH_TPK_CONFIG_H_ diff --git a/src/wgt/CMakeLists.txt b/src/wgt/CMakeLists.txt index d1201bb..a1ee89c 100644 --- a/src/wgt/CMakeLists.txt +++ b/src/wgt/CMakeLists.txt @@ -31,10 +31,8 @@ ENDIF(WRT_LAUNCHER) # Target - definition ADD_LIBRARY(${TARGET_LIBNAME_WGT} STATIC ${SRCS}) -ADD_EXECUTABLE(${TARGET_WGT_BACKEND} "wgt_backend.cc") # Target - includes TARGET_INCLUDE_DIRECTORIES(${TARGET_LIBNAME_WGT} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../") -TARGET_INCLUDE_DIRECTORIES(${TARGET_WGT_BACKEND} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../") # Target - deps APPLY_PKG_CONFIG(${TARGET_LIBNAME_WGT} PUBLIC APP_INSTALLERS_DEPS @@ -44,10 +42,3 @@ APPLY_PKG_CONFIG(${TARGET_LIBNAME_WGT} PUBLIC ENCRYPTION_DEPS Boost ) - -# Target - in-package deps -TARGET_LINK_LIBRARIES(${TARGET_WGT_BACKEND} PRIVATE ${TARGET_LIBNAME_WGT}) - -# Install -INSTALL(TARGETS ${TARGET_LIBNAME_WGT} DESTINATION ${LIB_INSTALL_DIR}) -INSTALL(TARGETS ${TARGET_WGT_BACKEND} DESTINATION ${BINDIR}) diff --git a/src/wgt/step/step_create_symbolic_link.cc b/src/wgt/step/step_create_symbolic_link.cc index 1a3eda2..d8a18e7 100644 --- a/src/wgt/step/step_create_symbolic_link.cc +++ b/src/wgt/step/step_create_symbolic_link.cc @@ -33,10 +33,11 @@ common_installer::Step::Status StepCreateSymbolicLink::process() { boost::system::error_code error; for (application_x* app : GListRange(context_->manifest_data.get()->application)) { + // filter out non-wgt apps as this step is run for hybrid backend too + if (strcmp("webapp", app->type) != 0) + continue; // binary is a symbolic link named and is located in / - bf::path exec_path = - context_->pkg_path.get() - / bf::path("bin"); + bf::path exec_path = context_->pkg_path.get() / bf::path("bin"); common_installer::CreateDir(exec_path); exec_path /= bf::path(app->appid); @@ -52,7 +53,7 @@ common_installer::Step::Status StepCreateSymbolicLink::process() { return Step::Status::ERROR; } } - LOG(DEBUG) << "Successfully parse tizen manifest xml"; + LOG(DEBUG) << "Symlinks created successfully"; return Status::OK; } diff --git a/src/wgt/step/step_encrypt_resources.cc b/src/wgt/step/step_encrypt_resources.cc index 08f659d..51c1aec 100644 --- a/src/wgt/step/step_encrypt_resources.cc +++ b/src/wgt/step/step_encrypt_resources.cc @@ -19,7 +19,6 @@ #include #include - namespace { const std::set encryptSet { ".html", ".htm", ".css", ".js"}; @@ -40,7 +39,7 @@ common_installer::Step::Status StepEncryptResources::precheck() { return common_installer::Step::Status::ERROR; } - input_ = context_->unpacked_dir_path.get(); + SetEncryptionRoot(); if (input_.empty()) { LOG(ERROR) << "unpacked_dir_path attribute is empty"; @@ -200,6 +199,10 @@ bool StepEncryptResources::EncryptFile(const bf::path &src) { return true; } +void StepEncryptResources::SetEncryptionRoot() { + input_ = context_->unpacked_dir_path.get(); +} + bool StepEncryptResources::ToBeEncrypted(const bf::path &file) { size_t found_key = file.string().rfind("."); if (std::string::npos != found_key) { diff --git a/src/wgt/step/step_encrypt_resources.h b/src/wgt/step/step_encrypt_resources.h index 2d64a51..d6a8b19 100644 --- a/src/wgt/step/step_encrypt_resources.h +++ b/src/wgt/step/step_encrypt_resources.h @@ -53,14 +53,20 @@ class StepEncryptResources : public common_installer::Step { */ Status precheck() override; + protected: + boost::filesystem::path input_; + private: + virtual void SetEncryptionRoot(); + bool Encrypt(const boost::filesystem::path &src); bool EncryptFile(const boost::filesystem::path &src); bool ToBeEncrypted(const boost::filesystem::path &file); WgtBackendData* backend_data_; - boost::filesystem::path input_; SCOPE_LOG_TAG(EncryptResources) }; + } // namespace encrypt } // namespace wgt + #endif // WGT_STEP_STEP_ENCRYPT_RESOURCES_H_ diff --git a/src/wgt/step/step_parse.cc b/src/wgt/step/step_parse.cc index 315a46d..392196e 100644 --- a/src/wgt/step/step_parse.cc +++ b/src/wgt/step/step_parse.cc @@ -526,7 +526,8 @@ common_installer::Step::Status StepParse::process() { if (perm_info) permissions = perm_info->GetAPIPermissions(); - std::unique_ptr backend_data(new WgtBackendData()); + WgtBackendData* backend_data = + static_cast(context_->backend_data.get()); std::shared_ptr settings_info = std::static_pointer_cast( @@ -535,8 +536,6 @@ common_installer::Step::Status StepParse::process() { if (settings_info) backend_data->settings.set(*settings_info); - context_->backend_data.set(backend_data.release()); - LOG(DEBUG) << " Read data -[ "; LOG(DEBUG) << "App id: " << info->id(); LOG(DEBUG) << " package = " << info->package(); @@ -553,13 +552,16 @@ common_installer::Step::Status StepParse::process() { LOG(DEBUG) << " ]-"; LOG(DEBUG) << "]-"; + // TODO(t.iwanek): In delta mode this step is running two times + if (context_->manifest_data.get()) + pkgmgr_parser_free_manifest_xml(context_->manifest_data.get()); + context_->manifest_data.set(manifest); return common_installer::Step::Status::OK; } bool StepParse::Check(const boost::filesystem::path& widget_path) { - boost::filesystem::path config = widget_path; - config /= "config.xml"; + boost::filesystem::path config = widget_path / "config.xml"; LOG(DEBUG) << "config.xml path: " << config; diff --git a/src/wgt/step/step_parse.h b/src/wgt/step/step_parse.h index 115ccf0..e1f2547 100644 --- a/src/wgt/step/step_parse.h +++ b/src/wgt/step/step_parse.h @@ -23,43 +23,16 @@ namespace wgt { namespace parse { /** - * \brief This step parse manifest.xml document + * \brief This step parse config.xml configuration file of widget */ class StepParse : public common_installer::Step { public: - /** - * \brief Explicit constructor - * - * \param context Installer context - * \param check_start_file Flag if start file should be validated - */ explicit StepParse(common_installer::InstallerContext* context, bool check_start_file); - /** - * \brief - */ Status process() override; - - /** - * \brief Empty method - * - * \return Status::OK - */ Status clean() override { return Status::OK; } - - /** - * \brief Empty method - * - * \return Status::OK - */ Status undo() override { return Status::OK; } - - /** - * \brief Empty method - * - * \return Status::OK - */ Status precheck() override { return Status::OK; } protected: diff --git a/src/wgt/wgt_app_query_interface.cc b/src/wgt/wgt_app_query_interface.cc index 2a8e046..3f42f71 100644 --- a/src/wgt/wgt_app_query_interface.cc +++ b/src/wgt/wgt_app_query_interface.cc @@ -32,10 +32,14 @@ namespace ci = common_installer; namespace { -std::string GetInstallationPackagePath(int argc, char** argv) { +const char kHybridConfigLocation[] = "res/wgt/config.xml"; +const char kTizenManifestLocation[] = "tizen-manifest.xml"; + +std::string GetInstallationRequestInfo(int argc, char** argv) { std::string path; for (int i = 0; i < argc; ++i) { - if (!strcmp(argv[i], "-i")) { + if (!strcmp(argv[i], "-i") || !strcmp(argv[i], "-r") || + !strcmp(argv[i], "-d") || !strcmp(argv[i], "-b")) { if (i + 1 < argc) { path = argv[i + 1]; break; @@ -46,6 +50,8 @@ std::string GetInstallationPackagePath(int argc, char** argv) { } std::string GetPkgIdFromPath(const std::string& path) { + if (!bf::exists(path)) + return {}; bf::path tmp_path = common_installer::GenerateTmpDir("/tmp"); bs::error_code code; bf::create_directories(tmp_path, code); @@ -87,15 +93,35 @@ std::string GetPkgIdFromPath(const std::string& path) { namespace wgt { bool WgtAppQueryInterface::IsAppInstalledByArgv(int argc, char** argv) { - std::string path = GetInstallationPackagePath(argc, argv); - if (path.empty()) { - // not the installaton + std::string path = GetInstallationRequestInfo(argc, argv); + if (path.empty()) return false; - } std::string pkg_id = GetPkgIdFromPath(path); if (pkg_id.empty()) return false; return ci::IsPackageInstalled(pkg_id, ci::GetRequestMode()); } +bool WgtAppQueryInterface::IsHybridApplication(int argc, char** argv) { + std::string arg = GetInstallationRequestInfo(argc, argv); + if (ci::IsPackageInstalled(arg, ci::GetRequestMode())) { + bf::path package_directory(ci::GetRootAppPath()); + if (bf::exists(package_directory / kTizenManifestLocation) && + bf::exists(package_directory / kHybridConfigLocation)) + return true; + } else { + bool tizen_manifest_found = false; + bool config_xml_found = false; + if (!ci::CheckPathInZipArchive(arg.c_str(), kTizenManifestLocation, + &tizen_manifest_found)) + return false; + if (!ci::CheckPathInZipArchive(arg.c_str(), kHybridConfigLocation, + &config_xml_found)) + return false; + if (tizen_manifest_found && config_xml_found) + return true; + } + return false; +} + } // namespace wgt diff --git a/src/wgt/wgt_app_query_interface.h b/src/wgt/wgt_app_query_interface.h index 40a9a07..8c3776a 100644 --- a/src/wgt/wgt_app_query_interface.h +++ b/src/wgt/wgt_app_query_interface.h @@ -26,6 +26,17 @@ class WgtAppQueryInterface : public common_installer::AppQueryInterface { * \return true if package is installed */ bool IsAppInstalledByArgv(int argc, char** argv) override; + + /** + * \brief This method is workaround for detecting installation of hybrid + * application. + * + * \param argc main() argc argument passed to the backend + * \param argv main() argv argument passed to the backend + * + * \return true if package is hybrid + */ + bool IsHybridApplication(int argc, char** argv); }; } // namespace wgt diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index f2be1cd..6f117b3 100644 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -63,6 +63,8 @@ namespace wgt { WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) : AppInstaller("wgt", pkgrmgr) { + context_->backend_data.set(new WgtBackendData()); + /* treat the request */ switch (pkgmgr_->GetRequestType()) { case ci::RequestType::Install : { diff --git a/src/wgt_backend/CMakeLists.txt b/src/wgt_backend/CMakeLists.txt new file mode 100644 index 0000000..54f886e --- /dev/null +++ b/src/wgt_backend/CMakeLists.txt @@ -0,0 +1,11 @@ +# Target - definition +ADD_EXECUTABLE(${TARGET_WGT_BACKEND} "wgt_backend.cc") +# Target - includes +TARGET_INCLUDE_DIRECTORIES(${TARGET_WGT_BACKEND} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../") + +# Target - in-package deps +TARGET_LINK_LIBRARIES(${TARGET_WGT_BACKEND} PRIVATE ${TARGET_LIBNAME_WGT}) +TARGET_LINK_LIBRARIES(${TARGET_WGT_BACKEND} PRIVATE ${TARGET_LIBNAME_HYBRID}) + +# Install +INSTALL(TARGETS ${TARGET_WGT_BACKEND} DESTINATION ${BINDIR}) diff --git a/src/wgt/wgt_backend.cc b/src/wgt_backend/wgt_backend.cc similarity index 56% rename from src/wgt/wgt_backend.cc rename to src/wgt_backend/wgt_backend.cc index 576e861..3d59c2e 100644 --- a/src/wgt/wgt_backend.cc +++ b/src/wgt_backend/wgt_backend.cc @@ -6,6 +6,7 @@ #include #include +#include "hybrid/hybrid_installer.h" #include "wgt/wgt_app_query_interface.h" #include "wgt/wgt_installer.h" @@ -18,6 +19,15 @@ int main(int argc, char** argv) { LOG(ERROR) << "Options of pkgmgr installer cannot be parsed"; return EINVAL; } - wgt::WgtInstaller installer(pkgmgr); - return (installer.Run() == ci::AppInstaller::Result::OK) ? 0 : 1; + + // This is workaround for hybrid apps as they requires much different flow + // but installer does not branch at all in current design + if (query_interface.IsHybridApplication(argc, argv)) { + LOG(INFO) << "Hybrid package detected"; + hybrid::HybridInstaller installer(pkgmgr); + return (installer.Run() == ci::AppInstaller::Result::OK) ? 0 : 1; + } else { + wgt::WgtInstaller installer(pkgmgr); + return (installer.Run() == ci::AppInstaller::Result::OK) ? 0 : 1; + } } -- 2.7.4 From 35604245e23261c1b53835067d13076787f67aed Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Thu, 14 Jan 2016 15:14:57 +0100 Subject: [PATCH 09/11] Clean up of storage dirs code - fix update in hybrid app installation Fixes some issue in code handling storage directories. Due to requirement of copying wgt's shared/ directory is addition, situation where: - common create storage directories step - create directories for tpk - wgt create storage directories step - create directories for wgt should be changed to: - common create storage directories step - create directories for tpk and wgt - wgt create storage directories step - only patches shared/ directory with widget shared/ before common step Change-Id: I10f94eafbe31497ad5216f1f5e1ce1abf81bbd44 --- src/hybrid/hybrid_installer.cc | 26 ++-- src/wgt/CMakeLists.txt | 3 +- src/wgt/step/step_wgt_copy_storage_directories.cc | 172 --------------------- src/wgt/step/step_wgt_copy_storage_directories.h | 58 ------- .../step/step_wgt_create_storage_directories.cc | 102 ------------ src/wgt/step/step_wgt_create_storage_directories.h | 77 --------- src/wgt/step/step_wgt_patch_storage_directories.cc | 72 +++++++++ src/wgt/step/step_wgt_patch_storage_directories.h | 39 +++++ src/wgt/wgt_installer.cc | 13 +- 9 files changed, 135 insertions(+), 427 deletions(-) delete mode 100644 src/wgt/step/step_wgt_copy_storage_directories.cc delete mode 100644 src/wgt/step/step_wgt_copy_storage_directories.h delete mode 100644 src/wgt/step/step_wgt_create_storage_directories.cc delete mode 100644 src/wgt/step/step_wgt_create_storage_directories.h create mode 100644 src/wgt/step/step_wgt_patch_storage_directories.cc create mode 100644 src/wgt/step/step_wgt_patch_storage_directories.h diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index 7e75a28..c8ec5ad 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -10,7 +10,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -43,8 +45,7 @@ #include "wgt/step/step_generate_xml.h" #include "wgt/step/step_remove_encryption_data.h" #include "wgt/step/step_wgt_create_icons.h" -#include "wgt/step/step_wgt_create_storage_directories.h" -#include "wgt/step/step_wgt_copy_storage_directories.h" +#include "wgt/step/step_wgt_patch_storage_directories.h" namespace ci = common_installer; @@ -69,11 +70,12 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - AddStep(); - AddStep(); - AddStep(); AddStep(); AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -96,11 +98,12 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - AddStep(); - AddStep(); - AddStep(); AddStep(); AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -145,11 +148,12 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); - AddStep(); - AddStep(); - AddStep(); AddStep(); AddStep(); + AddStep(); + AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); diff --git a/src/wgt/CMakeLists.txt b/src/wgt/CMakeLists.txt index a1ee89c..7f32240 100644 --- a/src/wgt/CMakeLists.txt +++ b/src/wgt/CMakeLists.txt @@ -13,8 +13,7 @@ SET(SRCS step/step_rds_modify.cc step/step_wgt_backup_icons.cc step/step_wgt_create_icons.cc - step/step_wgt_create_storage_directories.cc - step/step_wgt_copy_storage_directories.cc + step/step_wgt_patch_storage_directories.cc step/step_wgt_recover_icons.cc step/step_wgt_resource_directory.cc step/step_add_default_privileges.cc diff --git a/src/wgt/step/step_wgt_copy_storage_directories.cc b/src/wgt/step/step_wgt_copy_storage_directories.cc deleted file mode 100644 index fc2e366..0000000 --- a/src/wgt/step/step_wgt_copy_storage_directories.cc +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2015 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/step_wgt_copy_storage_directories.h" - -#include -#include -#include - -#include - -namespace bf = boost::filesystem; -namespace bs = boost::system; - -namespace { - -const char kDataLocation[] = "data"; -const char kSharedLocation[] = "shared"; -const char kSharedDataLocation[] = "shared/data"; -const char kSharedTrustedLocation[] = "shared/trusted"; -const char kResWgtSubPath[] = "res/wgt"; -const char kTemporaryData[] = "tmp"; -} // namespace - -namespace wgt { -namespace filesystem { - -common_installer::Step::Status StepWgtCopyStorageDirectories::process() { - Status status = CreatePrivateTmpDir(); - if (status != Status::OK) - return status; - if (!CacheDir()) - return Status::APP_DIR_ERROR; - - int version = context_->manifest_data.get()->api_version[0] - '0'; - if (version < 3) { - LOG(DEBUG) << "Shared directory coping for tizen 2.x"; - return StepCopyStorageDirectories::process(); - } - - LOG(DEBUG) << "Shared directory coping for tizen 3.x"; - status = CopySharedDirectory(); - if (status != Status::OK) - return status; - - return CopyDataDirectory(); -} - -common_installer::Step::Status StepWgtCopyStorageDirectories::undo() { - int version = context_->manifest_data.get()->api_version[0] - '0'; - if (version < 3) { - LOG(DEBUG) << "Shared directory coping for tizen 2.x"; - return StepCopyStorageDirectories::undo(); - } - - UndoSharedDirectory(); - UndoDataDirectory(); - return Status::OK; -} - -void StepWgtCopyStorageDirectories::UndoSharedDirectory() { - if (!MoveAppStorage(context_->pkg_path.get(), - backup_path_, - kSharedDataLocation)) { - LOG(ERROR) << - "Failed to undo moving of shared/data directory for widget in update"; - } - - if (!MoveAppStorage(context_->pkg_path.get(), - backup_path_, - kSharedTrustedLocation)) { - LOG(ERROR) << "Failed to undo moving of shared/trusted directory" - << "for widget in update"; - } -} - -void StepWgtCopyStorageDirectories::UndoDataDirectory() { - if (!MoveAppStorage(context_->pkg_path.get(), - backup_path_, - kDataLocation)) { - LOG(ERROR) - << "Failed to undo moving of private directory for widget in update"; - } -} - -common_installer::Step::Status -StepWgtCopyStorageDirectories::HandleWgtSharedDirectory() { - bf::path res_wgt_path = context_->pkg_path.get() / kResWgtSubPath; - bf::path shared_source = res_wgt_path / kSharedLocation; - bf::path shared_destination = context_->pkg_path.get() / kSharedLocation; - - // Move shared if exist in wgt - if (bf::exists(shared_source)) { - if (!common_installer::MoveDir(shared_source, shared_destination)) { - LOG(ERROR) << "Failed to move shared data from res/wgt to shared"; - return Status::ERROR; - } - } - - // Create shared directory if not present yet - if (!bf::exists(shared_destination)) { - bs::error_code error_code; - bf::create_directory(shared_destination, error_code); - if (error_code) { - LOG(ERROR) << "Failed to create shared storage directory"; - return Status::ERROR; - } - } - - // Symlink created shared directory - bs::error_code error_code; - bf::create_symlink(shared_destination, shared_source, error_code); - if (error_code) { - LOG(ERROR) << "Failed to create symbolic link for shared dir" - << boost::system::system_error(error_code).what(); - return Status::ERROR; - } - return Status::OK; -} - -common_installer::Step::Status -StepWgtCopyStorageDirectories::CopySharedDirectory() { - Status status = HandleWgtSharedDirectory(); - if (status != Status::OK) - return status; - - if (!MoveAppStorage(backup_path_, - context_->pkg_path.get(), - kSharedDataLocation)) { - LOG(ERROR) << - "Failed to restore shared/data directory for widget in update"; - return Status::ERROR; - } - - if (!MoveAppStorage(backup_path_, - context_->pkg_path.get(), - kSharedTrustedLocation)) { - LOG(ERROR) << - "Failed to restore shared/trusted directory for widget in update"; - return Status::ERROR; - } - - return Status::OK; -} - -common_installer::Step::Status -StepWgtCopyStorageDirectories::CopyDataDirectory() { - if (!MoveAppStorage(backup_path_, - context_->pkg_path.get(), - kDataLocation)) { - LOG(ERROR) << "Failed to restore private directory for widget in update"; - return Status::ERROR; - } - return Status::OK; -} - -common_installer::Step::Status -StepWgtCopyStorageDirectories::CreatePrivateTmpDir() { - bs::error_code error_code; - bf::path tmp_path = context_->pkg_path.get() / kTemporaryData; - bf::create_directory(tmp_path, error_code); - if (error_code) { - LOG(ERROR) << "Failed to create private temporary directory for package"; - return Status::ERROR; - } - return Status::OK; -} - -} // namespace filesystem -} // namespace wgt - diff --git a/src/wgt/step/step_wgt_copy_storage_directories.h b/src/wgt/step/step_wgt_copy_storage_directories.h deleted file mode 100644 index 18eac47..0000000 --- a/src/wgt/step/step_wgt_copy_storage_directories.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2015 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_STEP_WGT_COPY_STORAGE_DIRECTORIES_H_ -#define WGT_STEP_STEP_WGT_COPY_STORAGE_DIRECTORIES_H_ - -#include - -#include - -namespace wgt { -namespace filesystem { - -/** - * \brief Update installation (WGT). - * Responsible for coping shared and data directories. - * It extends StepCopyStorageDirectories (it adds distinction between - * 2.x and 3.x shared dir handling - */ -class StepWgtCopyStorageDirectories - : public common_installer::filesystem::StepCopyStorageDirectories { - public: - using StepCopyStorageDirectories::StepCopyStorageDirectories; - - /** - * \brief Create shared and private directories, - * and copy/restore widget files to appropriate directory - * - * \return Status::ERROR when failed to create temporary location, - * private temporary location, or failed to restore - * shared/private directory for widget, - * Status::OK otherwise - */ - Status process() override; - - /** - * \brief Move files from shared/private directories back to source directory - * - * \return Status::OK - */ - Status undo() override; - - private: - Status CopySharedDirectory(); - Status CopyDataDirectory(); - Status HandleWgtSharedDirectory(); - void UndoSharedDirectory(); - void UndoDataDirectory(); - Status CreatePrivateTmpDir(); - - SCOPE_LOG_TAG(CopyWgtStorageDirectories) -}; - -} // namespace filesystem -} // namespace wgt - -#endif // WGT_STEP_STEP_WGT_COPY_STORAGE_DIRECTORIES_H_ diff --git a/src/wgt/step/step_wgt_create_storage_directories.cc b/src/wgt/step/step_wgt_create_storage_directories.cc deleted file mode 100644 index d50d072..0000000 --- a/src/wgt/step/step_wgt_create_storage_directories.cc +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2015 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/step_wgt_create_storage_directories.h" - -#include -#include -#include - -#include - -namespace bf = boost::filesystem; -namespace bs = boost::system; - -namespace { - -const char kSharedLocation[] = "shared"; -const char kResWgtSubPath[] = "res/wgt"; -const char kTemporaryData[] = "tmp"; - -} // namespace - -namespace wgt { -namespace filesystem { - -common_installer::Step::Status StepWgtCreateStorageDirectories::process() { - if (!PrivateDir()) - return Status::APP_DIR_ERROR; - - char version = context_->manifest_data.get()->api_version[0]; - - if ((version-'0') < 3) { - LOG(DEBUG) << "Shared directory preparation for tizen 2.x"; - if (!ShareDir()) - return Status::APP_DIR_ERROR; - } else { - LOG(DEBUG) << "Shared directory preparation for tizen 3.x"; - if (!ShareDirFor3x()) - return Status::APP_DIR_ERROR; - } - - if (!SubShareDir()) - return Status::APP_DIR_ERROR; - - if (!CreatePrivateTmpDir()) - return Status::APP_DIR_ERROR; - - if (!CacheDir()) - return Status::APP_DIR_ERROR; - - return Status::OK; -} - -bool StepWgtCreateStorageDirectories::ShareDirFor2x() { - bs::error_code error_code; - bf::path shared_path = context_->pkg_path.get() / kSharedLocation; - bf::create_directory(shared_path, error_code); - if (error_code) { - LOG(ERROR) << "Failed to create shared directory for widget"; - return false; - } - return true; -} - -bool StepWgtCreateStorageDirectories::ShareDirFor3x() { - bf::path res_wgt_path = context_->pkg_path.get() / kResWgtSubPath; - if (!bf::exists(res_wgt_path / kSharedLocation)) { - if (!ShareDir()) - return false; - } else { - bf::path src = res_wgt_path / kSharedLocation; - bf::path dst = context_->pkg_path.get() / kSharedLocation; - if (!common_installer::MoveDir(src, dst)) { - LOG(ERROR) << "Failed to move shared data from res/wgt to shared"; - return false; - } - - bs::error_code error_code; - bf::create_symlink(dst, src, error_code); - if (error_code) { - LOG(ERROR) << "Failed to create symbolic link for shared dir" - << boost::system::system_error(error_code).what(); - return false; - } - } // else - return true; -} - -bool StepWgtCreateStorageDirectories::CreatePrivateTmpDir() { - bs::error_code error_code; - bf::path tmp_path = context_->pkg_path.get() / kTemporaryData; - bf::create_directory(tmp_path, error_code); - if (error_code) { - LOG(ERROR) << "Failed to create private temporary directory for package"; - return false; - } - return true; -} - -} // namespace filesystem -} // namespace wgt diff --git a/src/wgt/step/step_wgt_create_storage_directories.h b/src/wgt/step/step_wgt_create_storage_directories.h deleted file mode 100644 index 789c5ee..0000000 --- a/src/wgt/step/step_wgt_create_storage_directories.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2015 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_STEP_WGT_CREATE_STORAGE_DIRECTORIES_H_ -#define WGT_STEP_STEP_WGT_CREATE_STORAGE_DIRECTORIES_H_ - -#include - -#include - -namespace wgt { -namespace filesystem { - -/** - * \brief Installation (WGT). - * Responsible for creating shared and data directories. - * It extends StepCreateStorageDirectories (it adds distinction between - * 2.x and 3.x shared dir handling - * - * process method implements creation of shared and data directories. - * Depending on tizen required version it can also move "shared" resources - * from ./res/wgt/shared to ./shared dir (and create symlink back - * to ./res/wgt/shared). - * - * StepWgtCreateStorageDirectories works on following directory: - * * TZ_SYS_RW/PKGID (/usr/apps/PKGID) - * * TZ_SER_APPS/PKGID (/{HOME}/apps_rw/PKGID) - */ -class StepWgtCreateStorageDirectories : - public common_installer::filesystem::StepCreateStorageDirectories { - public: - using StepCreateStorageDirectories::StepCreateStorageDirectories; - - /** - * \brief Create shared and private directories - * - * \return Status::ERROR when failed to create temporary location, or - * private temporary location - * Status::OK otherwise - */ - Status process() override; - - /** - * \brief Empty method - * - * \return Status::OK - */ - Status clean() override { return Status::OK; } - - /** - * \brief Empty method - * - * \return Status::OK - */ - Status undo() override { return Status::OK; } - - /** - * \brief Empty method - * - * \return Status::OK - */ - Status precheck() override { return Status::OK; } - - private: - bool ShareDirFor2x(); - bool ShareDirFor3x(); - - bool CreatePrivateTmpDir(); - - SCOPE_LOG_TAG(CreateWgtStorageDirectories) -}; - -} // namespace filesystem -} // namespace wgt - -#endif // WGT_STEP_STEP_WGT_CREATE_STORAGE_DIRECTORIES_H_ diff --git a/src/wgt/step/step_wgt_patch_storage_directories.cc b/src/wgt/step/step_wgt_patch_storage_directories.cc new file mode 100644 index 0000000..c6a7a94 --- /dev/null +++ b/src/wgt/step/step_wgt_patch_storage_directories.cc @@ -0,0 +1,72 @@ +// Copyright (c) 2015 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/step_wgt_patch_storage_directories.h" + +#include +#include +#include + +#include + +namespace bf = boost::filesystem; +namespace bs = boost::system; + +namespace { + +const char kSharedLocation[] = "shared"; +const char kResWgtSubPath[] = "res/wgt"; +const char kTemporaryData[] = "tmp"; + +} // namespace + +namespace wgt { +namespace filesystem { + +common_installer::Step::Status StepWgtPatchStorageDirectories::process() { + if (!CreatePrivateTmpDir()) + return Status::APP_DIR_ERROR; + + char version = context_->manifest_data.get()->api_version[0]; + if ((version-'0') >= 3) { + LOG(DEBUG) << "Copying widget's shared/ directory"; + if (!ShareDirFor3x()) + return Status::APP_DIR_ERROR; + } + + return Status::OK; +} + +bool StepWgtPatchStorageDirectories::ShareDirFor3x() { + bf::path src = context_->pkg_path.get() / kResWgtSubPath / kSharedLocation; + bf::path dst = context_->pkg_path.get() / kSharedLocation; + if (!common_installer::MoveDir(src, dst, + common_installer::FS_MERGE_DIRECTORIES)) { + LOG(ERROR) << "Failed to move shared data from res/wgt to shared"; + return false; + } + + bs::error_code error_code; + bf::create_symlink(dst, src, error_code); + if (error_code) { + LOG(ERROR) << "Failed to create symbolic link for shared dir" + << boost::system::system_error(error_code).what(); + return false; + } + return true; +} + +bool StepWgtPatchStorageDirectories::CreatePrivateTmpDir() { + bs::error_code error_code; + bf::path tmp_path = context_->pkg_path.get() / kTemporaryData; + bf::create_directory(tmp_path, error_code); + if (error_code) { + LOG(ERROR) << "Failed to create private temporary directory for package"; + return false; + } + return true; +} + +} // namespace filesystem +} // namespace wgt diff --git a/src/wgt/step/step_wgt_patch_storage_directories.h b/src/wgt/step/step_wgt_patch_storage_directories.h new file mode 100644 index 0000000..89992df --- /dev/null +++ b/src/wgt/step/step_wgt_patch_storage_directories.h @@ -0,0 +1,39 @@ +// Copyright (c) 2015 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_STEP_WGT_PATCH_STORAGE_DIRECTORIES_H_ +#define WGT_STEP_STEP_WGT_PATCH_STORAGE_DIRECTORIES_H_ + +#include +#include + +namespace wgt { +namespace filesystem { + +/** + * \brief Installation (WGT). + * Responsible for copying widgets shared/ directory into package's + * shared/ directory for tizen widget with api version > 3.0 + */ +class StepWgtPatchStorageDirectories : + public common_installer::Step { + public: + using Step::Step; + + Status process() override; + Status clean() override { return Status::OK; } + Status undo() override { return Status::OK; } + Status precheck() override { return Status::OK; } + + private: + bool ShareDirFor3x(); + bool CreatePrivateTmpDir(); + + SCOPE_LOG_TAG(PatchWgtStorageDirectories) +}; + +} // namespace filesystem +} // namespace wgt + +#endif // WGT_STEP_STEP_WGT_PATCH_STORAGE_DIRECTORIES_H_ diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index 6f117b3..54e4bf0 100644 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -51,9 +52,8 @@ #include "wgt/step/step_rds_parse.h" #include "wgt/step/step_remove_encryption_data.h" #include "wgt/step/step_wgt_backup_icons.h" -#include "wgt/step/step_wgt_copy_storage_directories.h" #include "wgt/step/step_wgt_create_icons.h" -#include "wgt/step/step_wgt_create_storage_directories.h" +#include "wgt/step/step_wgt_patch_storage_directories.h" #include "wgt/step/step_wgt_recover_icons.h" #include "wgt/step/step_wgt_resource_directory.h" @@ -79,7 +79,8 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -102,7 +103,8 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -151,7 +153,8 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); -- 2.7.4 From accca51d6a9e4e8384e3d131a2a459c7b86ad866 Mon Sep 17 00:00:00 2001 From: Lukasz Wysocki Date: Fri, 15 Jan 2016 11:11:29 +0100 Subject: [PATCH 10/11] Style and code fix Change-Id: I2579598545e3539944c78fcf0bc93f220eaf3512 --- src/wgt/step/step_wgt_backup_icons.cc | 3 ++- src/wgt/step/step_wgt_create_icons.cc | 5 +++-- src/wgt/step/step_wgt_recover_icons.cc | 2 +- src/wgt/step/step_wgt_recover_icons.h | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/wgt/step/step_wgt_backup_icons.cc b/src/wgt/step/step_wgt_backup_icons.cc index c1d63e0..5544182 100644 --- a/src/wgt/step/step_wgt_backup_icons.cc +++ b/src/wgt/step/step_wgt_backup_icons.cc @@ -5,6 +5,7 @@ #include "wgt/step/step_wgt_backup_icons.h" #include +#include namespace { const char kSharedRes[] = "shared/res"; @@ -16,7 +17,7 @@ namespace wgt { namespace backup { common_installer::Step::Status StepWgtBackupIcons::process() { - // TODO (l.wysocki): As a temporary solution this will move icons into two + // TODO(l.wysocki): As a temporary solution this will move icons into two // destinations respectively {HOME}/.applications/icons, // and {APP_ROOT}/shared/res, when some project will stop using old // location ({HOME}/.applications/icons) then it can be removed from here. diff --git a/src/wgt/step/step_wgt_create_icons.cc b/src/wgt/step/step_wgt_create_icons.cc index 1bd73eb..c38f4c7 100644 --- a/src/wgt/step/step_wgt_create_icons.cc +++ b/src/wgt/step/step_wgt_create_icons.cc @@ -5,6 +5,7 @@ #include "wgt/step/step_wgt_create_icons.h" #include +#include #include "common/utils/glist_range.h" @@ -19,7 +20,7 @@ namespace wgt { namespace filesystem { common_installer::Step::Status StepWgtCreateIcons::process() { - // TODO (l.wysocki): As a temporary solution this will copy icons into two + // TODO(l.wysocki): As a temporary solution this will copy icons into two // destinations respectively {HOME}/.applications/icons, // and {APP_ROOT}/shared/res, when some project will stop using old // location ({HOME}/.applications/icons) then it can be removed from here. @@ -35,7 +36,7 @@ common_installer::Step::Status StepWgtCreateIcons::process() { icon_x* icon = reinterpret_cast(app->icon->data); bf::path icon_path = StepCreateIcons::GetIconRoot() / icon->text; if (icon->text) - free((void *)icon->text); + free(const_cast(icon->text)); icon->text = strdup(icon_path.c_str()); } } diff --git a/src/wgt/step/step_wgt_recover_icons.cc b/src/wgt/step/step_wgt_recover_icons.cc index 0149b78..995e609 100644 --- a/src/wgt/step/step_wgt_recover_icons.cc +++ b/src/wgt/step/step_wgt_recover_icons.cc @@ -16,7 +16,7 @@ namespace wgt { namespace filesystem { std::vector StepWgtRecoverIcons::GetIconsPaths() { - // TODO (l.wysocki): As a temporary solution this will move icons into two + // TODO(l.wysocki): As a temporary solution this will move icons into two // destinations respectively {HOME}/.applications/icons, // and {APP_ROOT}/shared/res, when some project will stop using old // location ({HOME}/.applications/icons) then it can be removed from here. diff --git a/src/wgt/step/step_wgt_recover_icons.h b/src/wgt/step/step_wgt_recover_icons.h index cf63981..5f88113 100644 --- a/src/wgt/step/step_wgt_recover_icons.h +++ b/src/wgt/step/step_wgt_recover_icons.h @@ -6,6 +6,7 @@ #define WGT_STEP_STEP_WGT_RECOVER_ICONS_H_ #include +#include namespace wgt { namespace filesystem { -- 2.7.4 From 782d65d706b0bc46e12a2e041a9331893c788f6c Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Mon, 18 Jan 2016 10:31:48 +0100 Subject: [PATCH 11/11] Fix icon copying Icons element are receiving full path in StepParse from now for both wgt and tpk backend and all modes. Steps: - StepCreateIcons - StepBackupIcons - StepRecoverIcons - StepRemoveIcons handles icon files only outside package directory (those in: $HOME/.applications/icons/*) Icons within application directories are copied together with whole package directory (StepCopy) and are not managed by those steps. To handle copying icons within package directory new steps are introduced: - StepWgtPatchIcons (copy to $package/shared/res/ from widget content directory) - StepTpkPatchIcons (copy to $package/shared/res/ if they are in different location, e.g. preload apps) Following changes needs to be submitted together: - https://review.tizen.org/gerrit/57258 (wgt-backend) - https://review.tizen.org/gerrit/57257 (app-installers) - https://review.tizen.org/gerrit/57259 (tpk-backend) Verify by: $ /usr/bin/tpk-backend-ut/smoke_test --gtest_filter=SmokeTest.UpdateMode_Tpk $ /usr/bin/tpk-backend-ut/smoke_test --gtest_filter=SmokeTest.InstallationMode_Tpk $ /usr/bin/tpk-backend-ut/smoke_test --gtest_filter=SmokeTest.DeltaMode_Tpk $ /usr/bin/wgt-backend-ut/smoke_test --gtest_filter=SmokeTest.InstallationMode $ /usr/bin/wgt-backend-ut/smoke_test --gtest_filter=SmokeTest.UpdateMode $ /usr/bin/wgt-backend-ut/smoke_test --gtest_filter=SmokeTest.RDSMode $ /usr/bin/wgt-backend-ut/smoke_test --gtest_filter=SmokeTest.DeltaMode $ /usr/bin/wgt-backend-ut/smoke_test --gtest_filter=SmokeTest.UpdateMode_Rollback $ /usr/bin/wgt-backend-ut/smoke_test --gtest_filter=SmokeTest.InstallationMode_Rollback Change-Id: I8c5d3ba513bb47eed571c3363f657eacb429f82f --- src/hybrid/hybrid_installer.cc | 12 ++++--- src/wgt/CMakeLists.txt | 4 +-- src/wgt/step/step_generate_xml.cc | 23 ++------------ src/wgt/step/step_parse.cc | 15 ++++++++- src/wgt/step/step_wgt_backup_icons.cc | 31 ------------------ src/wgt/step/step_wgt_backup_icons.h | 36 --------------------- src/wgt/step/step_wgt_create_icons.cc | 56 --------------------------------- src/wgt/step/step_wgt_create_icons.h | 47 ---------------------------- src/wgt/step/step_wgt_patch_icons.cc | 57 ++++++++++++++++++++++++++++++++++ src/wgt/step/step_wgt_patch_icons.h | 37 ++++++++++++++++++++++ src/wgt/step/step_wgt_recover_icons.cc | 31 ------------------ src/wgt/step/step_wgt_recover_icons.h | 36 --------------------- src/wgt/wgt_app_query_interface.cc | 14 +++++++-- src/wgt/wgt_installer.cc | 26 +++++++++------- 14 files changed, 147 insertions(+), 278 deletions(-) delete mode 100644 src/wgt/step/step_wgt_backup_icons.cc delete mode 100644 src/wgt/step/step_wgt_backup_icons.h delete mode 100644 src/wgt/step/step_wgt_create_icons.cc delete mode 100644 src/wgt/step/step_wgt_create_icons.h create mode 100644 src/wgt/step/step_wgt_patch_icons.cc create mode 100644 src/wgt/step/step_wgt_patch_icons.h delete mode 100644 src/wgt/step/step_wgt_recover_icons.cc delete mode 100644 src/wgt/step/step_wgt_recover_icons.h diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index c8ec5ad..d044c7e 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -33,6 +33,7 @@ #include #include +#include #include "hybrid/hybrid_backend_data.h" #include "hybrid/step/step_encrypt_resources.h" @@ -44,7 +45,7 @@ #include "wgt/step/step_create_symbolic_link.h" #include "wgt/step/step_generate_xml.h" #include "wgt/step/step_remove_encryption_data.h" -#include "wgt/step/step_wgt_create_icons.h" +#include "wgt/step/step_wgt_patch_icons.h" #include "wgt/step/step_wgt_patch_storage_directories.h" namespace ci = common_installer; @@ -70,8 +71,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); + AddStep(); AddStep(); - AddStep(); AddStep(); AddStep(); AddStep(); @@ -98,8 +100,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); + AddStep(); AddStep(); - AddStep(); AddStep(); AddStep(); AddStep(); @@ -148,8 +151,9 @@ HybridInstaller::HybridInstaller(common_installer::PkgMgrPtr pkgmgr) AddStep(); AddStep(); AddStep(); + AddStep(); + AddStep(); AddStep(); - AddStep(); AddStep(); AddStep(); AddStep(); diff --git a/src/wgt/CMakeLists.txt b/src/wgt/CMakeLists.txt index 7f32240..b68e08b 100644 --- a/src/wgt/CMakeLists.txt +++ b/src/wgt/CMakeLists.txt @@ -11,10 +11,8 @@ SET(SRCS step/step_parse_recovery.cc step/step_rds_parse.cc step/step_rds_modify.cc - step/step_wgt_backup_icons.cc - step/step_wgt_create_icons.cc + step/step_wgt_patch_icons.cc step/step_wgt_patch_storage_directories.cc - step/step_wgt_recover_icons.cc step/step_wgt_resource_directory.cc step/step_add_default_privileges.cc wgt_app_query_interface.cc diff --git a/src/wgt/step/step_generate_xml.cc b/src/wgt/step/step_generate_xml.cc index 6be0750..b2090be 100644 --- a/src/wgt/step/step_generate_xml.cc +++ b/src/wgt/step/step_generate_xml.cc @@ -132,30 +132,13 @@ common_installer::Step::Status StepGenerateXml::GenerateApplicationCommonXml( xmlTextWriterEndElement(writer); } - // icon is renamed to if (app->icon) { icon_x* iconx = reinterpret_cast(app->icon->data); - bf::path app_icon = context_->pkg_path.get(); - // TODO(t.iwanek): type should not be used here - if (context_->pkg_type.get() == "wgt") { - app_icon /= "res/wgt"; - } else { - app_icon /= "shared/res"; - } - app_icon /= iconx->text; - bf::path icon = app->appid; - if (app_icon.has_extension()) - icon += app_icon.extension(); - else - icon += bf::path(".png"); - - if (bf::exists(app_icon)) { - xmlTextWriterWriteFormatElement(writer, BAD_CAST "icon", - "%s", BAD_CAST icon.c_str()); - } + 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 package"; + LOG(DEBUG) << "Icon was not found in application"; } for (image_x* image : GListRange(app->image)) { diff --git a/src/wgt/step/step_parse.cc b/src/wgt/step/step_parse.cc index 392196e..bab1d10 100644 --- a/src/wgt/step/step_parse.cc +++ b/src/wgt/step/step_parse.cc @@ -5,6 +5,8 @@ #include "wgt/step/step_parse.h" +#include + #include #include #include @@ -36,6 +38,8 @@ #include "wgt/wgt_backend_data.h" +namespace bf = boost::filesystem; + namespace { const std::string kManifestVersion = "1.0.0"; @@ -108,13 +112,22 @@ bool StepParse::FillInstallationInfo(manifest_x* manifest) { } bool StepParse::FillIconPaths(manifest_x* manifest) { + std::shared_ptr app_info = + std::static_pointer_cast( + parser_->GetManifestData(app_keys::kTizenApplicationKey)); + if (!app_info) { + LOG(ERROR) << "Application info manifest data has not been found."; + return false; + } std::shared_ptr icons_info = std::static_pointer_cast( parser_->GetManifestData(app_keys::kIconsKey)); if (icons_info.get()) { for (auto& application_icon : icons_info->icons()) { icon_x* icon = reinterpret_cast (calloc(1, sizeof(icon_x))); - icon->text = strdup(application_icon.path().c_str()); + bf::path icon_path = context_->root_application_path.get() + / app_info->package() / "res" / "wgt" / application_icon.path(); + icon->text = strdup(icon_path.c_str()); icon->lang = strdup(DEFAULT_LOCALE); manifest->icon = g_list_append(manifest->icon, icon); } diff --git a/src/wgt/step/step_wgt_backup_icons.cc b/src/wgt/step/step_wgt_backup_icons.cc deleted file mode 100644 index 5544182..0000000 --- a/src/wgt/step/step_wgt_backup_icons.cc +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved -// Use of this source code is governed by a apache 2.0 license that can be -// found in the LICENSE file. - -#include "wgt/step/step_wgt_backup_icons.h" - -#include -#include - -namespace { -const char kSharedRes[] = "shared/res"; - -namespace bf = boost::filesystem; -} // namespace - -namespace wgt { -namespace backup { - -common_installer::Step::Status StepWgtBackupIcons::process() { - // TODO(l.wysocki): As a temporary solution this will move icons into two - // destinations respectively {HOME}/.applications/icons, - // and {APP_ROOT}/shared/res, when some project will stop using old - // location ({HOME}/.applications/icons) then it can be removed from here. - std::vector paths { getIconPath(context_->uid.get()), - context_->root_application_path.get() - / context_->pkgid.get() / kSharedRes }; - return MoveIcons(paths); -} - -} // namespace backup -} // namespace wgt diff --git a/src/wgt/step/step_wgt_backup_icons.h b/src/wgt/step/step_wgt_backup_icons.h deleted file mode 100644 index dc62760..0000000 --- a/src/wgt/step/step_wgt_backup_icons.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved -// Use of this source code is governed by a apache 2.0 license that can be -// found in the LICENSE file. - -#ifndef WGT_STEP_STEP_WGT_BACKUP_ICONS_H_ -#define WGT_STEP_STEP_WGT_BACKUP_ICONS_H_ - -#include -#include - -namespace wgt { -namespace backup { - -/** - *\brief Step responsible for creating backup for icons during update and - * uninstallation. - * Used by WGT backend - */ -class StepWgtBackupIcons : public common_installer::backup::StepBackupIcons { - public: - using StepBackupIcons::StepBackupIcons; - - /** - * \brief main logic of backuping icons - * - * \return Status::OK, if successful backup, Status::ERROR otherwise - */ - Status process() override; - - SCOPE_LOG_TAG(WgtBackupIcons) -}; - -} // namespace backup -} // namespace wgt - -#endif // WGT_STEP_STEP_WGT_BACKUP_ICONS_H_ diff --git a/src/wgt/step/step_wgt_create_icons.cc b/src/wgt/step/step_wgt_create_icons.cc deleted file mode 100644 index c38f4c7..0000000 --- a/src/wgt/step/step_wgt_create_icons.cc +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2015 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/step_wgt_create_icons.h" - -#include -#include - -#include "common/utils/glist_range.h" - -namespace bf = boost::filesystem; -namespace ci = common_installer; - -namespace { -const char kResWgt[] = "res/wgt"; -} // namespace - -namespace wgt { -namespace filesystem { - -common_installer::Step::Status StepWgtCreateIcons::process() { - // TODO(l.wysocki): As a temporary solution this will copy icons into two - // destinations respectively {HOME}/.applications/icons, - // and {APP_ROOT}/shared/res, when some project will stop using old - // location ({HOME}/.applications/icons) then it can be removed from here. - std::vector paths { getIconPath(context_->uid.get()), - StepCreateIcons::GetIconRoot() }; - - // explicit step for wgt apps to add absolute path to icon in order to - // store it in db - ci::Step::Status result = CopyIcons(paths); - for (application_x* app : - GListRange(context_->manifest_data.get()->application)) { - if (app->icon) { - icon_x* icon = reinterpret_cast(app->icon->data); - bf::path icon_path = StepCreateIcons::GetIconRoot() / icon->text; - if (icon->text) - free(const_cast(icon->text)); - icon->text = strdup(icon_path.c_str()); - } - } - return result; -} - -boost::filesystem::path StepWgtCreateIcons::GetIconRoot() const { - return context_->pkg_path.get() / kResWgt; -} - -std::string StepWgtCreateIcons::GetAppTypeForIcons() const { - return "webapp"; -} - -} // namespace filesystem -} // namespace wgt - diff --git a/src/wgt/step/step_wgt_create_icons.h b/src/wgt/step/step_wgt_create_icons.h deleted file mode 100644 index a9501a3..0000000 --- a/src/wgt/step/step_wgt_create_icons.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2015 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_STEP_WGT_CREATE_ICONS_H_ -#define WGT_STEP_STEP_WGT_CREATE_ICONS_H_ - -#include - -#include - -#include - -namespace wgt { -namespace filesystem { - -/** - * \brief This step return path to widget icon - */ -class StepWgtCreateIcons - : public common_installer::filesystem::StepCreateIcons { - public: - using StepCreateIcons::StepCreateIcons; - - Status process() override; - - /** - * \brief Return path to widget icon - * - * \return path to widget icon - */ - boost::filesystem::path GetIconRoot() const override; - - /** - * \brief Return type of application for which icons should be created - * - * \return application type - */ - std::string GetAppTypeForIcons() const override; - - SCOPE_LOG_TAG(WgtCreateIcons) -}; - -} // namespace filesystem -} // namespace wgt - -#endif // WGT_STEP_STEP_WGT_CREATE_ICONS_H_ diff --git a/src/wgt/step/step_wgt_patch_icons.cc b/src/wgt/step/step_wgt_patch_icons.cc new file mode 100644 index 0000000..45da3de --- /dev/null +++ b/src/wgt/step/step_wgt_patch_icons.cc @@ -0,0 +1,57 @@ +// Copyright (c) 2015 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/step_wgt_patch_icons.h" + +#include + +#include "common/utils/file_util.h" +#include "common/utils/glist_range.h" + +namespace bf = boost::filesystem; +namespace bs = boost::system; +namespace ci = common_installer; + +namespace { +const char kResWgt[] = "res/wgt"; +} // namespace + +namespace wgt { +namespace filesystem { + +common_installer::Step::Status StepWgtPatchIcons::process() { + bf::path common_icon_location = context_->pkg_path.get() / "shared" / "res"; + bs::error_code error; + bf::create_directories(common_icon_location, error); + for (application_x* app : + GListRange(context_->manifest_data.get()->application)) { + 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"; + + 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()); + } + } + return Status::OK; +} + +} // namespace filesystem +} // namespace wgt + diff --git a/src/wgt/step/step_wgt_patch_icons.h b/src/wgt/step/step_wgt_patch_icons.h new file mode 100644 index 0000000..c5eabaa --- /dev/null +++ b/src/wgt/step/step_wgt_patch_icons.h @@ -0,0 +1,37 @@ +// Copyright (c) 2015 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_STEP_WGT_PATCH_ICONS_H_ +#define WGT_STEP_STEP_WGT_PATCH_ICONS_H_ + +#include + +#include + +#include + +namespace wgt { +namespace filesystem { + +/** + * @brief The StepWgtPatchIcons class + * Copy widget icons to standard location of icons - shared/res/ + * where StepCreateIcons excepts icons to be. + */ +class StepWgtPatchIcons : public common_installer::Step { + public: + using Step::Step; + + Status process() override; + Status undo() override { return Status::OK; } + Status clean() override { return Status::OK; } + Status precheck() override { return Status::OK; } + + SCOPE_LOG_TAG(WgtPatchIcons) +}; + +} // namespace filesystem +} // namespace wgt + +#endif // WGT_STEP_STEP_WGT_PATCH_ICONS_H_ diff --git a/src/wgt/step/step_wgt_recover_icons.cc b/src/wgt/step/step_wgt_recover_icons.cc deleted file mode 100644 index 995e609..0000000 --- a/src/wgt/step/step_wgt_recover_icons.cc +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2015 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/step_wgt_recover_icons.h" - -#include - -namespace { -const char kSharedRes[] = "shared/res"; - -namespace bf = boost::filesystem; -} // namespace - -namespace wgt { -namespace filesystem { - -std::vector StepWgtRecoverIcons::GetIconsPaths() { - // TODO(l.wysocki): As a temporary solution this will move icons into two - // destinations respectively {HOME}/.applications/icons, - // and {APP_ROOT}/shared/res, when some project will stop using old - // location ({HOME}/.applications/icons) then it can be removed from here. - std::vector paths { bf::path(getIconPath(context_->uid.get())), - context_->root_application_path.get() - / context_->pkgid.get() / kSharedRes }; - return paths; -} - -} // namespace filesystem -} // namespace wgt - diff --git a/src/wgt/step/step_wgt_recover_icons.h b/src/wgt/step/step_wgt_recover_icons.h deleted file mode 100644 index 5f88113..0000000 --- a/src/wgt/step/step_wgt_recover_icons.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2015 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_STEP_WGT_RECOVER_ICONS_H_ -#define WGT_STEP_STEP_WGT_RECOVER_ICONS_H_ - -#include -#include - -namespace wgt { -namespace filesystem { - -/** - * @brief The StepRecoverIcons class - * Fixes state of platform icon files in recovery mode. - * - * For recovery of new installation, all icons files are removed. - * For recovery of update installation, all icons of applications of package are - * restored to its previous locations. - */ -class StepWgtRecoverIcons : - public common_installer::filesystem::StepRecoverIcons { - public: - using StepRecoverIcons::StepRecoverIcons; - - protected: - virtual std::vector GetIconsPaths(); - - SCOPE_LOG_TAG(WgtRecoverIcons) -}; - -} // namespace filesystem -} // namespace wgt - -#endif // WGT_STEP_STEP_WGT_RECOVER_ICONS_H_ diff --git a/src/wgt/wgt_app_query_interface.cc b/src/wgt/wgt_app_query_interface.cc index 3f42f71..0dc580d 100644 --- a/src/wgt/wgt_app_query_interface.cc +++ b/src/wgt/wgt_app_query_interface.cc @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -88,6 +89,13 @@ std::string GetPkgIdFromPath(const std::string& path) { return pkg_id; } +std::string ReadPkgidFromRecovery(const std::string& recovery_path) { + std::unique_ptr recovery_file = + ci::recovery::RecoveryFile::OpenRecoveryFileForPath(recovery_path); + recovery_file->Detach(); + return recovery_file->pkgid(); +} + } // namespace namespace wgt { @@ -104,10 +112,12 @@ bool WgtAppQueryInterface::IsAppInstalledByArgv(int argc, char** argv) { 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::IsPackageInstalled(arg, ci::GetRequestMode())) { bf::path package_directory(ci::GetRootAppPath()); - if (bf::exists(package_directory / kTizenManifestLocation) && - bf::exists(package_directory / kHybridConfigLocation)) + if (bf::exists(package_directory / arg / kTizenManifestLocation) && + bf::exists(package_directory / arg / kHybridConfigLocation)) return true; } else { bool tizen_manifest_found = false; diff --git a/src/wgt/wgt_installer.cc b/src/wgt/wgt_installer.cc index 54e4bf0..c4d5ca9 100644 --- a/src/wgt/wgt_installer.cc +++ b/src/wgt/wgt_installer.cc @@ -8,7 +8,9 @@ #include #include +#include #include +#include #include #include #include @@ -22,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -51,10 +54,8 @@ #include "wgt/step/step_rds_modify.h" #include "wgt/step/step_rds_parse.h" #include "wgt/step/step_remove_encryption_data.h" -#include "wgt/step/step_wgt_backup_icons.h" -#include "wgt/step/step_wgt_create_icons.h" +#include "wgt/step/step_wgt_patch_icons.h" #include "wgt/step/step_wgt_patch_storage_directories.h" -#include "wgt/step/step_wgt_recover_icons.h" #include "wgt/step/step_wgt_resource_directory.h" namespace ci = common_installer; @@ -82,7 +83,8 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -101,12 +103,13 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); AddStep(); AddStep(); - AddStep(); AddStep(); - AddStep(); + AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -151,12 +154,13 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); AddStep(); AddStep(); - AddStep(); AddStep(); - AddStep(); + AddStep(); + AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); @@ -168,7 +172,7 @@ WgtInstaller::WgtInstaller(ci::PkgMgrPtr pkgrmgr) AddStep(); AddStep(); AddStep(); - AddStep(); + AddStep(); AddStep(); AddStep(); AddStep(); -- 2.7.4