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("(is)", 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("(is)", 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("(is)", 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("(is)", 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;
604 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
605 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
606 g_dbus_method_invocation_return_value(invocation,
607 g_variant_new("(i)", PKGMGR_R_ECOMM));
611 reqkey = __generate_reqkey(pkgid);
615 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype,
617 g_dbus_method_invocation_return_value(invocation,
618 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
622 g_dbus_method_invocation_return_value(invocation,
623 g_variant_new("(i)", PKGMGR_R_OK));
628 static int __handle_request_clearcache(uid_t uid,
629 GDBusMethodInvocation *invocation, GVariant *parameters)
631 uid_t target_uid = (uid_t)-1;
634 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
635 if (target_uid == (uid_t)-1 || pkgid == NULL) {
636 g_dbus_method_invocation_return_value(invocation,
637 g_variant_new("(i)", PKGMGR_R_ECOMM));
641 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE,
642 "clearcache", pkgid, "")) {
643 g_dbus_method_invocation_return_value(invocation,
644 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
648 g_dbus_method_invocation_return_value(invocation,
649 g_variant_new("(i)", PKGMGR_R_OK));
654 static int __handle_request_kill(uid_t uid,
655 GDBusMethodInvocation *invocation, GVariant *parameters)
657 uid_t target_uid = (uid_t)-1;
660 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
661 if (target_uid == (uid_t)-1 || pkgid == NULL) {
662 g_dbus_method_invocation_return_value(invocation,
663 g_variant_new("(i)", PKGMGR_R_ECOMM));
667 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_KILL, "pkg",
669 g_dbus_method_invocation_return_value(invocation,
670 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
674 g_dbus_method_invocation_return_value(invocation,
675 g_variant_new("(i)", PKGMGR_R_OK));
680 static int __handle_request_check(uid_t uid,
681 GDBusMethodInvocation *invocation, GVariant *parameters)
683 uid_t target_uid = (uid_t)-1;
686 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
687 if (target_uid == (uid_t)-1 || pkgid == NULL) {
688 g_dbus_method_invocation_return_value(invocation,
689 g_variant_new("(i)", PKGMGR_R_ECOMM));
693 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CHECK, "pkg",
695 g_dbus_method_invocation_return_value(invocation,
696 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
700 g_dbus_method_invocation_return_value(invocation,
701 g_variant_new("(i)", PKGMGR_R_OK));
706 static int __handle_request_generate_license_request(uid_t uid,
707 GDBusMethodInvocation *invocation, GVariant *parameters)
710 char *resp_data = NULL;
712 g_variant_get(parameters, "(&s)", &resp_data);
713 if (resp_data == NULL) {
714 g_dbus_method_invocation_return_value(invocation,
715 g_variant_new("(iss)", PKGMGR_R_ECOMM, "", ""));
719 reqkey = __generate_reqkey("drm");
720 if (reqkey == NULL) {
721 g_dbus_method_invocation_return_value(invocation,
722 g_variant_new("(iss)", PKGMGR_R_ENOMEM, "",
727 if (_pm_queue_push(uid, reqkey,
728 PKGMGR_REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
729 "pkg", "", resp_data)) {
730 g_dbus_method_invocation_return_value(invocation,
731 g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
737 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
738 (gpointer)invocation))
739 ERR("reqkey already exists");
744 static int __handle_request_register_license(uid_t uid,
745 GDBusMethodInvocation *invocation, GVariant *parameters)
748 char *resp_data = NULL;
750 g_variant_get(parameters, "(&s)", &resp_data);
751 if (resp_data == NULL) {
752 g_dbus_method_invocation_return_value(invocation,
753 g_variant_new("(i)", PKGMGR_R_ECOMM));
757 reqkey = __generate_reqkey("drm");
758 if (reqkey == NULL) {
759 g_dbus_method_invocation_return_value(invocation,
760 g_variant_new("(i)", PKGMGR_R_ENOMEM));
764 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REGISTER_LICENSE,
765 "pkg", "", resp_data)) {
766 g_dbus_method_invocation_return_value(invocation,
767 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
772 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
773 (gpointer)invocation))
774 ERR("reqkey already exists");
779 static int __handle_request_decrypt_package(uid_t uid,
780 GDBusMethodInvocation *invocation, GVariant *parameters)
783 char *drm_file_path = NULL;
784 char *decrypted_file_path = NULL;
786 g_variant_get(parameters, "(&s&s)", &drm_file_path,
787 &decrypted_file_path);
788 if (drm_file_path == NULL || decrypted_file_path == NULL) {
789 g_dbus_method_invocation_return_value(invocation,
790 g_variant_new("(i)", PKGMGR_R_ECOMM));
794 reqkey = __generate_reqkey("drm");
795 if (reqkey == NULL) {
796 g_dbus_method_invocation_return_value(invocation,
797 g_variant_new("(i)", PKGMGR_R_ENOMEM));
801 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_DECRYPT_PACKAGE,
802 "pkg", drm_file_path, decrypted_file_path)) {
803 g_dbus_method_invocation_return_value(invocation,
804 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
809 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
810 (gpointer)invocation))
811 ERR("reqkey already exists");
816 static int __handle_request_add_blacklist(uid_t uid,
817 GDBusMethodInvocation *invocation, GVariant *parameters)
819 uid_t target_uid = (uid_t)-1;
823 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
824 if (target_uid == (uid_t)-1 || pkgid == NULL) {
825 g_dbus_method_invocation_return_value(invocation,
826 g_variant_new("(i)", PKGMGR_R_ECOMM));
830 reqkey = __generate_reqkey("blacklist");
831 if (reqkey == NULL) {
832 g_dbus_method_invocation_return_value(invocation,
833 g_variant_new("(i)", PKGMGR_R_ENOMEM));
837 if (_pm_queue_push(target_uid, reqkey,
838 PKGMGR_REQUEST_TYPE_ADD_BLACKLIST,
840 g_dbus_method_invocation_return_value(invocation,
841 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
845 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
846 (gpointer)invocation))
847 ERR("reqkey already exists");
852 static int __handle_request_remove_blacklist(uid_t uid,
853 GDBusMethodInvocation *invocation, GVariant *parameters)
855 uid_t target_uid = (uid_t)-1;
859 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
860 if (target_uid == (uid_t)-1 || pkgid == NULL) {
861 g_dbus_method_invocation_return_value(invocation,
862 g_variant_new("(i)", PKGMGR_R_ECOMM));
866 reqkey = __generate_reqkey("blacklist");
867 if (reqkey == NULL) {
868 g_dbus_method_invocation_return_value(invocation,
869 g_variant_new("(i)", PKGMGR_R_ENOMEM));
873 if (_pm_queue_push(target_uid, reqkey,
874 PKGMGR_REQUEST_TYPE_REMOVE_BLACKLIST,
876 g_dbus_method_invocation_return_value(invocation,
877 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
881 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
882 (gpointer)invocation))
883 ERR("reqkey already exists");
888 static int __handle_request_check_blacklist(uid_t uid,
889 GDBusMethodInvocation *invocation, GVariant *parameters)
891 uid_t target_uid = (uid_t)-1;
895 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
896 if (target_uid == (uid_t)-1 || pkgid == NULL) {
897 g_dbus_method_invocation_return_value(invocation,
898 g_variant_new("(i)", PKGMGR_R_ECOMM));
902 reqkey = __generate_reqkey("blacklist");
903 if (reqkey == NULL) {
904 g_dbus_method_invocation_return_value(invocation,
905 g_variant_new("(i)", PKGMGR_R_ENOMEM));
909 if (_pm_queue_push(target_uid, reqkey,
910 PKGMGR_REQUEST_TYPE_CHECK_BLACKLIST,
912 g_dbus_method_invocation_return_value(invocation,
913 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
917 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
918 (gpointer)invocation))
919 ERR("reqkey already exists");
924 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
930 result = g_dbus_connection_call_sync(connection,
931 "org.freedesktop.DBus", "/org/freedesktop/DBus",
932 "org.freedesktop.DBus", "GetConnectionUnixUser",
933 g_variant_new("(s)", name), NULL,
934 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
935 if (result == NULL) {
936 ERR("failed to get caller uid: %s", err->message);
941 g_variant_get(result, "(u)", &uid);
946 static void __handle_method_call(GDBusConnection *connection,
947 const gchar *sender, const gchar *object_path,
948 const gchar *interface_name, const gchar *method_name,
949 GVariant *parameters, GDBusMethodInvocation *invocation,
955 uid = __get_caller_uid(connection,
956 g_dbus_method_invocation_get_sender(invocation));
957 if (uid == (uid_t)-1)
960 if (g_strcmp0(method_name, "install") == 0)
961 ret = __handle_request_install(uid, invocation, parameters);
962 else if (g_strcmp0(method_name, "reinstall") == 0)
963 ret = __handle_request_reinstall(uid, invocation, parameters);
964 else if (g_strcmp0(method_name, "uninstall") == 0)
965 ret = __handle_request_uninstall(uid, invocation, parameters);
966 else if (g_strcmp0(method_name, "cleardata") == 0)
967 ret = __handle_request_cleardata(uid, invocation, parameters);
968 else if (g_strcmp0(method_name, "move") == 0)
969 ret = __handle_request_move(uid, invocation, parameters);
970 else if (g_strcmp0(method_name, "enable") == 0)
971 ret = __handle_request_enable_pkg(uid, invocation, parameters);
972 else if (g_strcmp0(method_name, "disable") == 0)
973 ret = __handle_request_disable_pkg(uid, invocation, parameters);
974 else if (g_strcmp0(method_name, "getsize") == 0)
975 ret = __handle_request_getsize(uid, invocation, parameters);
976 else if (g_strcmp0(method_name, "clearcache") == 0)
977 ret = __handle_request_clearcache(uid, invocation, parameters);
978 else if (g_strcmp0(method_name, "enable_app") == 0)
979 ret = __handle_request_enable_app(uid, invocation, parameters);
980 else if (g_strcmp0(method_name, "disable_app") == 0)
981 ret = __handle_request_disable_app(uid, invocation, parameters);
982 else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
983 ret = __handle_request_enable_global_app_for_uid(uid, invocation, parameters);
984 else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
985 ret = __handle_request_disable_global_app_for_uid(uid, invocation, parameters);
986 else if (g_strcmp0(method_name, "kill") == 0)
987 ret = __handle_request_kill(uid, invocation, parameters);
988 else if (g_strcmp0(method_name, "check") == 0)
989 ret = __handle_request_check(uid, invocation, parameters);
990 else if (g_strcmp0(method_name, "generate_license_request") == 0)
991 ret = __handle_request_generate_license_request(uid, invocation,
993 else if (g_strcmp0(method_name, "register_license") == 0)
994 ret = __handle_request_register_license(uid, invocation,
996 else if (g_strcmp0(method_name, "decrypt_package") == 0)
997 ret = __handle_request_decrypt_package(uid, invocation,
999 else if (g_strcmp0(method_name, "add_blacklist") == 0)
1000 ret = __handle_request_add_blacklist(uid, invocation,
1002 else if (g_strcmp0(method_name, "remove_blacklist") == 0)
1003 ret = __handle_request_remove_blacklist(uid, invocation,
1005 else if (g_strcmp0(method_name, "check_blacklist") == 0)
1006 ret = __handle_request_check_blacklist(uid, invocation,
1012 g_idle_add(queue_job, NULL);
1015 int __return_value_to_caller(const char *req_key, GVariant *result)
1017 GDBusMethodInvocation *invocation;
1019 invocation = (GDBusMethodInvocation *)g_hash_table_lookup(req_table,
1021 if (invocation == NULL) {
1022 ERR("no such request id");
1026 g_dbus_method_invocation_return_value(invocation, result);
1027 g_hash_table_remove(req_table, (gpointer)req_key);
1032 static const GDBusInterfaceVTable interface_vtable =
1034 __handle_method_call,
1039 static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
1044 DBG("on bus acquired");
1046 reg_id = g_dbus_connection_register_object(connection,
1047 COMM_PKGMGR_DBUS_OBJECT_PATH,
1048 instropection_data->interfaces[0],
1049 &interface_vtable, NULL, NULL, &err);
1052 ERR("failed to register object: %s", err->message);
1057 static void __on_name_acquired(GDBusConnection *connection, const gchar *name,
1060 DBG("on name acquired: %s", name);
1063 static void __on_name_lost(GDBusConnection *connection, const gchar *name,
1066 DBG("on name lost: %s", name);
1069 int __init_request_handler(void)
1071 instropection_data = g_dbus_node_info_new_for_xml(instropection_xml, NULL);
1073 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, COMM_PKGMGR_DBUS_SERVICE,
1074 G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
1075 __on_name_acquired, __on_name_lost, NULL, NULL);
1077 req_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1079 if (req_table == NULL)
1085 void __fini_request_handler(void)
1087 g_hash_table_destroy(req_table);
1088 g_bus_unown_name(owner_id);
1089 g_dbus_node_info_unref(instropection_data);