allow using pkgcmd from root shell. 06/96306/5
authorjongmyeongko <jongmyeong.ko@samsung.com>
Tue, 8 Nov 2016 11:18:47 +0000 (20:18 +0900)
committerjongmyeongko <jongmyeong.ko@samsung.com>
Fri, 11 Nov 2016 13:19:50 +0000 (22:19 +0900)
- if current user is root, then target_uid will be default user.
- if current user is non-root, then target_uid will be current user.
- --global option will work same in above two case.

Change-Id: I7ee0ed6d5cd0069bed387ea3d05cce7965dd413b
Signed-off-by: jongmyeongko <jongmyeong.ko@samsung.com>
packaging/pkgmgr-tool.spec
src/pkg_cmd.c

index 00d596eb54b9288e89c0914dd9bbaf95f85feac4..373cab448ba1c88d3e4508ff2549c6146b349ab7 100644 (file)
@@ -1,6 +1,6 @@
 Name:       pkgmgr-tool
 Summary:    Packager Manager Tool package
-Version:    0.1.0
+Version:    0.1.1
 Release:    1
 Group:      Application Framework/Package Management
 License:    Apache-2.0
index 332dca2af0e3decf6700a845319c7396e581d7af..47ae952e9345d9c5ac8106c73624c4f8c07f2967 100644 (file)
@@ -51,6 +51,7 @@
 
 #define OWNER_ROOT 0
 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
+#define DEFAULT_USER tzplatform_getuid(TZ_SYS_DEFAULT_USER)
 
 #define OPTVAL_GLOBAL 1000
 #define OPTVAL_CLEAR_ALL 1001
@@ -241,6 +242,16 @@ static void __error_no_to_string(int errnumber, char **errstr)
        }
 }
 
+static uid_t __get_current_user_id(void)
+{
+       uid_t uid = getuid();
+
+       if (uid == OWNER_ROOT)
+               uid = DEFAULT_USER;
+
+       return uid;
+}
+
 static int __return_cb(uid_t target_uid, int req_id, const char *pkg_type,
                       const char *pkgid, const char *key, const char *val,
                       const void *pmsg, void *priv_data)
@@ -580,7 +591,7 @@ static int __pkgmgr_list_clear_cb(const pkgmgrinfo_pkginfo_h handle, void *user_
        return ret;
 }
 
-static int __process_request(uid_t uid)
+static int __process_request(uid_t target_uid)
 {
        int ret = -1;
        pkgmgr_client *pc = NULL;
@@ -616,12 +627,12 @@ static int __process_request(uid_t uid)
                        ret = pkgmgr_client_usr_install(pc,
                                        data.pkg_type[0] != '\0' ? data.pkg_type : NULL,
                                        NULL, data.pkg_path, NULL, PM_QUIET,
-                                       __return_cb, pc, uid);
+                                       __return_cb, pc, target_uid);
                else
                        ret = pkgmgr_client_usr_install(pc,
                                        data.pkg_type[0] != '\0' ? data.pkg_type : NULL,
                                        data.des_path, data.pkg_path,
-                                       NULL, PM_QUIET, __return_cb, pc, uid);
+                                       NULL, PM_QUIET, __return_cb, pc, target_uid);
 
                if (ret < 0) {
                        data.result = PKGCMD_ERRCODE_ERROR;
@@ -695,14 +706,14 @@ static int __process_request(uid_t uid)
                        break;
                }
 
-               ret = __is_app_installed(data.pkgid, uid);
+               ret = __is_app_installed(data.pkgid, target_uid);
                if (ret == -1) {
                        printf("package is not installed\n");
                        break;
                }
 
                ret = pkgmgr_client_usr_uninstall(pc, data.pkg_type, data.pkgid,
-                               PM_QUIET, __return_cb, NULL, uid);
+                               PM_QUIET, __return_cb, NULL, target_uid);
                if (ret < 0) {
                        data.result = PKGCMD_ERRCODE_ERROR;
                        if (access(data.pkg_path, F_OK) != 0)
@@ -728,7 +739,7 @@ static int __process_request(uid_t uid)
                        break;
                }
 
-               ret = pkgmgr_client_usr_reinstall(pc, NULL, data.pkgid, NULL, PM_QUIET, __return_cb, pc, uid);
+               ret = pkgmgr_client_usr_reinstall(pc, NULL, data.pkgid, NULL, PM_QUIET, __return_cb, pc, target_uid);
                if (ret < 0) {
                        data.result = PKGCMD_ERRCODE_ERROR;
                        if (access(data.pkg_path, F_OK) != 0)
@@ -760,12 +771,12 @@ static int __process_request(uid_t uid)
                        ret = pkgmgr_client_usr_mount_install(pc,
                                        data.pkg_type[0] != '\0' ? data.pkg_type : NULL,
                                        NULL, data.pkg_path, NULL, PM_QUIET,
-                                       __return_cb, pc, uid);
+                                       __return_cb, pc, target_uid);
                else
                        ret = pkgmgr_client_usr_mount_install(pc,
                                        data.pkg_type[0] != '\0' ? data.pkg_type : NULL,
                                        data.des_path, data.pkg_path,
-                                       NULL, PM_QUIET, __return_cb, pc, uid);
+                                       NULL, PM_QUIET, __return_cb, pc, target_uid);
 
                if (ret < 0) {
                        data.result = PKGCMD_ERRCODE_ERROR;
@@ -790,13 +801,13 @@ static int __process_request(uid_t uid)
                        ret = -1;
                        break;
                }
