9 #include "pkgmgr-info.h"
10 #include "pkgmgr-server.h"
11 #include "package-manager.h"
13 #define PKGMGR_DBUS_SERVICE "org.tizen.pkgmgr"
14 #define PKGMGR_DBUS_OBJECT_PATH "/org/tizen/pkgmgr"
16 static const char instropection_xml[] =
18 " <interface name='org.tizen.pkgmgr'>"
19 " <method name='install'>"
20 " <arg type='u' name='uid' direction='in'/>"
21 " <arg type='s' name='pkgtype' direction='in'/>"
22 " <arg type='s' name='pkgpath' direction='in'/>"
23 " <arg type='as' name='args' direction='in'/>"
24 " <arg type='i' name='ret' direction='out'/>"
25 " <arg type='s' name='reqkey' direction='out'/>"
27 " <method name='reinstall'>"
28 " <arg type='u' name='uid' direction='in'/>"
29 " <arg type='s' name='pkgid' direction='in'/>"
30 " <arg type='i' name='ret' direction='out'/>"
31 " <arg type='s' name='reqkey' direction='out'/>"
33 " <method name='mount_install'>"
34 " <arg type='u' name='uid' direction='in'/>"
35 " <arg type='s' name='pkgtype' direction='in'/>"
36 " <arg type='s' name='pkgpath' direction='in'/>"
37 " <arg type='as' name='args' direction='in'/>"
38 " <arg type='i' name='ret' direction='out'/>"
39 " <arg type='s' name='reqkey' direction='out'/>"
41 " <method name='uninstall'>"
42 " <arg type='u' name='uid' direction='in'/>"
43 " <arg type='s' name='pkgid' direction='in'/>"
44 " <arg type='i' name='ret' direction='out'/>"
45 " <arg type='s' name='reqkey' direction='out'/>"
47 " <method name='move'>"
48 " <arg type='u' name='uid' direction='in'/>"
49 " <arg type='s' name='pkgid' direction='in'/>"
50 " <arg type='i' name='movetype' direction='in'/>"
51 " <arg type='i' name='ret' direction='out'/>"
52 " <arg type='s' name='reqkey' direction='out'/>"
54 " <method name='enable_pkgs'>"
55 " <arg type='u' name='uid' direction='in'/>"
56 " <arg type='as' name='pkgids' direction='in'/>"
57 " <arg type='i' name='ret' direction='out'/>"
58 " <arg type='s' name='reqkey' direction='out'/>"
60 " <method name='disable_pkgs'>"
61 " <arg type='u' name='uid' direction='in'/>"
62 " <arg type='as' name='pkgids' direction='in'/>"
63 " <arg type='i' name='ret' direction='out'/>"
64 " <arg type='s' name='reqkey' direction='out'/>"
66 " <method name='register_pkg_update_info'>"
67 " <arg type='u' name='uid' direction='in'/>"
68 " <arg type='s' name='pkgid' direction='in'/>"
69 " <arg type='s' name='version' direction='in'/>"
70 " <arg type='i' name='type' direction='in'/>"
71 " <arg type='i' name='ret' direction='out'/>"
73 " <method name='unregister_pkg_update_info'>"
74 " <arg type='u' name='uid' direction='in'/>"
75 " <arg type='s' name='pkgid' direction='in'/>"
76 " <arg type='i' name='ret' direction='out'/>"
78 " <method name='unregister_all_pkg_update_info'>"
79 " <arg type='u' name='uid' direction='in'/>"
80 " <arg type='i' name='ret' direction='out'/>"
82 " <method name='enable_app'>"
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_app'>"
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='enable_apps'>"
95 " <arg type='u' name='uid' direction='in'/>"
96 " <arg type='as' name='appids' direction='in'/>"
97 " <arg type='i' name='ret' direction='out'/>"
98 " <arg type='s' name='reqkey' direction='out'/>"
100 " <method name='disable_apps'>"
101 " <arg type='u' name='uid' direction='in'/>"
102 " <arg type='as' name='appids' direction='in'/>"
103 " <arg type='i' name='ret' direction='out'/>"
104 " <arg type='s' name='reqkey' direction='out'/>"
106 " <method name='enable_global_app_for_uid'>"
107 " <arg type='u' name='uid' direction='in'/>"
108 " <arg type='s' name='appid' direction='in'/>"
109 " <arg type='i' name='ret' direction='out'/>"
110 " <arg type='s' name='reqkey' direction='out'/>"
112 " <method name='disable_global_app_for_uid'>"
113 " <arg type='u' name='uid' direction='in'/>"
114 " <arg type='s' name='appid' direction='in'/>"
115 " <arg type='i' name='ret' direction='out'/>"
116 " <arg type='s' name='reqkey' direction='out'/>"
118 " <method name='getsize'>"
119 " <arg type='u' name='uid' direction='in'/>"
120 " <arg type='s' name='pkgid' direction='in'/>"
121 " <arg type='i' name='get_type' direction='in'/>"
122 " <arg type='i' name='ret' direction='out'/>"
123 " <arg type='s' name='reqkey' direction='out'/>"
125 " <method name='getsize_sync'>"
126 " <arg type='u' name='uid' direction='in'/>"
127 " <arg type='s' name='pkgid' direction='in'/>"
128 " <arg type='i' name='get_type' direction='in'/>"
129 " <arg type='i' name='ret' direction='out'/>"
130 " <arg type='x' name='size_info' direction='out'/>"
132 " <method name='cleardata'>"
133 " <arg type='u' name='uid' direction='in'/>"
134 " <arg type='s' name='pkgid' direction='in'/>"
135 " <arg type='i' name='ret' direction='out'/>"
137 " <method name='clearcache'>"
138 " <arg type='u' name='uid' direction='in'/>"
139 " <arg type='s' name='pkgid' direction='in'/>"
140 " <arg type='i' name='ret' direction='out'/>"
142 " <method name='kill'>"
143 " <arg type='u' name='uid' direction='in'/>"
144 " <arg type='s' name='pkgid' direction='in'/>"
145 " <arg type='i' name='ret' direction='out'/>"
146 " <arg type='i' name='pid' direction='out'/>"
148 " <method name='check'>"
149 " <arg type='u' name='uid' direction='in'/>"
150 " <arg type='s' name='pkgid' direction='in'/>"
151 " <arg type='i' name='ret' direction='out'/>"
152 " <arg type='i' name='pid' direction='out'/>"
154 " <method name='generate_license_request'>"
155 " <arg type='s' name='resp_data' direction='in'/>"
156 " <arg type='i' name='ret' direction='out'/>"
157 " <arg type='s' name='req_data' direction='out'/>"
158 " <arg type='s' name='license_url' direction='out'/>"
160 " <method name='register_license'>"
161 " <arg type='s' name='resp_data' direction='in'/>"
162 " <arg type='i' name='ret' direction='out'/>"
164 " <method name='decrypt_package'>"
165 " <arg type='s' name='drm_file_path' direction='in'/>"
166 " <arg type='s' name='decrypted_file_path' direction='in'/>"
167 " <arg type='i' name='ret' direction='out'/>"
169 " <method name='enable_app_splash_screen'>"
170 " <arg type='u' name='uid' direction='in'/>"
171 " <arg type='s' name='appid' direction='in'/>"
172 " <arg type='i' name='ret' direction='out'/>"
174 " <method name='disable_app_splash_screen'>"
175 " <arg type='u' name='uid' direction='in'/>"
176 " <arg type='s' name='appid' direction='in'/>"
177 " <arg type='i' name='ret' direction='out'/>"
179 " <method name='set_restriction_mode'>"
180 " <arg type='u' name='uid' direction='in'/>"
181 " <arg type='s' name='pkgid' direction='in'/>"
182 " <arg type='i' name='mode' direction='in'/>"
183 " <arg type='i' name='ret' direction='out'/>"
185 " <method name='unset_restriction_mode'>"
186 " <arg type='u' name='uid' direction='in'/>"
187 " <arg type='s' name='pkgid' direction='in'/>"
188 " <arg type='i' name='mode' direction='in'/>"
189 " <arg type='i' name='ret' direction='out'/>"
191 " <method name='get_restriction_mode'>"
192 " <arg type='u' name='uid' direction='in'/>"
193 " <arg type='s' name='pkgid' direction='in'/>"
194 " <arg type='i' name='result' direction='out'/>"
195 " <arg type='i' name='ret' direction='out'/>"
197 " <method name='set_app_label'>"
198 " <arg type='u' name='uid' direction='in'/>"
199 " <arg type='s' name='appid' direction='in'/>"
200 " <arg type='s' name='label' direction='in'/>"
201 " <arg type='i' name='ret' direction='out'/>"
203 " <method name='set_app_icon'>"
204 " <arg type='u' name='uid' direction='in'/>"
205 " <arg type='s' name='appid' direction='in'/>"
206 " <arg type='s' name='icon_path' direction='in'/>"
207 " <arg type='i' name='ret' direction='out'/>"
209 " <method name='migrate_external_image'>"
210 " <arg type='u' name='uid' direction='in'/>"
211 " <arg type='s' name='pkgid' direction='in'/>"
212 " <arg type='i' name='ret' direction='out'/>"
216 static GDBusNodeInfo *instropection_data;
218 static guint owner_id;
219 static GHashTable *req_table;
221 static char *__generate_reqkey(const char *pkgid)
225 char timestr[MAX_PKG_ARGS_LEN];
229 gettimeofday(&tv, NULL);
230 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
231 snprintf(timestr, sizeof(timestr), "%ld", curtime);
233 size = strlen(pkgid) + strlen(timestr) + 2;
234 str_req_key = (char *)calloc(size, sizeof(char));
235 if (str_req_key == NULL) {
236 ERR("calloc failed");
239 snprintf(str_req_key, size, "%s_%s", pkgid, timestr);
244 static int __check_caller_permission(uid_t uid,
245 GDBusMethodInvocation *invocation, GVariant *parameters)
251 if (uid < REGULAR_USER)
254 v = g_variant_get_child_value(parameters, 0);
256 g_dbus_method_invocation_return_error_literal(invocation,
257 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
262 target_uid = g_variant_get_uint32(v);
264 if (uid == target_uid)
267 is_admin = __is_admin_user(uid);
268 if (is_admin == -1) {
269 g_dbus_method_invocation_return_error_literal(invocation,
270 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
273 } else if (is_admin == 0) {
274 g_dbus_method_invocation_return_error_literal(invocation,
275 G_DBUS_ERROR, G_DBUS_ERROR_ACCESS_DENIED,
276 "Non-admin user cannot request operation to "
284 static int __handle_request_install(uid_t caller_uid,
285 GDBusMethodInvocation *invocation, GVariant *parameters)
287 uid_t target_uid = (uid_t)-1;
288 char *arg_pkgtype = NULL;
290 const char *pkgpath = NULL;
293 gchar **tmp_args = NULL;
300 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
302 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
304 for (i = 0; i < args_count; i++)
305 len = len + strlen(tmp_args[i]) + 1;
308 args = (char *)calloc(len, sizeof(char));
310 ERR("calloc failed");
311 g_dbus_method_invocation_return_value(invocation,
312 g_variant_new("(is)",
313 PKGMGR_R_ENOMEM, ""));
317 for (i = 0; i < args_count; i++) {
318 strncat(args, tmp_args[i], len - strlen(args) - 1);
319 if (i != args_count - 1)
320 strncat(args, " ", len - strlen(args) - 1);
323 if (target_uid == (uid_t)-1 || pkgpath == NULL) {
324 g_dbus_method_invocation_return_value(invocation,
325 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
330 pkgpath = _get_adjusted_pkgpath(pkgpath, caller_uid);
331 pkgtype = _get_pkgtype_from_file(pkgpath);
332 if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
333 pkgtype = (const char *)arg_pkgtype;
334 if (pkgtype == NULL) {
335 g_dbus_method_invocation_return_value(invocation,
336 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
341 reqkey = __generate_reqkey(pkgpath);
342 if (reqkey == NULL) {
343 g_dbus_method_invocation_return_value(invocation,
344 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
349 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_INSTALL,
350 pkgtype, pkgpath, args, NULL)) {
351 g_dbus_method_invocation_return_value(invocation,
352 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
357 g_dbus_method_invocation_return_value(invocation,
358 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
375 static int __handle_request_mount_install(uid_t caller_uid,
376 GDBusMethodInvocation *invocation, GVariant *parameters)
378 uid_t target_uid = (uid_t)-1;
379 char *arg_pkgtype = NULL;
381 const char *pkgpath = NULL;
384 gchar **tmp_args = NULL;
391 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
393 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
395 for (i = 0; i < args_count; i++)
396 len = len + strlen(tmp_args[i]) + 1;
398 args = (char *)calloc(len, sizeof(char));
400 ERR("calloc failed");
401 g_dbus_method_invocation_return_value(invocation,
402 g_variant_new("(is)",
403 PKGMGR_R_ENOMEM, ""));
407 for (i = 0; i < args_count; i++) {
408 strncat(args, tmp_args[i], len - strlen(args) - 1);
409 if (i != args_count - 1)
410 strncat(args, " ", len - strlen(args) - 1);
413 if (target_uid == (uid_t)-1 || pkgpath == NULL) {
414 g_dbus_method_invocation_return_value(invocation,
415 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
420 pkgpath = _get_adjusted_pkgpath(pkgpath, caller_uid);
421 pkgtype = _get_pkgtype_from_file(pkgpath);
422 if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
423 pkgtype = (const char *)arg_pkgtype;
424 if (pkgtype == NULL) {
425 g_dbus_method_invocation_return_value(invocation,
426 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
431 reqkey = __generate_reqkey(pkgpath);
432 if (reqkey == NULL) {
433 g_dbus_method_invocation_return_value(invocation,
434 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
439 if (_push_queue(target_uid, caller_uid, reqkey,
440 REQUEST_TYPE_MOUNT_INSTALL,
441 pkgtype, pkgpath, args, NULL)) {
442 g_dbus_method_invocation_return_value(invocation,
443 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
448 g_dbus_method_invocation_return_value(invocation,
449 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
465 static int __handle_request_reinstall(uid_t caller_uid,
466 GDBusMethodInvocation *invocation, GVariant *parameters)
468 uid_t target_uid = (uid_t)-1;
473 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
474 if (target_uid == (uid_t)-1 || pkgid == NULL) {
475 g_dbus_method_invocation_return_value(invocation,
476 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
480 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
481 if (pkgtype == NULL) {
482 g_dbus_method_invocation_return_value(invocation,
483 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
487 reqkey = __generate_reqkey(pkgid);
488 if (reqkey == NULL) {
489 g_dbus_method_invocation_return_value(invocation,
490 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
494 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_REINSTALL,
495 pkgtype, pkgid, NULL, NULL)) {
496 g_dbus_method_invocation_return_value(invocation,
497 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
503 g_dbus_method_invocation_return_value(invocation,
504 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
511 static int __handle_request_uninstall(uid_t caller_uid,
512 GDBusMethodInvocation *invocation, GVariant *parameters)
514 uid_t target_uid = (uid_t)-1;
519 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
520 if (target_uid == (uid_t)-1 || pkgid == NULL) {
521 g_dbus_method_invocation_return_value(invocation,
522 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
526 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
527 if (pkgtype == NULL) {
528 g_dbus_method_invocation_return_value(invocation,
529 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
533 reqkey = __generate_reqkey(pkgid);
534 if (reqkey == NULL) {
535 g_dbus_method_invocation_return_value(invocation,
536 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
540 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_UNINSTALL,
541 pkgtype, pkgid, NULL, NULL)) {
542 g_dbus_method_invocation_return_value(invocation,
543 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
549 g_dbus_method_invocation_return_value(invocation,
550 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
557 static int __handle_request_move(uid_t caller_uid,
558 GDBusMethodInvocation *invocation, GVariant *parameters)
560 uid_t target_uid = (uid_t)-1;
565 char buf[4] = { '\0' };
567 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &move_type);
568 if (target_uid == (uid_t)-1 || pkgid == NULL) {
569 g_dbus_method_invocation_return_value(invocation,
570 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
574 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
575 if (pkgtype == NULL) {
576 g_dbus_method_invocation_return_value(invocation,
577 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
581 reqkey = __generate_reqkey(pkgid);
582 if (reqkey == NULL) {
583 g_dbus_method_invocation_return_value(invocation,
584 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
589 snprintf(buf, sizeof(buf), "%d", move_type);
590 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_MOVE,
591 pkgtype, pkgid, buf, NULL)) {
592 g_dbus_method_invocation_return_value(invocation,
593 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
599 g_dbus_method_invocation_return_value(invocation,
600 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
607 static int __handle_request_enable_pkgs(uid_t caller_uid,
608 GDBusMethodInvocation *invocation, GVariant *parameters)
610 uid_t target_uid = (uid_t)-1;
616 g_variant_get(parameters, "(uas)", &target_uid, &iter);
617 if (target_uid == (uid_t)-1 || iter == NULL) {
618 g_dbus_method_invocation_return_value(invocation,
619 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
623 reqkey = __generate_reqkey("enable_pkgs");
624 if (reqkey == NULL) {
625 g_dbus_method_invocation_return_value(invocation,
626 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
630 while (g_variant_iter_next(iter, "&s", &pkgid)) {
631 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
632 if (pkgtype == NULL) {
633 g_dbus_method_invocation_return_value(invocation,
634 g_variant_new("(is)",
635 PKGMGR_R_ENOPKG, ""));
639 if (_push_queue(target_uid, caller_uid, reqkey,
640 REQUEST_TYPE_ENABLE_PKG,
641 pkgtype, pkgid, NULL, NULL)) {
642 g_dbus_method_invocation_return_value(invocation,
643 g_variant_new("(is)",
644 PKGMGR_R_ESYSTEM, ""));
652 g_dbus_method_invocation_return_value(invocation,
653 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
659 static int __handle_request_register_pkg_update_info(
660 uid_t caller_uid, GDBusMethodInvocation *invocation,
661 GVariant *parameters)
664 char buf[MAX_PKG_ARGS_LEN];
666 pkgmgrinfo_pkginfo_h pkg_info;
668 pkgmgrinfo_updateinfo_h update_info;
669 pkgmgrinfo_updateinfo_update_type converted_type;
670 uid_t target_uid = (uid_t)-1;
672 gchar *version = NULL;
674 g_variant_get(parameters, "(ussi)", &target_uid, &pkgid, &version, &converted_type);
676 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &pkg_info);
677 if (ret != PMINFO_R_OK) {
678 g_dbus_method_invocation_return_value(invocation,
679 g_variant_new("(i)", PKGMGR_R_EIO));
682 ret = pkgmgrinfo_pkginfo_is_global(pkg_info, &is_global_pkg);
683 if (ret != PMINFO_R_OK) {
684 pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
685 g_dbus_method_invocation_return_value(invocation,
686 g_variant_new("(i)", PKGMGR_R_EIO));
689 pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
691 /* return error if given pkg is global pkg but caller is not admin */
692 if (caller_uid >= REGULAR_USER && is_global_pkg
693 && !__is_admin_user(caller_uid)) {
694 g_dbus_method_invocation_return_value(invocation,
695 g_variant_new("(i)", PKGMGR_R_EPRIV));
699 ret = pkgmgrinfo_updateinfo_create(&update_info);
700 if (ret != PMINFO_R_OK) {
701 g_dbus_method_invocation_return_value(invocation,
702 g_variant_new("(i)", PKGMGR_R_ENOMEM));
706 ret = pkgmgrinfo_updateinfo_set_pkgid(update_info, (char *)pkgid);
707 if (ret != PMINFO_R_OK) {
708 g_dbus_method_invocation_return_value(invocation,
709 g_variant_new("(i)", PKGMGR_R_ENOMEM));
710 pkgmgrinfo_updateinfo_destroy(update_info);
714 ret = pkgmgrinfo_updateinfo_set_version(update_info, (char *)version);
715 if (ret != PMINFO_R_OK) {
716 g_dbus_method_invocation_return_value(invocation,
717 g_variant_new("(i)", PKGMGR_R_ENOMEM));
718 pkgmgrinfo_updateinfo_destroy(update_info);
722 ret = pkgmgrinfo_updateinfo_set_type(update_info, converted_type);
723 if (ret != PMINFO_R_OK) {
724 g_dbus_method_invocation_return_value(invocation,
725 g_variant_new("(i)", PKGMGR_R_ENOMEM));
726 pkgmgrinfo_updateinfo_destroy(update_info);
730 reqkey = __generate_reqkey("register_pkg_update_info");
731 if (reqkey == NULL) {
732 pkgmgrinfo_updateinfo_destroy(update_info);
733 g_dbus_method_invocation_return_value(invocation,
734 g_variant_new("(i)", PKGMGR_R_ENOMEM));
738 if (_push_queue(target_uid, caller_uid, reqkey,
739 REQUEST_TYPE_REGISTER_PKG_UPDATE_INFO, "default",
740 NULL, buf, update_info)) {
741 pkgmgrinfo_updateinfo_destroy(update_info);
742 g_dbus_method_invocation_return_value(invocation,
743 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
747 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
748 (gpointer)invocation))
749 ERR("reqkey already exists");
754 static int __handle_request_unregister_pkg_update_info(
755 uid_t caller_uid, GDBusMethodInvocation *invocation,
756 GVariant *parameters)
758 uid_t target_uid = (uid_t)-1;
761 pkgmgrinfo_pkginfo_h pkg_info;
765 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
766 if (target_uid == (uid_t)-1 || pkgid == NULL) {
767 g_dbus_method_invocation_return_value(invocation,
768 g_variant_new("(i)", PKGMGR_R_ECOMM));
772 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &pkg_info);
773 if (ret != PMINFO_R_OK) {
774 g_dbus_method_invocation_return_value(invocation,
775 g_variant_new("(i)", PKGMGR_R_EIO));
778 ret = pkgmgrinfo_pkginfo_is_global(pkg_info, &is_global_pkg);
779 if (ret != PMINFO_R_OK) {
780 pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
781 g_dbus_method_invocation_return_value(invocation,
782 g_variant_new("(i)", PKGMGR_R_EIO));
785 pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
787 /* return error if given pkg is global pkg but caller is not admin */
788 if (caller_uid >= REGULAR_USER && is_global_pkg
789 && !__is_admin_user(caller_uid)) {
790 g_dbus_method_invocation_return_value(invocation,
791 g_variant_new("(i)", PKGMGR_R_EPRIV));
795 reqkey = __generate_reqkey("unregister_pkg_update_info");
796 if (reqkey == NULL) {
797 g_dbus_method_invocation_return_value(invocation,
798 g_variant_new("(i)", PKGMGR_R_ENOMEM));
802 if (_push_queue(target_uid, caller_uid, reqkey,
803 REQUEST_TYPE_UNREGISTER_PKG_UPDATE_INFO, "default",
804 pkgid, NULL, NULL)) {
805 g_dbus_method_invocation_return_value(invocation,
806 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
811 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
812 (gpointer)invocation))
813 ERR("reqkey already exists");
820 static int __handle_request_unregister_all_pkg_update_info(
821 uid_t caller_uid, GDBusMethodInvocation *invocation,
822 GVariant *parameters)
824 uid_t target_uid = (uid_t)-1;
827 g_variant_get(parameters, "(u)", &target_uid);
828 if (target_uid == (uid_t)-1) {
829 g_dbus_method_invocation_return_value(invocation,
830 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
834 reqkey = __generate_reqkey("unregister_all_pkg_update_info");
835 if (reqkey == NULL) {
836 g_dbus_method_invocation_return_value(invocation,
837 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
841 if (_push_queue(target_uid, caller_uid, reqkey,
842 REQUEST_TYPE_UNREGISTER_ALL_PKG_UPDATE_INFO, "default",
844 g_dbus_method_invocation_return_value(invocation,
845 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
850 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
851 (gpointer)invocation))
852 ERR("reqkey already exists");
857 static int __handle_request_disable_pkgs(uid_t caller_uid,
858 GDBusMethodInvocation *invocation, GVariant *parameters)
860 uid_t target_uid = (uid_t)-1;
866 g_variant_get(parameters, "(uas)", &target_uid, &iter);
867 if (target_uid == (uid_t)-1 || iter == NULL) {
868 g_dbus_method_invocation_return_value(invocation,
869 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
873 reqkey = __generate_reqkey("disable_pkgs");
874 if (reqkey == NULL) {
875 g_dbus_method_invocation_return_value(invocation,
876 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
880 while (g_variant_iter_next(iter, "&s", &pkgid)) {
881 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
882 if (pkgtype == NULL) {
883 g_dbus_method_invocation_return_value(invocation,
884 g_variant_new("(is)",
885 PKGMGR_R_ENOPKG, ""));
889 if (_push_queue(target_uid, caller_uid, reqkey,
890 REQUEST_TYPE_DISABLE_PKG,
891 pkgtype, pkgid, NULL, NULL)) {
892 g_dbus_method_invocation_return_value(invocation,
893 g_variant_new("(is)",
894 PKGMGR_R_ESYSTEM, ""));
902 g_dbus_method_invocation_return_value(invocation,
903 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
909 static int __handle_request_enable_apps(uid_t caller_uid,
910 GDBusMethodInvocation *invocation, GVariant *parameters)
912 uid_t target_uid = (uid_t)-1;
915 char buf[MAX_PKG_ARGS_LEN];
918 g_variant_get(parameters, "(uas)", &target_uid, &iter);
919 if (target_uid == (uid_t)-1 || iter == NULL) {
920 g_dbus_method_invocation_return_value(invocation,
921 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
925 reqkey = __generate_reqkey("enable_apps");
926 if (reqkey == NULL) {
927 g_dbus_method_invocation_return_value(invocation,
928 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
932 while (g_variant_iter_next(iter, "&s", &appid)) {
933 if (_push_queue(target_uid, caller_uid, reqkey,
934 REQUEST_TYPE_ENABLE_APP,
935 "default", appid, buf, NULL)) {
936 g_dbus_method_invocation_return_value(invocation,
937 g_variant_new("(is)",
938 PKGMGR_R_ESYSTEM, ""));
944 g_dbus_method_invocation_return_value(invocation,
945 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
951 static int __handle_request_disable_apps(uid_t caller_uid,
952 GDBusMethodInvocation *invocation, GVariant *parameters)
954 uid_t target_uid = (uid_t)-1;
957 char buf[MAX_PKG_ARGS_LEN];
960 g_variant_get(parameters, "(uas)", &target_uid, &iter);
961 if (target_uid == (uid_t)-1 || iter == NULL) {
962 g_dbus_method_invocation_return_value(invocation,
963 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
967 reqkey = __generate_reqkey("disable_apps");
968 if (reqkey == NULL) {
969 g_dbus_method_invocation_return_value(invocation,
970 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
974 while (g_variant_iter_next(iter, "&s", &appid)) {
975 if (_push_queue(target_uid, caller_uid, reqkey,
976 REQUEST_TYPE_DISABLE_APP,
977 "default", appid, buf, NULL)) {
978 g_dbus_method_invocation_return_value(invocation,
979 g_variant_new("(is)",
980 PKGMGR_R_ESYSTEM, ""));
986 g_dbus_method_invocation_return_value(invocation,
987 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
994 static int __handle_request_enable_app(uid_t caller_uid,
995 GDBusMethodInvocation *invocation, GVariant *parameters)
997 uid_t target_uid = (uid_t)-1;
1002 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1003 if (target_uid == (uid_t)-1 || appid == NULL) {
1004 g_dbus_method_invocation_return_value(invocation,
1005 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1009 reqkey = __generate_reqkey(appid);
1010 if (reqkey == NULL) {
1011 g_dbus_method_invocation_return_value(invocation,
1012 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1017 if (_push_queue(target_uid, caller_uid, reqkey,
1018 REQUEST_TYPE_ENABLE_APP, "default",
1019 appid, NULL, NULL)) {
1020 g_dbus_method_invocation_return_value(invocation,
1021 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1026 g_dbus_method_invocation_return_value(invocation,
1027 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1038 static int __handle_request_disable_app(uid_t caller_uid,
1039 GDBusMethodInvocation *invocation, GVariant *parameters)
1041 uid_t target_uid = (uid_t)-1;
1043 char *reqkey = NULL;
1046 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1047 if (target_uid == (uid_t)-1 || appid == NULL) {
1048 g_dbus_method_invocation_return_value(invocation,
1049 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1053 reqkey = __generate_reqkey(appid);
1054 if (reqkey == NULL) {
1055 g_dbus_method_invocation_return_value(invocation,
1056 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1061 if (_push_queue(target_uid, caller_uid, reqkey,
1062 REQUEST_TYPE_DISABLE_APP, "default",
1063 appid, NULL, NULL)) {
1064 g_dbus_method_invocation_return_value(invocation,
1065 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1070 g_dbus_method_invocation_return_value(invocation,
1071 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1082 static int __handle_request_enable_global_app_for_uid(uid_t caller_uid,
1083 GDBusMethodInvocation *invocation, GVariant *parameters)
1085 uid_t target_uid = (uid_t)-1;
1087 char *reqkey = NULL;
1090 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1091 if (target_uid == (uid_t)-1 || appid == NULL) {
1092 g_dbus_method_invocation_return_value(invocation,
1093 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1097 reqkey = __generate_reqkey(appid);
1098 if (reqkey == NULL) {
1099 g_dbus_method_invocation_return_value(invocation,
1100 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1105 if (_push_queue(target_uid, caller_uid, reqkey,
1106 REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID,
1107 "default", appid, NULL, NULL)) {
1108 g_dbus_method_invocation_return_value(invocation,
1109 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1114 g_dbus_method_invocation_return_value(invocation,
1115 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1126 static int __handle_request_disable_global_app_for_uid(uid_t caller_uid,
1127 GDBusMethodInvocation *invocation, GVariant *parameters)
1129 uid_t target_uid = (uid_t)-1;
1131 char *reqkey = NULL;
1134 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1135 if (target_uid == (uid_t)-1 || appid == NULL) {
1136 g_dbus_method_invocation_return_value(invocation,
1137 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1141 reqkey = __generate_reqkey(appid);
1142 if (reqkey == NULL) {
1143 g_dbus_method_invocation_return_value(invocation,
1144 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1149 if (_push_queue(target_uid, caller_uid, reqkey,
1150 REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID,
1151 "default", appid, NULL, NULL)) {
1152 g_dbus_method_invocation_return_value(invocation,
1153 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1158 g_dbus_method_invocation_return_value(invocation,
1159 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1170 static int __handle_request_getsize(uid_t caller_uid,
1171 GDBusMethodInvocation *invocation, GVariant *parameters)
1173 uid_t target_uid = (uid_t)-1;
1179 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
1180 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
1181 g_dbus_method_invocation_return_value(invocation,
1182 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1186 reqkey = __generate_reqkey(pkgid);
1187 if (reqkey == NULL) {
1188 g_dbus_method_invocation_return_value(invocation,
1189 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1193 snprintf(buf, sizeof(buf), "%d", get_type);
1194 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE,
1195 "pkgtool", pkgid, buf, NULL)) {
1196 g_dbus_method_invocation_return_value(invocation,
1197 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1202 g_dbus_method_invocation_return_value(invocation,
1203 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1209 static int __handle_request_getsize_sync(uid_t caller_uid,
1210 GDBusMethodInvocation *invocation, GVariant *parameters)
1212 uid_t target_uid = (uid_t)-1;
1218 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
1219 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
1220 g_dbus_method_invocation_return_value(invocation,
1221 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1225 reqkey = __generate_reqkey(pkgid);
1226 if (reqkey == NULL) {
1227 g_dbus_method_invocation_return_value(invocation,
1228 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1232 snprintf(buf, sizeof(buf), "%d", get_type);
1233 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE_SYNC,
1234 "pkgtool", pkgid, buf, NULL)) {
1235 g_dbus_method_invocation_return_value(invocation,
1236 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1241 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1242 (gpointer)invocation))
1243 ERR("reqkey already exists");
1248 static int __handle_request_cleardata(uid_t caller_uid,
1249 GDBusMethodInvocation *invocation, GVariant *parameters)
1251 uid_t target_uid = (uid_t)-1;
1255 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1256 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1257 g_dbus_method_invocation_return_value(invocation,
1258 g_variant_new("(i)", PKGMGR_R_ECOMM));
1262 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
1263 if (pkgtype == NULL) {
1264 g_dbus_method_invocation_return_value(invocation,
1265 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
1269 if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARDATA,
1270 pkgtype, pkgid, NULL, NULL)) {
1271 g_dbus_method_invocation_return_value(invocation,
1272 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1277 g_dbus_method_invocation_return_value(invocation,
1278 g_variant_new("(i)", PKGMGR_R_OK));
1284 static int __handle_request_clearcache(uid_t caller_uid,
1285 GDBusMethodInvocation *invocation, GVariant *parameters)
1287 uid_t target_uid = (uid_t)-1;
1291 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1292 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1293 g_dbus_method_invocation_return_value(invocation,
1294 g_variant_new("(i)", PKGMGR_R_ECOMM));
1298 if (strcmp(PKG_CLEAR_ALL_CACHE, pkgid) == 0)
1299 pkgtype = strdup("pkgtool");
1301 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
1302 if (pkgtype == NULL) {
1303 g_dbus_method_invocation_return_value(invocation,
1304 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
1308 if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARCACHE,
1309 pkgtype, pkgid, NULL, NULL)) {
1310 g_dbus_method_invocation_return_value(invocation,
1311 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1316 g_dbus_method_invocation_return_value(invocation,
1317 g_variant_new("(i)", PKGMGR_R_OK));
1323 static int __handle_request_kill(uid_t caller_uid,
1324 GDBusMethodInvocation *invocation, GVariant *parameters)
1326 uid_t target_uid = (uid_t)-1;
1328 char *reqkey = NULL;
1330 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1331 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1332 g_dbus_method_invocation_return_value(invocation,
1333 g_variant_new("(ii)", PKGMGR_R_ECOMM, 0));
1337 reqkey = __generate_reqkey(pkgid);
1338 if (reqkey == NULL) {
1339 g_dbus_method_invocation_return_value(invocation,
1340 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1344 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_KILL,
1345 "default", pkgid, NULL, NULL)) {
1346 g_dbus_method_invocation_return_value(invocation,
1347 g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
1352 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1353 (gpointer)invocation))
1354 ERR("reqkey already exists");
1359 static int __handle_request_check(uid_t caller_uid,
1360 GDBusMethodInvocation *invocation, GVariant *parameters)
1362 uid_t target_uid = (uid_t)-1;
1364 char *reqkey = NULL;
1366 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1367 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1368 g_dbus_method_invocation_return_value(invocation,
1369 g_variant_new("(ii)", PKGMGR_R_ECOMM, 0));
1373 reqkey = __generate_reqkey(pkgid);
1374 if (reqkey == NULL) {
1375 g_dbus_method_invocation_return_value(invocation,
1376 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1380 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CHECK,
1381 "default", pkgid, NULL, NULL)) {
1382 g_dbus_method_invocation_return_value(invocation,
1383 g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
1388 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1389 (gpointer)invocation))
1390 ERR("reqkey already exists");
1395 static int __handle_request_generate_license_request(uid_t caller_uid,
1396 GDBusMethodInvocation *invocation, GVariant *parameters)
1399 char *resp_data = NULL;
1401 g_variant_get(parameters, "(&s)", &resp_data);
1402 if (resp_data == NULL) {
1403 g_dbus_method_invocation_return_value(invocation,
1404 g_variant_new("(iss)", PKGMGR_R_ECOMM, "", ""));
1408 reqkey = __generate_reqkey("drm");
1409 if (reqkey == NULL) {
1410 g_dbus_method_invocation_return_value(invocation,
1411 g_variant_new("(iss)", PKGMGR_R_ENOMEM, "",
1416 if (_push_queue(caller_uid, caller_uid, reqkey,
1417 REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
1418 "default", NULL, resp_data, NULL)) {
1419 g_dbus_method_invocation_return_value(invocation,
1420 g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
1426 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1427 (gpointer)invocation))
1428 ERR("reqkey already exists");
1433 static int __handle_request_register_license(uid_t caller_uid,
1434 GDBusMethodInvocation *invocation, GVariant *parameters)
1437 char *resp_data = NULL;
1439 g_variant_get(parameters, "(&s)", &resp_data);
1440 if (resp_data == NULL) {
1441 g_dbus_method_invocation_return_value(invocation,
1442 g_variant_new("(i)", PKGMGR_R_ECOMM));
1446 reqkey = __generate_reqkey("drm");
1447 if (reqkey == NULL) {
1448 g_dbus_method_invocation_return_value(invocation,
1449 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1453 if (_push_queue(caller_uid, caller_uid, reqkey,
1454 REQUEST_TYPE_REGISTER_LICENSE,
1455 "default", NULL, resp_data, NULL)) {
1456 g_dbus_method_invocation_return_value(invocation,
1457 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1462 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1463 (gpointer)invocation))
1464 ERR("reqkey already exists");
1469 static int __handle_request_decrypt_package(uid_t caller_uid,
1470 GDBusMethodInvocation *invocation, GVariant *parameters)
1473 char *drm_file_path = NULL;
1474 char *decrypted_file_path = NULL;
1476 g_variant_get(parameters, "(&s&s)", &drm_file_path,
1477 &decrypted_file_path);
1478 if (drm_file_path == NULL || decrypted_file_path == NULL) {
1479 g_dbus_method_invocation_return_value(invocation,
1480 g_variant_new("(i)", PKGMGR_R_ECOMM));
1484 reqkey = __generate_reqkey("drm");
1485 if (reqkey == NULL) {
1486 g_dbus_method_invocation_return_value(invocation,
1487 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1491 if (_push_queue(caller_uid, caller_uid, reqkey,
1492 REQUEST_TYPE_DECRYPT_PACKAGE,
1493 "default", drm_file_path,
1494 decrypted_file_path, NULL)) {
1495 g_dbus_method_invocation_return_value(invocation,
1496 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1501 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1502 (gpointer)invocation))
1503 ERR("reqkey already exists");
1508 static int __update_app_splash_screen(uid_t caller_uid,
1509 GDBusMethodInvocation *invocation, GVariant *parameters,
1512 uid_t target_uid = (uid_t)-1;
1516 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1517 if (target_uid == (uid_t)-1 || appid == NULL) {
1518 ERR("target_uid: %d, appid: %s", target_uid, appid);
1519 g_dbus_method_invocation_return_value(invocation,
1520 g_variant_new("(i)", PKGMGR_R_ECOMM));
1524 reqkey = __generate_reqkey(appid);
1525 if (reqkey == NULL) {
1526 ERR("Failed to generate request key");
1527 g_dbus_method_invocation_return_value(invocation,
1528 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1532 if (_push_queue(target_uid, caller_uid, reqkey, req_type, "default",
1533 appid, NULL, NULL)) {
1534 ERR("Failed to push request");
1535 g_dbus_method_invocation_return_value(invocation,
1536 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1541 g_dbus_method_invocation_return_value(invocation,
1542 g_variant_new("(i)", PKGMGR_R_OK));
1550 static int __handle_request_enable_app_splash_screen(uid_t caller_uid,
1551 GDBusMethodInvocation *invocation, GVariant *parameters)
1553 return __update_app_splash_screen(caller_uid, invocation, parameters,
1554 REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
1557 static int __handle_request_disable_app_splash_screen(uid_t caller_uid,
1558 GDBusMethodInvocation *invocation, GVariant *parameters)
1560 return __update_app_splash_screen(caller_uid, invocation, parameters,
1561 REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
1564 static int __handle_request_set_restriction_mode(uid_t caller_uid,
1565 GDBusMethodInvocation *invocation, GVariant *parameters)
1567 uid_t target_uid = (uid_t)-1;
1573 g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
1574 if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
1575 g_dbus_method_invocation_return_value(invocation,
1576 g_variant_new("(i)", PKGMGR_R_ECOMM));
1580 reqkey = __generate_reqkey("restriction");
1581 if (reqkey == NULL) {
1582 g_dbus_method_invocation_return_value(invocation,
1583 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1587 snprintf(buf, sizeof(buf), "%d", mode);
1588 if (_push_queue(target_uid, caller_uid, reqkey,
1589 REQUEST_TYPE_SET_RESTRICTION_MODE,
1590 "default", pkgid, buf, NULL)) {
1591 g_dbus_method_invocation_return_value(invocation,
1592 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1597 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1598 (gpointer)invocation))
1599 ERR("reqkey already exists");
1604 static int __handle_request_unset_restriction_mode(uid_t caller_uid,
1605 GDBusMethodInvocation *invocation, GVariant *parameters)
1607 uid_t target_uid = (uid_t)-1;
1613 g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
1614 if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
1615 g_dbus_method_invocation_return_value(invocation,
1616 g_variant_new("(i)", PKGMGR_R_ECOMM));
1620 reqkey = __generate_reqkey("restriction");
1621 if (reqkey == NULL) {
1622 g_dbus_method_invocation_return_value(invocation,
1623 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1627 snprintf(buf, sizeof(buf), "%d", mode);
1628 if (_push_queue(target_uid, caller_uid, reqkey,
1629 REQUEST_TYPE_UNSET_RESTRICTION_MODE,
1630 "default", pkgid, buf, NULL)) {
1631 g_dbus_method_invocation_return_value(invocation,
1632 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1637 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1638 (gpointer)invocation))
1639 ERR("reqkey already exists");
1644 static int __handle_request_get_restriction_mode(uid_t caller_uid,
1645 GDBusMethodInvocation *invocation, GVariant *parameters)
1647 uid_t target_uid = (uid_t)-1;
1651 g_variant_get(parameters, "(us)", &target_uid, &pkgid);
1652 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1653 g_dbus_method_invocation_return_value(invocation,
1654 g_variant_new("(ii)", -1, PKGMGR_R_ECOMM));
1658 reqkey = __generate_reqkey("restriction");
1659 if (reqkey == NULL) {
1660 g_dbus_method_invocation_return_value(invocation,
1661 g_variant_new("(ii)", -1, PKGMGR_R_ENOMEM));
1665 if (_push_queue(target_uid, caller_uid, reqkey,
1666 REQUEST_TYPE_GET_RESTRICTION_MODE,
1667 "default", pkgid, NULL, NULL)) {
1668 g_dbus_method_invocation_return_value(invocation,
1669 g_variant_new("(ii)", -1, PKGMGR_R_ESYSTEM));
1674 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1675 (gpointer)invocation))
1676 ERR("reqkey already exists");
1681 static int __handle_request_set_app_label(uid_t uid,
1682 GDBusMethodInvocation *invocation, GVariant *parameters)
1684 uid_t target_uid = (uid_t)-1;
1689 g_variant_get(parameters, "(uss)", &target_uid, &appid, &label);
1690 if (target_uid == (uid_t)-1 || appid == NULL || label == NULL) {
1691 g_dbus_method_invocation_return_value(invocation,
1692 g_variant_new("(i)", PKGMGR_R_ECOMM));
1696 reqkey = __generate_reqkey("appid");
1697 if (reqkey == NULL) {
1698 g_dbus_method_invocation_return_value(invocation,
1699 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1703 if (_push_queue(target_uid, uid, reqkey,
1704 REQUEST_TYPE_SET_APP_LABEL,
1705 "default", appid, label, NULL)) {
1706 g_dbus_method_invocation_return_value(invocation,
1707 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1712 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1713 (gpointer)invocation))
1714 ERR("reqkey already exists");
1719 static int __handle_request_set_app_icon(uid_t uid,
1720 GDBusMethodInvocation *invocation, GVariant *parameters)
1722 uid_t target_uid = (uid_t)-1;
1724 char *icon_path = NULL;
1727 g_variant_get(parameters, "(uss)", &target_uid, &appid, &icon_path);
1728 if (target_uid == (uid_t)-1 || appid == NULL || icon_path == NULL) {
1729 g_dbus_method_invocation_return_value(invocation,
1730 g_variant_new("(i)", PKGMGR_R_ECOMM));
1734 reqkey = __generate_reqkey("app_icon");
1735 if (reqkey == NULL) {
1736 g_dbus_method_invocation_return_value(invocation,
1737 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1741 if (_push_queue(target_uid, uid, reqkey,
1742 REQUEST_TYPE_SET_APP_ICON,
1743 "default", appid, icon_path, NULL)) {
1744 g_dbus_method_invocation_return_value(invocation,
1745 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1750 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1751 (gpointer)invocation))
1752 ERR("reqkey already exists");
1757 static int __handle_request_migrate_external_image(uid_t uid,
1758 GDBusMethodInvocation *invocation, GVariant *parameters)
1760 uid_t target_uid = (uid_t)-1;
1765 g_variant_get(parameters, "(us)", &target_uid, &pkgid);
1766 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1767 g_dbus_method_invocation_return_value(invocation,
1768 g_variant_new("(i)", PKGMGR_R_ECOMM));
1772 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
1773 if (pkgtype == NULL) {
1774 g_dbus_method_invocation_return_value(invocation,
1775 g_variant_new("(i)", PKGMGR_R_ENOPKG));
1779 reqkey = __generate_reqkey(pkgid);
1780 if (reqkey == NULL) {
1781 g_dbus_method_invocation_return_value(invocation,
1782 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1787 if (_push_queue(target_uid, uid, reqkey,
1788 REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE,
1789 pkgtype, pkgid, NULL, NULL)) {
1790 g_dbus_method_invocation_return_value(invocation,
1791 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1797 g_dbus_method_invocation_return_value(invocation,
1798 g_variant_new("(i)", PKGMGR_R_OK));
1806 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
1812 result = g_dbus_connection_call_sync(connection,
1813 "org.freedesktop.DBus", "/org/freedesktop/DBus",
1814 "org.freedesktop.DBus", "GetConnectionUnixUser",
1815 g_variant_new("(s)", name), NULL,
1816 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
1817 if (result == NULL) {
1818 ERR("failed to get caller uid: %s", err->message);
1823 g_variant_get(result, "(u)", &uid);
1824 g_variant_unref(result);
1829 static void __handle_method_call(GDBusConnection *connection,
1830 const gchar *sender, const gchar *object_path,
1831 const gchar *interface_name, const gchar *method_name,
1832 GVariant *parameters, GDBusMethodInvocation *invocation,
1838 uid = __get_caller_uid(connection,
1839 g_dbus_method_invocation_get_sender(invocation));
1840 if (uid == (uid_t)-1)
1843 if (__check_caller_permission(uid, invocation, parameters))
1846 if (g_strcmp0(method_name, "install") == 0)
1847 ret = __handle_request_install(uid, invocation, parameters);
1848 else if (g_strcmp0(method_name, "mount_install") == 0)
1849 ret = __handle_request_mount_install(uid, invocation,
1851 else if (g_strcmp0(method_name, "reinstall") == 0)
1852 ret = __handle_request_reinstall(uid, invocation, parameters);
1853 else if (g_strcmp0(method_name, "uninstall") == 0)
1854 ret = __handle_request_uninstall(uid, invocation, parameters);
1855 else if (g_strcmp0(method_name, "cleardata") == 0)
1856 ret = __handle_request_cleardata(uid, invocation, parameters);
1857 else if (g_strcmp0(method_name, "move") == 0)
1858 ret = __handle_request_move(uid, invocation, parameters);
1859 else if (g_strcmp0(method_name, "enable_pkgs") == 0)
1860 ret = __handle_request_enable_pkgs(uid, invocation, parameters);
1861 else if (g_strcmp0(method_name, "disable_pkgs") == 0)
1862 ret = __handle_request_disable_pkgs(uid, invocation, parameters);
1863 else if (g_strcmp0(method_name, "register_pkg_update_info") == 0)
1864 ret = __handle_request_register_pkg_update_info(uid, invocation, parameters);
1865 else if (g_strcmp0(method_name, "unregister_pkg_update_info") == 0)
1866 ret = __handle_request_unregister_pkg_update_info(uid, invocation, parameters);
1867 else if (g_strcmp0(method_name, "unregister_all_pkg_update_info") == 0)
1868 ret = __handle_request_unregister_all_pkg_update_info(uid, invocation, parameters);
1869 else if (g_strcmp0(method_name, "getsize") == 0)
1870 ret = __handle_request_getsize(uid, invocation, parameters);
1871 else if (g_strcmp0(method_name, "getsize_sync") == 0)
1872 ret = __handle_request_getsize_sync(uid, invocation, parameters);
1873 else if (g_strcmp0(method_name, "clearcache") == 0)
1874 ret = __handle_request_clearcache(uid, invocation, parameters);
1875 else if (g_strcmp0(method_name, "enable_app") == 0)
1876 ret = __handle_request_enable_app(uid, invocation, parameters);
1877 else if (g_strcmp0(method_name, "disable_app") == 0)
1878 ret = __handle_request_disable_app(uid, invocation, parameters);
1879 else if (g_strcmp0(method_name, "enable_apps") == 0)
1880 ret = __handle_request_enable_apps(uid, invocation, parameters);
1881 else if (g_strcmp0(method_name, "disable_apps") == 0)
1882 ret = __handle_request_disable_apps(uid, invocation, parameters);
1883 else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
1884 ret = __handle_request_enable_global_app_for_uid(uid,
1885 invocation, parameters);
1886 else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
1887 ret = __handle_request_disable_global_app_for_uid(uid,
1888 invocation, parameters);
1889 else if (g_strcmp0(method_name, "kill") == 0)
1890 ret = __handle_request_kill(uid, invocation, parameters);
1891 else if (g_strcmp0(method_name, "check") == 0)
1892 ret = __handle_request_check(uid, invocation, parameters);
1893 else if (g_strcmp0(method_name, "generate_license_request") == 0)
1894 ret = __handle_request_generate_license_request(uid, invocation,
1896 else if (g_strcmp0(method_name, "register_license") == 0)
1897 ret = __handle_request_register_license(uid, invocation,
1899 else if (g_strcmp0(method_name, "decrypt_package") == 0)
1900 ret = __handle_request_decrypt_package(uid, invocation,
1902 else if (g_strcmp0(method_name, "disable_app_splash_screen") == 0)
1903 ret = __handle_request_disable_app_splash_screen(uid,
1904 invocation, parameters);
1905 else if (g_strcmp0(method_name, "enable_app_splash_screen") == 0)
1906 ret = __handle_request_enable_app_splash_screen(uid,
1907 invocation, parameters);
1908 else if (g_strcmp0(method_name, "set_restriction_mode") == 0)
1909 ret = __handle_request_set_restriction_mode(uid, invocation,
1911 else if (g_strcmp0(method_name, "unset_restriction_mode") == 0)
1912 ret = __handle_request_unset_restriction_mode(uid, invocation,
1914 else if (g_strcmp0(method_name, "get_restriction_mode") == 0)
1915 ret = __handle_request_get_restriction_mode(uid, invocation,
1917 else if (g_strcmp0(method_name, "set_app_label") == 0)
1918 ret = __handle_request_set_app_label(uid, invocation, parameters);
1919 else if (g_strcmp0(method_name, "set_app_icon") == 0)
1920 ret = __handle_request_set_app_icon(uid, invocation, parameters);
1921 else if (g_strcmp0(method_name, "migrate_external_image") == 0)
1922 ret = __handle_request_migrate_external_image(uid, invocation,
1928 g_idle_add(queue_job, NULL);
1931 int _return_value_to_caller(const char *req_key, GVariant *result)
1933 GDBusMethodInvocation *invocation;
1935 invocation = (GDBusMethodInvocation *)g_hash_table_lookup(req_table,
1937 if (invocation == NULL) {
1938 ERR("no such request id");
1942 g_dbus_method_invocation_return_value(invocation, result);
1943 g_hash_table_remove(req_table, (gpointer)req_key);
1948 static const GDBusInterfaceVTable interface_vtable = {
1949 __handle_method_call,
1954 static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
1959 DBG("on bus acquired");
1961 reg_id = g_dbus_connection_register_object(connection,
1962 PKGMGR_DBUS_OBJECT_PATH,
1963 instropection_data->interfaces[0],
1964 &interface_vtable, NULL, NULL, &err);
1967 ERR("failed to register object: %s", err->message);
1972 static void __on_name_acquired(GDBusConnection *connection, const gchar *name,
1975 DBG("on name acquired: %s", name);
1978 static void __on_name_lost(GDBusConnection *connection, const gchar *name,
1981 DBG("on name lost: %s", name);
1984 int _init_request_handler(void)
1986 instropection_data = g_dbus_node_info_new_for_xml(instropection_xml,
1989 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, PKGMGR_DBUS_SERVICE,
1990 G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
1991 __on_name_acquired, __on_name_lost, NULL, NULL);
1993 req_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1995 if (req_table == NULL)
2001 void _fini_request_handler(void)
2003 g_hash_table_destroy(req_table);
2004 g_bus_unown_name(owner_id);
2005 g_dbus_node_info_unref(instropection_data);