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'/>"
60 " <method name='disable_app'>"
61 " <arg type='u' name='uid' direction='in'/>"
62 " <arg type='s' name='appid' direction='in'/>"
63 " <arg type='i' name='ret' direction='out'/>"
65 " <method name='enable_global_app'>"
66 " <arg type='u' name='uid' direction='in'/>"
67 " <arg type='s' name='appid' direction='in'/>"
68 " <arg type='i' name='ret' direction='out'/>"
70 " <method name='disable_global_app'>"
71 " <arg type='u' name='uid' direction='in'/>"
72 " <arg type='s' name='appid' direction='in'/>"
73 " <arg type='i' name='ret' direction='out'/>"
75 " <method name='getsize'>"
76 " <arg type='u' name='uid' direction='in'/>"
77 " <arg type='s' name='pkgid' direction='in'/>"
78 " <arg type='i' name='get_type' direction='in'/>"
79 " <arg type='i' name='ret' direction='out'/>"
80 " <arg type='s' name='reqkey' direction='out'/>"
82 " <method name='cleardata'>"
83 " <arg type='u' name='uid' direction='in'/>"
84 " <arg type='s' name='pkgtype' direction='in'/>"
85 " <arg type='s' name='pkgid' direction='in'/>"
86 " <arg type='i' name='ret' direction='out'/>"
88 " <method name='clearcache'>"
89 " <arg type='u' name='uid' direction='in'/>"
90 " <arg type='s' name='pkgid' direction='in'/>"
91 " <arg type='i' name='ret' direction='out'/>"
93 " <method name='kill'>"
94 " <arg type='u' name='uid' direction='in'/>"
95 " <arg type='s' name='pkgid' direction='in'/>"
96 " <arg type='i' name='ret' direction='out'/>"
98 " <method name='check'>"
99 " <arg type='u' name='uid' direction='in'/>"
100 " <arg type='s' name='pkgid' direction='in'/>"
101 " <arg type='i' name='ret' direction='out'/>"
103 " <method name='generate_license_request'>"
104 " <arg type='s' name='resp_data' direction='in'/>"
105 " <arg type='i' name='ret' direction='out'/>"
106 " <arg type='s' name='req_data' direction='out'/>"
107 " <arg type='s' name='license_url' direction='out'/>"
109 " <method name='register_license'>"
110 " <arg type='s' name='resp_data' direction='in'/>"
111 " <arg type='i' name='ret' direction='out'/>"
113 " <method name='decrypt_package'>"
114 " <arg type='s' name='drm_file_path' direction='in'/>"
115 " <arg type='s' name='decrypted_file_path' direction='in'/>"
116 " <arg type='i' name='ret' direction='out'/>"
118 " <method name='add_blacklist'>"
119 " <arg type='u' name='uid' direction='in'/>"
120 " <arg type='s' name='pkgid' direction='in'/>"
121 " <arg type='i' name='ret' direction='out'/>"
123 " <method name='remove_blacklist'>"
124 " <arg type='u' name='uid' direction='in'/>"
125 " <arg type='s' name='pkgid' direction='in'/>"
126 " <arg type='i' name='ret' direction='out'/>"
128 " <method name='check_blacklist'>"
129 " <arg type='u' name='uid' direction='in'/>"
130 " <arg type='s' name='pkgid' direction='in'/>"
131 " <arg type='i' name='result' direction='out'/>"
132 " <arg type='i' name='ret' direction='out'/>"
136 static GDBusNodeInfo *instropection_data;
138 static guint owner_id;
139 static GHashTable *req_table;
141 static char *__generate_reqkey(const char *pkgid)
145 char timestr[MAX_PKG_ARGS_LEN];
149 gettimeofday(&tv, NULL);
150 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
151 snprintf(timestr, sizeof(timestr), "%ld", curtime);
153 size = strlen(pkgid) + strlen(timestr) + 2;
154 str_req_key = (char *)calloc(size, sizeof(char));
155 if (str_req_key == NULL) {
156 DBG("calloc failed");
159 snprintf(str_req_key, size, "%s_%s", pkgid, timestr);
164 static int __handle_request_install(uid_t uid,
165 GDBusMethodInvocation *invocation, GVariant *parameters)
167 uid_t target_uid = (uid_t)-1;
168 char *pkgtype = NULL;
169 char *pkgpath = NULL;
172 gchar **tmp_args = NULL;
180 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &pkgtype, &pkgpath, &value);
181 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
183 for (i = 0; i < args_count; i++)
184 len = len + strlen(tmp_args[i]) + 1;
186 args = (char *)calloc(len, sizeof(char));
188 ERR("calloc failed");
193 for (i = 0; i < args_count; i++) {
194 strncat(args, tmp_args[i], strlen(tmp_args[i]));
195 strncat(args, " ", strlen(" "));
198 if (target_uid == (uid_t)-1 || pkgtype == NULL) {
199 g_dbus_method_invocation_return_value(invocation,
200 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
205 if (pkgpath == NULL) {
206 g_dbus_method_invocation_return_value(invocation,
207 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
212 reqkey = __generate_reqkey(pkgpath);
213 if (reqkey == NULL) {
218 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype,
220 g_dbus_method_invocation_return_value(invocation,
221 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
226 g_dbus_method_invocation_return_value(invocation,
227 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
241 static int __handle_request_reinstall(uid_t uid,
242 GDBusMethodInvocation *invocation, GVariant *parameters)
244 uid_t target_uid = (uid_t)-1;
245 char *pkgtype = NULL;
249 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
250 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
251 g_dbus_method_invocation_return_value(invocation,
252 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
256 reqkey = __generate_reqkey(pkgid);
259 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype,
261 g_dbus_method_invocation_return_value(invocation,
262 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
267 g_dbus_method_invocation_return_value(invocation,
268 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
274 static int __handle_request_uninstall(uid_t uid,
275 GDBusMethodInvocation *invocation, GVariant *parameters)
277 uid_t target_uid = (uid_t)-1;
278 char *pkgtype = NULL;
282 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
283 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
284 g_dbus_method_invocation_return_value(invocation,
285 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
289 reqkey = __generate_reqkey(pkgid);
292 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype,
294 g_dbus_method_invocation_return_value(invocation,
295 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
300 g_dbus_method_invocation_return_value(invocation,
301 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
307 static int __handle_request_move(uid_t uid,
308 GDBusMethodInvocation *invocation, GVariant *parameters)
310 uid_t target_uid = (uid_t)-1;
311 char *pkgtype = NULL;
315 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
316 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
317 g_dbus_method_invocation_return_value(invocation,
318 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
322 reqkey = __generate_reqkey(pkgid);
325 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype,
327 g_dbus_method_invocation_return_value(invocation,
328 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
333 g_dbus_method_invocation_return_value(invocation,
334 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
340 static int __handle_request_enable(uid_t uid,
341 GDBusMethodInvocation *invocation, GVariant *parameters)
343 uid_t target_uid = (uid_t)-1;
346 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
347 if (target_uid == (uid_t)-1 || pkgid == NULL) {
348 g_dbus_method_invocation_return_value(invocation,
349 g_variant_new("(i)", PKGMGR_R_ECOMM));
353 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_ENABLE, "none",
355 g_dbus_method_invocation_return_value(invocation,
356 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
360 g_dbus_method_invocation_return_value(invocation,
361 g_variant_new("(i)", PKGMGR_R_OK));
366 static int __handle_request_disable(uid_t uid,
367 GDBusMethodInvocation *invocation, GVariant *parameters)
369 uid_t target_uid = (uid_t)-1;
372 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
373 if (target_uid == (uid_t)-1 || pkgid == NULL) {
374 g_dbus_method_invocation_return_value(invocation,
375 g_variant_new("(i)", PKGMGR_R_ECOMM));
379 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_DISABLE, "none",
381 g_dbus_method_invocation_return_value(invocation,
382 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
386 g_dbus_method_invocation_return_value(invocation,
387 g_variant_new("(i)", PKGMGR_R_OK));
392 static int __handle_request_enable_global_app(uid_t uid,
393 GDBusMethodInvocation *invocation, GVariant *parameters)
395 uid_t target_uid = (uid_t)-1;
398 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
399 if (target_uid == (uid_t)-1 || appid == NULL) {
400 g_dbus_method_invocation_return_value(invocation,
401 g_variant_new("(i)", PKGMGR_R_ECOMM));
405 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP, "none",
407 g_dbus_method_invocation_return_value(invocation,
408 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
412 g_dbus_method_invocation_return_value(invocation,
413 g_variant_new("(i)", PKGMGR_R_OK));
418 static int __handle_request_disable_global_app(uid_t uid,
419 GDBusMethodInvocation *invocation, GVariant *parameters)
421 uid_t target_uid = (uid_t)-1;
424 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
425 if (target_uid == (uid_t)-1 || appid == NULL) {
426 g_dbus_method_invocation_return_value(invocation,
427 g_variant_new("(i)", PKGMGR_R_ECOMM));
431 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP, "none",
433 g_dbus_method_invocation_return_value(invocation,
434 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
438 g_dbus_method_invocation_return_value(invocation,
439 g_variant_new("(i)", PKGMGR_R_OK));
444 static int __handle_request_getsize(uid_t uid,
445 GDBusMethodInvocation *invocation, GVariant *parameters)
447 uid_t target_uid = (uid_t)-1;
453 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
454 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
455 g_dbus_method_invocation_return_value(invocation,
456 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
460 reqkey = __generate_reqkey(pkgid);
464 snprintf(buf, sizeof(buf), "%d", get_type);
465 if (_pm_queue_push(target_uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "getsize",
467 g_dbus_method_invocation_return_value(invocation,
468 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
473 g_dbus_method_invocation_return_value(invocation,
474 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
480 static int __handle_request_cleardata(uid_t uid,
481 GDBusMethodInvocation *invocation, GVariant *parameters)
483 uid_t target_uid = (uid_t)-1;
484 char *pkgtype = NULL;
487 g_variant_get(parameters, "(u&s&s)", &target_uid, &pkgtype, &pkgid);
488 if (target_uid == (uid_t)-1 || pkgtype == NULL || pkgid == NULL) {
489 g_dbus_method_invocation_return_value(invocation,
490 g_variant_new("(i)", PKGMGR_R_ECOMM));
494 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype,
496 g_dbus_method_invocation_return_value(invocation,
497 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
501 g_dbus_method_invocation_return_value(invocation,
502 g_variant_new("(i)", PKGMGR_R_OK));
507 static int __handle_request_clearcache(uid_t uid,
508 GDBusMethodInvocation *invocation, GVariant *parameters)
510 uid_t target_uid = (uid_t)-1;
513 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
514 if (target_uid == (uid_t)-1 || pkgid == NULL) {
515 g_dbus_method_invocation_return_value(invocation,
516 g_variant_new("(i)", PKGMGR_R_ECOMM));
520 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE,
521 "clearcache", pkgid, "")) {
522 g_dbus_method_invocation_return_value(invocation,
523 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
527 g_dbus_method_invocation_return_value(invocation,
528 g_variant_new("(i)", PKGMGR_R_OK));
533 static int __handle_request_kill(uid_t uid,
534 GDBusMethodInvocation *invocation, GVariant *parameters)
536 uid_t target_uid = (uid_t)-1;
539 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
540 if (target_uid == (uid_t)-1 || pkgid == NULL) {
541 g_dbus_method_invocation_return_value(invocation,
542 g_variant_new("(i)", PKGMGR_R_ECOMM));
546 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_KILL, "pkg",
548 g_dbus_method_invocation_return_value(invocation,
549 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
553 g_dbus_method_invocation_return_value(invocation,
554 g_variant_new("(i)", PKGMGR_R_OK));
559 static int __handle_request_check(uid_t uid,
560 GDBusMethodInvocation *invocation, GVariant *parameters)
562 uid_t target_uid = (uid_t)-1;
565 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
566 if (target_uid == (uid_t)-1 || pkgid == NULL) {
567 g_dbus_method_invocation_return_value(invocation,
568 g_variant_new("(i)", PKGMGR_R_ECOMM));
572 if (_pm_queue_push(target_uid, "", PKGMGR_REQUEST_TYPE_CHECK, "pkg",
574 g_dbus_method_invocation_return_value(invocation,
575 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
579 g_dbus_method_invocation_return_value(invocation,
580 g_variant_new("(i)", PKGMGR_R_OK));
585 static int __handle_request_generate_license_request(uid_t uid,
586 GDBusMethodInvocation *invocation, GVariant *parameters)
589 char *resp_data = NULL;
591 g_variant_get(parameters, "(&s)", &resp_data);
592 if (resp_data == NULL) {
593 g_dbus_method_invocation_return_value(invocation,
594 g_variant_new("(iss)", PKGMGR_R_ECOMM, "", ""));
598 reqkey = __generate_reqkey("drm");
599 if (reqkey == NULL) {
600 g_dbus_method_invocation_return_value(invocation,
601 g_variant_new("(iss)", PKGMGR_R_ENOMEM, "",
606 if (_pm_queue_push(uid, reqkey,
607 PKGMGR_REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
608 "pkg", "", resp_data)) {
609 g_dbus_method_invocation_return_value(invocation,
610 g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
616 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
617 (gpointer)invocation))
618 ERR("reqkey already exists");
623 static int __handle_request_register_license(uid_t uid,
624 GDBusMethodInvocation *invocation, GVariant *parameters)
627 char *resp_data = NULL;
629 g_variant_get(parameters, "(&s)", &resp_data);
630 if (resp_data == NULL) {
631 g_dbus_method_invocation_return_value(invocation,
632 g_variant_new("(i)", PKGMGR_R_ECOMM));
636 reqkey = __generate_reqkey("drm");
637 if (reqkey == NULL) {
638 g_dbus_method_invocation_return_value(invocation,
639 g_variant_new("(i)", PKGMGR_R_ENOMEM));
643 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REGISTER_LICENSE,
644 "pkg", "", resp_data)) {
645 g_dbus_method_invocation_return_value(invocation,
646 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
651 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
652 (gpointer)invocation))
653 ERR("reqkey already exists");
658 static int __handle_request_decrypt_package(uid_t uid,
659 GDBusMethodInvocation *invocation, GVariant *parameters)
662 char *drm_file_path = NULL;
663 char *decrypted_file_path = NULL;
665 g_variant_get(parameters, "(&s&s)", &drm_file_path,
666 &decrypted_file_path);
667 if (drm_file_path == NULL || decrypted_file_path == NULL) {
668 g_dbus_method_invocation_return_value(invocation,
669 g_variant_new("(i)", PKGMGR_R_ECOMM));
673 reqkey = __generate_reqkey("drm");
674 if (reqkey == NULL) {
675 g_dbus_method_invocation_return_value(invocation,
676 g_variant_new("(i)", PKGMGR_R_ENOMEM));
680 if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_DECRYPT_PACKAGE,
681 "pkg", drm_file_path, decrypted_file_path)) {
682 g_dbus_method_invocation_return_value(invocation,
683 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
688 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
689 (gpointer)invocation))
690 ERR("reqkey already exists");
695 static int __handle_request_add_blacklist(uid_t uid,
696 GDBusMethodInvocation *invocation, GVariant *parameters)
698 uid_t target_uid = (uid_t)-1;
702 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
703 if (target_uid == (uid_t)-1 || pkgid == NULL) {
704 g_dbus_method_invocation_return_value(invocation,
705 g_variant_new("(i)", PKGMGR_R_ECOMM));
709 reqkey = __generate_reqkey("blacklist");
710 if (reqkey == NULL) {
711 g_dbus_method_invocation_return_value(invocation,
712 g_variant_new("(i)", PKGMGR_R_ENOMEM));
716 if (_pm_queue_push(target_uid, reqkey,
717 PKGMGR_REQUEST_TYPE_ADD_BLACKLIST,
719 g_dbus_method_invocation_return_value(invocation,
720 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
724 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
725 (gpointer)invocation))
726 ERR("reqkey already exists");
731 static int __handle_request_remove_blacklist(uid_t uid,
732 GDBusMethodInvocation *invocation, GVariant *parameters)
734 uid_t target_uid = (uid_t)-1;
738 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
739 if (target_uid == (uid_t)-1 || pkgid == NULL) {
740 g_dbus_method_invocation_return_value(invocation,
741 g_variant_new("(i)", PKGMGR_R_ECOMM));
745 reqkey = __generate_reqkey("blacklist");
746 if (reqkey == NULL) {
747 g_dbus_method_invocation_return_value(invocation,
748 g_variant_new("(i)", PKGMGR_R_ENOMEM));
752 if (_pm_queue_push(target_uid, reqkey,
753 PKGMGR_REQUEST_TYPE_REMOVE_BLACKLIST,
755 g_dbus_method_invocation_return_value(invocation,
756 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
760 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
761 (gpointer)invocation))
762 ERR("reqkey already exists");
767 static int __handle_request_check_blacklist(uid_t uid,
768 GDBusMethodInvocation *invocation, GVariant *parameters)
770 uid_t target_uid = (uid_t)-1;
774 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
775 if (target_uid == (uid_t)-1 || pkgid == NULL) {
776 g_dbus_method_invocation_return_value(invocation,
777 g_variant_new("(i)", PKGMGR_R_ECOMM));
781 reqkey = __generate_reqkey("blacklist");
782 if (reqkey == NULL) {
783 g_dbus_method_invocation_return_value(invocation,
784 g_variant_new("(i)", PKGMGR_R_ENOMEM));
788 if (_pm_queue_push(target_uid, reqkey,
789 PKGMGR_REQUEST_TYPE_CHECK_BLACKLIST,
791 g_dbus_method_invocation_return_value(invocation,
792 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
796 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
797 (gpointer)invocation))
798 ERR("reqkey already exists");
803 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
809 result = g_dbus_connection_call_sync(connection,
810 "org.freedesktop.DBus", "/org/freedesktop/DBus",
811 "org.freedesktop.DBus", "GetConnectionUnixUser",
812 g_variant_new("(s)", name), NULL,
813 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
814 if (result == NULL) {
815 ERR("failed to get caller uid: %s", err->message);
820 g_variant_get(result, "(u)", &uid);
825 static void __handle_method_call(GDBusConnection *connection,
826 const gchar *sender, const gchar *object_path,
827 const gchar *interface_name, const gchar *method_name,
828 GVariant *parameters, GDBusMethodInvocation *invocation,
834 uid = __get_caller_uid(connection,
835 g_dbus_method_invocation_get_sender(invocation));
836 if (uid == (uid_t)-1)
839 if (g_strcmp0(method_name, "install") == 0)
840 ret = __handle_request_install(uid, invocation, parameters);
841 else if (g_strcmp0(method_name, "reinstall") == 0)
842 ret = __handle_request_reinstall(uid, invocation, parameters);
843 else if (g_strcmp0(method_name, "uninstall") == 0)
844 ret = __handle_request_uninstall(uid, invocation, parameters);
845 else if (g_strcmp0(method_name, "cleardata") == 0)
846 ret = __handle_request_cleardata(uid, invocation, parameters);
847 else if (g_strcmp0(method_name, "move") == 0)
848 ret = __handle_request_move(uid, invocation, parameters);
849 else if (g_strcmp0(method_name, "enable") == 0)
850 ret = __handle_request_enable(uid, invocation, parameters);
851 else if (g_strcmp0(method_name, "disable") == 0)
852 ret = __handle_request_disable(uid, invocation, parameters);
853 else if (g_strcmp0(method_name, "getsize") == 0)
854 ret = __handle_request_getsize(uid, invocation, parameters);
855 else if (g_strcmp0(method_name, "clearcache") == 0)
856 ret = __handle_request_clearcache(uid, invocation, parameters);
857 else if (g_strcmp0(method_name, "enable_global_app") == 0)
858 ret = __handle_request_enable_global_app(uid, invocation, parameters);
859 else if (g_strcmp0(method_name, "disable_global_app") == 0)
860 ret = __handle_request_disable_global_app(uid, invocation, parameters);
861 else if (g_strcmp0(method_name, "kill") == 0)
862 ret = __handle_request_kill(uid, invocation, parameters);
863 else if (g_strcmp0(method_name, "check") == 0)
864 ret = __handle_request_check(uid, invocation, parameters);
865 else if (g_strcmp0(method_name, "generate_license_request") == 0)
866 ret = __handle_request_generate_license_request(uid, invocation,
868 else if (g_strcmp0(method_name, "register_license") == 0)
869 ret = __handle_request_register_license(uid, invocation,
871 else if (g_strcmp0(method_name, "decrypt_package") == 0)
872 ret = __handle_request_decrypt_package(uid, invocation,
874 else if (g_strcmp0(method_name, "add_blacklist") == 0)
875 ret = __handle_request_add_blacklist(uid, invocation,
877 else if (g_strcmp0(method_name, "remove_blacklist") == 0)
878 ret = __handle_request_remove_blacklist(uid, invocation,
880 else if (g_strcmp0(method_name, "check_blacklist") == 0)
881 ret = __handle_request_check_blacklist(uid, invocation,
887 g_idle_add(queue_job, NULL);
890 int __return_value_to_caller(const char *req_key, GVariant *result)
892 GDBusMethodInvocation *invocation;
894 invocation = (GDBusMethodInvocation *)g_hash_table_lookup(req_table,
896 if (invocation == NULL) {
897 ERR("no such request id");
901 g_dbus_method_invocation_return_value(invocation, result);
902 g_hash_table_remove(req_table, (gpointer)req_key);
907 static const GDBusInterfaceVTable interface_vtable =
909 __handle_method_call,
914 static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
919 DBG("on bus acquired");
921 reg_id = g_dbus_connection_register_object(connection,
922 COMM_PKGMGR_DBUS_OBJECT_PATH,
923 instropection_data->interfaces[0],
924 &interface_vtable, NULL, NULL, &err);
927 ERR("failed to register object: %s", err->message);
932 static void __on_name_acquired(GDBusConnection *connection, const gchar *name,
935 DBG("on name acquired: %s", name);
938 static void __on_name_lost(GDBusConnection *connection, const gchar *name,
941 DBG("on name lost: %s", name);
944 int __init_request_handler(void)
946 instropection_data = g_dbus_node_info_new_for_xml(instropection_xml, NULL);
948 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, COMM_PKGMGR_DBUS_SERVICE,
949 G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
950 __on_name_acquired, __on_name_lost, NULL, NULL);
952 req_table = g_hash_table_new_full(g_str_hash, g_str_equal,
954 if (req_table == NULL)
960 void __fini_request_handler(void)
962 g_hash_table_destroy(req_table);
963 g_bus_unown_name(owner_id);
964 g_dbus_node_info_unref(instropection_data);