-               ret = __is_app_installed(data.pkgid, uid);
+               ret = __is_app_installed(data.pkgid, target_uid);
                if (ret == -1) {
                        printf("package is not installed\n");
                        break;
                }
                ret = pkgmgr_client_usr_clear_user_data(pc, data.pkg_type,
-                               data.pkgid, PM_QUIET, uid);
+                               data.pkgid, PM_QUIET, target_uid);
                if (ret < 0)
                        break;
                ret = data.result;
@@ -805,8 +816,8 @@ static int __process_request(uid_t uid)
        case CLEAR_ALL_REQ:
                if (data.pkg_type[0] == '\0') {
                        ret = 0;
-                       if (uid != GLOBAL_USER)
-                               ret = pkgmgrinfo_pkginfo_get_usr_list(__pkgmgr_list_clear_cb, NULL, uid);
+                       if (target_uid != GLOBAL_USER)
+                               ret = pkgmgrinfo_pkginfo_get_usr_list(__pkgmgr_list_clear_cb, NULL, target_uid);
                        else
                                ret = pkgmgrinfo_pkginfo_get_list(__pkgmgr_list_clear_cb, NULL);
 
@@ -829,8 +840,8 @@ static int __process_request(uid_t uid)
                                break;
                        }
 
-                       if (uid != GLOBAL_USER)
-                               ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, __pkgmgr_list_clear_cb, NULL, uid);
+                       if (target_uid != GLOBAL_USER)
+                               ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, __pkgmgr_list_clear_cb, NULL, target_uid);
                        else
                                ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, __pkgmgr_list_clear_cb, NULL);
 
@@ -860,10 +871,11 @@ static int __process_request(uid_t uid)
                if (strcmp(data.pkg_type, "app") == 0) {
                        if (data.global)
                                /* enable global app for this user only */
-                               ret = pkgmgr_client_activate_global_app_for_uid(pc, data.pkgid, __app_return_cb, getuid());
+                               ret = pkgmgr_client_activate_global_app_for_uid(pc, data.pkgid,
+                                       __app_return_cb, __get_current_user_id());
                        else
                                /* enable app which belongs to this user */
-                               ret = pkgmgr_client_usr_activate_app(pc, data.pkgid, __app_return_cb, uid);
+                               ret = pkgmgr_client_usr_activate_app(pc, data.pkgid, __app_return_cb, target_uid);
                } else {
                        listen_pc = pkgmgr_client_new(PC_LISTENING);
                        if (listen_pc == NULL) {
@@ -876,7 +888,7 @@ static int __process_request(uid_t uid)
                                printf("Failed to set callback[%d]\n", ret);
                                break;
                        }
-                       ret = pkgmgr_client_usr_activate(pc, data.pkg_type, data.pkgid, uid);
+                       ret = pkgmgr_client_usr_activate(pc, data.pkg_type, data.pkgid, target_uid);
                }
                if (ret < 0)
                        break;
@@ -904,10 +916,11 @@ static int __process_request(uid_t uid)
                if (strcmp(data.pkg_type, "app") == 0) {
                        if (data.global)
                                /* disable global app for this user only*/
-                               ret = pkgmgr_client_deactivate_global_app_for_uid(pc, data.pkgid, __app_return_cb, getuid());
+                               ret = pkgmgr_client_deactivate_global_app_for_uid(pc, data.pkgid,
+                                       __app_return_cb, __get_current_user_id());
                        else
                                /* disable app which belongs to this user */
-                               ret = pkgmgr_client_usr_deactivate_app(pc, data.pkgid, __app_return_cb, uid);
+                               ret = pkgmgr_client_usr_deactivate_app(pc, data.pkgid, __app_return_cb, target_uid);
                } else {
                        listen_pc = pkgmgr_client_new(PC_LISTENING);
                        if (listen_pc == NULL) {
@@ -920,7 +933,7 @@ static int __process_request(uid_t uid)
                                printf("Failed to set callback[%d]\n", ret);
                                break;
                        }
-                       ret = pkgmgr_client_usr_deactivate(pc, data.pkg_type, data.pkgid, uid);
+                       ret = pkgmgr_client_usr_deactivate(pc, data.pkg_type, data.pkgid, target_uid);
                }
                if (ret < 0)
                        break;
