From b3494eee356d7dfc2849dcd86b2d92f0a792a5ac Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Wed, 28 Oct 2015 11:09:30 +0900 Subject: [PATCH] Set target uid on dbus method call it is necessary to install global apps TODO: allow global app installation only for privileged user Change-Id: Id08619fc3efe0cece086e51251b8d0d913e89ce3 Signed-off-by: Sangyoon Jang --- client/src/pkgmgr.c | 22 ++++++------ server/src/request.c | 96 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 71 insertions(+), 47 deletions(-) diff --git a/client/src/pkgmgr.c b/client/src/pkgmgr.c index 27df4dc..63fd017 100644 --- a/client/src/pkgmgr.c +++ b/client/src/pkgmgr.c @@ -930,7 +930,7 @@ API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type, pkgtype = strdup(pkg_type); result = comm_client_request(mpc->info.request.cc, "install", - g_variant_new("(ss)", pkgtype, pkg_path)); + g_variant_new("(uss)", uid, pkgtype, pkg_path)); free(pkgtype); if (result == NULL) return PKGMGR_R_ECOMM; @@ -1003,7 +1003,7 @@ API int pkgmgr_client_usr_reinstall(pkgmgr_client * pc, const char *pkg_type, } result = comm_client_request(mpc->info.request.cc, "reinstall", - g_variant_new("(ss)", pkgtype, pkgid)); + g_variant_new("(uss)", uid, pkgtype, pkgid)); pkgmgrinfo_pkginfo_destroy_pkginfo(handle); if (result == NULL) return PKGMGR_R_ECOMM; @@ -1068,7 +1068,7 @@ API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type, /* TODO: check removable ? */ result = comm_client_request(mpc->info.request.cc, "uninstall", - g_variant_new("(ss)", pkgtype, pkgid)); + g_variant_new("(uss)", uid, pkgtype, pkgid)); if (result == NULL) { pkgmgrinfo_pkginfo_destroy_pkginfo(handle); return PKGMGR_R_ECOMM; @@ -1122,7 +1122,7 @@ API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type, } result = comm_client_request(mpc->info.request.cc, "move", - g_variant_new("(ss)", pkg_type, pkgid)); + g_variant_new("(uss)", uid, pkg_type, pkgid)); if (result == NULL) return PKGMGR_R_ECOMM; g_variant_get(result, "(i)", &ret); @@ -1144,7 +1144,7 @@ API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type, } result = comm_client_request(mpc->info.request.cc, "enable_pkg", - g_variant_new("(s)", pkgid)); + g_variant_new("(us)", uid, pkgid)); if (result == NULL) return PKGMGR_R_ECOMM; g_variant_get(result, "(i)", &ret); @@ -1172,7 +1172,7 @@ API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type, } result = comm_client_request(mpc->info.request.cc, "disable_pkg", - g_variant_new("(s)", pkgid)); + g_variant_new("(us)", uid, pkgid)); if (result == NULL) return PKGMGR_R_ECOMM; g_variant_get(result, "(i)", &ret); @@ -1200,7 +1200,7 @@ API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid, } result = comm_client_request(mpc->info.request.cc, "enable_app", - g_variant_new("(s)", appid)); + g_variant_new("(us)", uid, appid)); if (result == NULL) return PKGMGR_R_ECOMM; g_variant_get(result, "(i)", &ret); @@ -1240,7 +1240,7 @@ API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, } result = comm_client_request(mpc->info.request.cc, "disable_app", - g_variant_new("(s)", appid)); + g_variant_new("(us)", uid, appid)); if (result == NULL) return PKGMGR_R_ECOMM; g_variant_get(result, "(i)", &ret); @@ -1273,7 +1273,7 @@ API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc, } result = comm_client_request(mpc->info.request.cc, "cleardata", - g_variant_new("(ss)", pkg_type, appid)); + g_variant_new("(uss)", uid, pkg_type, appid)); if (result == NULL) return PKGMGR_R_ECOMM; @@ -1544,7 +1544,7 @@ API int pkgmgr_client_usr_get_size(pkgmgr_client * pc, const char *pkgid, else get_type = PM_GET_PKG_SIZE_INFO; result = comm_client_request(mpc->info.request.cc, "getsize", - g_variant_new("(si)", pkgid, get_type)); + g_variant_new("(usi)", uid, pkgid, get_type)); if (result == NULL) return PKGMGR_R_ECOMM; @@ -1598,7 +1598,7 @@ API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc, else get_type = PM_GET_PKG_SIZE_INFO; result = comm_client_request(mpc->info.request.cc, "getsize", - g_variant_new("(si)", pkgid, get_type)); + g_variant_new("(usi)", uid, pkgid, get_type)); if (result == NULL) return PKGMGR_R_ECOMM; diff --git a/server/src/request.c b/server/src/request.c index 114edab..7b1d8d4 100644 --- a/server/src/request.c +++ b/server/src/request.c @@ -14,65 +14,78 @@ static const char instropection_xml[] = "" " " " " + " " " " " " " " " " " " " " + " " " " " " " " " " " " " " + " " " " " " " " " " " " " " + " " " " " " " " " " " " " " + " " " " " " " " " " + " " " " " " " " " " + " " " " " " " " " " + " " " " " " " " " " + " " " " " " " " " " " " " " + " " " " " " " " " " " " + " " " " " " " " " " + " " " " " " " " " " + " " " " " " " " @@ -108,12 +121,13 @@ static char *__generate_reqkey(const char *pkgid) static int __handle_request_install(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { + uid_t target_uid = (uid_t)-1; char *pkgtype = NULL; char *pkgpath = NULL; char *reqkey; - g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgpath); - if (pkgtype == NULL || pkgpath == NULL) { + g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgpath); + if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgpath == NULL) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; @@ -122,7 +136,7 @@ static int __handle_request_install(uid_t uid, reqkey = __generate_reqkey(pkgpath); if (reqkey == NULL) return -1; - if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype, + if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype, pkgpath, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); @@ -140,12 +154,13 @@ static int __handle_request_install(uid_t uid, static int __handle_request_reinstall(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { + uid_t target_uid = (uid_t)-1; char *pkgtype = NULL; char *pkgid = NULL; char *reqkey; - g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); - if (pkgtype == NULL || pkgid == NULL) { + g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid); + if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; @@ -154,7 +169,7 @@ static int __handle_request_reinstall(uid_t uid, reqkey = __generate_reqkey(pkgid); if (reqkey == NULL) return -1; - if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype, + if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype, pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); @@ -172,12 +187,13 @@ static int __handle_request_reinstall(uid_t uid, static int __handle_request_uninstall(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { + uid_t target_uid = (uid_t)-1; char *pkgtype = NULL; char *pkgid = NULL; char *reqkey; - g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); - if (pkgtype == NULL || pkgid == NULL) { + g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid); + if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; @@ -186,7 +202,7 @@ static int __handle_request_uninstall(uid_t uid, reqkey = __generate_reqkey(pkgid); if (reqkey == NULL) return -1; - if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype, + if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype, pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); @@ -204,12 +220,13 @@ static int __handle_request_uninstall(uid_t uid, static int __handle_request_move(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { + uid_t target_uid = (uid_t)-1; char *pkgtype = NULL; char *pkgid = NULL; char *reqkey; - g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); - if (pkgtype == NULL || pkgid == NULL) { + g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid); + if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; @@ -218,7 +235,7 @@ static int __handle_request_move(uid_t uid, reqkey = __generate_reqkey(pkgid); if (reqkey == NULL) return -1; - if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype, + if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype, pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); @@ -236,16 +253,17 @@ static int __handle_request_move(uid_t uid, static int __handle_request_enable(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { + uid_t target_uid = (uid_t)-1; char *pkgid = NULL; - g_variant_get(parameters, "(&s)", &pkgid); - if (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; } - if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_ENABLE, "pkg", + if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_ENABLE, "pkg", pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", PKGMGR_R_ESYSTEM)); @@ -261,16 +279,17 @@ static int __handle_request_enable(uid_t uid, static int __handle_request_disable(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { + uid_t target_uid = (uid_t)-1; char *pkgid = NULL; - g_variant_get(parameters, "(&s)", &pkgid); - if (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; } - if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_DISABLE, "pkg", + if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_DISABLE, "pkg", pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", PKGMGR_R_ESYSTEM)); @@ -286,13 +305,14 @@ static int __handle_request_disable(uid_t uid, static int __handle_request_getsize(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { + uid_t target_uid = (uid_t)-1; char *pkgid = NULL; int get_type = -1; char *reqkey; char buf[4]; - g_variant_get(parameters, "(&si)", &pkgid, &get_type); - if (pkgid == NULL || get_type == -1) { + g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type); + if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; @@ -303,7 +323,7 @@ static int __handle_request_getsize(uid_t uid, return -1; snprintf(buf, sizeof(buf), "%d", get_type); - if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "getsize", + if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "getsize", pkgid, buf)) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); @@ -321,17 +341,18 @@ static int __handle_request_getsize(uid_t uid, static int __handle_request_cleardata(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { + uid_t target_uid = (uid_t)-1; char *pkgtype = NULL; char *pkgid = NULL; - g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); - if (pkgtype == NULL || pkgid == NULL) { + g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid); + if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", PKGMGR_R_ECOMM)); return -1; } - if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype, + if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype, pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", PKGMGR_R_ESYSTEM)); @@ -347,16 +368,17 @@ static int __handle_request_cleardata(uid_t uid, static int __handle_request_clearcache(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { - char *pkgid; + uid_t target_uid = (uid_t)-1; + char *pkgid = NULL; - g_variant_get(parameters, "(&s)", &pkgid); - if (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; } - if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE, + if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE, "clearcache", pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", PKGMGR_R_ESYSTEM)); @@ -372,16 +394,17 @@ static int __handle_request_clearcache(uid_t uid, static int __handle_request_kill(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { - char *pkgid; + uid_t target_uid = (uid_t)-1; + char *pkgid = NULL; - g_variant_get(parameters, "(&s)", &pkgid); - if (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; } - if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_KILL, "pkg", + if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_KILL, "pkg", pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", PKGMGR_R_ESYSTEM)); @@ -397,16 +420,17 @@ static int __handle_request_kill(uid_t uid, static int __handle_request_check(uid_t uid, GDBusMethodInvocation *invocation, GVariant *parameters) { - char *pkgid; + uid_t target_uid = (uid_t)-1; + char *pkgid = NULL; - g_variant_get(parameters, "(&s)", &pkgid); - if (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; } - if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_CHECK, "pkg", + if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CHECK, "pkg", pkgid, "")) { g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", PKGMGR_R_ESYSTEM)); -- 2.7.4