7 #include "comm_config.h"
9 #include "pkgmgr-server.h"
10 #include "package-manager.h"
11 #include "package-manager-debug.h"
13 static const char instropection_xml[] =
15 " <interface name='org.tizen.pkgmgr'>"
16 " <method name='install'>"
17 " <arg type='u' name='uid' direction='in'/>"
18 " <arg type='s' name='pkgtype' direction='in'/>"
19 " <arg type='s' name='pkgpath' direction='in'/>"
20 " <arg type='as' name='args' direction='in'/>"
21 " <arg type='i' name='ret' direction='out'/>"
22 " <arg type='s' name='reqkey' direction='out'/>"
24 " <method name='reinstall'>"
25 " <arg type='u' name='uid' direction='in'/>"
26 " <arg type='s' name='pkgtype' direction='in'/>"
27 " <arg type='s' name='pkgid' direction='in'/>"
28 " <arg type='i' name='ret' direction='out'/>"
29 " <arg type='s' name='reqkey' direction='out'/>"
31 " <method name='uninstall'>"
32 " <arg type='u' name='uid' direction='in'/>"
33 " <arg type='s' name='pkgtype' direction='in'/>"
34 " <arg type='s' name='pkgid' direction='in'/>"
35 " <arg type='i' name='ret' direction='out'/>"
36 " <arg type='s' name='reqkey' direction='out'/>"
38 " <method name='move'>"
39 " <arg type='u' name='uid' direction='in'/>"
40 " <arg type='s' name='pkgtype' direction='in'/>"
41 " <arg type='s' name='pkgid' direction='in'/>"
42 " <arg type='i' name='ret' direction='out'/>"
43 " <arg type='s' name='reqkey' direction='out'/>"
45 " <method name='enable_pkg'>"
46 " <arg type='u' name='uid' direction='in'/>"
47 " <arg type='s' name='pkgid' direction='in'/>"
48 " <arg type='i' name='ret' direction='out'/>"
50 " <method name='disable_pkg'>"
51 " <arg type='u' name='uid' direction='in'/>"
52 " <arg type='s' name='pkgid' direction='in'/>"
53 " <arg type='i' name='ret' direction='out'/>"
55 " <method name='enable_app'>"
56 " <arg type='u' name='uid' direction='in'/>"
57 " <arg type='s' name='appid' direction='in'/>"
58 " <arg type='i' name='ret' direction='out'/>"
59 " <arg type='s' name='reqkey' direction='out'/>"
61 " <method name='disable_app'>"
62 " <arg type='u' name='uid' direction='in'/>"
63 " <arg type='s' name='appid' direction='in'/>"
64 " <arg type='i' name='ret' direction='out'/>"
65 " <arg type='s' name='reqkey' direction='out'/>"
67 " <method name='enable_global_app_for_uid'>"
68 " <arg type='u' name='uid' direction='in'/>"
69 " <arg type='s' name='appid' direction='in'/>"
70 " <arg type='i' name='ret' direction='out'/>"
71 " <arg type='s' name='reqkey' direction='out'/>"
73 " <method name='disable_global_app_for_uid'>"
74 " <arg type='u' name='uid' direction='in'/>"
75 " <arg type='s' name='appid' direction='in'/>"
76 " <arg type='i' name='ret' direction='out'/>"
77 " <arg type='s' name='reqkey' direction='out'/>"
79 " <method name='getsize'>"
80 " <arg type='u' name='uid' direction='in'/>"
81 " <arg type='s' name='pkgid' direction='in'/>"
82 " <arg type='i' name='get_type' direction='in'/>"
83 " <arg type='i' name='ret' direction='out'/>"
84 " <arg type='s' name='reqkey' direction='out'/>"
86 " <method name='cleardata'>"
87 " <arg type='u' name='uid' direction='in'/>"
88 " <arg type='s' name='pkgtype' direction='in'/>"
89 " <arg type='s' name='pkgid' direction='in'/>"
90 " <arg type='i' name='ret' direction='out'/>"
92 " <method name='clearcache'>"
93 " <arg type='u' name='uid' direction='in'/>"
94 " <arg type='s' name='pkgid' direction='in'/>"
95 " <arg type='i' name='ret' direction='out'/>"
97 " <method name='kill'>"
98 " <arg type='u' name='uid' direction='in'/>"
99 " <arg type='s' name='pkgid' direction='in'/>"
100 " <arg type='i' name='ret' direction='out'/>"
102 " <method name='check'>"
103 " <arg type='u' name='uid' direction='in'/>"
104 " <arg type='s' name='pkgid' direction='in'/>"
105 " <arg type='i' name='ret' direction='out'/>"
107 " <method name='generate_license_request'>"
108 " <arg type='s' name='resp_data' direction='in'/>"
109 " <arg type='i' name='ret' direction='out'/>"
110 " <arg type='s' name='req_data' direction='out'/>"
111 " <arg type='s' name='license_url' direction='out'/>"
113 " <method name='register_license'>"
114 " <arg type='s' name='resp_data' direction='in'/>"
115 " <arg type='i' name='ret' direction='out'/>"
117 " <method name='decrypt_package'>"
118 " <arg type='s' name='drm_file_path' direction='in'/>"
119 " <arg type='s' name='decrypted_file_path' direction='in'/>"
120 " <arg type='i' name='ret' direction='out'/>"
122 " <method name='add_blacklist'>"
123 " <arg type='u' name='uid' direction='in'/>"
124 " <arg type='s' name='pkgid' direction='in'/>"
125 " <arg type='i' name='ret' direction='out'/>"
127 " <method name='remove_blacklist'>"
128 " <arg type='u' name='uid' direction='in'/>"
129 " <arg type='s' name='pkgid' direction='in'/>"
130 " <arg type='i' name='ret' direction='out'/>"
132 " <method name='check_blacklist'>"
133 " <arg type='u' name='uid' direction='in'/>"
134 " <arg type='s' name='pkgid' direction='in'/>"
135 " <arg type='i' name='result' direction='out'/>"
136 " <arg type='i' name='ret' direction='out'/>"
140 static GDBusNodeInfo *instropection_data;
142 static guint owner_id;
143 static GHashTable *req_table;
145 static char *__generate_reqkey(const char *pkgid)
149 char timestr[MAX_PKG_ARGS_LEN];
153 gettimeofday(&tv, NULL);
154 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
155 snprintf(timestr, sizeof(timestr), "%ld", curtime);
157 size = strlen(pkgid) + strlen(timestr) + 2;
158 str_req_key = (char *)calloc(size, sizeof(char));
159 if (str_req_key == NULL) {
160 DBG("calloc failed");
163 snprintf(str_req_key, size, "%s_%s", pkgid, timestr);
168 static int __handle_request_install(uid_t uid,
169 GDBusMethodInvocation *invocation, GVariant *parameters)
171 uid_t target_uid = (uid_t)-1;
172 char *pkgtype = NULL;
173 char *pkgpath = NULL;
176 gchar **tmp_args = NULL;
184 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
185 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
187 for (i = 0; i < args_count; i++)
188 len = len + strlen(tmp_args[i]) + 1;
190 args = (char *)calloc(len, sizeof(char));
192 ERR("calloc failed");
197 for (i = 0; i < args_count; i++) {
198 strncat(args, tmp_args[i], strlen(tmp_args[i]));
199 strncat(args, " ", strlen(" "));
202 if (target_uid == (uid_t)-1 || pkgtype == NULL) {
203 g_dbus_method_invocation_return_value(invocation,
204 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
209 if (pkgpath == NULL) {
210 g_dbus_method_invocation_return_value(invocation,
211 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
216 reqkey = __generate_reqkey(pkgpath);
217 if (reqkey == NULL) {
222 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype,
224 g_dbus_method_invocation_return_value(invocation,
225 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
230 g_dbus_method_invocation_return_value(invocation,
231 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
245 static int __handle_request_reinstall(uid_t uid,
246 GDBusMethodInvocation *invocation, GVariant *parameters)
248 uid_t target_uid = (uid_t)-1;
249 char *pkgtype = NULL;
253 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
254 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
255 g_dbus_method_invocation_return_value(invocation,
256 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
260 reqkey = __generate_reqkey(pkgid);
263 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype,
265 g_dbus_method_invocation_return_value(invocation,
266 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
271 g_dbus_method_invocation_return_value(invocation,
272 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
278 static int __handle_request_uninstall(uid_t uid,
279 GDBusMethodInvocation *invocation, GVariant *parameters)
281 uid_t target_uid = (uid_t)-1;
282 char *pkgtype = NULL;
286 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
287 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
288 g_dbus_method_invocation_return_value(invocation,
289 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
293 reqkey = __generate_reqkey(pkgid);
296 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype,
298 g_dbus_method_invocation_return_value(invocation,
299 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
304 g_dbus_method_invocation_return_value(invocation,
305 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
311 static int __handle_request_move(uid_t uid,
312 GDBusMethodInvocation *invocation, GVariant *parameters)
314 uid_t target_uid = (uid_t)-1;
315 char *pkgtype = NULL;
319 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
320 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
321 g_dbus_method_invocation_return_value(invocation,
322 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
326 reqkey = __generate_reqkey(pkgid);
329 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype,
331 g_dbus_method_invocation_return_value(invocation,
332 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
337 g_dbus_method_invocation_return_value(invocation,
338 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
344 static int __handle_request_enable_pkg(uid_t uid,
345 GDBusMethodInvocation *invocation, GVariant *parameters)
347 uid_t target_uid = (uid_t)-1;
350 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
351 if (target_uid == (uid_t)-1 || pkgid == NULL) {
352 g_dbus_method_invocation_return_value(invocation,
353 g_variant_new("(i)", PKGMGR_R_ECOMM));
357 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_ENABLE_PKG, "pkg",
359 g_dbus_method_invocation_return_value(invocation,
360 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
364 g_dbus_method_invocation_return_value(invocation,
365 g_variant_new("(i)", PKGMGR_R_OK));
370 static int __handle_request_disable_pkg(uid_t uid,
371 GDBusMethodInvocation *invocation, GVariant *parameters)
373 uid_t target_uid = (uid_t)-1;
376 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
377 if (target_uid == (uid_t)-1 || pkgid == NULL) {
378 g_dbus_method_invocation_return_value(invocation,
379 g_variant_new("(i)", PKGMGR_R_ECOMM));
383 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_DISABLE_PKG, "pkg",
385 g_dbus_method_invocation_return_value(invocation,
386 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
390 g_dbus_method_invocation_return_value(invocation,
391 g_variant_new("(i)", PKGMGR_R_OK));
396 static int __handle_request_enable_app(uid_t uid,
397 GDBusMethodInvocation *invocation, GVariant *parameters)
399 uid_t target_uid = (uid_t)-1;
404 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
405 if (target_uid == (uid_t)-1 || appid == NULL) {
406 g_dbus_method_invocation_return_value(invocation,
407 g_variant_new("(i)", PKGMGR_R_ECOMM));
411 reqkey = __generate_reqkey(appid);
412 if (reqkey == NULL) {
417 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_APP, "app",
419 g_dbus_method_invocation_return_value(invocation,
420 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
425 g_dbus_method_invocation_return_value(invocation,
426 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
437 static int __handle_request_disable_app(uid_t uid,
438 GDBusMethodInvocation *invocation, GVariant *parameters)
440 uid_t target_uid = (uid_t)-1;
445 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
446 if (target_uid == (uid_t)-1 || appid == NULL) {
447 g_dbus_method_invocation_return_value(invocation,
448 g_variant_new("(i)", PKGMGR_R_ECOMM));
452 reqkey = __generate_reqkey(appid);
453 if (reqkey == NULL) {
458 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_APP, "app",
460 g_dbus_method_invocation_return_value(invocation,
461 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
466 g_dbus_method_invocation_return_value(invocation,
467 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
478 static int __handle_request_enable_global_app_for_uid(uid_t uid,
479 GDBusMethodInvocation *invocation, GVariant *parameters)
481 uid_t target_uid = (uid_t)-1;
486 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
487 if (target_uid == (uid_t)-1 || appid == NULL) {
488 g_dbus_method_invocation_return_value(invocation,
489 g_variant_new("(i)", PKGMGR_R_ECOMM));
493 reqkey = __generate_reqkey(appid);
494 if (reqkey == NULL) {
499 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID, "app",
501 g_dbus_method_invocation_return_value(invocation,
502 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
507 g_dbus_method_invocation_return_value(invocation,
508 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
519 static int __handle_request_disable_global_app_for_uid(uid_t uid,
520 GDBusMethodInvocation *invocation, GVariant *parameters)
522 uid_t target_uid = (uid_t)-1;
527 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
528 if (target_uid == (uid_t)-1 || appid == NULL) {
529 g_dbus_method_invocation_return_value(invocation,
530 g_variant_new("(i)", PKGMGR_R_ECOMM));
534 reqkey = __generate_reqkey(appid);
535 if (reqkey == NULL) {
540 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID, "app",
542 g_dbus_method_invocation_return_value(invocation,
543 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
548 g_dbus_method_invocation_return_value(invocation,
549 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
560 static int __handle_request_getsize(uid_t uid,
561 GDBusMethodInvocation *invocation, GVariant *parameters)
563 uid_t target_uid = (uid_t)-1;
569 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
570 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
571 g_dbus_method_invocation_return_value(invocation,
572 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
576 reqkey = __generate_reqkey(pkgid);
580 snprintf(buf, sizeof(buf), "%d", get_type);
581 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "getsize",
583 g_dbus_method_invocation_return_value(invocation,
584 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
589 g_dbus_method_invocation_return_value(invocation,
590 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
596 static int __handle_request_cleardata(uid_t uid,
597 GDBusMethodInvocation *invocation, GVariant *parameters)
599 uid_t target_uid = (uid_t)-1;
600 char *pkgtype = NULL;
603 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
604 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
605 g_dbus_method_invocation_return_value(invocation,
606 g_variant_new("(i)", PKGMGR_R_ECOMM));
610 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype,
612 g_dbus_method_invocation_return_value(invocation,
613 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
617 g_dbus_method_invocation_return_value(invocation,
618 g_variant_new("(i)", PKGMGR_R_OK));
623 static int __handle_request_clearcache(uid_t uid,
624 GDBusMethodInvocation *invocation, GVariant *parameters)
626 uid_t target_uid = (uid_t)-1;
629 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
630 if (target_uid == (uid_t)-1 || pkgid == NULL) {
631 g_dbus_method_invocation_return_value(invocation,
632 g_variant_new("(i)", PKGMGR_R_ECOMM));
636 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE,
637 "clearcache", pkgid, "")) {
638 g_dbus_method_invocation_return_value(invocation,
639 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
643 g_dbus_method_invocation_return_value(invocation,
644 g_variant_new("(i)", PKGMGR_R_OK));
649 static int __handle_request_kill(uid_t uid,
650 GDBusMethodInvocation *invocation, GVariant *parameters)
652 uid_t target_uid = (uid_t)-1;
655 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
656 if (target_uid == (uid_t)-1 || pkgid == NULL) {
657 g_dbus_method_invocation_return_value(invocation,
658 g_variant_new("(i)", PKGMGR_R_ECOMM));
662 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_KILL, "pkg",
664 g_dbus_method_invocation_return_value(invocation,
665 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
669 g_dbus_method_invocation_return_value(invocation,
670 g_variant_new("(i)", PKGMGR_R_OK));
675 static int __handle_request_check(uid_t uid,
676 GDBusMethodInvocation *invocation, GVariant *parameters)
678 uid_t target_uid = (uid_t)-1;
681 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
682 if (target_uid == (uid_t)-1 || pkgid == NULL) {
683 g_dbus_method_invocation_return_value(invocation,
684 g_variant_new("(i)", PKGMGR_R_ECOMM));
688 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CHECK, "pkg",
690 g_dbus_method_invocation_return_value(invocation,
691 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
695 g_dbus_method_invocation_return_value(invocation,
696 g_variant_new("(i)", PKGMGR_R_OK));
701 static int __handle_request_generate_license_request(uid_t uid,
702 GDBusMethodInvocation *invocation, GVariant *parameters)
705 char *resp_data = NULL;
707 g_variant_get(parameters, "(&s)", &resp_data);
708 if (resp_data == NULL) {
709 g_dbus_method_invocation_return_value(invocation,
710 g_variant_new("(iss)", PKGMGR_R_ECOMM, "", ""));
714 reqkey = __generate_reqkey("drm");
715 if (reqkey == NULL) {
716 g_dbus_method_invocation_return_value(invocation,
717 g_variant_new("(iss)", PKGMGR_R_ENOMEM, "",
722 if (_pm_queue_push(uid, reqkey,
723 PKGMGR_REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
724 "pkg", "", resp_data)) {
725 g_dbus_method_invocation_return_value(invocation,
726 g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
732 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
733 (gpointer)invocation))
734 ERR("reqkey already exists");
739 static int __handle_request_register_license(uid_t uid,
740 GDBusMethodInvocation *invocation, GVariant *parameters)
743 char *resp_data = NULL;
745 g_variant_get(parameters, "(&s)", &resp_data);
746 if (resp_data == NULL) {
747 g_dbus_method_invocation_return_value(invocation,
748 g_variant_new("(i)", PKGMGR_R_ECOMM));
752 reqkey = __generate_reqkey("drm");
753 if (reqkey == NULL) {
754 g_dbus_method_invocation_return_value(invocation,
755 g_variant_new("(i)", PKGMGR_R_ENOMEM));
759 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REGISTER_LICENSE,
760 "pkg", "", resp_data)) {
761 g_dbus_method_invocation_return_value(invocation,
762 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
767 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
768 (gpointer)invocation))
769 ERR("reqkey already exists");
774 static int __handle_request_decrypt_package(uid_t uid,
775 GDBusMethodInvocation *invocation, GVariant *parameters)
778 char *drm_file_path = NULL;
779 char *decrypted_file_path = NULL;
781 g_variant_get(parameters, "(&s&s)", &drm_file_path,
782 &decrypted_file_path);
783 if (drm_file_path == NULL || decrypted_file_path == NULL) {
784 g_dbus_method_invocation_return_value(invocation,
785 g_variant_new("(i)", PKGMGR_R_ECOMM));
789 reqkey = __generate_reqkey("drm");
790 if (reqkey == NULL) {
791 g_dbus_method_invocation_return_value(invocation,
792 g_variant_new("(i)", PKGMGR_R_ENOMEM));
796 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_DECRYPT_PACKAGE,
797 "pkg", drm_file_path, decrypted_file_path)) {
798 g_dbus_method_invocation_return_value(invocation,
799 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
804 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
805 (gpointer)invocation))
806 ERR("reqkey already exists");
811 static int __handle_request_add_blacklist(uid_t uid,
812 GDBusMethodInvocation *invocation, GVariant *parameters)
814 uid_t target_uid = (uid_t)-1;
818 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
819 if (target_uid == (uid_t)-1 || pkgid == NULL) {
820 g_dbus_method_invocation_return_value(invocation,
821 g_variant_new("(i)", PKGMGR_R_ECOMM));
825 reqkey = __generate_reqkey("blacklist");
826 if (reqkey == NULL) {
827 g_dbus_method_invocation_return_value(invocation,
828 g_variant_new("(i)", PKGMGR_R_ENOMEM));
832 if (_pm_queue_push(target_uid, reqkey,
833 PKGMGR_REQUEST_TYPE_ADD_BLACKLIST,
835 g_dbus_method_invocation_return_value(invocation,
836 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
840 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
841 (gpointer)invocation))
842 ERR("reqkey already exists");
847 static int __handle_request_remove_blacklist(uid_t uid,
848 GDBusMethodInvocation *invocation, GVariant *parameters)
850 uid_t target_uid = (uid_t)-1;
854 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
855 if (target_uid == (uid_t)-1 || pkgid == NULL) {
856 g_dbus_method_invocation_return_value(invocation,
857 g_variant_new("(i)", PKGMGR_R_ECOMM));
861 reqkey = __generate_reqkey("blacklist");
862 if (reqkey == NULL) {
863 g_dbus_method_invocation_return_value(invocation,
864 g_variant_new("(i)", PKGMGR_R_ENOMEM));
868 if (_pm_queue_push(target_uid, reqkey,
869 PKGMGR_REQUEST_TYPE_REMOVE_BLACKLIST,
871 g_dbus_method_invocation_return_value(invocation,
872 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
876 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
877 (gpointer)invocation))
878 ERR("reqkey already exists");
883 static int __handle_request_check_blacklist(uid_t uid,
884 GDBusMethodInvocation *invocation, GVariant *parameters)
886 uid_t target_uid = (uid_t)-1;
890 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
891 if (target_uid == (uid_t)-1 || pkgid == NULL) {
892 g_dbus_method_invocation_return_value(invocation,
893 g_variant_new("(i)", PKGMGR_R_ECOMM));
897 reqkey = __generate_reqkey("blacklist");
898 if (reqkey == NULL) {
899 g_dbus_method_invocation_return_value(invocation,
900 g_variant_new("(i)", PKGMGR_R_ENOMEM));
904 if (_pm_queue_push(target_uid, reqkey,
905 PKGMGR_REQUEST_TYPE_CHECK_BLACKLIST,
907 g_dbus_method_invocation_return_value(invocation,
908 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
912 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
913 (gpointer)invocation))
914 ERR("reqkey already exists");
919 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
925 result = g_dbus_connection_call_sync(connection,
926 "org.freedesktop.DBus", "/org/freedesktop/DBus",
927 "org.freedesktop.DBus", "GetConnectionUnixUser",
928 g_variant_new("(s)", name), NULL,
929 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
930 if (result == NULL) {
931 ERR("failed to get caller uid: %s", err->message);
936 g_variant_get(result, "(u)", &uid);
941 static void __handle_method_call(GDBusConnection *connection,
942 const gchar *sender, const gchar *object_path,
943 const gchar *interface_name, const gchar *method_name,
944 GVariant *parameters, GDBusMethodInvocation *invocation,
950 uid = __get_caller_uid(connection,
951 g_dbus_method_invocation_get_sender(invocation));
952 if (uid == (uid_t)-1)
955 if (g_strcmp0(method_name, "install") == 0)
956 ret = __handle_request_install(uid, invocation, parameters);
957 else if (g_strcmp0(method_name, "reinstall") == 0)
958 ret = __handle_request_reinstall(uid, invocation, parameters);
959 else if (g_strcmp0(method_name, "uninstall") == 0)
960 ret = __handle_request_uninstall(uid, invocation, parameters);
961 else if (g_strcmp0(method_name, "cleardata") == 0)
962 ret = __handle_request_cleardata(uid, invocation, parameters);
963 else if (g_strcmp0(method_name, "move") == 0)
964 ret = __handle_request_move(uid, invocation, parameters);
965 else if (g_strcmp0(method_name, "enable") == 0)
966 ret = __handle_request_enable_pkg(uid, invocation, parameters);
967 else if (g_strcmp0(method_name, "disable") == 0)
968 ret = __handle_request_disable_pkg(uid, invocation, parameters);
969 else if (g_strcmp0(method_name, "getsize") == 0)
970 ret = __handle_request_getsize(uid, invocation, parameters);
971 else if (g_strcmp0(method_name, "clearcache") == 0)
972 ret = __handle_request_clearcache(uid, invocation, parameters);
973 else if (g_strcmp0(method_name, "enable_app") == 0)
974 ret = __handle_request_enable_app(uid, invocation, parameters);
975 else if (g_strcmp0(method_name, "disable_app") == 0)
976 ret = __handle_request_disable_app(uid, invocation, parameters);
977 else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
978 ret = __handle_request_enable_global_app_for_uid(uid, invocation, parameters);
979 else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
980 ret = __handle_request_disable_global_app_for_uid(uid, invocation, parameters);
981 else if (g_strcmp0(method_name, "kill") == 0)
982 ret = __handle_request_kill(uid, invocation, parameters);
983 else if (g_strcmp0(method_name, "check") == 0)
984 ret = __handle_request_check(uid, invocation, parameters);
985 else if (g_strcmp0(method_name, "generate_license_request") == 0)
986 ret = __handle_request_generate_license_request(uid, invocation,
988 else if (g_strcmp0(method_name, "register_license") == 0)
989 ret = __handle_request_register_license(uid, invocation,
991 else if (g_strcmp0(method_name, "decrypt_package") == 0)
992 ret = __handle_request_decrypt_package(uid, invocation,
994 else if (g_strcmp0(method_name, "add_blacklist") == 0)
995 ret = __handle_request_add_blacklist(uid, invocation,
997 else if (g_strcmp0(method_name, "remove_blacklist") == 0)
998 ret = __handle_request_remove_blacklist(uid, invocation,
1000 else if (g_strcmp0(method_name, "check_blacklist") == 0)
1001 ret = __handle_request_check_blacklist(uid, invocation,
1007 g_idle_add(queue_job, NULL);
1010 int __return_value_to_caller(const char *req_key, GVariant *result)
1012 GDBusMethodInvocation *invocation;
1014 invocation = (GDBusMethodInvocation *)g_hash_table_lookup(req_table,
1016 if (invocation == NULL) {
1017 ERR("no such request id");
1021 g_dbus_method_invocation_return_value(invocation, result);
1022 g_hash_table_remove(req_table, (gpointer)req_key);
1027 static const GDBusInterfaceVTable interface_vtable =
1029 __handle_method_call,
1034 static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
1039 DBG("on bus acquired");
1041 reg_id = g_dbus_connection_register_object(connection,
1042 COMM_PKGMGR_DBUS_OBJECT_PATH,
1043 instropection_data->interfaces[0],
1044 &interface_vtable, NULL, NULL, &err);
1047 ERR("failed to register object: %s", err->message);
1052 static void __on_name_acquired(GDBusConnection *connection, const gchar *name,
1055 DBG("on name acquired: %s", name);
1058 static void __on_name_lost(GDBusConnection *connection, const gchar *name,
1061 DBG("on name lost: %s", name);
1064 int __init_request_handler(void)
1066 instropection_data = g_dbus_node_info_new_for_xml(instropection_xml, NULL);
1068 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, COMM_PKGMGR_DBUS_SERVICE,
1069 G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
1070 __on_name_acquired, __on_name_lost, NULL, NULL);
1072 req_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1074 if (req_table == NULL)
1080 void __fini_request_handler(void)
1082 g_hash_table_destroy(req_table);
1083 g_bus_unown_name(owner_id);
1084 g_dbus_node_info_unref(instropection_data);