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'/>"
57 " <method name='enable_pkg'>"
58 " <arg type='u' name='uid' direction='in'/>"
59 " <arg type='s' name='pkgtype' direction='in'/>"
60 " <arg type='s' name='pkgid' direction='in'/>"
61 " <arg type='i' name='ret' direction='out'/>"
63 " <method name='disable_pkg'>"
64 " <arg type='u' name='uid' direction='in'/>"
65 " <arg type='s' name='pkgtype' direction='in'/>"
66 " <arg type='s' name='pkgid' direction='in'/>"
67 " <arg type='i' name='ret' direction='out'/>"
69 " <method name='enable_app'>"
70 " <arg type='u' name='uid' direction='in'/>"
71 " <arg type='s' name='appid' direction='in'/>"
72 " <arg type='i' name='ret' direction='out'/>"
73 " <arg type='s' name='reqkey' direction='out'/>"
75 " <method name='disable_app'>"
76 " <arg type='u' name='uid' direction='in'/>"
77 " <arg type='s' name='appid' direction='in'/>"
78 " <arg type='i' name='ret' direction='out'/>"
79 " <arg type='s' name='reqkey' direction='out'/>"
81 " <method name='enable_global_app_for_uid'>"
82 " <arg type='u' name='uid' direction='in'/>"
83 " <arg type='s' name='appid' direction='in'/>"
84 " <arg type='i' name='ret' direction='out'/>"
85 " <arg type='s' name='reqkey' direction='out'/>"
87 " <method name='disable_global_app_for_uid'>"
88 " <arg type='u' name='uid' direction='in'/>"
89 " <arg type='s' name='appid' direction='in'/>"
90 " <arg type='i' name='ret' direction='out'/>"
91 " <arg type='s' name='reqkey' direction='out'/>"
93 " <method name='getsize'>"
94 " <arg type='u' name='uid' direction='in'/>"
95 " <arg type='s' name='pkgid' direction='in'/>"
96 " <arg type='i' name='get_type' direction='in'/>"
97 " <arg type='i' name='ret' direction='out'/>"
98 " <arg type='s' name='reqkey' direction='out'/>"
100 " <method name='cleardata'>"
101 " <arg type='u' name='uid' direction='in'/>"
102 " <arg type='s' name='pkgtype' direction='in'/>"
103 " <arg type='s' name='pkgid' direction='in'/>"
104 " <arg type='i' name='ret' direction='out'/>"
106 " <method name='clearcache'>"
107 " <arg type='u' name='uid' direction='in'/>"
108 " <arg type='s' name='pkgid' direction='in'/>"
109 " <arg type='i' name='ret' direction='out'/>"
111 " <method name='kill'>"
112 " <arg type='u' name='uid' direction='in'/>"
113 " <arg type='s' name='pkgid' direction='in'/>"
114 " <arg type='i' name='ret' direction='out'/>"
116 " <method name='check'>"
117 " <arg type='u' name='uid' direction='in'/>"
118 " <arg type='s' name='pkgid' direction='in'/>"
119 " <arg type='i' name='ret' direction='out'/>"
121 " <method name='generate_license_request'>"
122 " <arg type='s' name='resp_data' direction='in'/>"
123 " <arg type='i' name='ret' direction='out'/>"
124 " <arg type='s' name='req_data' direction='out'/>"
125 " <arg type='s' name='license_url' direction='out'/>"
127 " <method name='register_license'>"
128 " <arg type='s' name='resp_data' direction='in'/>"
129 " <arg type='i' name='ret' direction='out'/>"
131 " <method name='decrypt_package'>"
132 " <arg type='s' name='drm_file_path' direction='in'/>"
133 " <arg type='s' name='decrypted_file_path' direction='in'/>"
134 " <arg type='i' name='ret' direction='out'/>"
136 " <method name='add_blacklist'>"
137 " <arg type='u' name='uid' direction='in'/>"
138 " <arg type='s' name='pkgid' direction='in'/>"
139 " <arg type='i' name='ret' direction='out'/>"
141 " <method name='remove_blacklist'>"
142 " <arg type='u' name='uid' direction='in'/>"
143 " <arg type='s' name='pkgid' direction='in'/>"
144 " <arg type='i' name='ret' direction='out'/>"
146 " <method name='check_blacklist'>"
147 " <arg type='u' name='uid' direction='in'/>"
148 " <arg type='s' name='pkgid' direction='in'/>"
149 " <arg type='i' name='result' direction='out'/>"
150 " <arg type='i' name='ret' direction='out'/>"
152 " <method name='enable_app_splash_screen'>"
153 " <arg type='u' name='uid' direction='in'/>"
154 " <arg type='s' name='appid' direction='in'/>"
155 " <arg type='i' name='ret' direction='out'/>"
157 " <method name='disable_app_splash_screen'>"
158 " <arg type='u' name='uid' direction='in'/>"
159 " <arg type='s' name='appid' direction='in'/>"
160 " <arg type='i' name='ret' direction='out'/>"
164 static GDBusNodeInfo *instropection_data;
166 static guint owner_id;
167 static GHashTable *req_table;
169 static char *__generate_reqkey(const char *pkgid)
173 char timestr[MAX_PKG_ARGS_LEN];
177 gettimeofday(&tv, NULL);
178 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
179 snprintf(timestr, sizeof(timestr), "%ld", curtime);
181 size = strlen(pkgid) + strlen(timestr) + 2;
182 str_req_key = (char *)calloc(size, sizeof(char));
183 if (str_req_key == NULL) {
184 DBG("calloc failed");
187 snprintf(str_req_key, size, "%s_%s", pkgid, timestr);
192 static int __is_admin_user(uid_t uid)
195 GumUserType ut = GUM_USERTYPE_NONE;
197 guser = gum_user_get_sync(uid, FALSE);
199 ERR("cannot get user information from gumd");
203 g_object_get(G_OBJECT(guser), "usertype", &ut, NULL);
204 if (ut == GUM_USERTYPE_NONE) {
205 ERR("cannot get user type");
206 g_object_unref(guser);
208 } else if (ut != GUM_USERTYPE_ADMIN) {
209 g_object_unref(guser);
213 g_object_unref(guser);
218 static int __check_caller_permission(uid_t uid,
219 GDBusMethodInvocation *invocation, GVariant *parameters)
225 v = g_variant_get_child_value(parameters, 0);
227 g_dbus_method_invocation_return_error_literal(invocation,
228 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
233 target_uid = g_variant_get_uint32(v);
235 if (uid == target_uid)
238 is_admin = __is_admin_user(uid);
239 if (is_admin == -1) {
240 g_dbus_method_invocation_return_error_literal(invocation,
241 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
244 } else if (is_admin == 0) {
245 g_dbus_method_invocation_return_error_literal(invocation,
246 G_DBUS_ERROR, G_DBUS_ERROR_ACCESS_DENIED,
247 "Non-admin user cannot request operation to "
255 static int __handle_request_install(uid_t uid,
256 GDBusMethodInvocation *invocation, GVariant *parameters)
258 uid_t target_uid = (uid_t)-1;
259 char *pkgtype = NULL;
260 char *pkgpath = NULL;
263 gchar **tmp_args = NULL;
270 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
271 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
273 for (i = 0; i < args_count; i++)
274 len = len + strlen(tmp_args[i]) + 1;
276 args = (char *)calloc(len, sizeof(char));
278 ERR("calloc failed");
283 for (i = 0; i < args_count; i++) {
284 strncat(args, tmp_args[i], strlen(tmp_args[i]));
285 if (i != args_count - 1)
286 strncat(args, " ", strlen(" "));
289 if (target_uid == (uid_t)-1 || pkgtype == NULL) {
290 g_dbus_method_invocation_return_value(invocation,
291 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
296 if (pkgpath == NULL) {
297 g_dbus_method_invocation_return_value(invocation,
298 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
303 reqkey = __generate_reqkey(pkgpath);
304 if (reqkey == NULL) {
309 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype,
311 g_dbus_method_invocation_return_value(invocation,
312 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
317 g_dbus_method_invocation_return_value(invocation,
318 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
332 static int __handle_request_mount_install(uid_t uid,
333 GDBusMethodInvocation *invocation, GVariant *parameters)
335 uid_t target_uid = (uid_t)-1;
336 char *pkgtype = NULL;
337 char *pkgpath = NULL;
340 gchar **tmp_args = NULL;
347 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
348 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
350 for (i = 0; i < args_count; i++)
351 len = len + strlen(tmp_args[i]) + 1;
353 args = (char *)calloc(len, sizeof(char));
355 ERR("calloc failed");
360 for (i = 0; i < args_count; i++) {
361 strncat(args, tmp_args[i], strlen(tmp_args[i]));
362 if (i != args_count - 1)
363 strncat(args, " ", strlen(" "));
366 if (target_uid == (uid_t)-1 || pkgtype == NULL) {
367 g_dbus_method_invocation_return_value(invocation,
368 g_variant_new("(is)",
369 PKGMGR_R_ECOMM, ""));
374 if (pkgpath == NULL) {
375 g_dbus_method_invocation_return_value(invocation,
376 g_variant_new("(is)",
377 PKGMGR_R_ECOMM, ""));
382 reqkey = __generate_reqkey(pkgpath);
383 if (reqkey == NULL) {
388 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOUNT_INSTALL,
389 pkgtype, pkgpath, args)) {
390 g_dbus_method_invocation_return_value(invocation,
391 g_variant_new("(is)",
392 PKGMGR_R_ESYSTEM, ""));
397 g_dbus_method_invocation_return_value(invocation,
398 g_variant_new("(is)",
413 static int __handle_request_reinstall(uid_t uid,
414 GDBusMethodInvocation *invocation, GVariant *parameters)
416 uid_t target_uid = (uid_t)-1;
417 char *pkgtype = NULL;
421 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
422 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
423 g_dbus_method_invocation_return_value(invocation,
424 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
428 reqkey = __generate_reqkey(pkgid);
431 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype,
433 g_dbus_method_invocation_return_value(invocation,
434 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
439 g_dbus_method_invocation_return_value(invocation,
440 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
446 static int __handle_request_uninstall(uid_t uid,
447 GDBusMethodInvocation *invocation, GVariant *parameters)
449 uid_t target_uid = (uid_t)-1;
450 char *pkgtype = NULL;
454 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
455 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
456 g_dbus_method_invocation_return_value(invocation,
457 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
461 reqkey = __generate_reqkey(pkgid);
464 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype,
466 g_dbus_method_invocation_return_value(invocation,
467 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
472 g_dbus_method_invocation_return_value(invocation,
473 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
479 static int __handle_request_move(uid_t uid,
480 GDBusMethodInvocation *invocation, GVariant *parameters)
482 uid_t target_uid = (uid_t)-1;
483 char *pkgtype = NULL;
487 char buf[4] = { '\0' };
489 g_variant_get(parameters, "(u&s&si)", &target_uid, &pkgtype, &pkgid, &move_type);
490 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
491 g_dbus_method_invocation_return_value(invocation,
492 g_variant_new("(i)", PKGMGR_R_ECOMM));
496 reqkey = __generate_reqkey(pkgid);
500 snprintf(buf, sizeof(buf), "%d", move_type);
501 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype,
503 g_dbus_method_invocation_return_value(invocation,
504 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
509 g_dbus_method_invocation_return_value(invocation,
510 g_variant_new("(i)", PKGMGR_R_OK));
516 static int __handle_request_enable_pkg(uid_t uid,
517 GDBusMethodInvocation *invocation, GVariant *parameters)
519 uid_t target_uid = (uid_t)-1;
520 char *pkgtype = NULL;
523 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
524 if (target_uid == (uid_t)-1 || pkgid == NULL) {
525 g_dbus_method_invocation_return_value(invocation,
526 g_variant_new("(i)", PKGMGR_R_ECOMM));
530 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_ENABLE_PKG, pkgtype,
532 g_dbus_method_invocation_return_value(invocation,
533 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
537 g_dbus_method_invocation_return_value(invocation,
538 g_variant_new("(i)", PKGMGR_R_OK));
543 static int __handle_request_disable_pkg(uid_t uid,
544 GDBusMethodInvocation *invocation, GVariant *parameters)
546 uid_t target_uid = (uid_t)-1;
547 char *pkgtype = NULL;
550 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
551 if (target_uid == (uid_t)-1 || pkgid == NULL) {
552 g_dbus_method_invocation_return_value(invocation,
553 g_variant_new("(i)", PKGMGR_R_ECOMM));
557 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_DISABLE_PKG, pkgtype,
559 g_dbus_method_invocation_return_value(invocation,
560 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
564 g_dbus_method_invocation_return_value(invocation,
565 g_variant_new("(i)", PKGMGR_R_OK));
570 static int __handle_request_enable_app(uid_t uid,
571 GDBusMethodInvocation *invocation, GVariant *parameters)
573 uid_t target_uid = (uid_t)-1;
578 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
579 if (target_uid == (uid_t)-1 || appid == NULL) {
580 g_dbus_method_invocation_return_value(invocation,
581 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
585 reqkey = __generate_reqkey(appid);
586 if (reqkey == NULL) {
591 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_APP, "default",
593 g_dbus_method_invocation_return_value(invocation,
594 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
599 g_dbus_method_invocation_return_value(invocation,
600 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
611 static int __handle_request_disable_app(uid_t uid,
612 GDBusMethodInvocation *invocation, GVariant *parameters)
614 uid_t target_uid = (uid_t)-1;
619 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
620 if (target_uid == (uid_t)-1 || appid == NULL) {
621 g_dbus_method_invocation_return_value(invocation,
622 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
626 reqkey = __generate_reqkey(appid);
627 if (reqkey == NULL) {
632 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_APP, "default",
634 g_dbus_method_invocation_return_value(invocation,
635 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
640 g_dbus_method_invocation_return_value(invocation,
641 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
652 static int __handle_request_enable_global_app_for_uid(uid_t uid,
653 GDBusMethodInvocation *invocation, GVariant *parameters)
655 uid_t target_uid = (uid_t)-1;
660 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
661 if (target_uid == (uid_t)-1 || appid == NULL) {
662 g_dbus_method_invocation_return_value(invocation,
663 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
667 reqkey = __generate_reqkey(appid);
668 if (reqkey == NULL) {
673 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID, "default",
675 g_dbus_method_invocation_return_value(invocation,
676 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
681 g_dbus_method_invocation_return_value(invocation,
682 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
693 static int __handle_request_disable_global_app_for_uid(uid_t uid,
694 GDBusMethodInvocation *invocation, GVariant *parameters)
696 uid_t target_uid = (uid_t)-1;
701 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
702 if (target_uid == (uid_t)-1 || appid == NULL) {
703 g_dbus_method_invocation_return_value(invocation,
704 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
708 reqkey = __generate_reqkey(appid);
709 if (reqkey == NULL) {
714 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID, "default",
716 g_dbus_method_invocation_return_value(invocation,
717 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
722 g_dbus_method_invocation_return_value(invocation,
723 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
734 static int __handle_request_getsize(uid_t uid,
735 GDBusMethodInvocation *invocation, GVariant *parameters)
737 uid_t target_uid = (uid_t)-1;
743 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
744 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
745 g_dbus_method_invocation_return_value(invocation,
746 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
750 reqkey = __generate_reqkey(pkgid);
754 snprintf(buf, sizeof(buf), "%d", get_type);
755 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "pkgtool",
757 g_dbus_method_invocation_return_value(invocation,
758 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
763 g_dbus_method_invocation_return_value(invocation,
764 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
770 static int __handle_request_cleardata(uid_t uid,
771 GDBusMethodInvocation *invocation, GVariant *parameters)
773 uid_t target_uid = (uid_t)-1;
774 char *pkgtype = NULL;
777 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
778 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
779 g_dbus_method_invocation_return_value(invocation,
780 g_variant_new("(i)", PKGMGR_R_ECOMM));
784 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARDATA, "pkgtool",
786 g_dbus_method_invocation_return_value(invocation,
787 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
791 g_dbus_method_invocation_return_value(invocation,
792 g_variant_new("(i)", PKGMGR_R_OK));
797 static int __handle_request_clearcache(uid_t uid,
798 GDBusMethodInvocation *invocation, GVariant *parameters)
800 uid_t target_uid = (uid_t)-1;
803 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
804 if (target_uid == (uid_t)-1 || pkgid == NULL) {
805 g_dbus_method_invocation_return_value(invocation,
806 g_variant_new("(i)", PKGMGR_R_ECOMM));
810 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE,
811 "pkgtool", pkgid, "")) {
812 g_dbus_method_invocation_return_value(invocation,
813 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
817 g_dbus_method_invocation_return_value(invocation,
818 g_variant_new("(i)", PKGMGR_R_OK));
823 static int __handle_request_kill(uid_t uid,
824 GDBusMethodInvocation *invocation, GVariant *parameters)
826 uid_t target_uid = (uid_t)-1;
829 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
830 if (target_uid == (uid_t)-1 || pkgid == NULL) {
831 g_dbus_method_invocation_return_value(invocation,
832 g_variant_new("(i)", PKGMGR_R_ECOMM));
836 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_KILL, "default",
838 g_dbus_method_invocation_return_value(invocation,
839 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
843 g_dbus_method_invocation_return_value(invocation,
844 g_variant_new("(i)", PKGMGR_R_OK));
849 static int __handle_request_check(uid_t uid,
850 GDBusMethodInvocation *invocation, GVariant *parameters)
852 uid_t target_uid = (uid_t)-1;
855 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
856 if (target_uid == (uid_t)-1 || pkgid == NULL) {
857 g_dbus_method_invocation_return_value(invocation,
858 g_variant_new("(i)", PKGMGR_R_ECOMM));
862 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CHECK, "default",
864 g_dbus_method_invocation_return_value(invocation,
865 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
869 g_dbus_method_invocation_return_value(invocation,
870 g_variant_new("(i)", PKGMGR_R_OK));
875 static int __handle_request_generate_license_request(uid_t uid,
876 GDBusMethodInvocation *invocation, GVariant *parameters)
879 char *resp_data = NULL;
881 g_variant_get(parameters, "(&s)", &resp_data);
882 if (resp_data == NULL) {
883 g_dbus_method_invocation_return_value(invocation,
884 g_variant_new("(iss)", PKGMGR_R_ECOMM, "", ""));
888 reqkey = __generate_reqkey("drm");
889 if (reqkey == NULL) {
890 g_dbus_method_invocation_return_value(invocation,
891 g_variant_new("(iss)", PKGMGR_R_ENOMEM, "",
896 if (_pm_queue_push(uid, reqkey,
897 PKGMGR_REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
898 "default", "", resp_data)) {
899 g_dbus_method_invocation_return_value(invocation,
900 g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
906 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
907 (gpointer)invocation))
908 ERR("reqkey already exists");
913 static int __handle_request_register_license(uid_t uid,
914 GDBusMethodInvocation *invocation, GVariant *parameters)
917 char *resp_data = NULL;
919 g_variant_get(parameters, "(&s)", &resp_data);
920 if (resp_data == NULL) {
921 g_dbus_method_invocation_return_value(invocation,
922 g_variant_new("(i)", PKGMGR_R_ECOMM));
926 reqkey = __generate_reqkey("drm");
927 if (reqkey == NULL) {
928 g_dbus_method_invocation_return_value(invocation,
929 g_variant_new("(i)", PKGMGR_R_ENOMEM));
933 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REGISTER_LICENSE,
934 "default", "", resp_data)) {
935 g_dbus_method_invocation_return_value(invocation,
936 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
941 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
942 (gpointer)invocation))
943 ERR("reqkey already exists");
948 static int __handle_request_decrypt_package(uid_t uid,
949 GDBusMethodInvocation *invocation, GVariant *parameters)
952 char *drm_file_path = NULL;
953 char *decrypted_file_path = NULL;
955 g_variant_get(parameters, "(&s&s)", &drm_file_path,
956 &decrypted_file_path);
957 if (drm_file_path == NULL || decrypted_file_path == NULL) {
958 g_dbus_method_invocation_return_value(invocation,
959 g_variant_new("(i)", PKGMGR_R_ECOMM));
963 reqkey = __generate_reqkey("drm");
964 if (reqkey == NULL) {
965 g_dbus_method_invocation_return_value(invocation,
966 g_variant_new("(i)", PKGMGR_R_ENOMEM));
970 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_DECRYPT_PACKAGE,
971 "default", drm_file_path, decrypted_file_path)) {
972 g_dbus_method_invocation_return_value(invocation,
973 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
978 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
979 (gpointer)invocation))
980 ERR("reqkey already exists");
985 static int __handle_request_add_blacklist(uid_t uid,
986 GDBusMethodInvocation *invocation, GVariant *parameters)
988 uid_t target_uid = (uid_t)-1;
992 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
993 if (target_uid == (uid_t)-1 || pkgid == NULL) {
994 g_dbus_method_invocation_return_value(invocation,
995 g_variant_new("(i)", PKGMGR_R_ECOMM));
999 reqkey = __generate_reqkey("blacklist");
1000 if (reqkey == NULL) {
1001 g_dbus_method_invocation_return_value(invocation,
1002 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1006 if (_pm_queue_push(target_uid, reqkey,
1007 PKGMGR_REQUEST_TYPE_ADD_BLACKLIST,
1008 "default", pkgid, "")) {
1009 g_dbus_method_invocation_return_value(invocation,
1010 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1015 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1016 (gpointer)invocation))
1017 ERR("reqkey already exists");
1022 static int __handle_request_remove_blacklist(uid_t uid,
1023 GDBusMethodInvocation *invocation, GVariant *parameters)
1025 uid_t target_uid = (uid_t)-1;
1029 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1030 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1031 g_dbus_method_invocation_return_value(invocation,
1032 g_variant_new("(i)", PKGMGR_R_ECOMM));
1036 reqkey = __generate_reqkey("blacklist");
1037 if (reqkey == NULL) {
1038 g_dbus_method_invocation_return_value(invocation,
1039 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1043 if (_pm_queue_push(target_uid, reqkey,
1044 PKGMGR_REQUEST_TYPE_REMOVE_BLACKLIST,
1045 "default", pkgid, "")) {
1046 g_dbus_method_invocation_return_value(invocation,
1047 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1052 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1053 (gpointer)invocation))
1054 ERR("reqkey already exists");
1059 static int __handle_request_check_blacklist(uid_t uid,
1060 GDBusMethodInvocation *invocation, GVariant *parameters)
1062 uid_t target_uid = (uid_t)-1;
1066 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1067 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1068 g_dbus_method_invocation_return_value(invocation,
1069 g_variant_new("(ii)", PKGMGR_R_ECOMM, -1));
1073 reqkey = __generate_reqkey("blacklist");
1074 if (reqkey == NULL) {
1075 g_dbus_method_invocation_return_value(invocation,
1076 g_variant_new("(ii)", PKGMGR_R_ENOMEM, -1));
1080 if (_pm_queue_push(target_uid, reqkey,
1081 PKGMGR_REQUEST_TYPE_CHECK_BLACKLIST,
1082 "default", pkgid, "")) {
1083 g_dbus_method_invocation_return_value(invocation,
1084 g_variant_new("(ii)", PKGMGR_R_ESYSTEM, -1));
1089 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1090 (gpointer)invocation))
1091 ERR("reqkey already exists");
1097 static int __update_app_splash_screen(uid_t uid,
1098 GDBusMethodInvocation *invocation, GVariant *parameters,
1101 uid_t target_uid = (uid_t)-1;
1105 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1106 if (target_uid == (uid_t)-1 || appid == NULL) {
1107 ERR("target_uid: %d, appid: %s", target_uid, appid);
1108 g_dbus_method_invocation_return_value(invocation,
1109 g_variant_new("(i)", PKGMGR_R_ECOMM));
1113 reqkey = __generate_reqkey(appid);
1114 if (reqkey == NULL) {
1115 ERR("Failed to generate request key");
1119 if (_pm_queue_push(target_uid, reqkey, req_type, "default",
1121 ERR("Failed to push request");
1122 g_dbus_method_invocation_return_value(invocation,
1123 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1128 g_dbus_method_invocation_return_value(invocation,
1129 g_variant_new("(i)", PKGMGR_R_OK));
1137 static int __handle_request_enable_app_splash_screen(uid_t uid,
1138 GDBusMethodInvocation *invocation, GVariant *parameters)
1140 return __update_app_splash_screen(uid, invocation, parameters,
1141 PKGMGR_REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
1144 static int __handle_request_disable_app_splash_screen(uid_t uid,
1145 GDBusMethodInvocation *invocation, GVariant *parameters)
1147 return __update_app_splash_screen(uid, invocation, parameters,
1148 PKGMGR_REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
1151 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
1157 result = g_dbus_connection_call_sync(connection,
1158 "org.freedesktop.DBus", "/org/freedesktop/DBus",
1159 "org.freedesktop.DBus", "GetConnectionUnixUser",
1160 g_variant_new("(s)", name), NULL,
1161 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
1162 if (result == NULL) {
1163 ERR("failed to get caller uid: %s", err->message);
1168 g_variant_get(result, "(u)", &uid);
1173 static void __handle_method_call(GDBusConnection *connection,
1174 const gchar *sender, const gchar *object_path,
1175 const gchar *interface_name, const gchar *method_name,
1176 GVariant *parameters, GDBusMethodInvocation *invocation,
1182 uid = __get_caller_uid(connection,
1183 g_dbus_method_invocation_get_sender(invocation));
1184 if (uid == (uid_t)-1)
1187 if (__check_caller_permission(uid, invocation, parameters))
1190 if (g_strcmp0(method_name, "install") == 0)
1191 ret = __handle_request_install(uid, invocation, parameters);
1192 else if (g_strcmp0(method_name, "mount_install") == 0)
1193 ret = __handle_request_mount_install(uid, invocation, parameters);
1194 else if (g_strcmp0(method_name, "reinstall") == 0)
1195 ret = __handle_request_reinstall(uid, invocation, parameters);
1196 else if (g_strcmp0(method_name, "uninstall") == 0)
1197 ret = __handle_request_uninstall(uid, invocation, parameters);
1198 else if (g_strcmp0(method_name, "cleardata") == 0)
1199 ret = __handle_request_cleardata(uid, invocation, parameters);
1200 else if (g_strcmp0(method_name, "move") == 0)
1201 ret = __handle_request_move(uid, invocation, parameters);
1202 else if (g_strcmp0(method_name, "enable") == 0)
1203 ret = __handle_request_enable_pkg(uid, invocation, parameters);
1204 else if (g_strcmp0(method_name, "disable") == 0)
1205 ret = __handle_request_disable_pkg(uid, invocation, parameters);
1206 else if (g_strcmp0(method_name, "getsize") == 0)
1207 ret = __handle_request_getsize(uid, invocation, parameters);
1208 else if (g_strcmp0(method_name, "clearcache") == 0)
1209 ret = __handle_request_clearcache(uid, invocation, parameters);
1210 else if (g_strcmp0(method_name, "enable_app") == 0)
1211 ret = __handle_request_enable_app(uid, invocation, parameters);
1212 else if (g_strcmp0(method_name, "disable_app") == 0)
1213 ret = __handle_request_disable_app(uid, invocation, parameters);
1214 else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
1215 ret = __handle_request_enable_global_app_for_uid(uid, invocation, parameters);
1216 else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
1217 ret = __handle_request_disable_global_app_for_uid(uid, invocation, parameters);
1218 else if (g_strcmp0(method_name, "kill") == 0)
1219 ret = __handle_request_kill(uid, invocation, parameters);
1220 else if (g_strcmp0(method_name, "check") == 0)
1221 ret = __handle_request_check(uid, invocation, parameters);
1222 else if (g_strcmp0(method_name, "generate_license_request") == 0)
1223 ret = __handle_request_generate_license_request(uid, invocation,
1225 else if (g_strcmp0(method_name, "register_license") == 0)
1226 ret = __handle_request_register_license(uid, invocation,
1228 else if (g_strcmp0(method_name, "decrypt_package") == 0)
1229 ret = __handle_request_decrypt_package(uid, invocation,
1231 else if (g_strcmp0(method_name, "add_blacklist") == 0)
1232 ret = __handle_request_add_blacklist(uid, invocation,
1234 else if (g_strcmp0(method_name, "remove_blacklist") == 0)
1235 ret = __handle_request_remove_blacklist(uid, invocation,
1237 else if (g_strcmp0(method_name, "check_blacklist") == 0)
1238 ret = __handle_request_check_blacklist(uid, invocation,
1240 else if (g_strcmp0(method_name, "disable_app_splash_screen") == 0)
1241 ret = __handle_request_disable_app_splash_screen(uid,
1242 invocation, parameters);
1243 else if (g_strcmp0(method_name, "enable_app_splash_screen") == 0)
1244 ret = __handle_request_enable_app_splash_screen(uid,
1245 invocation, parameters);
1250 g_idle_add(queue_job, NULL);
1253 int __return_value_to_caller(const char *req_key, GVariant *result)
1255 GDBusMethodInvocation *invocation;
1257 invocation = (GDBusMethodInvocation *)g_hash_table_lookup(req_table,
1259 if (invocation == NULL) {
1260 ERR("no such request id");
1264 g_dbus_method_invocation_return_value(invocation, result);
1265 g_hash_table_remove(req_table, (gpointer)req_key);
1270 static const GDBusInterfaceVTable interface_vtable =
1272 __handle_method_call,
1277 static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
1282 DBG("on bus acquired");
1284 reg_id = g_dbus_connection_register_object(connection,
1285 PKGMGR_DBUS_OBJECT_PATH,
1286 instropection_data->interfaces[0],
1287 &interface_vtable, NULL, NULL, &err);
1290 ERR("failed to register object: %s", err->message);
1295 static void __on_name_acquired(GDBusConnection *connection, const gchar *name,
1298 DBG("on name acquired: %s", name);
1301 static void __on_name_lost(GDBusConnection *connection, const gchar *name,
1304 DBG("on name lost: %s", name);
1307 int __init_request_handler(void)
1309 instropection_data = g_dbus_node_info_new_for_xml(instropection_xml, NULL);
1311 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, PKGMGR_DBUS_SERVICE,
1312 G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
1313 __on_name_acquired, __on_name_lost, NULL, NULL);
1315 req_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1317 if (req_table == NULL)
1323 void __fini_request_handler(void)
1325 g_hash_table_destroy(req_table);
1326 g_bus_unown_name(owner_id);
1327 g_dbus_node_info_unref(instropection_data);