@@ -949,13 +962,13 @@ static int __process_request(uid_t uid)
                        ret = -1;
                        break;
                }
-               ret = __is_app_installed(data.pkgid, uid);
+               ret = __is_app_installed(data.pkgid, target_uid);
                if (ret == -1) {
                        printf("package is not installed\n");
                        break;
                }
                ret = pkgmgr_client_usr_request_service(PM_REQUEST_MOVE, data.type, pc,
-                               data.pkg_type, data.pkgid, uid, NULL, __return_cb, NULL);
+                               data.pkg_type, data.pkgid, target_uid, NULL, __return_cb, NULL);
 
                if (ret < 0)
                        break;
@@ -1010,7 +1023,8 @@ static int __process_request(uid_t uid)
                }
 
                if (data.request == KILLAPP_REQ) {
-                       ret = pkgmgr_client_usr_request_service(PM_REQUEST_KILL_APP, 0, pc, NULL, data.pkgid, uid, NULL, NULL, &pid);
+                       ret = pkgmgr_client_usr_request_service(PM_REQUEST_KILL_APP, 0, pc,
+                               NULL, data.pkgid, target_uid, NULL, NULL, &pid);
                        if (ret < 0) {
                                data.result = PKGCMD_ERRCODE_ERROR;
                                break;
@@ -1021,7 +1035,8 @@ static int __process_request(uid_t uid)
                                printf("Pkgid: %s is already Terminated\n", data.pkgid);
 
                } else if (data.request == CHECKAPP_REQ) {
-                       ret = pkgmgr_client_usr_request_service(PM_REQUEST_CHECK_APP, 0, pc, NULL, data.pkgid, uid, NULL, NULL, &pid);
+                       ret = pkgmgr_client_usr_request_service(PM_REQUEST_CHECK_APP, 0, pc,
+                               NULL, data.pkgid, target_uid, NULL, NULL, &pid);
                        if (ret < 0) {
                                data.result = PKGCMD_ERRCODE_ERROR;
                                break;
@@ -1038,8 +1053,8 @@ static int __process_request(uid_t uid)
        case LIST_REQ:
                if (data.pkg_type[0] == '\0') {
                        ret = 0;
-                       if (uid != GLOBAL_USER)
-                               ret = pkgmgrinfo_pkginfo_get_usr_list(__pkgmgr_list_cb, NULL, uid);
+                       if (target_uid != GLOBAL_USER)
+                               ret = pkgmgrinfo_pkginfo_get_usr_list(__pkgmgr_list_cb, NULL, target_uid);
                        else
                                ret = pkgmgrinfo_pkginfo_get_list(__pkgmgr_list_cb, NULL);
 
@@ -1062,8 +1077,8 @@ static int __process_request(uid_t uid)
                                break;
                        }
 
-                       if (uid != GLOBAL_USER)
-                               ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, __pkgmgr_list_cb, NULL, uid);
+                       if (target_uid != GLOBAL_USER)
+                               ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, __pkgmgr_list_cb, NULL, target_uid);
                        else
                                ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle, __pkgmgr_list_cb, NULL);
 
@@ -1095,11 +1110,11 @@ static int __process_request(uid_t uid)
                }
 
                if (data.type == 9) {
-                       ret = pkgmgrinfo_pkginfo_get_usr_list(__pkg_list_cb, (void *)pc, uid);
+                       ret = pkgmgrinfo_pkginfo_get_usr_list(__pkg_list_cb, (void *)pc, target_uid);
                        break;
                }
                ret = pkgmgr_client_usr_request_service(PM_REQUEST_GET_SIZE, data.type,
-                               pc, NULL, data.pkgid, uid, NULL, NULL, NULL);
+                               pc, NULL, data.pkgid, target_uid, NULL, NULL, NULL);
                if (ret < 0) {
                        data.result = PKGCMD_ERRCODE_ERROR;
                        break;
@@ -1394,13 +1409,20 @@ int main(int argc, char *argv[])
        }
 
        uid_t uid = getuid();
-       if (!is_root_cmd && uid == OWNER_ROOT) {
-               printf("Current User is Root! : Only regular users are allowed\n");
+       if (is_root_cmd && uid != OWNER_ROOT) {
+               printf("This cmd is allowed for only root user\n");
                return -1;
        }
 
+       if (uid == OWNER_ROOT) {
+               uid = DEFAULT_USER;
+               printf("Current User is Root! : " \
+                       "target_uid will be default user(%d)\n", uid);
+       }
+
        if (data.global == 1)
                uid = GLOBAL_USER;
+       printf("target uid(%d)\n", uid);
 
        ret = __process_request(uid);
        if ((ret < 0) && (data.result == 0)) {