Tizen 2.4.0 rev3 SDK Public Release accepted/tizen_2.3.1_mobile accepted/tizen_2.3.1_wearable tizen_2.3.1 accepted/tizen/2.3.1/mobile/20160306.221748 accepted/tizen/2.3.1/wearable/20160306.221741 submit/tizen_2.3.1/20160304.093537
authorjk7744.park <jk7744.park@samsung.com>
Fri, 4 Mar 2016 03:52:15 +0000 (12:52 +0900)
committerjk7744.park <jk7744.park@samsung.com>
Fri, 4 Mar 2016 03:52:15 +0000 (12:52 +0900)
CMakeLists.txt
backend/src/coretpk/coretpk-installer.c
backend/src/coretpk/xml-parser/coretpk-parser-hybrid.c
backend/src/vconf/rpm-vconf-intf.c
common/rpm-installer-util.c
inc/rpm-installer-util.h
packaging/rpm-installer.spec

index b2d1b14..a349f6e 100755 (executable)
@@ -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/)
 
index 72ab12c..0edcc5b 100755 (executable)
@@ -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, &current_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 {
index 3208b3a..495dec2 100755 (executable)
@@ -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;
        }
 
index 41413da..ba2c56f 100755 (executable)
@@ -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;
index e6455bc..b890a73 100755 (executable)
@@ -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;
 
index be1fbdf..138e850 100755 (executable)
@@ -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
index 7806170..f4fab76 100755 (executable)
@@ -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}