7 #include <gum/gum-user.h>
8 #include <gum/common/gum-user-types.h>
11 #include "pkgmgr-server.h"
12 #include "package-manager.h"
14 #define PKGMGR_DBUS_SERVICE "org.tizen.pkgmgr"
15 #define PKGMGR_DBUS_OBJECT_PATH "/org/tizen/pkgmgr"
17 static const char instropection_xml[] =
19 " <interface name='org.tizen.pkgmgr'>"
20 " <method name='install'>"
21 " <arg type='u' name='uid' direction='in'/>"
22 " <arg type='s' name='pkgtype' direction='in'/>"
23 " <arg type='s' name='pkgpath' direction='in'/>"
24 " <arg type='as' name='args' direction='in'/>"
25 " <arg type='i' name='ret' direction='out'/>"
26 " <arg type='s' name='reqkey' direction='out'/>"
28 " <method name='reinstall'>"
29 " <arg type='u' name='uid' direction='in'/>"
30 " <arg type='s' name='pkgtype' direction='in'/>"
31 " <arg type='s' name='pkgid' direction='in'/>"
32 " <arg type='i' name='ret' direction='out'/>"
33 " <arg type='s' name='reqkey' direction='out'/>"
35 " <method name='mount_install'>"
36 " <arg type='u' name='uid' direction='in'/>"
37 " <arg type='s' name='pkgtype' direction='in'/>"
38 " <arg type='s' name='pkgpath' direction='in'/>"
39 " <arg type='as' name='args' direction='in'/>"
40 " <arg type='i' name='ret' direction='out'/>"
41 " <arg type='s' name='reqkey' direction='out'/>"
43 " <method name='uninstall'>"
44 " <arg type='u' name='uid' direction='in'/>"
45 " <arg type='s' name='pkgtype' direction='in'/>"
46 " <arg type='s' name='pkgid' direction='in'/>"
47 " <arg type='i' name='ret' direction='out'/>"
48 " <arg type='s' name='reqkey' direction='out'/>"
50 " <method name='move'>"
51 " <arg type='u' name='uid' direction='in'/>"
52 " <arg type='s' name='pkgtype' direction='in'/>"
53 " <arg type='s' name='pkgid' direction='in'/>"
54 " <arg type='i' name='movetype' direction='in'/>"
55 " <arg type='i' name='ret' direction='out'/>"
56 " <arg type='s' name='reqkey' direction='out'/>"
58 " <method name='enable_pkg'>"
59 " <arg type='u' name='uid' direction='in'/>"
60 " <arg type='s' name='pkgtype' direction='in'/>"
61 " <arg type='s' name='pkgid' direction='in'/>"
62 " <arg type='i' name='ret' direction='out'/>"
64 " <method name='disable_pkg'>"
65 " <arg type='u' name='uid' direction='in'/>"
66 " <arg type='s' name='pkgtype' direction='in'/>"
67 " <arg type='s' name='pkgid' direction='in'/>"
68 " <arg type='i' name='ret' direction='out'/>"
70 " <method name='enable_app'>"
71 " <arg type='u' name='uid' direction='in'/>"
72 " <arg type='s' name='appid' direction='in'/>"
73 " <arg type='i' name='ret' direction='out'/>"
74 " <arg type='s' name='reqkey' direction='out'/>"
76 " <method name='disable_app'>"
77 " <arg type='u' name='uid' direction='in'/>"
78 " <arg type='s' name='appid' direction='in'/>"
79 " <arg type='i' name='ret' direction='out'/>"
80 " <arg type='s' name='reqkey' direction='out'/>"
82 " <method name='enable_global_app_for_uid'>"
83 " <arg type='u' name='uid' direction='in'/>"
84 " <arg type='s' name='appid' direction='in'/>"
85 " <arg type='i' name='ret' direction='out'/>"
86 " <arg type='s' name='reqkey' direction='out'/>"
88 " <method name='disable_global_app_for_uid'>"
89 " <arg type='u' name='uid' direction='in'/>"
90 " <arg type='s' name='appid' direction='in'/>"
91 " <arg type='i' name='ret' direction='out'/>"
92 " <arg type='s' name='reqkey' direction='out'/>"
94 " <method name='getsize'>"
95 " <arg type='u' name='uid' direction='in'/>"
96 " <arg type='s' name='pkgid' direction='in'/>"
97 " <arg type='i' name='get_type' direction='in'/>"
98 " <arg type='i' name='ret' direction='out'/>"
99 " <arg type='s' name='reqkey' direction='out'/>"
101 " <method name='cleardata'>"
102 " <arg type='u' name='uid' direction='in'/>"
103 " <arg type='s' name='pkgtype' direction='in'/>"
104 " <arg type='s' name='pkgid' direction='in'/>"
105 " <arg type='i' name='ret' direction='out'/>"
107 " <method name='clearcache'>"
108 " <arg type='u' name='uid' direction='in'/>"
109 " <arg type='s' name='pkgid' direction='in'/>"
110 " <arg type='i' name='ret' direction='out'/>"
112 " <method name='kill'>"
113 " <arg type='u' name='uid' direction='in'/>"
114 " <arg type='s' name='pkgid' direction='in'/>"
115 " <arg type='i' name='ret' direction='out'/>"
117 " <method name='check'>"
118 " <arg type='u' name='uid' direction='in'/>"
119 " <arg type='s' name='pkgid' direction='in'/>"
120 " <arg type='i' name='ret' direction='out'/>"
122 " <method name='generate_license_request'>"
123 " <arg type='s' name='resp_data' direction='in'/>"
124 " <arg type='i' name='ret' direction='out'/>"
125 " <arg type='s' name='req_data' direction='out'/>"
126 " <arg type='s' name='license_url' direction='out'/>"
128 " <method name='register_license'>"
129 " <arg type='s' name='resp_data' direction='in'/>"
130 " <arg type='i' name='ret' direction='out'/>"
132 " <method name='decrypt_package'>"
133 " <arg type='s' name='drm_file_path' direction='in'/>"
134 " <arg type='s' name='decrypted_file_path' direction='in'/>"
135 " <arg type='i' name='ret' direction='out'/>"
137 " <method name='enable_app_splash_screen'>"
138 " <arg type='u' name='uid' direction='in'/>"
139 " <arg type='s' name='appid' direction='in'/>"
140 " <arg type='i' name='ret' direction='out'/>"
142 " <method name='disable_app_splash_screen'>"
143 " <arg type='u' name='uid' direction='in'/>"
144 " <arg type='s' name='appid' direction='in'/>"
145 " <arg type='i' name='ret' direction='out'/>"
147 " <method name='set_restriction_mode'>"
148 " <arg type='u' name='uid' direction='in'/>"
149 " <arg type='s' name='pkgid' direction='in'/>"
150 " <arg type='i' name='mode' direction='in'/>"
151 " <arg type='i' name='ret' direction='out'/>"
153 " <method name='unset_restriction_mode'>"
154 " <arg type='u' name='uid' direction='in'/>"
155 " <arg type='s' name='pkgid' direction='in'/>"
156 " <arg type='i' name='mode' direction='in'/>"
157 " <arg type='i' name='ret' direction='out'/>"
159 " <method name='get_restriction_mode'>"
160 " <arg type='u' name='uid' direction='in'/>"
161 " <arg type='s' name='pkgid' direction='in'/>"
162 " <arg type='i' name='result' direction='out'/>"
163 " <arg type='i' name='ret' direction='out'/>"
167 static GDBusNodeInfo *instropection_data;
169 static guint owner_id;
170 static GHashTable *req_table;
172 static char *__generate_reqkey(const char *pkgid)
176 char timestr[MAX_PKG_ARGS_LEN];
180 gettimeofday(&tv, NULL);
181 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
182 snprintf(timestr, sizeof(timestr), "%ld", curtime);
184 size = strlen(pkgid) + strlen(timestr) + 2;
185 str_req_key = (char *)calloc(size, sizeof(char));
186 if (str_req_key == NULL) {
187 DBG("calloc failed");
190 snprintf(str_req_key, size, "%s_%s", pkgid, timestr);
195 static int __is_admin_user(uid_t uid)
198 GumUserType ut = GUM_USERTYPE_NONE;
200 guser = gum_user_get_sync(uid, FALSE);
202 ERR("cannot get user information from gumd");
206 g_object_get(G_OBJECT(guser), "usertype", &ut, NULL);
207 if (ut == GUM_USERTYPE_NONE) {
208 ERR("cannot get user type");
209 g_object_unref(guser);
211 } else if (ut != GUM_USERTYPE_ADMIN) {
212 g_object_unref(guser);
216 g_object_unref(guser);
221 #define REGULAR_USER 5000
222 static int __check_caller_permission(uid_t uid,
223 GDBusMethodInvocation *invocation, GVariant *parameters)
229 if (uid < REGULAR_USER)
232 v = g_variant_get_child_value(parameters, 0);
234 g_dbus_method_invocation_return_error_literal(invocation,
235 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
240 target_uid = g_variant_get_uint32(v);
242 if (uid == target_uid)
245 is_admin = __is_admin_user(uid);
246 if (is_admin == -1) {
247 g_dbus_method_invocation_return_error_literal(invocation,
248 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
251 } else if (is_admin == 0) {
252 g_dbus_method_invocation_return_error_literal(invocation,
253 G_DBUS_ERROR, G_DBUS_ERROR_ACCESS_DENIED,
254 "Non-admin user cannot request operation to "
262 static int __handle_request_install(uid_t uid,
263 GDBusMethodInvocation *invocation, GVariant *parameters)
265 uid_t target_uid = (uid_t)-1;
266 char *pkgtype = NULL;
267 char *pkgpath = NULL;
270 gchar **tmp_args = NULL;
277 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
278 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
280 for (i = 0; i < args_count; i++)
281 len = len + strlen(tmp_args[i]) + 1;
283 args = (char *)calloc(len, sizeof(char));
285 ERR("calloc failed");
290 for (i = 0; i < args_count; i++) {
291 strncat(args, tmp_args[i], strlen(tmp_args[i]));
292 if (i != args_count - 1)
293 strncat(args, " ", strlen(" "));
296 if (target_uid == (uid_t)-1 || pkgtype == NULL) {
297 g_dbus_method_invocation_return_value(invocation,
298 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
303 if (pkgpath == NULL) {
304 g_dbus_method_invocation_return_value(invocation,
305 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
310 reqkey = __generate_reqkey(pkgpath);
311 if (reqkey == NULL) {
316 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype,
318 g_dbus_method_invocation_return_value(invocation,
319 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
324 g_dbus_method_invocation_return_value(invocation,
325 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
339 static int __handle_request_mount_install(uid_t uid,
340 GDBusMethodInvocation *invocation, GVariant *parameters)
342 uid_t target_uid = (uid_t)-1;
343 char *pkgtype = NULL;
344 char *pkgpath = NULL;
347 gchar **tmp_args = NULL;
354 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
355 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
357 for (i = 0; i < args_count; i++)
358 len = len + strlen(tmp_args[i]) + 1;
360 args = (char *)calloc(len, sizeof(char));
362 ERR("calloc failed");
367 for (i = 0; i < args_count; i++) {
368 strncat(args, tmp_args[i], strlen(tmp_args[i]));
369 if (i != args_count - 1)
370 strncat(args, " ", strlen(" "));
373 if (target_uid == (uid_t)-1 || pkgtype == NULL) {
374 g_dbus_method_invocation_return_value(invocation,
375 g_variant_new("(is)",
376 PKGMGR_R_ECOMM, ""));
381 if (pkgpath == NULL) {
382 g_dbus_method_invocation_return_value(invocation,
383 g_variant_new("(is)",
384 PKGMGR_R_ECOMM, ""));
389 reqkey = __generate_reqkey(pkgpath);
390 if (reqkey == NULL) {
395 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOUNT_INSTALL,
396 pkgtype, pkgpath, args)) {
397 g_dbus_method_invocation_return_value(invocation,
398 g_variant_new("(is)",
399 PKGMGR_R_ESYSTEM, ""));
404 g_dbus_method_invocation_return_value(invocation,
405 g_variant_new("(is)",
420 static int __handle_request_reinstall(uid_t uid,
421 GDBusMethodInvocation *invocation, GVariant *parameters)
423 uid_t target_uid = (uid_t)-1;
424 char *pkgtype = NULL;
428 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
429 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
430 g_dbus_method_invocation_return_value(invocation,
431 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
435 reqkey = __generate_reqkey(pkgid);
438 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype,
440 g_dbus_method_invocation_return_value(invocation,
441 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
446 g_dbus_method_invocation_return_value(invocation,
447 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
453 static int __handle_request_uninstall(uid_t uid,
454 GDBusMethodInvocation *invocation, GVariant *parameters)
456 uid_t target_uid = (uid_t)-1;
457 char *pkgtype = NULL;
461 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
462 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
463 g_dbus_method_invocation_return_value(invocation,
464 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
468 reqkey = __generate_reqkey(pkgid);
471 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype,
473 g_dbus_method_invocation_return_value(invocation,
474 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
479 g_dbus_method_invocation_return_value(invocation,
480 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
486 static int __handle_request_move(uid_t uid,
487 GDBusMethodInvocation *invocation, GVariant *parameters)
489 uid_t target_uid = (uid_t)-1;
490 char *pkgtype = NULL;
494 char buf[4] = { '\0' };
496 g_variant_get(parameters, "(u&s&si)", &target_uid, &pkgtype, &pkgid, &move_type);
497 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
498 g_dbus_method_invocation_return_value(invocation,
499 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
503 reqkey = __generate_reqkey(pkgid);
507 snprintf(buf, sizeof(buf), "%d", move_type);
508 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype,
510 g_dbus_method_invocation_return_value(invocation,
511 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
516 g_dbus_method_invocation_return_value(invocation,
517 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
523 static int __handle_request_enable_pkg(uid_t uid,
524 GDBusMethodInvocation *invocation, GVariant *parameters)
526 uid_t target_uid = (uid_t)-1;
527 char *pkgtype = NULL;
530 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
531 if (target_uid == (uid_t)-1 || pkgid == NULL) {
532 g_dbus_method_invocation_return_value(invocation,
533 g_variant_new("(i)", PKGMGR_R_ECOMM));
537 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_ENABLE_PKG, pkgtype,
539 g_dbus_method_invocation_return_value(invocation,
540 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
544 g_dbus_method_invocation_return_value(invocation,
545 g_variant_new("(i)", PKGMGR_R_OK));
550 static int __handle_request_disable_pkg(uid_t uid,
551 GDBusMethodInvocation *invocation, GVariant *parameters)
553 uid_t target_uid = (uid_t)-1;
554 char *pkgtype = NULL;
557 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
558 if (target_uid == (uid_t)-1 || pkgid == NULL) {
559 g_dbus_method_invocation_return_value(invocation,
560 g_variant_new("(i)", PKGMGR_R_ECOMM));
564 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_DISABLE_PKG, pkgtype,
566 g_dbus_method_invocation_return_value(invocation,
567 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
571 g_dbus_method_invocation_return_value(invocation,
572 g_variant_new("(i)", PKGMGR_R_OK));
577 static int __handle_request_enable_app(uid_t uid,
578 GDBusMethodInvocation *invocation, GVariant *parameters)
580 uid_t target_uid = (uid_t)-1;
585 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
586 if (target_uid == (uid_t)-1 || appid == NULL) {
587 g_dbus_method_invocation_return_value(invocation,
588 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
592 reqkey = __generate_reqkey(appid);
593 if (reqkey == NULL) {
598 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_APP, "default",
600 g_dbus_method_invocation_return_value(invocation,
601 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
606 g_dbus_method_invocation_return_value(invocation,
607 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
618 static int __handle_request_disable_app(uid_t uid,
619 GDBusMethodInvocation *invocation, GVariant *parameters)
621 uid_t target_uid = (uid_t)-1;
626 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
627 if (target_uid == (uid_t)-1 || appid == NULL) {
628 g_dbus_method_invocation_return_value(invocation,
629 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
633 reqkey = __generate_reqkey(appid);
634 if (reqkey == NULL) {
639 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_APP, "default",
641 g_dbus_method_invocation_return_value(invocation,
642 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
647 g_dbus_method_invocation_return_value(invocation,
648 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
659 static int __handle_request_enable_global_app_for_uid(uid_t uid,
660 GDBusMethodInvocation *invocation, GVariant *parameters)
662 uid_t target_uid = (uid_t)-1;
667 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
668 if (target_uid == (uid_t)-1 || appid == NULL) {
669 g_dbus_method_invocation_return_value(invocation,
670 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
674 reqkey = __generate_reqkey(appid);
675 if (reqkey == NULL) {
680 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID, "default",
682 g_dbus_method_invocation_return_value(invocation,
683 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
688 g_dbus_method_invocation_return_value(invocation,
689 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
700 static int __handle_request_disable_global_app_for_uid(uid_t uid,
701 GDBusMethodInvocation *invocation, GVariant *parameters)
703 uid_t target_uid = (uid_t)-1;
708 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
709 if (target_uid == (uid_t)-1 || appid == NULL) {
710 g_dbus_method_invocation_return_value(invocation,
711 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
715 reqkey = __generate_reqkey(appid);
716 if (reqkey == NULL) {
721 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID, "default",
723 g_dbus_method_invocation_return_value(invocation,
724 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
729 g_dbus_method_invocation_return_value(invocation,
730 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
741 static int __handle_request_getsize(uid_t uid,
742 GDBusMethodInvocation *invocation, GVariant *parameters)
744 uid_t target_uid = (uid_t)-1;
750 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
751 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
752 g_dbus_method_invocation_return_value(invocation,
753 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
757 reqkey = __generate_reqkey(pkgid);
761 snprintf(buf, sizeof(buf), "%d", get_type);
762 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "pkgtool",
764 g_dbus_method_invocation_return_value(invocation,
765 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
770 g_dbus_method_invocation_return_value(invocation,
771 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
777 static int __handle_request_cleardata(uid_t uid,
778 GDBusMethodInvocation *invocation, GVariant *parameters)
780 uid_t target_uid = (uid_t)-1;
781 char *pkgtype = NULL;
785 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
786 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
787 g_dbus_method_invocation_return_value(invocation,
788 g_variant_new("(i)", PKGMGR_R_ECOMM));
792 reqkey = __generate_reqkey(pkgid);
796 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype,
798 g_dbus_method_invocation_return_value(invocation,
799 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
804 g_dbus_method_invocation_return_value(invocation,
805 g_variant_new("(i)", PKGMGR_R_OK));
812 static int __handle_request_clearcache(uid_t uid,
813 GDBusMethodInvocation *invocation, GVariant *parameters)
815 uid_t target_uid = (uid_t)-1;
818 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
819 if (target_uid == (uid_t)-1 || pkgid == NULL) {
820 g_dbus_method_invocation_return_value(invocation,
821 g_variant_new("(i)", PKGMGR_R_ECOMM));
825 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE,
826 "pkgtool", pkgid, "")) {
827 g_dbus_method_invocation_return_value(invocation,
828 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
832 g_dbus_method_invocation_return_value(invocation,
833 g_variant_new("(i)", PKGMGR_R_OK));
838 static int __handle_request_kill(uid_t uid,
839 GDBusMethodInvocation *invocation, GVariant *parameters)
841 uid_t target_uid = (uid_t)-1;
844 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
845 if (target_uid == (uid_t)-1 || pkgid == NULL) {
846 g_dbus_method_invocation_return_value(invocation,
847 g_variant_new("(i)", PKGMGR_R_ECOMM));
851 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_KILL, "default",
853 g_dbus_method_invocation_return_value(invocation,
854 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
858 g_dbus_method_invocation_return_value(invocation,
859 g_variant_new("(i)", PKGMGR_R_OK));
864 static int __handle_request_check(uid_t uid,
865 GDBusMethodInvocation *invocation, GVariant *parameters)
867 uid_t target_uid = (uid_t)-1;
870 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
871 if (target_uid == (uid_t)-1 || pkgid == NULL) {
872 g_dbus_method_invocation_return_value(invocation,
873 g_variant_new("(i)", PKGMGR_R_ECOMM));
877 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CHECK, "default",
879 g_dbus_method_invocation_return_value(invocation,
880 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
884 g_dbus_method_invocation_return_value(invocation,
885 g_variant_new("(i)", PKGMGR_R_OK));
890 static int __handle_request_generate_license_request(uid_t uid,
891 GDBusMethodInvocation *invocation, GVariant *parameters)
894 char *resp_data = NULL;
896 g_variant_get(parameters, "(&s)", &resp_data);
897 if (resp_data == NULL) {
898 g_dbus_method_invocation_return_value(invocation,
899 g_variant_new("(iss)", PKGMGR_R_ECOMM, "", ""));
903 reqkey = __generate_reqkey("drm");
904 if (reqkey == NULL) {
905 g_dbus_method_invocation_return_value(invocation,
906 g_variant_new("(iss)", PKGMGR_R_ENOMEM, "",
911 if (_pm_queue_push(uid, reqkey,
912 PKGMGR_REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
913 "default", "", resp_data)) {
914 g_dbus_method_invocation_return_value(invocation,
915 g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
921 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
922 (gpointer)invocation))
923 ERR("reqkey already exists");
928 static int __handle_request_register_license(uid_t uid,
929 GDBusMethodInvocation *invocation, GVariant *parameters)
932 char *resp_data = NULL;
934 g_variant_get(parameters, "(&s)", &resp_data);
935 if (resp_data == NULL) {
936 g_dbus_method_invocation_return_value(invocation,
937 g_variant_new("(i)", PKGMGR_R_ECOMM));
941 reqkey = __generate_reqkey("drm");
942 if (reqkey == NULL) {
943 g_dbus_method_invocation_return_value(invocation,
944 g_variant_new("(i)", PKGMGR_R_ENOMEM));
948 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REGISTER_LICENSE,
949 "default", "", resp_data)) {
950 g_dbus_method_invocation_return_value(invocation,
951 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
956 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
957 (gpointer)invocation))
958 ERR("reqkey already exists");
963 static int __handle_request_decrypt_package(uid_t uid,
964 GDBusMethodInvocation *invocation, GVariant *parameters)
967 char *drm_file_path = NULL;
968 char *decrypted_file_path = NULL;
970 g_variant_get(parameters, "(&s&s)", &drm_file_path,
971 &decrypted_file_path);
972 if (drm_file_path == NULL || decrypted_file_path == NULL) {
973 g_dbus_method_invocation_return_value(invocation,
974 g_variant_new("(i)", PKGMGR_R_ECOMM));
978 reqkey = __generate_reqkey("drm");
979 if (reqkey == NULL) {
980 g_dbus_method_invocation_return_value(invocation,
981 g_variant_new("(i)", PKGMGR_R_ENOMEM));
985 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_DECRYPT_PACKAGE,
986 "default", drm_file_path, decrypted_file_path)) {
987 g_dbus_method_invocation_return_value(invocation,
988 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
993 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
994 (gpointer)invocation))
995 ERR("reqkey already exists");
1000 static int __update_app_splash_screen(uid_t uid,
1001 GDBusMethodInvocation *invocation, GVariant *parameters,
1004 uid_t target_uid = (uid_t)-1;
1008 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1009 if (target_uid == (uid_t)-1 || appid == NULL) {
1010 ERR("target_uid: %d, appid: %s", target_uid, appid);
1011 g_dbus_method_invocation_return_value(invocation,
1012 g_variant_new("(i)", PKGMGR_R_ECOMM));
1016 reqkey = __generate_reqkey(appid);
1017 if (reqkey == NULL) {
1018 ERR("Failed to generate request key");
1022 if (_pm_queue_push(target_uid, reqkey, req_type, "default",
1024 ERR("Failed to push request");
1025 g_dbus_method_invocation_return_value(invocation,
1026 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1031 g_dbus_method_invocation_return_value(invocation,
1032 g_variant_new("(i)", PKGMGR_R_OK));
1040 static int __handle_request_enable_app_splash_screen(uid_t uid,
1041 GDBusMethodInvocation *invocation, GVariant *parameters)
1043 return __update_app_splash_screen(uid, invocation, parameters,
1044 PKGMGR_REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
1047 static int __handle_request_disable_app_splash_screen(uid_t uid,
1048 GDBusMethodInvocation *invocation, GVariant *parameters)
1050 return __update_app_splash_screen(uid, invocation, parameters,
1051 PKGMGR_REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
1054 static int __handle_request_set_restriction_mode(uid_t uid,
1055 GDBusMethodInvocation *invocation, GVariant *parameters)
1057 uid_t target_uid = (uid_t)-1;
1063 g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
1064 if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
1065 g_dbus_method_invocation_return_value(invocation,
1066 g_variant_new("(i)", PKGMGR_R_ECOMM));
1070 reqkey = __generate_reqkey("restriction");
1071 if (reqkey == NULL) {
1072 g_dbus_method_invocation_return_value(invocation,
1073 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1077 snprintf(buf, sizeof(buf), "%d", mode);
1078 if (_pm_queue_push(target_uid, reqkey,
1079 PKGMGR_REQUEST_TYPE_SET_RESTRICTION_MODE,
1080 "default", pkgid, buf)) {
1081 g_dbus_method_invocation_return_value(invocation,
1082 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1087 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1088 (gpointer)invocation))
1089 ERR("reqkey already exists");
1094 static int __handle_request_unset_restriction_mode(uid_t uid,
1095 GDBusMethodInvocation *invocation, GVariant *parameters)
1097 uid_t target_uid = (uid_t)-1;
1103 g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
1104 if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
1105 g_dbus_method_invocation_return_value(invocation,
1106 g_variant_new("(i)", PKGMGR_R_ECOMM));
1110 reqkey = __generate_reqkey("restriction");
1111 if (reqkey == NULL) {
1112 g_dbus_method_invocation_return_value(invocation,
1113 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1117 snprintf(buf, sizeof(buf), "%d", mode);
1118 if (_pm_queue_push(target_uid, reqkey,
1119 PKGMGR_REQUEST_TYPE_UNSET_RESTRICTION_MODE,
1120 "default", pkgid, buf)) {
1121 g_dbus_method_invocation_return_value(invocation,
1122 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1127 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1128 (gpointer)invocation))
1129 ERR("reqkey already exists");
1134 static int __handle_request_get_restriction_mode(uid_t uid,
1135 GDBusMethodInvocation *invocation, GVariant *parameters)
1137 uid_t target_uid = (uid_t)-1;
1141 g_variant_get(parameters, "(us)", &target_uid, &pkgid);
1142 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1143 g_dbus_method_invocation_return_value(invocation,
1144 g_variant_new("(i)", PKGMGR_R_ECOMM));
1148 reqkey = __generate_reqkey("restriction");
1149 if (reqkey == NULL) {
1150 g_dbus_method_invocation_return_value(invocation,
1151 g_variant_new("(ii)", -1, PKGMGR_R_ENOMEM));
1155 if (_pm_queue_push(target_uid, reqkey,
1156 PKGMGR_REQUEST_TYPE_GET_RESTRICTION_MODE,
1157 "default", pkgid, "")) {
1158 g_dbus_method_invocation_return_value(invocation,
1159 g_variant_new("(ii)", -1, PKGMGR_R_ESYSTEM));
1164 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1165 (gpointer)invocation))
1166 ERR("reqkey already exists");
1171 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
1177 result = g_dbus_connection_call_sync(connection,
1178 "org.freedesktop.DBus", "/org/freedesktop/DBus",
1179 "org.freedesktop.DBus", "GetConnectionUnixUser",
1180 g_variant_new("(s)", name), NULL,
1181 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
1182 if (result == NULL) {
1183 ERR("failed to get caller uid: %s", err->message);
1188 g_variant_get(result, "(u)", &uid);
1193 static void __handle_method_call(GDBusConnection *connection,
1194 const gchar *sender, const gchar *object_path,
1195 const gchar *interface_name, const gchar *method_name,
1196 GVariant *parameters, GDBusMethodInvocation *invocation,
1202 uid = __get_caller_uid(connection,
1203 g_dbus_method_invocation_get_sender(invocation));
1204 if (uid == (uid_t)-1)
1207 if (__check_caller_permission(uid, invocation, parameters))
1210 if (g_strcmp0(method_name, "install") == 0)
1211 ret = __handle_request_install(uid, invocation, parameters);
1212 else if (g_strcmp0(method_name, "mount_install") == 0)
1213 ret = __handle_request_mount_install(uid, invocation, parameters);
1214 else if (g_strcmp0(method_name, "reinstall") == 0)
1215 ret = __handle_request_reinstall(uid, invocation, parameters);
1216 else if (g_strcmp0(method_name, "uninstall") == 0)
1217 ret = __handle_request_uninstall(uid, invocation, parameters);
1218 else if (g_strcmp0(method_name, "cleardata") == 0)
1219 ret = __handle_request_cleardata(uid, invocation, parameters);
1220 else if (g_strcmp0(method_name, "move") == 0)
1221 ret = __handle_request_move(uid, invocation, parameters);
1222 else if (g_strcmp0(method_name, "enable") == 0)
1223 ret = __handle_request_enable_pkg(uid, invocation, parameters);
1224 else if (g_strcmp0(method_name, "disable") == 0)
1225 ret = __handle_request_disable_pkg(uid, invocation, parameters);
1226 else if (g_strcmp0(method_name, "getsize") == 0)
1227 ret = __handle_request_getsize(uid, invocation, parameters);
1228 else if (g_strcmp0(method_name, "clearcache") == 0)
1229 ret = __handle_request_clearcache(uid, invocation, parameters);
1230 else if (g_strcmp0(method_name, "enable_app") == 0)
1231 ret = __handle_request_enable_app(uid, invocation, parameters);
1232 else if (g_strcmp0(method_name, "disable_app") == 0)
1233 ret = __handle_request_disable_app(uid, invocation, parameters);
1234 else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
1235 ret = __handle_request_enable_global_app_for_uid(uid, invocation, parameters);
1236 else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
1237 ret = __handle_request_disable_global_app_for_uid(uid, invocation, parameters);
1238 else if (g_strcmp0(method_name, "kill") == 0)
1239 ret = __handle_request_kill(uid, invocation, parameters);
1240 else if (g_strcmp0(method_name, "check") == 0)
1241 ret = __handle_request_check(uid, invocation, parameters);
1242 else if (g_strcmp0(method_name, "generate_license_request") == 0)
1243 ret = __handle_request_generate_license_request(uid, invocation,
1245 else if (g_strcmp0(method_name, "register_license") == 0)
1246 ret = __handle_request_register_license(uid, invocation,
1248 else if (g_strcmp0(method_name, "decrypt_package") == 0)
1249 ret = __handle_request_decrypt_package(uid, invocation,
1251 else if (g_strcmp0(method_name, "disable_app_splash_screen") == 0)
1252 ret = __handle_request_disable_app_splash_screen(uid,
1253 invocation, parameters);
1254 else if (g_strcmp0(method_name, "enable_app_splash_screen") == 0)
1255 ret = __handle_request_enable_app_splash_screen(uid,
1256 invocation, parameters);
1257 else if (g_strcmp0(method_name, "set_restriction_mode") == 0)
1258 ret = __handle_request_set_restriction_mode(uid, invocation,
1260 else if (g_strcmp0(method_name, "unset_restriction_mode") == 0)
1261 ret = __handle_request_unset_restriction_mode(uid, invocation,
1263 else if (g_strcmp0(method_name, "get_restriction_mode") == 0)
1264 ret = __handle_request_get_restriction_mode(uid, invocation,
1270 g_idle_add(queue_job, NULL);
1273 int __return_value_to_caller(const char *req_key, GVariant *result)
1275 GDBusMethodInvocation *invocation;
1277 invocation = (GDBusMethodInvocation *)g_hash_table_lookup(req_table,
1279 if (invocation == NULL) {
1280 ERR("no such request id");
1284 g_dbus_method_invocation_return_value(invocation, result);
1285 g_hash_table_remove(req_table, (gpointer)req_key);
1290 static const GDBusInterfaceVTable interface_vtable =
1292 __handle_method_call,
1297 static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
1302 DBG("on bus acquired");
1304 reg_id = g_dbus_connection_register_object(connection,
1305 PKGMGR_DBUS_OBJECT_PATH,
1306 instropection_data->interfaces[0],
1307 &interface_vtable, NULL, NULL, &err);
1310 ERR("failed to register object: %s", err->message);
1315 static void __on_name_acquired(GDBusConnection *connection, const gchar *name,
1318 DBG("on name acquired: %s", name);
1321 static void __on_name_lost(GDBusConnection *connection, const gchar *name,
1324 DBG("on name lost: %s", name);
1327 int __init_request_handler(void)
1329 instropection_data = g_dbus_node_info_new_for_xml(instropection_xml, NULL);
1331 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, PKGMGR_DBUS_SERVICE,
1332 G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
1333 __on_name_acquired, __on_name_lost, NULL, NULL);
1335 req_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1337 if (req_table == NULL)
1343 void __fini_request_handler(void)
1345 g_hash_table_destroy(req_table);
1346 g_bus_unown_name(owner_id);
1347 g_dbus_node_info_unref(instropection_data);