Consider caller uid when handling request
[platform/core/appfw/pkgmgr-server.git] / src / request.c
index ad964c1..3269b24 100644 (file)
@@ -11,6 +11,8 @@
 #include "pkgmgr-server.h"
 #include "package-manager.h"
 
+#define RETRY_MAX 5
+#define RETRY_WAIT_USEC (1000000 / 2) /* 0.5 sec */
 #define PKGMGR_DBUS_SERVICE "org.tizen.pkgmgr"
 #define PKGMGR_DBUS_OBJECT_PATH "/org/tizen/pkgmgr"
 
@@ -19,7 +21,6 @@ static const char instropection_xml[] =
        "  <interface name='org.tizen.pkgmgr'>"
        "    <method name='install'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgpath' direction='in'/>"
        "      <arg type='as' name='args' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
@@ -27,14 +28,12 @@ static const char instropection_xml[] =
        "    </method>"
        "    <method name='reinstall'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
        "    <method name='mount_install'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgpath' direction='in'/>"
        "      <arg type='as' name='args' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
@@ -42,14 +41,12 @@ static const char instropection_xml[] =
        "    </method>"
        "    <method name='uninstall'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
        "    <method name='move'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='movetype' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
@@ -57,14 +54,12 @@ static const char instropection_xml[] =
        "    </method>"
        "    <method name='enable_pkgs'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='as' name='pkgids' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "      <arg type='s' name='reqkey' direction='out'/>"
        "    </method>"
        "    <method name='disable_pkgs'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='as' name='pkgids' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "      <arg type='s' name='reqkey' direction='out'/>"
@@ -102,7 +97,6 @@ static const char instropection_xml[] =
        "    </method>"
        "    <method name='cleardata'>"
        "      <arg type='u' name='uid' direction='in'/>"
-       "      <arg type='s' name='pkgtype' direction='in'/>"
        "      <arg type='s' name='pkgid' direction='in'/>"
        "      <arg type='i' name='ret' direction='out'/>"
        "    </method>"
