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='migrate_external_image'>"
204 " <arg type='u' name='uid' direction='in'/>"
205 " <arg type='s' name='pkgid' direction='in'/>"
206 " <arg type='i' name='ret' direction='out'/>"
210 static GDBusNodeInfo *instropection_data;
212 static guint owner_id;
213 static GHashTable *req_table;
215 static char *__generate_reqkey(const char *pkgid)
219 char timestr[MAX_PKG_ARGS_LEN];
223 gettimeofday(&tv, NULL);
224 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
225 snprintf(timestr, sizeof(timestr), "%ld", curtime);
227 size = strlen(pkgid) + strlen(timestr) + 2;
228 str_req_key = (char *)calloc(size, sizeof(char));
229 if (str_req_key == NULL) {
230 ERR("calloc failed");
233 snprintf(str_req_key, size, "%s_%s", pkgid, timestr);
238 static int __check_caller_permission(uid_t uid,
239 GDBusMethodInvocation *invocation, GVariant *parameters)
245 if (uid < REGULAR_USER)
248 v = g_variant_get_child_value(parameters, 0);
250 g_dbus_method_invocation_return_error_literal(invocation,
251 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
256 target_uid = g_variant_get_uint32(v);
258 if (uid == target_uid)
261 is_admin = __is_admin_user(uid);
262 if (is_admin == -1) {
263 g_dbus_method_invocation_return_error_literal(invocation,
264 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
267 } else if (is_admin == 0) {
268 g_dbus_method_invocation_return_error_literal(invocation,
269 G_DBUS_ERROR, G_DBUS_ERROR_ACCESS_DENIED,
270 "Non-admin user cannot request operation to "
278 static int __handle_request_install(uid_t caller_uid,
279 GDBusMethodInvocation *invocation, GVariant *parameters)
281 uid_t target_uid = (uid_t)-1;
282 char *arg_pkgtype = NULL;
284 const char *pkgpath = NULL;
287 gchar **tmp_args = NULL;
295 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
297 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
299 for (i = 0; i < args_count; i++)
300 len = len + strlen(tmp_args[i]) + 1;
302 args = (char *)calloc(len, sizeof(char));
304 ERR("calloc failed");
305 g_dbus_method_invocation_return_value(invocation,
306 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
311 for (i = 0; i < args_count; i++) {
312 strncat(args, tmp_args[i], len - s - 1);
313 s += strlen(tmp_args[i]);
314 if (i != args_count - 1) {
315 strncat(args, " ", len - s - 1);
320 if (target_uid == (uid_t)-1 || pkgpath == NULL) {
321 g_dbus_method_invocation_return_value(invocation,
322 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
327 pkgpath = _get_adjusted_pkgpath(pkgpath, caller_uid);
328 pkgtype = _get_pkgtype_from_file(pkgpath);
329 if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
330 pkgtype = (const char *)arg_pkgtype;
331 if (pkgtype == NULL) {
332 g_dbus_method_invocation_return_value(invocation,
333 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
338 reqkey = __generate_reqkey(pkgpath);
339 if (reqkey == NULL) {
340 g_dbus_method_invocation_return_value(invocation,
341 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
346 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_INSTALL,
347 pkgtype, pkgpath, args, NULL)) {
348 g_dbus_method_invocation_return_value(invocation,
349 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
354 g_dbus_method_invocation_return_value(invocation,
355 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
372 static int __handle_request_mount_install(uid_t caller_uid,
373 GDBusMethodInvocation *invocation, GVariant *parameters)
375 uid_t target_uid = (uid_t)-1;
376 char *arg_pkgtype = NULL;
378 const char *pkgpath = NULL;
381 gchar **tmp_args = NULL;
389 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
391 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
393 for (i = 0; i < args_count; i++)
394 len = len + strlen(tmp_args[i]) + 1;
396 args = (char *)calloc(len, sizeof(char));
398 ERR("calloc failed");
399 g_dbus_method_invocation_return_value(invocation,
400 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
405 for (i = 0; i < args_count; i++) {
406 strncat(args, tmp_args[i], len - s - 1);
407 s += strlen(tmp_args[i]);
408 if (i != args_count - 1) {
409 strncat(args, " ", len - s - 1);
414 if (target_uid == (uid_t)-1 || pkgpath == NULL) {
415 g_dbus_method_invocation_return_value(invocation,
416 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
421 pkgpath = _get_adjusted_pkgpath(pkgpath, caller_uid);
422 pkgtype = _get_pkgtype_from_file(pkgpath);
423 if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
424 pkgtype = (const char *)arg_pkgtype;
425 if (pkgtype == NULL) {
426 g_dbus_method_invocation_return_value(invocation,
427 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
432 reqkey = __generate_reqkey(pkgpath);
433 if (reqkey == NULL) {
434 g_dbus_method_invocation_return_value(invocation,
435 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
440 if (_push_queue(target_uid, caller_uid, reqkey,
441 REQUEST_TYPE_MOUNT_INSTALL,
442 pkgtype, pkgpath, args, NULL)) {
443 g_dbus_method_invocation_return_value(invocation,
444 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
449 g_dbus_method_invocation_return_value(invocation,
450 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
466 static int __handle_request_reinstall(uid_t caller_uid,
467 GDBusMethodInvocation *invocation, GVariant *parameters)
469 uid_t target_uid = (uid_t)-1;
474 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
475 if (target_uid == (uid_t)-1 || pkgid == NULL) {
476 g_dbus_method_invocation_return_value(invocation,
477 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
481 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
482 if (pkgtype == NULL) {
483 g_dbus_method_invocation_return_value(invocation,
484 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
488 reqkey = __generate_reqkey(pkgid);
489 if (reqkey == NULL) {
490 g_dbus_method_invocation_return_value(invocation,
491 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
495 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_REINSTALL,
496 pkgtype, pkgid, NULL, NULL)) {
497 g_dbus_method_invocation_return_value(invocation,
498 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
504 g_dbus_method_invocation_return_value(invocation,
505 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
512 static int __handle_request_uninstall(uid_t caller_uid,
513 GDBusMethodInvocation *invocation, GVariant *parameters)
515 uid_t target_uid = (uid_t)-1;
520 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
521 if (target_uid == (uid_t)-1 || pkgid == NULL) {
522 g_dbus_method_invocation_return_value(invocation,
523 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
527 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
528 if (pkgtype == NULL) {
529 g_dbus_method_invocation_return_value(invocation,
530 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
534 reqkey = __generate_reqkey(pkgid);
535 if (reqkey == NULL) {
536 g_dbus_method_invocation_return_value(invocation,
537 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
541 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_UNINSTALL,
542 pkgtype, pkgid, NULL, NULL)) {
543 g_dbus_method_invocation_return_value(invocation,
544 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
550 g_dbus_method_invocation_return_value(invocation,
551 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
558 static int __handle_request_move(uid_t caller_uid,
559 GDBusMethodInvocation *invocation, GVariant *parameters)
561 uid_t target_uid = (uid_t)-1;
566 char buf[4] = { '\0' };
568 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &move_type);
569 if (target_uid == (uid_t)-1 || pkgid == NULL) {
570 g_dbus_method_invocation_return_value(invocation,
571 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
575 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
576 if (pkgtype == NULL) {
577 g_dbus_method_invocation_return_value(invocation,
578 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
582 reqkey = __generate_reqkey(pkgid);
583 if (reqkey == NULL) {
584 g_dbus_method_invocation_return_value(invocation,
585 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
590 snprintf(buf, sizeof(buf), "%d", move_type);
591 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_MOVE,
592 pkgtype, pkgid, buf, NULL)) {
593 g_dbus_method_invocation_return_value(invocation,
594 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
600 g_dbus_method_invocation_return_value(invocation,
601 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
608 static int __handle_request_enable_pkgs(uid_t caller_uid,
609 GDBusMethodInvocation *invocation, GVariant *parameters)
611 uid_t target_uid = (uid_t)-1;
617 g_variant_get(parameters, "(uas)", &target_uid, &iter);
618 if (target_uid == (uid_t)-1 || iter == NULL) {
619 g_dbus_method_invocation_return_value(invocation,
620 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
624 reqkey = __generate_reqkey("enable_pkgs");
625 if (reqkey == NULL) {
626 g_dbus_method_invocation_return_value(invocation,
627 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
631 while (g_variant_iter_next(iter, "&s", &pkgid)) {
632 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
633 if (pkgtype == NULL) {
634 g_dbus_method_invocation_return_value(invocation,
635 g_variant_new("(is)",
636 PKGMGR_R_ENOPKG, ""));
640 if (_push_queue(target_uid, caller_uid, reqkey,
641 REQUEST_TYPE_ENABLE_PKG,
642 pkgtype, pkgid, NULL, NULL)) {
643 g_dbus_method_invocation_return_value(invocation,
644 g_variant_new("(is)",
645 PKGMGR_R_ESYSTEM, ""));
653 g_dbus_method_invocation_return_value(invocation,
654 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
660 static int __convert_updateinfo_type(const char *type, pkgmgrinfo_updateinfo_update_type *converted_type)
662 if (type == NULL || converted_type == NULL)
665 if (strncmp(type, PMINFO_UPDATEINFO_TYPE_NONE, strlen(PMINFO_UPDATEINFO_TYPE_NONE)) == 0)
666 *converted_type = PMINFO_UPDATEINFO_NONE;
667 else if (strncmp(type, PMINFO_UPDATEINFO_TYPE_FORCE, strlen(PMINFO_UPDATEINFO_TYPE_FORCE)) == 0)
668 *converted_type = PMINFO_UPDATEINFO_FORCE;
669 else if (strncmp(type, PMINFO_UPDATEINFO_TYPE_OPTIONAL, strlen(PMINFO_UPDATEINFO_TYPE_OPTIONAL)) == 0)
670 *converted_type = PMINFO_UPDATEINFO_OPTIONAL;
676 static int __handle_request_register_pkg_update_info(
677 uid_t caller_uid, GDBusMethodInvocation *invocation,
678 GVariant *parameters)
681 char buf[MAX_PKG_ARGS_LEN];
683 pkgmgrinfo_pkginfo_h pkg_info;
685 pkgmgrinfo_updateinfo_h update_info;
686 pkgmgrinfo_updateinfo_update_type converted_type;
687 uid_t target_uid = (uid_t)-1;
689 gchar *version = NULL;
691 g_variant_get(parameters, "(ussi)", &target_uid, &pkgid, &version, &converted_type);
693 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &pkg_info);
694 if (ret != PMINFO_R_OK) {
695 g_dbus_method_invocation_return_value(invocation,
696 g_variant_new("(i)", PKGMGR_R_EIO));
699 ret = pkgmgrinfo_pkginfo_is_global(pkg_info, &is_global_pkg);
700 if (ret != PMINFO_R_OK) {
701 pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
702 g_dbus_method_invocation_return_value(invocation,
703 g_variant_new("(i)", PKGMGR_R_EIO));
706 pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
708 /* return error if given pkg is global pkg but caller is not admin */
709 if (caller_uid >= REGULAR_USER && is_global_pkg
710 && !__is_admin_user(caller_uid)) {
711 g_dbus_method_invocation_return_value(invocation,
712 g_variant_new("(i)", PKGMGR_R_EPRIV));
716 ret = pkgmgrinfo_updateinfo_create(&update_info);
717 if (ret != PMINFO_R_OK) {
718 g_dbus_method_invocation_return_value(invocation,
719 g_variant_new("(i)", PKGMGR_R_ENOMEM));
723 ret = pkgmgrinfo_updateinfo_set_pkgid(update_info, (char *)pkgid);
724 if (ret != PMINFO_R_OK) {
725 g_dbus_method_invocation_return_value(invocation,
726 g_variant_new("(i)", PKGMGR_R_ENOMEM));
727 pkgmgrinfo_updateinfo_destroy(update_info);
731 ret = pkgmgrinfo_updateinfo_set_version(update_info, (char *)version);
732 if (ret != PMINFO_R_OK) {
733 g_dbus_method_invocation_return_value(invocation,
734 g_variant_new("(i)", PKGMGR_R_ENOMEM));
735 pkgmgrinfo_updateinfo_destroy(update_info);
739 ret = pkgmgrinfo_updateinfo_set_type(update_info, converted_type);
740 if (ret != PMINFO_R_OK) {
741 g_dbus_method_invocation_return_value(invocation,
742 g_variant_new("(i)", PKGMGR_R_ENOMEM));
743 pkgmgrinfo_updateinfo_destroy(update_info);
747 reqkey = __generate_reqkey("register_pkg_update_info");
748 if (reqkey == NULL) {
749 pkgmgrinfo_updateinfo_destroy(update_info);
750 g_dbus_method_invocation_return_value(invocation,
751 g_variant_new("(i)", PKGMGR_R_ENOMEM));
755 if (_push_queue(target_uid, caller_uid, reqkey,
756 REQUEST_TYPE_REGISTER_PKG_UPDATE_INFO, "default",
757 NULL, buf, update_info)) {
758 pkgmgrinfo_updateinfo_destroy(update_info);
759 g_dbus_method_invocation_return_value(invocation,
760 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
764 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
765 (gpointer)invocation))
766 ERR("reqkey already exists");
771 static int __handle_request_unregister_pkg_update_info(
772 uid_t caller_uid, GDBusMethodInvocation *invocation,
773 GVariant *parameters)
775 uid_t target_uid = (uid_t)-1;
778 pkgmgrinfo_pkginfo_h pkg_info;
782 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
783 if (target_uid == (uid_t)-1 || pkgid == NULL) {
784 g_dbus_method_invocation_return_value(invocation,
785 g_variant_new("(i)", PKGMGR_R_ECOMM));
789 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &pkg_info);
790 if (ret != PMINFO_R_OK) {
791 g_dbus_method_invocation_return_value(invocation,
792 g_variant_new("(i)", PKGMGR_R_EIO));
795 ret = pkgmgrinfo_pkginfo_is_global(pkg_info, &is_global_pkg);
796 if (ret != PMINFO_R_OK) {
797 pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
798 g_dbus_method_invocation_return_value(invocation,
799 g_variant_new("(i)", PKGMGR_R_EIO));
802 pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_info);
804 /* return error if given pkg is global pkg but caller is not admin */
805 if (caller_uid >= REGULAR_USER && is_global_pkg
806 && !__is_admin_user(caller_uid)) {
807 g_dbus_method_invocation_return_value(invocation,
808 g_variant_new("(i)", PKGMGR_R_EPRIV));
812 reqkey = __generate_reqkey("unregister_pkg_update_info");
813 if (reqkey == NULL) {
814 g_dbus_method_invocation_return_value(invocation,
815 g_variant_new("(i)", PKGMGR_R_ENOMEM));
819 if (_push_queue(target_uid, caller_uid, reqkey,
820 REQUEST_TYPE_UNREGISTER_PKG_UPDATE_INFO, "default",
821 pkgid, NULL, NULL)) {
822 g_dbus_method_invocation_return_value(invocation,
823 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
828 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
829 (gpointer)invocation))
830 ERR("reqkey already exists");
837 static int __handle_request_unregister_all_pkg_update_info(
838 uid_t caller_uid, GDBusMethodInvocation *invocation,
839 GVariant *parameters)
841 uid_t target_uid = (uid_t)-1;
844 g_variant_get(parameters, "(u)", &target_uid);
845 if (target_uid == (uid_t)-1) {
846 g_dbus_method_invocation_return_value(invocation,
847 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
851 reqkey = __generate_reqkey("unregister_all_pkg_update_info");
852 if (reqkey == NULL) {
853 g_dbus_method_invocation_return_value(invocation,
854 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
858 if (_push_queue(target_uid, caller_uid, reqkey,
859 REQUEST_TYPE_UNREGISTER_ALL_PKG_UPDATE_INFO, "default",
861 g_dbus_method_invocation_return_value(invocation,
862 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
867 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
868 (gpointer)invocation))
869 ERR("reqkey already exists");
874 static int __handle_request_disable_pkgs(uid_t caller_uid,
875 GDBusMethodInvocation *invocation, GVariant *parameters)
877 uid_t target_uid = (uid_t)-1;
883 g_variant_get(parameters, "(uas)", &target_uid, &iter);
884 if (target_uid == (uid_t)-1 || iter == NULL) {
885 g_dbus_method_invocation_return_value(invocation,
886 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
890 reqkey = __generate_reqkey("disable_pkgs");
891 if (reqkey == NULL) {
892 g_dbus_method_invocation_return_value(invocation,
893 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
897 while (g_variant_iter_next(iter, "&s", &pkgid)) {
898 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
899 if (pkgtype == NULL) {
900 g_dbus_method_invocation_return_value(invocation,
901 g_variant_new("(is)",
902 PKGMGR_R_ENOPKG, ""));
906 if (_push_queue(target_uid, caller_uid, reqkey,
907 REQUEST_TYPE_DISABLE_PKG,
908 pkgtype, pkgid, NULL, NULL)) {
909 g_dbus_method_invocation_return_value(invocation,
910 g_variant_new("(is)",
911 PKGMGR_R_ESYSTEM, ""));
919 g_dbus_method_invocation_return_value(invocation,
920 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
926 static int __handle_request_enable_apps(uid_t caller_uid,
927 GDBusMethodInvocation *invocation, GVariant *parameters)
929 uid_t target_uid = (uid_t)-1;
932 char buf[MAX_PKG_ARGS_LEN];
935 g_variant_get(parameters, "(uas)", &target_uid, &iter);
936 if (target_uid == (uid_t)-1 || iter == NULL) {
937 g_dbus_method_invocation_return_value(invocation,
938 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
942 reqkey = __generate_reqkey("enable_apps");
943 if (reqkey == NULL) {
944 g_dbus_method_invocation_return_value(invocation,
945 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
949 while (g_variant_iter_next(iter, "&s", &appid)) {
950 if (_push_queue(target_uid, caller_uid, reqkey,
951 REQUEST_TYPE_ENABLE_APP,
952 "default", appid, buf, NULL)) {
953 g_dbus_method_invocation_return_value(invocation,
954 g_variant_new("(is)",
955 PKGMGR_R_ESYSTEM, ""));
961 g_dbus_method_invocation_return_value(invocation,
962 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
968 static int __handle_request_disable_apps(uid_t caller_uid,
969 GDBusMethodInvocation *invocation, GVariant *parameters)
971 uid_t target_uid = (uid_t)-1;
974 char buf[MAX_PKG_ARGS_LEN];
977 g_variant_get(parameters, "(uas)", &target_uid, &iter);
978 if (target_uid == (uid_t)-1 || iter == NULL) {
979 g_dbus_method_invocation_return_value(invocation,
980 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
984 reqkey = __generate_reqkey("disable_apps");
985 if (reqkey == NULL) {
986 g_dbus_method_invocation_return_value(invocation,
987 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
991 while (g_variant_iter_next(iter, "&s", &appid)) {
992 if (_push_queue(target_uid, caller_uid, reqkey,
993 REQUEST_TYPE_DISABLE_APP,
994 "default", appid, buf, NULL)) {
995 g_dbus_method_invocation_return_value(invocation,
996 g_variant_new("(is)",
997 PKGMGR_R_ESYSTEM, ""));
1003 g_dbus_method_invocation_return_value(invocation,
1004 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1011 static int __handle_request_enable_app(uid_t caller_uid,
1012 GDBusMethodInvocation *invocation, GVariant *parameters)
1014 uid_t target_uid = (uid_t)-1;
1016 char *reqkey = NULL;
1019 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1020 if (target_uid == (uid_t)-1 || appid == NULL) {
1021 g_dbus_method_invocation_return_value(invocation,
1022 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1026 reqkey = __generate_reqkey(appid);
1027 if (reqkey == NULL) {
1028 g_dbus_method_invocation_return_value(invocation,
1029 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1034 if (_push_queue(target_uid, caller_uid, reqkey,
1035 REQUEST_TYPE_ENABLE_APP, "default",
1036 appid, NULL, NULL)) {
1037 g_dbus_method_invocation_return_value(invocation,
1038 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1043 g_dbus_method_invocation_return_value(invocation,
1044 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1055 static int __handle_request_disable_app(uid_t caller_uid,
1056 GDBusMethodInvocation *invocation, GVariant *parameters)
1058 uid_t target_uid = (uid_t)-1;
1060 char *reqkey = NULL;
1063 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1064 if (target_uid == (uid_t)-1 || appid == NULL) {
1065 g_dbus_method_invocation_return_value(invocation,
1066 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1070 reqkey = __generate_reqkey(appid);
1071 if (reqkey == NULL) {
1072 g_dbus_method_invocation_return_value(invocation,
1073 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1078 if (_push_queue(target_uid, caller_uid, reqkey,
1079 REQUEST_TYPE_DISABLE_APP, "default",
1080 appid, NULL, NULL)) {
1081 g_dbus_method_invocation_return_value(invocation,
1082 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1087 g_dbus_method_invocation_return_value(invocation,
1088 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1099 static int __handle_request_enable_global_app_for_uid(uid_t caller_uid,
1100 GDBusMethodInvocation *invocation, GVariant *parameters)
1102 uid_t target_uid = (uid_t)-1;
1104 char *reqkey = NULL;
1107 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1108 if (target_uid == (uid_t)-1 || appid == NULL) {
1109 g_dbus_method_invocation_return_value(invocation,
1110 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1114 reqkey = __generate_reqkey(appid);
1115 if (reqkey == NULL) {
1116 g_dbus_method_invocation_return_value(invocation,
1117 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1122 if (_push_queue(target_uid, caller_uid, reqkey,
1123 REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID,
1124 "default", appid, NULL, NULL)) {
1125 g_dbus_method_invocation_return_value(invocation,
1126 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1131 g_dbus_method_invocation_return_value(invocation,
1132 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1143 static int __handle_request_disable_global_app_for_uid(uid_t caller_uid,
1144 GDBusMethodInvocation *invocation, GVariant *parameters)
1146 uid_t target_uid = (uid_t)-1;
1148 char *reqkey = NULL;
1151 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1152 if (target_uid == (uid_t)-1 || appid == NULL) {
1153 g_dbus_method_invocation_return_value(invocation,
1154 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1158 reqkey = __generate_reqkey(appid);
1159 if (reqkey == NULL) {
1160 g_dbus_method_invocation_return_value(invocation,
1161 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1166 if (_push_queue(target_uid, caller_uid, reqkey,
1167 REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID,
1168 "default", appid, NULL, NULL)) {
1169 g_dbus_method_invocation_return_value(invocation,
1170 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1175 g_dbus_method_invocation_return_value(invocation,
1176 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1187 static int __handle_request_getsize(uid_t caller_uid,
1188 GDBusMethodInvocation *invocation, GVariant *parameters)
1190 uid_t target_uid = (uid_t)-1;
1196 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
1197 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
1198 g_dbus_method_invocation_return_value(invocation,
1199 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1203 reqkey = __generate_reqkey(pkgid);
1204 if (reqkey == NULL) {
1205 g_dbus_method_invocation_return_value(invocation,
1206 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1210 snprintf(buf, sizeof(buf), "%d", get_type);
1211 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE,
1212 "pkgtool", pkgid, buf, NULL)) {
1213 g_dbus_method_invocation_return_value(invocation,
1214 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1219 g_dbus_method_invocation_return_value(invocation,
1220 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
1226 static int __handle_request_getsize_sync(uid_t caller_uid,
1227 GDBusMethodInvocation *invocation, GVariant *parameters)
1229 uid_t target_uid = (uid_t)-1;
1235 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
1236 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
1237 g_dbus_method_invocation_return_value(invocation,
1238 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
1242 reqkey = __generate_reqkey(pkgid);
1243 if (reqkey == NULL) {
1244 g_dbus_method_invocation_return_value(invocation,
1245 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
1249 snprintf(buf, sizeof(buf), "%d", get_type);
1250 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE_SYNC,
1251 "pkgtool", pkgid, buf, NULL)) {
1252 g_dbus_method_invocation_return_value(invocation,
1253 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
1258 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1259 (gpointer)invocation))
1260 ERR("reqkey already exists");
1265 static int __handle_request_cleardata(uid_t caller_uid,
1266 GDBusMethodInvocation *invocation, GVariant *parameters)
1268 uid_t target_uid = (uid_t)-1;
1272 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1273 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1274 g_dbus_method_invocation_return_value(invocation,
1275 g_variant_new("(i)", PKGMGR_R_ECOMM));
1279 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
1280 if (pkgtype == NULL) {
1281 g_dbus_method_invocation_return_value(invocation,
1282 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
1286 if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARDATA,
1287 pkgtype, pkgid, NULL, NULL)) {
1288 g_dbus_method_invocation_return_value(invocation,
1289 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1294 g_dbus_method_invocation_return_value(invocation,
1295 g_variant_new("(i)", PKGMGR_R_OK));
1301 static int __handle_request_clearcache(uid_t caller_uid,
1302 GDBusMethodInvocation *invocation, GVariant *parameters)
1304 uid_t target_uid = (uid_t)-1;
1308 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1309 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1310 g_dbus_method_invocation_return_value(invocation,
1311 g_variant_new("(i)", PKGMGR_R_ECOMM));
1315 if (strcmp(PKG_CLEAR_ALL_CACHE, pkgid) == 0)
1316 pkgtype = strdup("pkgtool");
1318 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
1319 if (pkgtype == NULL) {
1320 g_dbus_method_invocation_return_value(invocation,
1321 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
1325 if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARCACHE,
1326 pkgtype, pkgid, NULL, NULL)) {
1327 g_dbus_method_invocation_return_value(invocation,
1328 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1333 g_dbus_method_invocation_return_value(invocation,
1334 g_variant_new("(i)", PKGMGR_R_OK));
1340 static int __handle_request_kill(uid_t caller_uid,
1341 GDBusMethodInvocation *invocation, GVariant *parameters)
1343 uid_t target_uid = (uid_t)-1;
1345 char *reqkey = NULL;
1347 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1348 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1349 g_dbus_method_invocation_return_value(invocation,
1350 g_variant_new("(ii)", PKGMGR_R_ECOMM, 0));
1354 reqkey = __generate_reqkey(pkgid);
1355 if (reqkey == NULL) {
1356 g_dbus_method_invocation_return_value(invocation,
1357 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1361 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_KILL,
1362 "default", pkgid, NULL, NULL)) {
1363 g_dbus_method_invocation_return_value(invocation,
1364 g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
1369 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1370 (gpointer)invocation))
1371 ERR("reqkey already exists");
1376 static int __handle_request_check(uid_t caller_uid,
1377 GDBusMethodInvocation *invocation, GVariant *parameters)
1379 uid_t target_uid = (uid_t)-1;
1381 char *reqkey = NULL;
1383 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1384 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1385 g_dbus_method_invocation_return_value(invocation,
1386 g_variant_new("(ii)", PKGMGR_R_ECOMM, 0));
1390 reqkey = __generate_reqkey(pkgid);
1391 if (reqkey == NULL) {
1392 g_dbus_method_invocation_return_value(invocation,
1393 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1397 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CHECK,
1398 "default", pkgid, NULL, NULL)) {
1399 g_dbus_method_invocation_return_value(invocation,
1400 g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
1405 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1406 (gpointer)invocation))
1407 ERR("reqkey already exists");
1412 static int __handle_request_generate_license_request(uid_t caller_uid,
1413 GDBusMethodInvocation *invocation, GVariant *parameters)
1416 char *resp_data = NULL;
1418 g_variant_get(parameters, "(&s)", &resp_data);
1419 if (resp_data == NULL) {
1420 g_dbus_method_invocation_return_value(invocation,
1421 g_variant_new("(iss)", PKGMGR_R_ECOMM, "", ""));
1425 reqkey = __generate_reqkey("drm");
1426 if (reqkey == NULL) {
1427 g_dbus_method_invocation_return_value(invocation,
1428 g_variant_new("(iss)", PKGMGR_R_ENOMEM, "",
1433 if (_push_queue(caller_uid, caller_uid, reqkey,
1434 REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
1435 "default", NULL, resp_data, NULL)) {
1436 g_dbus_method_invocation_return_value(invocation,
1437 g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
1443 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1444 (gpointer)invocation))
1445 ERR("reqkey already exists");
1450 static int __handle_request_register_license(uid_t caller_uid,
1451 GDBusMethodInvocation *invocation, GVariant *parameters)
1454 char *resp_data = NULL;
1456 g_variant_get(parameters, "(&s)", &resp_data);
1457 if (resp_data == NULL) {
1458 g_dbus_method_invocation_return_value(invocation,
1459 g_variant_new("(i)", PKGMGR_R_ECOMM));
1463 reqkey = __generate_reqkey("drm");
1464 if (reqkey == NULL) {
1465 g_dbus_method_invocation_return_value(invocation,
1466 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1470 if (_push_queue(caller_uid, caller_uid, reqkey,
1471 REQUEST_TYPE_REGISTER_LICENSE,
1472 "default", NULL, resp_data, NULL)) {
1473 g_dbus_method_invocation_return_value(invocation,
1474 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1479 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1480 (gpointer)invocation))
1481 ERR("reqkey already exists");
1486 static int __handle_request_decrypt_package(uid_t caller_uid,
1487 GDBusMethodInvocation *invocation, GVariant *parameters)
1490 char *drm_file_path = NULL;
1491 char *decrypted_file_path = NULL;
1493 g_variant_get(parameters, "(&s&s)", &drm_file_path,
1494 &decrypted_file_path);
1495 if (drm_file_path == NULL || decrypted_file_path == NULL) {
1496 g_dbus_method_invocation_return_value(invocation,
1497 g_variant_new("(i)", PKGMGR_R_ECOMM));
1501 reqkey = __generate_reqkey("drm");
1502 if (reqkey == NULL) {
1503 g_dbus_method_invocation_return_value(invocation,
1504 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1508 if (_push_queue(caller_uid, caller_uid, reqkey,
1509 REQUEST_TYPE_DECRYPT_PACKAGE,
1510 "default", drm_file_path,
1511 decrypted_file_path, NULL)) {
1512 g_dbus_method_invocation_return_value(invocation,
1513 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1518 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1519 (gpointer)invocation))
1520 ERR("reqkey already exists");
1525 static int __update_app_splash_screen(uid_t caller_uid,
1526 GDBusMethodInvocation *invocation, GVariant *parameters,
1529 uid_t target_uid = (uid_t)-1;
1533 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1534 if (target_uid == (uid_t)-1 || appid == NULL) {
1535 ERR("target_uid: %d, appid: %s", target_uid, appid);
1536 g_dbus_method_invocation_return_value(invocation,
1537 g_variant_new("(i)", PKGMGR_R_ECOMM));
1541 reqkey = __generate_reqkey(appid);
1542 if (reqkey == NULL) {
1543 ERR("Failed to generate request key");
1544 g_dbus_method_invocation_return_value(invocation,
1545 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1549 if (_push_queue(target_uid, caller_uid, reqkey, req_type, "default",
1550 appid, NULL, NULL)) {
1551 ERR("Failed to push request");
1552 g_dbus_method_invocation_return_value(invocation,
1553 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1558 g_dbus_method_invocation_return_value(invocation,
1559 g_variant_new("(i)", PKGMGR_R_OK));
1567 static int __handle_request_enable_app_splash_screen(uid_t caller_uid,
1568 GDBusMethodInvocation *invocation, GVariant *parameters)
1570 return __update_app_splash_screen(caller_uid, invocation, parameters,
1571 REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
1574 static int __handle_request_disable_app_splash_screen(uid_t caller_uid,
1575 GDBusMethodInvocation *invocation, GVariant *parameters)
1577 return __update_app_splash_screen(caller_uid, invocation, parameters,
1578 REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
1581 static int __handle_request_set_restriction_mode(uid_t caller_uid,
1582 GDBusMethodInvocation *invocation, GVariant *parameters)
1584 uid_t target_uid = (uid_t)-1;
1590 g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
1591 if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
1592 g_dbus_method_invocation_return_value(invocation,
1593 g_variant_new("(i)", PKGMGR_R_ECOMM));
1597 reqkey = __generate_reqkey("restriction");
1598 if (reqkey == NULL) {
1599 g_dbus_method_invocation_return_value(invocation,
1600 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1604 snprintf(buf, sizeof(buf), "%d", mode);
1605 if (_push_queue(target_uid, caller_uid, reqkey,
1606 REQUEST_TYPE_SET_RESTRICTION_MODE,
1607 "default", pkgid, buf, NULL)) {
1608 g_dbus_method_invocation_return_value(invocation,
1609 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1614 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1615 (gpointer)invocation))
1616 ERR("reqkey already exists");
1621 static int __handle_request_unset_restriction_mode(uid_t caller_uid,
1622 GDBusMethodInvocation *invocation, GVariant *parameters)
1624 uid_t target_uid = (uid_t)-1;
1630 g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
1631 if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
1632 g_dbus_method_invocation_return_value(invocation,
1633 g_variant_new("(i)", PKGMGR_R_ECOMM));
1637 reqkey = __generate_reqkey("restriction");
1638 if (reqkey == NULL) {
1639 g_dbus_method_invocation_return_value(invocation,
1640 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1644 snprintf(buf, sizeof(buf), "%d", mode);
1645 if (_push_queue(target_uid, caller_uid, reqkey,
1646 REQUEST_TYPE_UNSET_RESTRICTION_MODE,
1647 "default", pkgid, buf, NULL)) {
1648 g_dbus_method_invocation_return_value(invocation,
1649 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1654 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1655 (gpointer)invocation))
1656 ERR("reqkey already exists");
1661 static int __handle_request_get_restriction_mode(uid_t caller_uid,
1662 GDBusMethodInvocation *invocation, GVariant *parameters)
1664 uid_t target_uid = (uid_t)-1;
1668 g_variant_get(parameters, "(us)", &target_uid, &pkgid);
1669 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1670 g_dbus_method_invocation_return_value(invocation,
1671 g_variant_new("(i)", PKGMGR_R_ECOMM));
1675 reqkey = __generate_reqkey("restriction");
1676 if (reqkey == NULL) {
1677 g_dbus_method_invocation_return_value(invocation,
1678 g_variant_new("(ii)", -1, PKGMGR_R_ENOMEM));
1682 if (_push_queue(target_uid, caller_uid, reqkey,
1683 REQUEST_TYPE_GET_RESTRICTION_MODE,
1684 "default", pkgid, NULL, NULL)) {
1685 g_dbus_method_invocation_return_value(invocation,
1686 g_variant_new("(ii)", -1, PKGMGR_R_ESYSTEM));
1691 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1692 (gpointer)invocation))
1693 ERR("reqkey already exists");
1698 static int __handle_request_set_app_label(uid_t uid,
1699 GDBusMethodInvocation *invocation, GVariant *parameters)
1701 uid_t target_uid = (uid_t)-1;
1706 g_variant_get(parameters, "(uss)", &target_uid, &appid, &label);
1707 if (target_uid == (uid_t)-1 || appid == NULL || label == NULL) {
1708 g_dbus_method_invocation_return_value(invocation,
1709 g_variant_new("(i)", PKGMGR_R_ECOMM));
1713 reqkey = __generate_reqkey("appid");
1714 if (reqkey == NULL) {
1715 g_dbus_method_invocation_return_value(invocation,
1716 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1720 if (_push_queue(target_uid, uid, reqkey,
1721 REQUEST_TYPE_SET_APP_LABEL,
1722 "default", appid, label, NULL)) {
1723 g_dbus_method_invocation_return_value(invocation,
1724 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1729 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1730 (gpointer)invocation))
1731 ERR("reqkey already exists");
1736 static int __handle_request_migrate_external_image(uid_t uid,
1737 GDBusMethodInvocation *invocation, GVariant *parameters)
1739 uid_t target_uid = (uid_t)-1;
1744 g_variant_get(parameters, "(us)", &target_uid, &pkgid);
1745 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1746 g_dbus_method_invocation_return_value(invocation,
1747 g_variant_new("(i)", PKGMGR_R_ECOMM));
1751 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
1752 if (pkgtype == NULL) {
1753 g_dbus_method_invocation_return_value(invocation,
1754 g_variant_new("(i)", PKGMGR_R_ENOPKG));
1758 reqkey = __generate_reqkey(pkgid);
1759 if (reqkey == NULL) {
1760 g_dbus_method_invocation_return_value(invocation,
1761 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1766 if (_push_queue(target_uid, uid, reqkey,
1767 REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE,
1768 pkgtype, pkgid, NULL, NULL)) {
1769 g_dbus_method_invocation_return_value(invocation,
1770 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1776 g_dbus_method_invocation_return_value(invocation,
1777 g_variant_new("(i)", PKGMGR_R_OK));
1785 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
1791 result = g_dbus_connection_call_sync(connection,
1792 "org.freedesktop.DBus", "/org/freedesktop/DBus",
1793 "org.freedesktop.DBus", "GetConnectionUnixUser",
1794 g_variant_new("(s)", name), NULL,
1795 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
1796 if (result == NULL) {
1797 ERR("failed to get caller uid: %s", err->message);
1802 g_variant_get(result, "(u)", &uid);
1803 g_variant_unref(result);
1808 static void __handle_method_call(GDBusConnection *connection,
1809 const gchar *sender, const gchar *object_path,
1810 const gchar *interface_name, const gchar *method_name,
1811 GVariant *parameters, GDBusMethodInvocation *invocation,
1817 uid = __get_caller_uid(connection,
1818 g_dbus_method_invocation_get_sender(invocation));
1819 if (uid == (uid_t)-1)
1822 if (__check_caller_permission(uid, invocation, parameters))
1825 if (g_strcmp0(method_name, "install") == 0)
1826 ret = __handle_request_install(uid, invocation, parameters);
1827 else if (g_strcmp0(method_name, "mount_install") == 0)
1828 ret = __handle_request_mount_install(uid, invocation,
1830 else if (g_strcmp0(method_name, "reinstall") == 0)
1831 ret = __handle_request_reinstall(uid, invocation, parameters);
1832 else if (g_strcmp0(method_name, "uninstall") == 0)
1833 ret = __handle_request_uninstall(uid, invocation, parameters);
1834 else if (g_strcmp0(method_name, "cleardata") == 0)
1835 ret = __handle_request_cleardata(uid, invocation, parameters);
1836 else if (g_strcmp0(method_name, "move") == 0)
1837 ret = __handle_request_move(uid, invocation, parameters);
1838 else if (g_strcmp0(method_name, "enable_pkgs") == 0)
1839 ret = __handle_request_enable_pkgs(uid, invocation, parameters);
1840 else if (g_strcmp0(method_name, "disable_pkgs") == 0)
1841 ret = __handle_request_disable_pkgs(uid, invocation, parameters);
1842 else if (g_strcmp0(method_name, "register_pkg_update_info") == 0)
1843 ret = __handle_request_register_pkg_update_info(uid, invocation, parameters);
1844 else if (g_strcmp0(method_name, "unregister_pkg_update_info") == 0)
1845 ret = __handle_request_unregister_pkg_update_info(uid, invocation, parameters);
1846 else if (g_strcmp0(method_name, "unregister_all_pkg_update_info") == 0)
1847 ret = __handle_request_unregister_all_pkg_update_info(uid, invocation, parameters);
1848 else if (g_strcmp0(method_name, "getsize") == 0)
1849 ret = __handle_request_getsize(uid, invocation, parameters);
1850 else if (g_strcmp0(method_name, "getsize_sync") == 0)
1851 ret = __handle_request_getsize_sync(uid, invocation, parameters);
1852 else if (g_strcmp0(method_name, "clearcache") == 0)
1853 ret = __handle_request_clearcache(uid, invocation, parameters);
1854 else if (g_strcmp0(method_name, "enable_app") == 0)
1855 ret = __handle_request_enable_app(uid, invocation, parameters);
1856 else if (g_strcmp0(method_name, "disable_app") == 0)
1857 ret = __handle_request_disable_app(uid, invocation, parameters);
1858 else if (g_strcmp0(method_name, "enable_apps") == 0)
1859 ret = __handle_request_enable_apps(uid, invocation, parameters);
1860 else if (g_strcmp0(method_name, "disable_apps") == 0)
1861 ret = __handle_request_disable_apps(uid, invocation, parameters);
1862 else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
1863 ret = __handle_request_enable_global_app_for_uid(uid,
1864 invocation, parameters);
1865 else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
1866 ret = __handle_request_disable_global_app_for_uid(uid,
1867 invocation, parameters);
1868 else if (g_strcmp0(method_name, "kill") == 0)
1869 ret = __handle_request_kill(uid, invocation, parameters);
1870 else if (g_strcmp0(method_name, "check") == 0)
1871 ret = __handle_request_check(uid, invocation, parameters);
1872 else if (g_strcmp0(method_name, "generate_license_request") == 0)
1873 ret = __handle_request_generate_license_request(uid, invocation,
1875 else if (g_strcmp0(method_name, "register_license") == 0)
1876 ret = __handle_request_register_license(uid, invocation,
1878 else if (g_strcmp0(method_name, "decrypt_package") == 0)
1879 ret = __handle_request_decrypt_package(uid, invocation,
1881 else if (g_strcmp0(method_name, "disable_app_splash_screen") == 0)
1882 ret = __handle_request_disable_app_splash_screen(uid,
1883 invocation, parameters);
1884 else if (g_strcmp0(method_name, "enable_app_splash_screen") == 0)
1885 ret = __handle_request_enable_app_splash_screen(uid,
1886 invocation, parameters);
1887 else if (g_strcmp0(method_name, "set_restriction_mode") == 0)
1888 ret = __handle_request_set_restriction_mode(uid, invocation,
1890 else if (g_strcmp0(method_name, "unset_restriction_mode") == 0)
1891 ret = __handle_request_unset_restriction_mode(uid, invocation,
1893 else if (g_strcmp0(method_name, "get_restriction_mode") == 0)
1894 ret = __handle_request_get_restriction_mode(uid, invocation,
1896 else if (g_strcmp0(method_name, "set_app_label") == 0)
1897 ret = __handle_request_set_app_label(uid, invocation, parameters);
1898 else if (g_strcmp0(method_name, "migrate_external_image") == 0)
1899 ret = __handle_request_migrate_external_image(uid, invocation,
1905 g_idle_add(queue_job, NULL);
1908 int _return_value_to_caller(const char *req_key, GVariant *result)
1910 GDBusMethodInvocation *invocation;
1912 invocation = (GDBusMethodInvocation *)g_hash_table_lookup(req_table,
1914 if (invocation == NULL) {
1915 ERR("no such request id");
1919 g_dbus_method_invocation_return_value(invocation, result);
1920 g_hash_table_remove(req_table, (gpointer)req_key);
1925 static const GDBusInterfaceVTable interface_vtable = {
1926 __handle_method_call,
1931 static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
1936 DBG("on bus acquired");
1938 reg_id = g_dbus_connection_register_object(connection,
1939 PKGMGR_DBUS_OBJECT_PATH,
1940 instropection_data->interfaces[0],
1941 &interface_vtable, NULL, NULL, &err);
1944 ERR("failed to register object: %s", err->message);
1949 static void __on_name_acquired(GDBusConnection *connection, const gchar *name,
1952 DBG("on name acquired: %s", name);
1955 static void __on_name_lost(GDBusConnection *connection, const gchar *name,
1958 DBG("on name lost: %s", name);
1961 int _init_request_handler(void)
1963 instropection_data = g_dbus_node_info_new_for_xml(instropection_xml,
1966 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, PKGMGR_DBUS_SERVICE,
1967 G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
1968 __on_name_acquired, __on_name_lost, NULL, NULL);
1970 req_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1972 if (req_table == NULL)
1978 void _fini_request_handler(void)
1980 g_hash_table_destroy(req_table);
1981 g_bus_unown_name(owner_id);
1982 g_dbus_node_info_unref(instropection_data);