From 3f94aa2adc56182771d74b06c04ace785de4fe0a Mon Sep 17 00:00:00 2001 From: "jk7744.park" Date: Fri, 4 Mar 2016 12:52:15 +0900 Subject: [PATCH] Tizen 2.4.0 rev3 SDK Public Release --- CMakeLists.txt | 6 + backend/src/coretpk/coretpk-installer.c | 181 ++++++++++++++++----- .../src/coretpk/xml-parser/coretpk-parser-hybrid.c | 2 +- backend/src/vconf/rpm-vconf-intf.c | 11 ++ common/rpm-installer-util.c | 5 + inc/rpm-installer-util.h | 2 + packaging/rpm-installer.spec | 3 +- 7 files changed, 171 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2d1b14..a349f6e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,12 @@ SET(VERSION 1.0) set(CMAKE_SKIP_BUILD_RPATH true) +IF(TIZEN_VERSION) + ADD_DEFINITIONS("-DTIZEN_VERSION=\"${TIZEN_VERSION}\"") +ELSE(TIZEN_VERSION) + message(FATAL_ERROR "TIZEN_VERSION MUST BE declared on build flag.") +ENDIF(TIZEN_VERSION) + configure_file(rpm_installer_deactvation_list.txt.in rpm_installer_deactvation_list.txt @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/rpm_installer_deactvation_list.txt DESTINATION /opt/share/packages/.pkgmgr/rpm-installer/) diff --git a/backend/src/coretpk/coretpk-installer.c b/backend/src/coretpk/coretpk-installer.c index 72ab12c..0edcc5b 100755 --- a/backend/src/coretpk/coretpk-installer.c +++ b/backend/src/coretpk/coretpk-installer.c @@ -56,6 +56,74 @@ extern GList *privilege_list; int _coretpk_installer_get_group_id(char *pkgid, char **result); void _coretpk_installer_set_privilege_setup_path(char *pkgid, char *dirpath, app_path_type_t type, char *label); +int __coretpk_patch_padded_api_version(const char *api_version, char **pad_api_version) +{ + char *pad_version = NULL; + char *ptr_fw = NULL; + char *ptr_bw = NULL; + + pad_version = strdup(api_version); + if (pad_version == NULL) { + _LOGE("out of memory"); + return RPM_INSTALLER_ERR_NOT_ENOUGH_MEMORY; + } + + ptr_fw = strchr(pad_version, '.'); + ptr_bw = strrchr(pad_version, '.'); + + if (ptr_fw && ptr_bw) { + if (ptr_fw == ptr_bw) { + pad_version = strncat(pad_version, ".0", BUF_SIZE - strlen(pad_version) - 1); + } + } + + *pad_api_version = pad_version; + + return RPM_INSTALLER_SUCCESS; +} + +static int __coretpk_compare_with_platform_version(const char *api_version) +{ + char *current_version = NULL; + char *platform_version = NULL; + int ret = 0; + int result = 0; + + if (!api_version) { + _LOGE("Invalid parameter"); + return RPM_INSTALLER_ERR_WRONG_PARAM; + } + + if (strlen(api_version) == 0) { + _LOGD("No api-version, assume same with platform api-version"); + return RPM_INSTALLER_SUCCESS; + } + + ret = __coretpk_patch_padded_api_version(api_version, ¤t_version); + if (ret != RPM_INSTALLER_SUCCESS) { + return RPM_INSTALLER_ERR_WRONG_PARAM; + } + + ret = __coretpk_patch_padded_api_version(TIZEN_VERSION, &platform_version); + if (ret != RPM_INSTALLER_SUCCESS) { + return RPM_INSTALLER_ERR_WRONG_PARAM; + } + + _LOGD("platform_version(%s) vs. current_version(%s)", platform_version, current_version); + + result = strverscmp(platform_version, current_version); + if (result < 0) { + ret = RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION; + } else { + ret = RPM_INSTALLER_SUCCESS; + } + + FREE_AND_NULL(current_version); + FREE_AND_NULL(platform_version); + + return ret; +} + static int __get_unzip_size(const char *item, unsigned long long *size) { if (!item || !size) { @@ -641,21 +709,20 @@ int _coretpk_installer_set_smack_label_transmute(const char *path, const char *f return 0; } -int _coretpk_installer_verify_privilege_list(GList *privilege_list, int visibility, const char *api_version) +int _coretpk_installer_verify_privilege_list(const char *pkg_id, GList *privilege_list, int visibility, const char *api_version) { char *error_privilege_name = NULL; GList *list = NULL; int ret = 0; + char buf[BUF_SIZE] = { '\0' }; ret = privilege_manager_verify_privilege(api_version, PRVMGR_PACKAGE_TYPE_CORE, privilege_list, visibility, &error_privilege_name); if (ret != PRVMGR_ERR_NONE) { _LOGE("privilege_manager_verify_privilege_list(PRVMGR_PACKAGE_TYPE_CORE) failed. ret = [%d][%s]", ret, error_privilege_name); fprintf(stdout, "\n verify_privilege_list(PRVMGR_PACKAGE_TYPE_CORE) failed. [%d][%s]\n", ret, error_privilege_name); - if (!error_privilege_name) { - ret = RPM_INSTALLER_ERR_SIG_VERIFICATION_FAILED; - goto err; - } + if (!error_privilege_name) + error_privilege_name = strdup("Unidentified privilege error"); if (strstr(error_privilege_name, "[DEPRECATED_PRIVILEGE]") != NULL) ret = RPM_INSTALLER_ERR_PRIVILEGE_USING_LEGACY_FAILED; @@ -667,9 +734,11 @@ int _coretpk_installer_verify_privilege_list(GList *privilege_list, int visibili _LOGE("Unidentified privilege error : [%s]", error_privilege_name); ret = RPM_INSTALLER_ERR_SIG_VERIFICATION_FAILED; } - } else { + + snprintf(buf, BUF_SIZE - 1, "%d:%s", ret, error_privilege_name); + _ri_broadcast_privilege_notification(pkg_id, "coretpk", "error", buf); + } else _LOGD("privilege_manager_verify_privilege_list(PRVMGR_PACKAGE_TYPE_CORE) is ok."); - } err: @@ -2111,6 +2180,25 @@ int _coretpk_installer_package_install(char *pkgfile, char *pkgid, char *clienti _ri_broadcast_status_notification(pkgid, "coretpk", "start", "install"); _LOGD("[#]start : _coretpk_installer_package_install[%s]", pkgid); + /*get pkginfo*/ + info = _coretpk_installer_get_pkgfile_info(pkgfile); + if (info == NULL || (strlen(info->package_name) == 0)) { + _LOGE("failed to get pkg info"); + ret = RPM_INSTALLER_ERR_INTERNAL; + goto err; + } + + /*compare package's api version with platform version*/ + ret = __coretpk_compare_with_platform_version(info->api_version); + if (ret != RPM_INSTALLER_SUCCESS) { + if (ret == RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION) { + _LOGE("Unable to install. Platform version[%s] < Package version[%s]", + TIZEN_VERSION, info->api_version); + } + ret = RPM_INSTALLER_ERR_INTERNAL; + goto err; + } + /*send event for install_percent*/ _ri_broadcast_status_notification(pkgid, "coretpk", "install_percent", "30"); @@ -2163,7 +2251,7 @@ int _coretpk_installer_package_install(char *pkgfile, char *pkgid, char *clienti _LOGD("signature and certificate are verified successfully."); } - /*chdir*/ + /*chdir*/ ret = chdir(cwd); if (ret != 0) { _LOGL("chdir()", errno); @@ -2234,13 +2322,6 @@ int _coretpk_installer_package_install(char *pkgfile, char *pkgid, char *clienti goto err; } - info = _coretpk_installer_get_pkgfile_info(pkgfile); - if (info == NULL || (strlen(info->package_name) == 0)) { - _LOGE("failed to get pkg info"); - ret = RPM_INSTALLER_ERR_INTERNAL; - goto err; - } - if (strlen(info->api_version) != 0) { ret = _ri_privilege_set_package_version(pkgid, info->api_version); if (ret != 0) @@ -2260,7 +2341,7 @@ int _coretpk_installer_package_install(char *pkgfile, char *pkgid, char *clienti // Check privilege and visibility if (privilege_list) { - ret = _coretpk_installer_verify_privilege_list(privilege_list, visibility, info->api_version); + ret = _coretpk_installer_verify_privilege_list(pkgid, privilege_list, visibility, info->api_version); if (ret != 0) { goto err; } else { @@ -2327,8 +2408,10 @@ err: } char *errorstr = NULL; - _ri_error_no_to_string(ret, &errorstr); - _ri_broadcast_status_notification(pkgid, "coretpk", "error", errorstr); + if (ret < RPM_INSTALLER_ERR_PRIVILEGE_UNAUTHORIZED || ret > RPM_INSTALLER_ERR_PRIVILEGE_USING_LEGACY_FAILED) { + _ri_error_no_to_string(ret, &errorstr); + _ri_broadcast_status_notification(pkgid, "coretpk", "error", errorstr); + } sleep(2); _LOGE("_coretpk_installer_package_install is failed."); @@ -2387,6 +2470,25 @@ int _coretpk_installer_package_upgrade(char *pkgfile, char *pkgid, char *clienti /*send event for start*/ _ri_broadcast_status_notification(pkgid, "coretpk", "start", "update"); + /*get pkginfo*/ + info = _coretpk_installer_get_pkgfile_info(pkgfile); + if (info == NULL || strlen(info->package_name) == 0) { + _LOGE("failed to get pkg info"); + ret = RPM_INSTALLER_ERR_INTERNAL; + goto err; + } + + /*compare package's api version with platform version*/ + ret = __coretpk_compare_with_platform_version(info->api_version); + if (ret != RPM_INSTALLER_SUCCESS) { + if (ret == RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION) { + _LOGE("Unable to install. Platform version[%s] < Package version[%s]", + TIZEN_VERSION, info->api_version); + } + ret = RPM_INSTALLER_ERR_INTERNAL; + goto err; + } + /*terminate running app*/ ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkghandle); if (ret < 0) { @@ -2397,7 +2499,7 @@ int _coretpk_installer_package_upgrade(char *pkgfile, char *pkgid, char *clienti pkgmgrinfo_appinfo_get_list(pkghandle, PMINFO_UI_APP, __ri_check_running_app, NULL); pkgmgrinfo_pkginfo_destroy_pkginfo(pkghandle); - /*remove dir for clean*/ + /*remove dir for clean*/ __ri_remove_updated_dir(pkgid); /* pre_upgrade */ @@ -2447,7 +2549,7 @@ int _coretpk_installer_package_upgrade(char *pkgfile, char *pkgid, char *clienti _LOGD("#signature and certificate verifying success"); } - /*chdir*/ + /*chdir*/ ret = chdir(cwd); if (ret != 0) { _LOGL("chdir()", errno); @@ -2531,16 +2633,9 @@ int _coretpk_installer_package_upgrade(char *pkgfile, char *pkgid, char *clienti } _LOGD("#permission applying success."); - info = _coretpk_installer_get_pkgfile_info(pkgfile); - if (info == NULL || strlen(info->package_name) == 0) { - _LOGE("failed to get pkg info"); - ret = RPM_INSTALLER_ERR_INTERNAL; - goto err; - } - // Check privilege and visibility if (privilege_list) { - ret = _coretpk_installer_verify_privilege_list(privilege_list, visibility, info->api_version); + ret = _coretpk_installer_verify_privilege_list(pkgid, privilege_list, visibility, info->api_version); if (ret != 0) { goto err; } else { @@ -3250,7 +3345,7 @@ int _coretpk_installer_package_reinstall(char *pkgid, char *clientid) _LOGD("signature and certificate verifying success"); } - /*chdir*/ + /*chdir*/ ret = chdir(cwd); if (ret != 0) { _LOGL("chdir()", errno); @@ -3284,6 +3379,25 @@ int _coretpk_installer_package_reinstall(char *pkgid, char *clientid) goto err; } + /*get pkginfo*/ + info = _coretpk_installer_get_pkg_info(manifest); + if (info == NULL || strlen(info->package_name) == 0) { + _LOGE("failed to get pkg info"); + ret = RPM_INSTALLER_ERR_INTERNAL; + goto err; + } + + /*compare package's api version with platform version*/ + ret = __coretpk_compare_with_platform_version(info->api_version); + if (ret != RPM_INSTALLER_SUCCESS) { + if (ret == RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION) { + _LOGE("Unable to install. Platform version[%s] < Package version[%s]", + TIZEN_VERSION, info->api_version); + } + ret = RPM_INSTALLER_ERR_INTERNAL; + goto err; + } + /*Parse the manifest to get install location and size. If failed, remove manifest info from DB.*/ ret = pkgmgr_parser_parse_manifest_for_upgrade(manifest, NULL); if (ret < 0) { @@ -3322,16 +3436,9 @@ int _coretpk_installer_package_reinstall(char *pkgid, char *clientid) } _LOGD("#permission applying success."); - info = _coretpk_installer_get_pkg_info(manifest); - if (info == NULL || strlen(info->package_name) == 0) { - _LOGE("failed to get pkg info"); - ret = RPM_INSTALLER_ERR_INTERNAL; - goto err; - } - // Check privilege and visibility if (privilege_list) { - ret = _coretpk_installer_verify_privilege_list(privilege_list, visibility, info->api_version); + ret = _coretpk_installer_verify_privilege_list(pkgid, privilege_list, visibility, info->api_version); if (ret != 0) { goto err; } else { diff --git a/backend/src/coretpk/xml-parser/coretpk-parser-hybrid.c b/backend/src/coretpk/xml-parser/coretpk-parser-hybrid.c index 3208b3a..495dec2 100755 --- a/backend/src/coretpk/xml-parser/coretpk-parser-hybrid.c +++ b/backend/src/coretpk/xml-parser/coretpk-parser-hybrid.c @@ -569,7 +569,7 @@ int _coretpk_installer_hybrid_convert_manifest(char *manifest, const char* pkgid ret = mkdir(TEMP_XML_DIR, DIRECTORY_PERMISSION_755); if (ret != 0 && errno != EEXIST) { - _LOGE("mkdir()", errno); + _LOGE("mkdir(%d)", errno); return RPM_INSTALLER_ERR_INTERNAL; } diff --git a/backend/src/vconf/rpm-vconf-intf.c b/backend/src/vconf/rpm-vconf-intf.c index 41413da..ba2c56f 100755 --- a/backend/src/vconf/rpm-vconf-intf.c +++ b/backend/src/vconf/rpm-vconf-intf.c @@ -161,6 +161,17 @@ void _ri_save_last_input_info(char *pkgid, int reqcommand, int options) _LOGE("vconf_keylist_free FAIL\n"); } +void _ri_broadcast_privilege_notification(const char *pkgid, const char *pkgtype, const char *key, const char *val) +{ + int ret_val = 0; + + if (broadcast_disable || pi == NULL || val == NULL) + return; + + _LOGE("pkgid=[%s], key[%s], val=[%s]", pkgid, key, val); + pkgmgr_installer_send_signal(pi, pkgtype, pkgid, key, val); +} + void _ri_broadcast_status_notification(const char *pkgid, char *pkg_type, char *key, char *val) { const char *pkgid_tmp = pkgid; diff --git a/common/rpm-installer-util.c b/common/rpm-installer-util.c index e6455bc..b890a73 100755 --- a/common/rpm-installer-util.c +++ b/common/rpm-installer-util.c @@ -156,6 +156,9 @@ void _ri_error_no_to_string(int errnumber, char **errstr) case RPM_INSTALLER_ERR_PRIVILEGE_USING_LEGACY_FAILED: *errstr = RPM_INSTALLER_ERR_PRIVILEGE_USING_LEGACY_FAILED_STR; break; + case RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION: + *errstr = RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION_STR; + break; default: *errstr = RPM_INSTALLER_ERR_UNKNOWN_STR; break; @@ -239,6 +242,8 @@ int _ri_string_to_error_no(char *errstr) errnumber = RPM_INSTALLER_ERR_PRIVILEGE_UNKNOWN; else if (strcmp(errstr, RPM_INSTALLER_ERR_PRIVILEGE_USING_LEGACY_FAILED_STR) == 0) errnumber = RPM_INSTALLER_ERR_PRIVILEGE_USING_LEGACY_FAILED; + else if (strcmp(errstr, RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION_STR) == 0) + errnumber = RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION; else errnumber = RPM_INSTALLER_ERR_UNKNOWN; diff --git a/inc/rpm-installer-util.h b/inc/rpm-installer-util.h index be1fbdf..138e850 100755 --- a/inc/rpm-installer-util.h +++ b/inc/rpm-installer-util.h @@ -155,6 +155,7 @@ typedef struct privilegeinfo_t privilegeinfo; #define RPM_INSTALLER_ERR_PRIVILEGE_UNAUTHORIZED 43 #define RPM_INSTALLER_ERR_PRIVILEGE_UNKNOWN 44 #define RPM_INSTALLER_ERR_PRIVILEGE_USING_LEGACY_FAILED 45 +#define RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION 5 #define RPM_INSTALLER_SUCCESS_STR "Success" #define RPM_INSTALLER_ERR_WRONG_PARAM_STR "Wrong Input Param" @@ -189,6 +190,7 @@ typedef struct privilegeinfo_t privilegeinfo; #define RPM_INSTALLER_ERR_PRIVILEGE_UNAUTHORIZED_STR "Unauthorized privilege" #define RPM_INSTALLER_ERR_PRIVILEGE_UNKNOWN_ERR_STR "Unknown privilege" #define RPM_INSTALLER_ERR_PRIVILEGE_USING_LEGACY_FAILED_STR "Deprecated privilege" +#define RPM_INSTALLER_ERR_NOT_SUPPORTED_API_VERSION_STR "API Version Not supported" #define DEBUG_ERR 0x0001 #define DEBUG_INFO 0x0002 diff --git a/packaging/rpm-installer.spec b/packaging/rpm-installer.spec index 7806170..f4fab76 100755 --- a/packaging/rpm-installer.spec +++ b/packaging/rpm-installer.spec @@ -64,7 +64,8 @@ export CFLAGS="$CFLAGS -DMOBILE" %endif %endif -cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \ + -DTIZEN_VERSION=%{tizen_version} make %{?jobs:-j%jobs} -- 2.7.4