@@ -200,10 +194,21 @@ static int __is_admin_user(uid_t uid)
 {
        GumUser *guser;
        GumUserType ut = GUM_USERTYPE_NONE;
+       int retry_cnt = 0;
+
+       do {
+               guser = gum_user_get_sync(uid, FALSE);
+               if (guser == NULL) {
+                       ERR("cannot get user information from gumd, retry");
+                       retry_cnt++;
+                       usleep(RETRY_WAIT_USEC);
+                       continue;
+               }
+               break;
+       } while (retry_cnt <= RETRY_MAX);
 
-       guser = gum_user_get_sync(uid, FALSE);
        if (guser == NULL) {
-               ERR("cannot get user information from gumd");
+               ERR("cannot get user information from gumd, failed");
                return -1;
        }
 
@@ -263,11 +268,11 @@ static int __check_caller_permission(uid_t uid,
        return 0;
 }
 
-static int __handle_request_install(uid_t uid,
+static int __handle_request_install(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       const char *pkgtype;
        char *pkgpath = NULL;
        char *args = NULL;
        char *reqkey = NULL;
@@ -278,8 +283,7 @@ static int __handle_request_install(uid_t uid,
        int i = 0;
        int len = 0;
 
-       g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath,
-                       &value);
+       g_variant_get(parameters, "(u&s@as)", &target_uid, &pkgpath, &value);
        tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
 
        for (i = 0; i < args_count; i++)
@@ -300,14 +304,15 @@ static int __handle_request_install(uid_t uid,
                        strncat(args, " ", strlen(" "));
        }
 
-       if (target_uid == (uid_t)-1 || pkgtype == NULL) {
+       if (target_uid == (uid_t)-1 || pkgpath == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                ret = -1;
                goto catch;
        }
 
-       if (pkgpath == NULL) {
+       pkgtype = _get_pkgtype_from_file(pkgpath);
+       if (pkgtype == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                ret = -1;
@@ -322,8 +327,8 @@ static int __handle_request_install(uid_t uid,
                goto catch;
        }
 
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_INSTALL, pkgtype,
-                               pkgpath, args)) {
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_INSTALL,
+                               pkgtype, pkgpath, args)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                ret = -1;
@@ -348,11 +353,11 @@ catch:
        return ret;
 }
 
-static int __handle_request_mount_install(uid_t uid,
+static int __handle_request_mount_install(uid_t caller_uid,
        GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       const char *pkgtype;
        char *pkgpath = NULL;
        char *args = NULL;
        char *reqkey = NULL;
@@ -363,8 +368,7 @@ static int __handle_request_mount_install(uid_t uid,
        int i = 0;
        int len = 0;
 
-       g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath,
-                       &value);
+       g_variant_get(parameters, "(u&s@as)", &target_uid, &pkgpath, &value);
        tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
 
        for (i = 0; i < args_count; i++)
@@ -385,14 +389,15 @@ static int __handle_request_mount_install(uid_t uid,
                        strncat(args, " ", strlen(" "));
        }
 
-       if (target_uid == (uid_t)-1 || pkgtype == NULL) {
+       if (target_uid == (uid_t)-1 || pkgpath == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                ret = -1;
                goto catch;
        }
 
-       if (pkgpath == NULL) {
+       pkgtype = _get_pkgtype_from_file(pkgpath);
+       if (pkgtype == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                ret = -1;
@@ -407,7 +412,8 @@ static int __handle_request_mount_install(uid_t uid,
                goto catch;
        }
 
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_MOUNT_INSTALL,
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_MOUNT_INSTALL,
                                pkgtype, pkgpath, args)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
@@ -432,130 +438,159 @@ catch:
        return ret;
 }
 
-static int __handle_request_reinstall(uid_t uid,
+static int __handle_request_reinstall(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid = NULL;
        char *reqkey;
 
-       g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
+       pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+       if (pkgtype == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               return -1;
+       }
+
        reqkey = __generate_reqkey(pkgid);
        if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               free(pkgtype);
                return -1;
        }
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_REINSTALL, pkgtype,
-                               pkgid, NULL)) {
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_REINSTALL,
+                               pkgtype, pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                free(reqkey);
+               free(pkgtype);
                return -1;
        }
 
        g_dbus_method_invocation_return_value(invocation,
                        g_variant_new("(is)", PKGMGR_R_OK, reqkey));
        free(reqkey);
+       free(pkgtype);
 
        return 0;
 }
 
-static int __handle_request_uninstall(uid_t uid,
+static int __handle_request_uninstall(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid = NULL;
        char *reqkey;
 
-       g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
+       pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+       if (pkgtype == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               return -1;
+       }
+
        reqkey = __generate_reqkey(pkgid);
        if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               free(pkgtype);
                return -1;
        }
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_UNINSTALL, pkgtype,
-                               pkgid, NULL)) {
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_UNINSTALL,
+                               pkgtype, pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                free(reqkey);
+               free(pkgtype);
                return -1;
        }
 
        g_dbus_method_invocation_return_value(invocation,
                        g_variant_new("(is)", PKGMGR_R_OK, reqkey));
        free(reqkey);
+       free(pkgtype);
 
        return 0;
 }
 
-static int __handle_request_move(uid_t uid,
+static int __handle_request_move(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid = NULL;
        char *reqkey;
        int move_type = -1;
        char buf[4] = { '\0' };
 
-       g_variant_get(parameters, "(u&s&si)", &target_uid, &pkgtype, &pkgid,
-                       &move_type);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+       g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &move_type);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
        }
 
+       pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+       if (pkgtype == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
+               return -1;
+       }
+
        reqkey = __generate_reqkey(pkgid);
        if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
+               free(pkgtype);
                return -1;
        }
 
        snprintf(buf, sizeof(buf), "%d", move_type);
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_MOVE, pkgtype,
-                               pkgid, buf)) {
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_MOVE,
+                               pkgtype, pkgid, buf)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                free(reqkey);
+               free(pkgtype);
                return -1;
        }
 
        g_dbus_method_invocation_return_value(invocation,
                        g_variant_new("(is)", PKGMGR_R_OK, reqkey));
        free(reqkey);
+       free(pkgtype);
 
        return 0;
 }
 
-static int __handle_request_enable_pkgs(uid_t uid,
+static int __handle_request_enable_pkgs(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid;
        char *reqkey;
        GVariantIter *iter;
 
-       g_variant_get(parameters, "(u&sas)", &target_uid, &pkgtype, &iter);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || iter == NULL) {
+       g_variant_get(parameters, "(uas)", &target_uid, &iter);
+       if (target_uid == (uid_t)-1 || iter == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
@@ -569,14 +604,25 @@ static int __handle_request_enable_pkgs(uid_t uid,
        }
 
        while (g_variant_iter_next(iter, "&s", &pkgid)) {
-               if (_push_queue(target_uid, reqkey, REQUEST_TYPE_ENABLE_PKG,
+               pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+               if (pkgtype == NULL) {
+                       g_dbus_method_invocation_return_value(invocation,
+                                       g_variant_new("(is)",
+                                               PKGMGR_R_ESYSTEM, ""));
+                       free(reqkey);
+                       return -1;
+               }
+               if (_push_queue(target_uid, caller_uid, reqkey,
+                                       REQUEST_TYPE_ENABLE_PKG,
                                        pkgtype, pkgid, NULL)) {
                        g_dbus_method_invocation_return_value(invocation,
                                        g_variant_new("(is)",
                                                PKGMGR_R_ESYSTEM, ""));
+                       free(pkgtype);
                        free(reqkey);
                        return -1;
                }
+               free(pkgtype);
        }
 
        g_dbus_method_invocation_return_value(invocation,
@@ -586,17 +632,17 @@ static int __handle_request_enable_pkgs(uid_t uid,
        return 0;
 }
 
-static int __handle_request_disable_pkgs(uid_t uid,
+static int __handle_request_disable_pkgs(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid;
        char *reqkey;
        GVariantIter *iter;
 
-       g_variant_get(parameters, "(u&sas)", &target_uid, &pkgtype, &iter);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || iter == NULL) {
+       g_variant_get(parameters, "(uas)", &target_uid, &iter);
+       if (target_uid == (uid_t)-1 || iter == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
                return -1;
@@ -610,14 +656,25 @@ static int __handle_request_disable_pkgs(uid_t uid,
        }
 
        while (g_variant_iter_next(iter, "&s", &pkgid)) {
-               if (_push_queue(target_uid, reqkey, REQUEST_TYPE_DISABLE_PKG,
+               pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+               if (pkgtype == NULL) {
+                       g_dbus_method_invocation_return_value(invocation,
+                                       g_variant_new("(is)",
+                                               PKGMGR_R_ESYSTEM, ""));
+                       free(reqkey);
+                       return -1;
+               }
+               if (_push_queue(target_uid, caller_uid, reqkey,
+                                       REQUEST_TYPE_DISABLE_PKG,
                                        pkgtype, pkgid, NULL)) {
                        g_dbus_method_invocation_return_value(invocation,
                                        g_variant_new("(is)",
                                                PKGMGR_R_ESYSTEM, ""));
+                       free(pkgtype);
                        free(reqkey);
                        return -1;
                }
+               free(pkgtype);
        }
 
        g_dbus_method_invocation_return_value(invocation,
@@ -627,7 +684,7 @@ static int __handle_request_disable_pkgs(uid_t uid,
        return 0;
 }
 
-static int __handle_request_enable_app(uid_t uid,
+static int __handle_request_enable_app(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -650,7 +707,8 @@ static int __handle_request_enable_app(uid_t uid,
                goto catch;
        }
 
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_ENABLE_APP, "default",
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_ENABLE_APP, "default",
                                appid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
@@ -670,7 +728,7 @@ catch:
        return ret;
 }
 
-static int __handle_request_disable_app(uid_t uid,
+static int __handle_request_disable_app(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -693,7 +751,8 @@ static int __handle_request_disable_app(uid_t uid,
                goto catch;
        }
 
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_DISABLE_APP, "default",
+       if (_push_queue(target_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_DISABLE_APP, "default",
                                appid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
@@ -713,7 +772,7 @@ catch:
        return ret;
 }
 
-static int __handle_request_enable_global_app_for_uid(uid_t uid,
+static int __handle_request_enable_global_app_for_uid(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -736,7 +795,7 @@ static int __handle_request_enable_global_app_for_uid(uid_t uid,
                goto catch;
        }
 
-       if (_push_queue(target_uid, reqkey,
+       if (_push_queue(target_uid, caller_uid, reqkey,
                                REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID,
                                "default", appid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
@@ -757,7 +816,7 @@ catch:
        return ret;
 }
 
-static int __handle_request_disable_global_app_for_uid(uid_t uid,
+static int __handle_request_disable_global_app_for_uid(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -780,7 +839,7 @@ static int __handle_request_disable_global_app_for_uid(uid_t uid,
                goto catch;
        }
 
-       if (_push_queue(target_uid, reqkey,
+       if (_push_queue(target_uid, caller_uid, reqkey,
                                REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID,
                                "default", appid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
@@ -801,7 +860,7 @@ catch:
        return ret;
 }
 
-static int __handle_request_getsize(uid_t uid,
+static int __handle_request_getsize(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -825,8 +884,8 @@ static int __handle_request_getsize(uid_t uid,
        }
 
        snprintf(buf, sizeof(buf), "%d", get_type);
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_GETSIZE, "pkgtool",
-                               pkgid, buf)) {
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE,
+                               "pkgtool", pkgid, buf)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
                free(reqkey);
@@ -840,33 +899,42 @@ static int __handle_request_getsize(uid_t uid,
        return 0;
 }
 
-static int __handle_request_cleardata(uid_t uid,
+static int __handle_request_cleardata(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
-       char *pkgtype = NULL;
+       char *pkgtype;
        char *pkgid = NULL;
        char *reqkey = NULL;
 
-       g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
-       if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
+       g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
+       if (target_uid == (uid_t)-1 || pkgid == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ECOMM));
                return -1;
        }
 
+       pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
+       if (pkgtype == NULL) {
+               g_dbus_method_invocation_return_value(invocation,
+                               g_variant_new("(i)", PKGMGR_R_ESYSTEM));
+               return -1;
+       }
+
        reqkey = __generate_reqkey(pkgid);
        if (reqkey == NULL) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ENOMEM));
+               free(pkgtype);
                return -1;
        }
 
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_CLEARDATA, pkgtype,
-                               pkgid, NULL)) {
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CLEARDATA,
+                               pkgtype, pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
                free(reqkey);
+               free(pkgtype);
                return -1;
        }
 
@@ -874,11 +942,12 @@ static int __handle_request_cleardata(uid_t uid,
                        g_variant_new("(i)", PKGMGR_R_OK));
 
        free(reqkey);
+       free(pkgtype);
 
        return 0;
 }
 
-static int __handle_request_clearcache(uid_t uid,
+static int __handle_request_clearcache(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -891,7 +960,7 @@ static int __handle_request_clearcache(uid_t uid,
                return -1;
        }
 
-       if (_push_queue(target_uid, NULL, REQUEST_TYPE_CLEARCACHE,
+       if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARCACHE,
                                "pkgtool",  pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
@@ -904,7 +973,7 @@ static int __handle_request_clearcache(uid_t uid,
        return 0;
 }
 
-static int __handle_request_kill(uid_t uid,
+static int __handle_request_kill(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -925,7 +994,7 @@ static int __handle_request_kill(uid_t uid,
                return -1;
        }
 
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_KILL,
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_KILL,
                                "default", pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
@@ -940,7 +1009,7 @@ static int __handle_request_kill(uid_t uid,
        return 0;
 }
 
-static int __handle_request_check(uid_t uid,
+static int __handle_request_check(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -961,7 +1030,7 @@ static int __handle_request_check(uid_t uid,
                return -1;
        }
 
-       if (_push_queue(target_uid, reqkey, REQUEST_TYPE_CHECK,
+       if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CHECK,
                                "default", pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
@@ -976,7 +1045,7 @@ static int __handle_request_check(uid_t uid,
        return 0;
 }
 
-static int __handle_request_generate_license_request(uid_t uid,
+static int __handle_request_generate_license_request(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        char *reqkey;
@@ -997,7 +1066,7 @@ static int __handle_request_generate_license_request(uid_t uid,
                return -1;
        }
 
-       if (_push_queue(uid, reqkey,
+       if (_push_queue(caller_uid, caller_uid, reqkey,
                                REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
                                "default", NULL, resp_data)) {
                g_dbus_method_invocation_return_value(invocation,
@@ -1014,7 +1083,7 @@ static int __handle_request_generate_license_request(uid_t uid,
        return 0;
 }
 
-static int __handle_request_register_license(uid_t uid,
+static int __handle_request_register_license(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        char *reqkey;
@@ -1034,7 +1103,8 @@ static int __handle_request_register_license(uid_t uid,
                return -1;
        }
 
-       if (_push_queue(uid, reqkey, REQUEST_TYPE_REGISTER_LICENSE,
+       if (_push_queue(caller_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_REGISTER_LICENSE,
                                "default", NULL, resp_data)) {
                g_dbus_method_invocation_return_value(invocation,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
@@ -1049,7 +1119,7 @@ static int __handle_request_register_license(uid_t uid,
        return 0;
 }
 
-static int __handle_request_decrypt_package(uid_t uid,
+static int __handle_request_decrypt_package(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        char *reqkey;
@@ -1071,7 +1141,8 @@ static int __handle_request_decrypt_package(uid_t uid,
                return -1;
        }
 
-       if (_push_queue(uid, reqkey, REQUEST_TYPE_DECRYPT_PACKAGE,
+       if (_push_queue(caller_uid, caller_uid, reqkey,
+                               REQUEST_TYPE_DECRYPT_PACKAGE,
                                "default", drm_file_path,
                                decrypted_file_path)) {
                g_dbus_method_invocation_return_value(invocation,
@@ -1087,7 +1158,7 @@ static int __handle_request_decrypt_package(uid_t uid,
        return 0;
 }
 
-static int __update_app_splash_screen(uid_t uid,
+static int __update_app_splash_screen(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters,
                int req_type)
 {
@@ -1111,7 +1182,7 @@ static int __update_app_splash_screen(uid_t uid,
                return -1;
        }
 
-       if (_push_queue(target_uid, reqkey, req_type, "default",
+       if (_push_queue(target_uid, caller_uid, reqkey, req_type, "default",
                                appid, NULL)) {
                ERR("Failed to push request");
                g_dbus_method_invocation_return_value(invocation,
@@ -1129,21 +1200,21 @@ static int __update_app_splash_screen(uid_t uid,
        return 0;
 }
 
-static int __handle_request_enable_app_splash_screen(uid_t uid,
+static int __handle_request_enable_app_splash_screen(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
-       return __update_app_splash_screen(uid, invocation, parameters,
+       return __update_app_splash_screen(caller_uid, invocation, parameters,
                        REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
 }
 
-static int __handle_request_disable_app_splash_screen(uid_t uid,
+static int __handle_request_disable_app_splash_screen(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
-       return __update_app_splash_screen(uid, invocation, parameters,
+       return __update_app_splash_screen(caller_uid, invocation, parameters,
                        REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
 }
 
-static int __handle_request_set_restriction_mode(uid_t uid,
+static int __handle_request_set_restriction_mode(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -1167,7 +1238,7 @@ static int __handle_request_set_restriction_mode(uid_t uid,
        }
 
        snprintf(buf, sizeof(buf), "%d", mode);
-       if (_push_queue(target_uid, reqkey,
+       if (_push_queue(target_uid, caller_uid, reqkey,
                                REQUEST_TYPE_SET_RESTRICTION_MODE,
                                "default", pkgid, buf)) {
                g_dbus_method_invocation_return_value(invocation,
@@ -1183,7 +1254,7 @@ static int __handle_request_set_restriction_mode(uid_t uid,
        return 0;
 }
 
-static int __handle_request_unset_restriction_mode(uid_t uid,
+static int __handle_request_unset_restriction_mode(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -1207,7 +1278,7 @@ static int __handle_request_unset_restriction_mode(uid_t uid,
        }
 
        snprintf(buf, sizeof(buf), "%d", mode);
-       if (_push_queue(target_uid, reqkey,
+       if (_push_queue(target_uid, caller_uid, reqkey,
                                REQUEST_TYPE_UNSET_RESTRICTION_MODE,
                                "default", pkgid, buf)) {
                g_dbus_method_invocation_return_value(invocation,
@@ -1223,7 +1294,7 @@ static int __handle_request_unset_restriction_mode(uid_t uid,
        return 0;
 }
 
-static int __handle_request_get_restriction_mode(uid_t uid,
+static int __handle_request_get_restriction_mode(uid_t caller_uid,
                GDBusMethodInvocation *invocation, GVariant *parameters)
 {
        uid_t target_uid = (uid_t)-1;
@@ -1244,7 +1315,7 @@ static int __handle_request_get_restriction_mode(uid_t uid,
                return -1;
        }
 
-       if (_push_queue(target_uid, reqkey,
+       if (_push_queue(target_uid, caller_uid, reqkey,
                                REQUEST_TYPE_GET_RESTRICTION_MODE,
                                "default", pkgid, NULL)) {
                g_dbus_method_invocation_return_value(invocation,