9 #include <package-manager.h>
10 #include <pkgmgr-info.h>
11 #include <appsvc/appsvc.h>
12 #include <eventsystem.h>
13 #include <bundle_internal.h>
16 #include <tzplatform_config.h>
17 #include <cert-svc/ccert.h>
18 #include <cert-svc/cinstance.h>
19 #include <cynara-client.h>
20 #include <cynara-creds-gdbus.h>
21 #include <cynara-session.h>
22 #include <security-manager.h>
24 #include "dbus_event_module.hh"
26 #define FREE_AND_NULL(ptr) do { \
33 int __esd_register_vconf_callbacks();
37 #include "introspection_cb.hh"
39 constexpr const char ESD_BOOT_COMPLETED[] = "/tmp/esd_ready";
40 constexpr const char SYSTEMD_DBUS_DEST[] = "org.freedesktop.systemd1";
41 constexpr const char SYSTEMD_DBUS_IFACE_MANAGER[] = "org.freedesktop.systemd1.Manager";
42 constexpr const char SYSTEMD_DBUS_PATH[] = "/org/freedesktop/systemd1";
43 constexpr const char SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED[] = "StartupFinished";
44 constexpr const char SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED[] = "UserSessionStartupFinished";
46 #define DEFAULT_USER tzplatform_getuid(TZ_SYS_DEFAULT_USER)
47 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
48 constexpr const int ROOT_USER = 0;
50 constexpr const char SYS_EVENT_NAME_PREFIX[] = "tizen.system.event";
51 constexpr const char SYS_EVENT_OBJ_PATH[] = "/tizen/system/event";
52 constexpr const char REQUEST_LAST_DATA[] = "request_last_data";
54 GHashTable *event_launch_table; /* table of events for launch_on_event*/
56 const char *event_launch_support_list[] = {
57 SYS_EVENT_BATTERY_CHARGER_STATUS,
59 SYS_EVENT_EARJACK_STATUS,
60 SYS_EVENT_INCOMMING_MSG,
61 SYS_EVENT_OUTGOING_MSG,
65 struct privilege_info {
66 const char *event_name;
67 const char *privilege_name;
70 const struct privilege_info privilege_check_list[] = {
71 {SYS_EVENT_DISPLAY_STATE, "http://tizen.org/privilege/display"},
72 {SYS_EVENT_WIFI_STATE, "http://tizen.org/privilege/network.get"},
73 {SYS_EVENT_INCOMMING_MSG, "http://tizen.org/privilege/message.read"},
74 {SYS_EVENT_OUTGOING_MSG, "http://tizen.org/privilege/message.read"}
77 int privilege_check_size = sizeof(privilege_check_list)/sizeof(struct privilege_info);
79 const char *earlier_event_list[] = {
82 SYS_EVENT_BOOT_COMPLETED,
83 SYS_EVENT_SYSTEM_SHUTDOWN,
84 SYS_EVENT_BATTERY_CHARGER_STATUS
87 GHashTable *earlier_event_table; /* table of events for earlier_data */
89 typedef struct __earlier_table_item {
92 bundle *earlier_data; /* event-data from earlier occurrence */
95 GHashTable *user_last_event_table; /* table of user events for last data */
97 struct __last_event_item {
105 GHashTable *trusted_busname_table; /* table of dbus bus-names for trusted user-event */
107 typedef struct __trusted_busname_item {
114 typedef struct __eventlaunch_item_param {
116 } eventlaunch_item_param_s;
118 enum trusted_result {
124 typedef struct esd_list_item {
131 typedef struct __event_launch_table_item {
133 char *package_name; /* just for passing pointer to app-list removal func */
134 GList *app_list_evtlaunch; /* app-list for on-event-launch */
139 enum __pkg_event_type {
146 typedef struct __pkgmgr_event {
151 typedef struct __esd_event_param {
161 typedef struct esd_info {
162 pkgmgr_client *client;
164 static esd_info_s s_info;
166 typedef struct __esd_appctrl_cb_data {
170 } esd_appctrl_cb_data;
172 void __esd_event_handler(char *event_name, bundle *data, void *user_data);
173 int __esd_add_appinfo_handler(const pkgmgrinfo_appinfo_h handle, void *data);
177 int __esd_init_cynara() {
180 ret = cynara_initialize(&r_cynara, NULL);
181 if (ret != CYNARA_API_SUCCESS) {
182 _E("cynara initialize failed.");
189 void __esd_finish_cynara() {
191 cynara_finish(r_cynara);
195 void free_saved_event(struct __last_event_item *item) {
199 free(item->event_name);
200 free(item->own_name);
205 int __esd_check_earlier_support(const char *event_name) {
207 int size = sizeof(earlier_event_list)/sizeof(*earlier_event_list);
209 for (i = 0; i < size; i++) {
210 if (strcmp(earlier_event_list[i], event_name) == 0)
217 bool __esd_check_platform_cert(const char *pkgid, uid_t uid) {
218 _D("Checking if %s has a platform certification", pkgid);
221 const char *cert_value;
222 pkgmgrinfo_certinfo_h certinfo;
223 CertSvcInstance instance;
224 CertSvcCertificate certificate;
225 CertSvcVisibility visibility = CERTSVC_VISIBILITY_PUBLIC;
227 r = pkgmgrinfo_pkginfo_create_certinfo(&certinfo);
228 if (r != PMINFO_R_OK) {
229 _E("Failed to create certinfo");
233 r = pkgmgrinfo_pkginfo_load_certinfo(pkgid, certinfo, uid);
234 if (r != PMINFO_R_OK) {
235 _E("Failed to load certinfo");
236 pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
240 r = pkgmgrinfo_pkginfo_get_cert_value(certinfo,
241 PMINFO_DISTRIBUTOR_ROOT_CERT, &cert_value);
242 if (r != PMINFO_R_OK || cert_value == NULL) {
243 _E("Failed to get cert value");
244 pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
248 r = certsvc_instance_new(&instance);
249 if (r != CERTSVC_SUCCESS) {
250 _E("certsvc_instance_new() is failed.");
251 pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
255 r = certsvc_certificate_new_from_memory(instance,
256 (const unsigned char *)cert_value,
258 CERTSVC_FORM_DER_BASE64,
260 if (r != CERTSVC_SUCCESS) {
261 _E("certsvc_certificate_new_from_memory() is failed.");
262 pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
263 certsvc_instance_free(instance);
267 r = certsvc_certificate_get_visibility(certificate, &visibility);
268 if (r != CERTSVC_SUCCESS)
269 _E("certsvc_certificate_get_visibility() is failed.");
271 pkgmgrinfo_pkginfo_destroy_certinfo(certinfo);
272 certsvc_certificate_free(certificate);
273 certsvc_instance_free(instance);
275 _D("visibility is %d", visibility);
276 if (visibility & CERTSVC_VISIBILITY_PLATFORM) {
277 _D("%s has a platform certification", pkgid);
284 int __esd_check_event_launch_support(const char *event_name) {
286 int size = sizeof(event_launch_support_list)/sizeof(*event_launch_support_list);
288 for (i = 0; i < size; i++) {
289 if (strcmp(event_launch_support_list[i], event_name) == 0)
296 int __get_sender_unixinfo(GDBusConnection *conn, const char *sender_name, const char *type) {
297 GDBusMessage *msg = NULL;
298 GDBusMessage *reply = NULL;
304 msg = g_dbus_message_new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus",
305 "org.freedesktop.DBus", type);
307 _E("Can't allocate new method call");
311 g_dbus_message_set_body(msg, g_variant_new("(s)", sender_name));
312 reply = g_dbus_connection_send_message_with_reply_sync(conn, msg,
313 G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &err);
317 _E("Failed to get info [%s]", err->message);
323 body = g_dbus_message_get_body(reply);
324 g_variant_get(body, "(u)", &value);
331 g_object_unref(reply);
336 int __get_sender_pid(GDBusConnection *conn, const char *sender_name) {
339 pid = __get_sender_unixinfo(conn, sender_name, "GetConnectionUnixProcessID");
341 _E("failed to get pid");
345 _D("sender_name(%s), pid(%d)", sender_name, pid);
350 int __get_sender_uid(GDBusConnection *conn, const char *sender_name) {
353 uid = __get_sender_unixinfo(conn, sender_name, "GetConnectionUnixUser");
355 _E("failed to get uid");
357 _D("sender_name(%s), uid(%d)", sender_name, uid);
362 int __esd_check_certificate_match(uid_t uid, const char *app_id, uid_t from_uid, const char *from_appid) {
363 pkgmgrinfo_cert_compare_result_type_e res;
366 _D("uid(%d), app_id(%s), from_uid(%d), from_appid(%s)", uid, app_id, from_uid, from_appid);
368 ret = pkgmgrinfo_pkginfo_compare_usr_app_cert_info(app_id, from_appid, from_uid, &res);
370 _E("failed to check certificate");
374 if (res != PMINFO_CERT_COMPARE_MATCH) {
375 _D("certificat not match (%s)", app_id);
382 bool __esd_check_application_validation(uid_t uid, const char *appid) {
384 pkgmgrinfo_appinfo_h handle;
386 ret = pkgmgrinfo_appinfo_get_usr_appinfo(appid, uid, &handle);
387 if (ret != PMINFO_R_OK)
390 pkgmgrinfo_appinfo_destroy_appinfo(handle);
392 if (!aul_app_is_running_for_uid(appid, uid))
398 void __esd_trusted_busname_print_items() {
403 g_hash_table_iter_init(&iter, trusted_busname_table);
405 while (g_hash_table_iter_next(&iter, &key, &value)) {
406 trusted_item *item = (trusted_item *)value;
408 _D("uid(%d), appid(%s), pid(%d), busname(%s)", item->uid, item->app_id, item->pid, item->bus_name);
412 int __esd_trusted_busname_add_item(uid_t uid, const char *appid, const char *busname, int pid) {
414 char *bus_name = NULL;
415 trusted_item *item = NULL;
416 trusted_item *new_item;
418 app_id = strdup(appid);
419 if (app_id == NULL) {
424 bus_name = strdup(busname);
425 if (bus_name == NULL) {
427 FREE_AND_NULL(app_id);
431 item = (trusted_item *)g_hash_table_lookup(trusted_busname_table, app_id);
433 if (item && item->bus_name && strcmp(item->bus_name, bus_name) == 0 &&
434 (item->uid == uid)) {
435 _D("already exist (%s, %s)", app_id, bus_name);
436 FREE_AND_NULL(app_id);
437 FREE_AND_NULL(bus_name);
439 new_item = (trusted_item *)calloc(1, sizeof(trusted_item));
440 if (new_item == NULL) {
441 _E("memory alloc failed");
442 FREE_AND_NULL(app_id);
443 FREE_AND_NULL(bus_name);
447 new_item->app_id = app_id;
448 new_item->bus_name = bus_name;
450 g_hash_table_insert(trusted_busname_table, new_item->app_id, new_item);
451 _D("added busname(%s)", new_item->bus_name);
457 int __esd_check_trusted_events(GDBusConnection *conn, const char *list_name) {
459 GError *error = NULL;
462 char tmp_appid[128] = {0, };
467 result = g_dbus_connection_call_sync(conn,
468 "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus",
469 list_name, NULL, G_VARIANT_TYPE("(as)"), G_DBUS_CALL_FLAGS_NONE,
472 if (result == NULL) {
473 _E("get (%s) error(%s)", list_name, error->message);
478 g_variant_get(result, "(as)", &iter);
479 while (g_variant_iter_loop(iter, "s", &str)) {
480 if (!strstr((const char *)str, "event.busname.session"))
483 _D("list(%s), name(%s)", list_name, str);
484 pid = __get_sender_pid(conn, (const char *)str);
486 _E("failed to get pid(%d)", pid);
490 uid = __get_sender_uid(conn, (const char *)str);
492 _E("failed to get uid(%d)", uid);
497 memset(tmp_appid, 0, sizeof(tmp_appid));
498 ret = aul_app_get_appid_bypid_for_uid(pid, tmp_appid, sizeof(tmp_appid), (uid_t)uid);
499 if (ret != AUL_R_OK) {
500 _E("failed to get appid by pid(%d)", pid);
504 _D("appid(%s)", tmp_appid);
505 if (__esd_check_application_validation((uid_t)uid, tmp_appid)) {
507 ret = __esd_trusted_busname_add_item((uid_t)uid, tmp_appid, (const char *)str, pid);
509 _E("failed to add item");
512 g_variant_iter_free(iter);
513 g_variant_unref(result);
518 int __esd_check_privilege_name(const char *event_name, char **privilege_name) {
521 *privilege_name = NULL;
523 for (i = 0; i < privilege_check_size; i++) {
524 if (strcmp(event_name, privilege_check_list[i].event_name) == 0) {
525 *privilege_name = (char *)privilege_check_list[i].privilege_name;
526 _D("[%d] privilege_name(%s)", i, *privilege_name);
534 bool __esd_check_valid_privilege_by_cynara(const char *appid, const char *client,
535 const char *session, const char *user, const char *privilege_name) {
537 bool has_privilege = false;
539 _D("check privilege, (%s, %s, %s, %s, %s)", appid, client, session, user, privilege_name);
541 ret = cynara_check(r_cynara, client, session, user, privilege_name);
542 if (ret == CYNARA_API_ACCESS_ALLOWED) {
543 _D("valid privilege");
544 has_privilege = true;
545 } else if (ret == CYNARA_API_ACCESS_DENIED) {
546 _E("invalid privilege");
548 _E("failed to check privilege, error(%d)", ret);
551 return has_privilege;
554 int __esd_check_app_privileged_event(uid_t uid, const char *appid, const char *pkgid, const char *event_name) {
555 char *privilege_name = NULL;
559 _D("event_name(%s), uid(%d), appid(%s), pkgid(%s)", event_name, uid, appid, pkgid);
561 __esd_check_privilege_name(event_name, &privilege_name);
563 if (privilege_name) {
564 ret = security_manager_app_has_privilege(appid, privilege_name, uid, &result);
565 if (ret != SECURITY_MANAGER_SUCCESS)
566 _E("failed to check privilege(%d)", ret);
567 _D("result(%d)", result);
575 void __esd_print_appid_with_eventid(gpointer data, gpointer user_data) {
576 esd_list_item_s *item = (esd_list_item_s *)data;
577 char *event_name = (char *)user_data;
579 _D("event_name(%s)-uid(%d)-app_id(%s)-pkg_id(%s)", event_name, item->uid, item->app_id, item->pkg_id);
582 void __esd_print_interested_event(gpointer data, gpointer user_data) {
583 event_launch_item *el_item = (event_launch_item *)data;
584 char *event_name = (char *)el_item->event_name;
585 _D("event_name = (%s)", event_name);
586 g_list_foreach(el_item->app_list_evtlaunch, __esd_print_appid_with_eventid, event_name);
589 void __esd_launch_table_print_items() {
594 g_hash_table_iter_init(&iter, event_launch_table);
596 while (g_hash_table_iter_next(&iter, &key, &value))
597 __esd_print_interested_event(value, NULL);
600 int __esd_find_compare_by_list_item(gconstpointer data, gconstpointer user_data) {
601 esd_list_item_s *item_1 = (esd_list_item_s *)user_data;
602 esd_list_item_s *item_2 = (esd_list_item_s *)data;
604 return (item_1->uid != item_2->uid) |
605 strcmp(item_1->app_id, item_2->app_id) |
606 strcmp(item_1->pkg_id, item_2->pkg_id);
609 int __esd_add_list_item(uid_t uid, event_launch_item *el_item,
610 const char *app_id, const char *pkg_id) {
611 esd_list_item_s *item_of_list = NULL;
613 item_of_list = (esd_list_item_s *)calloc(1, sizeof(esd_list_item_s));
614 if (item_of_list == NULL) {
618 item_of_list->uid = uid;
619 item_of_list->app_id = (char *)app_id;
620 item_of_list->pkg_id = (char *)pkg_id;
621 item_of_list->trusted_info = TRUSTED_UNKNOWN;
622 el_item->app_list_evtlaunch =
623 g_list_append(el_item->app_list_evtlaunch, item_of_list);
628 int __esd_add_launch_item(uid_t uid, const char *event_name,
629 const char *appid, const char *pkgid) {
630 GList *app_list = NULL;
631 guint subscription_id = 0;
634 esd_list_item_s *item_of_list = NULL;
635 event_launch_item *eli;
636 event_launch_item *el_item =
637 (event_launch_item *)g_hash_table_lookup(event_launch_table, event_name);
640 item_of_list = (esd_list_item_s *)calloc(1, sizeof(esd_list_item_s));
641 if (item_of_list == NULL) {
642 _E("memory alloc failed");
645 item_of_list->uid = uid;
646 item_of_list->app_id = (char *)appid;
647 item_of_list->pkg_id = (char *)pkgid;
649 app_list = g_list_find_custom(el_item->app_list_evtlaunch,
650 item_of_list, (GCompareFunc)__esd_find_compare_by_list_item);
652 if (app_list == NULL) {
653 _D("add new item (list item only)");
654 app_id = strdup((char *)appid);
659 pkg_id = strdup((char *)pkgid);
662 FREE_AND_NULL(app_id);
665 if (__esd_add_list_item(uid, el_item, app_id, pkg_id) < 0) {
666 _E("failed to add list item");
667 FREE_AND_NULL(app_id);
668 FREE_AND_NULL(pkg_id);
673 _D("add new item (all)");
674 eli = (event_launch_item *)calloc(1, sizeof(event_launch_item));
676 _E("memory alloc failed");
680 eli->event_name = strdup(event_name);
681 if (!eli->event_name) {
687 app_id = strdup((char *)appid);
690 FREE_AND_NULL(eli->event_name);
695 pkg_id = strdup((char *)pkgid);
698 FREE_AND_NULL(app_id);
699 FREE_AND_NULL(eli->event_name);
704 if (__esd_add_list_item(uid, eli, app_id, pkg_id) < 0) {
705 _E("failed to add list item");
706 FREE_AND_NULL(app_id);
707 FREE_AND_NULL(pkg_id);
708 FREE_AND_NULL(eli->event_name);
713 g_hash_table_insert(event_launch_table, eli->event_name, eli);
715 eventsystem_register_event(eli->event_name, &subscription_id,
716 (eventsystem_handler)__esd_event_handler, NULL);
717 if (subscription_id == 0) {
718 _E("signal subscription error, event_name(%s), app_id(%s)",
719 eli->event_name, app_id);
722 eli->reg_id = subscription_id;
729 void __esd_remove_all_private_usr_app_list(gpointer data, gpointer user_data) {
730 esd_list_item_s *item = (esd_list_item_s *)data;
731 event_launch_item *eli = (event_launch_item *)user_data;
733 if (item->uid != GLOBAL_USER && !strcmp(eli->package_name, item->pkg_id)) {
734 _D("uid(%d), app_id(%s), pkg_id(%s)", item->uid, item->app_id, eli->package_name);
735 eli->app_list_evtlaunch = g_list_remove_all(eli->app_list_evtlaunch, data);
739 int __esd_launch_table_remove_private_usr_items() {
743 event_launch_item *eli = NULL;
744 GList *first_list = NULL;
746 g_hash_table_iter_init(&iter, event_launch_table);
748 while (g_hash_table_iter_next(&iter, &key, &value)) {
749 eli = (event_launch_item *)value;
750 g_list_foreach(eli->app_list_evtlaunch, __esd_remove_all_private_usr_app_list, eli);
752 first_list = g_list_first(eli->app_list_evtlaunch);
753 if (first_list == NULL) {
755 eventsystem_unregister_event(eli->reg_id);
757 g_hash_table_iter_remove(&iter);
764 void __esd_remove_app_list(gpointer data, gpointer user_data) {
766 esd_list_item_s *item = (esd_list_item_s *)data;
767 event_launch_item *eli = (event_launch_item *)user_data;
769 if (eli->uid != GLOBAL_USER && eli->uid != item->uid)
772 if (!skip && !strcmp(eli->package_name, item->pkg_id)) {
773 _D("pkg_id(%s), app_id(%s)", eli->package_name, item->app_id);
774 eli->app_list_evtlaunch =
775 g_list_remove_all(eli->app_list_evtlaunch, data);
779 int __esd_remove_launch_item(uid_t uid, gpointer data, const char *pkg_id) {
780 event_launch_item *eli = (event_launch_item *)data;
781 GList *first_list = NULL;
784 eli->package_name = (char *)pkg_id;
785 g_list_foreach(eli->app_list_evtlaunch, __esd_remove_app_list, eli);
787 first_list = g_list_first(eli->app_list_evtlaunch);
788 if (first_list == NULL) {
790 eventsystem_unregister_event(eli->reg_id);
798 int __esd_launch_table_remove_items(uid_t uid, const char *pkg_id) {
803 g_hash_table_iter_init(&iter, event_launch_table);
805 while (g_hash_table_iter_next(&iter, &key, &value)) {
806 if (__esd_remove_launch_item(uid, value, pkg_id) == ES_R_REMOVE) {
807 _D("remove item itself");
808 g_hash_table_iter_remove(&iter);
815 void __esd_event_launch_with_appid(gpointer data, gpointer user_data) {
816 esd_list_item_s *item = (esd_list_item_s *)data;
817 uid_t uid = item->uid;
818 char *app_id = item->app_id;
819 esd_event_param *eep = (esd_event_param *)user_data;
820 static unsigned int req_id;
822 char event_uri[1024];
826 _D("launch_on_event: app_id(%s), event_name(%s), uid(%d), is_user(%d), trusted(%d)",
827 app_id, eep->event_name, uid, eep->is_user_event, eep->trusted);
829 if (eep->is_user_event && eep->trusted) {
830 if (item->trusted_info == TRUSTED_UNKNOWN) {
831 ret = __esd_check_certificate_match(uid, app_id, eep->sender_uid, eep->sender_appid);
832 if (ret == ES_R_EINVAL) {
833 item->trusted_info = TRUSTED_DENIED;
835 } else if (ret == ES_R_ERROR) {
838 item->trusted_info = TRUSTED_ALLOWED;
840 } else if (item->trusted_info == TRUSTED_DENIED) {
845 if (!aul_app_is_running_for_uid(app_id, uid)) {
846 b = bundle_dup(eep->event_data);
847 if (eep->is_user_event)
848 snprintf(event_uri, sizeof(event_uri), "%s%s", USER_EVENT_NAME_PREFIX, eep->event_name);
850 snprintf(event_uri, sizeof(event_uri), "%s%s", SYSTEM_EVENT_NAME_PREFIX, eep->event_name);
852 appsvc_set_operation(b, APPSVC_OPERATION_LAUNCH_ON_EVENT);
853 appsvc_set_uri(b, event_uri);
854 appsvc_set_appid(b, app_id);
856 pid = aul_svc_run_service_async_for_uid(b, req_id++, NULL, eep->user_data, uid);
857 _D("uid(%d), pid(%d)", uid, pid);
861 _D("already is running or launch failed");
865 void __esd_check_event_launch_with_eventid(gpointer data, gpointer user_data) {
866 event_launch_item *el_item = (event_launch_item *)data;
867 esd_event_param *eep = (esd_event_param *)user_data;
869 if (strcmp(eep->event_name, (char *)el_item->event_name) == 0) {
870 g_list_foreach(el_item->app_list_evtlaunch,
871 __esd_event_launch_with_appid, user_data);
875 void __esd_launch_event_handler(char *event_name, bundle *data,
876 const bool is_user_event, gboolean trusted,
877 const uid_t sender_uid, char *sender_appid, void *user_data) {
879 const char *msg_type;
881 esd_event_param *eep;
882 event_launch_item *el_item;
884 _D("event_name(%s)", event_name);
886 el_item = (event_launch_item *)g_hash_table_lookup(event_launch_table, event_name);
890 if (el_item->app_list_evtlaunch != NULL) {
891 if (is_user_event == false) {
892 if (strcmp(SYS_EVENT_BATTERY_CHARGER_STATUS, event_name) == 0) {
893 val = bundle_get_val(data, EVT_KEY_BATTERY_CHARGER_STATUS);
894 _D("charger val(%s)", val);
895 if (val && (strcmp(EVT_VAL_BATTERY_CHARGER_CONNECTED, val) != 0))
897 } else if (strcmp(SYS_EVENT_USB_STATUS, event_name) == 0) {
898 val = bundle_get_val(data, EVT_KEY_USB_STATUS);
899 _D("usb val(%s)", val);
900 if (val && (strcmp(EVT_VAL_USB_CONNECTED, val) != 0))
902 } else if (strcmp(SYS_EVENT_EARJACK_STATUS, event_name) == 0) {
903 val = bundle_get_val(data, EVT_KEY_EARJACK_STATUS);
904 _D("earjack val(%s)", val);
905 if (val && (strcmp(EVT_VAL_EARJACK_CONNECTED, val) != 0))
907 } else if (strcmp(SYS_EVENT_INCOMMING_MSG, event_name) == 0) {
908 msg_type = bundle_get_val(data, EVT_KEY_MSG_TYPE);
909 _D("msg_type(%s)", msg_type);
910 if (msg_type == NULL)
913 msg_id = bundle_get_val(data, EVT_KEY_MSG_ID);
914 _D("msg_id(%s)", msg_id);
917 } else if (strcmp(SYS_EVENT_WIFI_STATE, event_name) == 0) {
918 val = bundle_get_val(data, EVT_KEY_WIFI_STATE);
921 _D("wifi_state(%s)", val);
922 if (strcmp(EVT_VAL_WIFI_CONNECTED, val) != 0)
927 eep = (esd_event_param *)calloc(1, sizeof(esd_event_param));
929 _E("memory alloc failed");
932 eep->event_name = event_name;
933 eep->event_data = data;
934 eep->sender_uid = sender_uid;
935 eep->sender_appid = sender_appid;
936 eep->is_user_event = is_user_event;
937 eep->trusted = (bool)trusted;
938 eep->user_data = (void *)user_data;
939 __esd_check_event_launch_with_eventid(el_item, eep);
944 void __esd_print_earlier_event(gpointer data, gpointer user_data) {
945 earlier_item *item = (earlier_item *)data;
946 char *event_name = (char *)item->event_name;
949 _D("event_name = (%s)", event_name);
951 if (strcmp(event_name, SYS_EVENT_BOOT_COMPLETED) == 0) {
952 if (item->earlier_data) {
953 val = bundle_get_val(item->earlier_data, EVT_KEY_BOOT_COMPLETED);
954 _D("boot_completed(%s)", val);
956 } else if (strcmp(event_name, SYS_EVENT_SYSTEM_SHUTDOWN) == 0) {
957 if (item->earlier_data) {
958 val = bundle_get_val(item->earlier_data, EVT_KEY_SYSTEM_SHUTDOWN);
959 _D("shutdown(%s)", val);
961 } else if (strcmp(event_name, SYS_EVENT_LOW_MEMORY) == 0) {
962 if (item->earlier_data) {
963 val = bundle_get_val(item->earlier_data, EVT_KEY_LOW_MEMORY);
964 _D("low_memory(%s)", val);
966 } else if (strcmp(event_name, SYS_EVENT_BATTERY_CHARGER_STATUS) == 0) {
967 if (item->earlier_data) {
968 val = bundle_get_val(item->earlier_data, EVT_KEY_BATTERY_CHARGER_STATUS);
969 _D("charger_status(%s)", val);
974 void __esd_earlier_table_print_items() {
979 g_hash_table_iter_init(&iter, earlier_event_table);
981 while (g_hash_table_iter_next(&iter, &key, &value))
982 __esd_print_earlier_event(value, NULL);
985 void __esd_earlier_event_handler(char *event_name, bundle *data, void *user_data) {
987 _D("event_name(%s)", event_name);
989 item = (earlier_item *)g_hash_table_lookup(earlier_event_table, event_name);
991 /* update earlier value */
992 if (item->earlier_data != NULL)
993 bundle_free(item->earlier_data);
995 item->earlier_data = bundle_dup(data);
999 void __esd_event_handler(char *event_name, bundle *data, void *user_data) {
1000 _D("event_name(%s)", event_name);
1002 if (__esd_check_earlier_support(event_name))
1003 __esd_earlier_event_handler(event_name, data, user_data);
1005 if (__esd_check_event_launch_support(event_name))
1006 __esd_launch_event_handler(event_name, data,
1007 false, TRUE, ROOT_USER, NULL, user_data);
1010 void __esd_trusted_busname_remove_item(char *bus_name) {
1011 GHashTableIter iter;
1016 g_hash_table_iter_init(&iter, trusted_busname_table);
1018 while (g_hash_table_iter_next(&iter, &key, &value)) {
1019 item = (trusted_item *)value;
1021 if (strcmp(bus_name, item->bus_name) == 0) {
1022 _D("remove trusted busname item(%s, %s)", item->app_id, item->bus_name);
1023 FREE_AND_NULL(item->app_id);
1024 FREE_AND_NULL(item->bus_name);
1025 FREE_AND_NULL(item);
1026 g_hash_table_iter_remove(&iter);
1028 __esd_trusted_busname_print_items();
1034 void __esd_filter_name_owner_changed(GDBusConnection *connection,
1035 const gchar *sender_name, const gchar *object_path,
1036 const gchar *interface_name, const gchar *signal_name,
1037 GVariant *parameters, gpointer user_data) {
1039 char *old_owner = NULL;
1040 char *new_owner = NULL;
1044 g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
1046 if (strstr(name, "event.busname.session")) {
1047 old_len = strlen(old_owner);
1048 new_len = strlen(new_owner);
1050 _D("changed name(%s), old_onwer(%s)(%d) -> new_onwer(%s)(%d)",
1051 name, old_owner, old_len, new_owner, new_len);
1053 if (old_len > 0 && new_len == 0)
1054 __esd_trusted_busname_remove_item(name);
1055 else if (old_len == 0 && new_len > 0)
1056 _D("new name owned");
1058 _E("not-expected name change");
1062 int __esd_dbus_name_monitor(GDBusConnection *connection) {
1063 guint name_owner_changed_id = 0;
1065 name_owner_changed_id = g_dbus_connection_signal_subscribe(connection,
1066 "org.freedesktop.DBus", "org.freedesktop.DBus",
1067 "NameOwnerChanged", "/org/freedesktop/DBus", NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1068 __esd_filter_name_owner_changed, NULL, NULL);
1070 _I("name_owner_changed_id(%d)", name_owner_changed_id);
1075 int __esd_get_user_items(uid_t uid) {
1077 pkgmgrinfo_appinfo_filter_h handle = NULL;
1079 _I("get user items for uid(%d)", uid);
1080 /* reset user's item */
1081 __esd_launch_table_remove_private_usr_items();
1083 ret = pkgmgrinfo_appinfo_filter_create(&handle);
1085 _E("failed to create appinfo filter");
1088 ret = pkgmgrinfo_appinfo_filter_add_string(handle,
1089 PMINFO_APPINFO_PROP_APP_COMPONENT, "svcapp");
1091 _E("failed to add appinfo filter string");
1092 pkgmgrinfo_appinfo_filter_destroy(handle);
1095 ret = pkgmgrinfo_appinfo_filter_add_string(handle,
1096 PMINFO_APPINFO_PROP_APP_OPERATION, APPSVC_OPERATION_LAUNCH_ON_EVENT);
1098 _E("failed to add appinfo filter string");
1099 pkgmgrinfo_appinfo_filter_destroy(handle);
1102 ret = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(handle,
1103 __esd_add_appinfo_handler, &uid, uid);
1105 _E("appinfo filter foreach error");
1106 pkgmgrinfo_appinfo_filter_destroy(handle);
1109 pkgmgrinfo_appinfo_filter_destroy(handle);
1111 __esd_launch_table_print_items();
1116 void __esd_signal_handler(GDBusConnection *connection,
1117 const gchar *sender_name,
1118 const gchar *object_path,
1119 const gchar *interface_name,
1120 const gchar *signal_name,
1121 GVariant *parameters,
1122 gpointer user_data) {
1127 if (!g_strcmp0(signal_name,
1128 SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED)) {
1129 _I("System session finished");
1131 b = bundle_create();
1132 bundle_add_str(b, EVT_KEY_BOOT_COMPLETED,
1133 EVT_VAL_BOOT_COMPLETED_TRUE);
1134 eventsystem_send_system_event(SYS_EVENT_BOOT_COMPLETED, b);
1137 handle = creat(ESD_BOOT_COMPLETED, 0640);
1140 } else if (!g_strcmp0(signal_name,
1141 SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED)) {
1142 g_variant_get(parameters, "(t)", &uid);
1143 _I("User session finished uid : %d", (int)uid);
1144 if ((uid_t)uid != DEFAULT_USER)
1145 __esd_get_user_items((uid_t)uid);
1149 static GDBusNodeInfo *introspection_data;
1151 int __esd_get_appid_by_pid_for_uid(int pid, uid_t uid, char *app_id, int buf_size) {
1152 int retval = ES_R_OK;
1156 _E("invalid pid(%d)", pid);
1157 retval = ES_R_ERROR;
1158 } else if (uid <= 0) {
1159 _E("invalid uid(%d)", uid);
1160 retval = ES_R_ERROR;
1162 ret = aul_app_get_appid_bypid_for_uid(pid, app_id, buf_size, (uid_t)uid);
1163 if (ret != AUL_R_OK) {
1164 _E("failed to get appid by pid");
1165 retval = ES_R_ERROR;
1167 _D("pid(%d)-uid(%d)-appid(%s)", pid, uid, app_id);
1173 int __esd_get_appid_by_pid(int pid, char *app_id, int buf_size) {
1176 char buf[128] = { 0, };
1178 ret = aul_app_get_appid_bypid(pid, app_id, buf_size);
1179 if (ret != AUL_R_OK) {
1180 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
1182 fd = open(buf, O_RDONLY);
1186 ret = read(fd, app_id, buf_size - 1);
1199 int check_user_event_sender_valid(const char *event_name, const char *app_id) {
1200 char *valid_name = NULL;
1201 char *temp_name = NULL;
1203 int retval = ES_R_OK;
1205 int valid_name_len = 0;
1207 temp_name = strdup(event_name);
1208 if (temp_name == NULL) {
1209 _E("out of memory");
1213 tmp = strrchr(temp_name, '.');
1214 if (tmp == NULL || strlen(tmp) == 0) {
1215 _E("invalid event name");
1216 FREE_AND_NULL(temp_name);
1220 if (len <= 1 || len > 128) {
1221 _E("invalid length(%d) of user-defined name", len);
1222 FREE_AND_NULL(temp_name);
1227 _D("app_id(%s), len(%zu)", app_id, strlen(app_id));
1229 valid_name_len = strlen(USER_EVENT_NAME_PREFIX) + strlen(app_id) + 1;
1230 valid_name = (char *)calloc(1, valid_name_len);
1231 if (valid_name == NULL) {
1232 _E("memory alloc failed");
1233 FREE_AND_NULL(temp_name);
1236 snprintf(valid_name, valid_name_len, "%s%s", USER_EVENT_NAME_PREFIX, app_id);
1237 _D("valid_name(%s)", valid_name);
1239 if (strcmp(temp_name, valid_name) != 0) {
1240 _E("appid misamatch");
1241 retval = ES_R_EINVAL;
1244 FREE_AND_NULL(temp_name);
1245 FREE_AND_NULL(valid_name);
1250 static const GDBusInterfaceVTable interface_vtable = {
1251 esd::module::DbusEventModule::HandleMethodCallCb,
1256 void __esd_on_bus_acquired(GDBusConnection *connection,
1257 const gchar *name, gpointer user_data) {
1258 _I("bus acquired(%s)", name);
1262 guint user_boot_id = 0;
1263 GError *error = NULL;
1265 reg_id = g_dbus_connection_register_object(connection,
1267 introspection_data->interfaces[0],
1269 user_data, NULL, &error);
1271 _E("g_dbus_connection_register_object error(%s)", error->message);
1272 g_error_free(error);
1275 boot_id = g_dbus_connection_signal_subscribe(connection,
1277 SYSTEMD_DBUS_IFACE_MANAGER,
1278 SYSTEMD_DBUS_SIGNAL_STARTUP_FINISHED,
1281 G_DBUS_SIGNAL_FLAGS_NONE,
1282 __esd_signal_handler,
1287 _E("g_dbus_connection_signal_subscribe() is failed.");
1289 user_boot_id = g_dbus_connection_signal_subscribe(connection,
1291 SYSTEMD_DBUS_IFACE_MANAGER,
1292 SYSTEMD_DBUS_SIGNAL_USER_STARTUP_FINISHED,
1295 G_DBUS_SIGNAL_FLAGS_NONE,
1296 __esd_signal_handler,
1300 if (user_boot_id == 0)
1301 _E("g_dbus_connection_signal_subscribe() is failed.");
1304 void __esd_on_name_acquired(GDBusConnection *connection,
1305 const gchar *name, gpointer user_data) {
1308 __esd_check_trusted_events(connection, "ListNames");
1309 __esd_check_trusted_events(connection, "ListActivatableNames");
1311 b = bundle_create();
1312 bundle_add_str(b, EVT_KEY_ESD_STATUS, EVT_VAL_ESD_STARTED);
1313 eventsystem_send_system_event(SYS_EVENT_ESD_STATUS, b);
1316 __esd_register_vconf_callbacks();
1318 __esd_trusted_busname_print_items();
1320 __esd_get_user_items(DEFAULT_USER);
1322 __esd_dbus_name_monitor(connection);
1325 void __esd_on_name_lost(GDBusConnection *connection,
1326 const gchar *name, gpointer user_data) {
1329 void __esd_pkgmgr_event_free(esd_pkgmgr_event *pkg_event) {
1330 pkg_event->type = UNKNOWN;
1331 if (pkg_event->pkgid) {
1332 free(pkg_event->pkgid);
1333 pkg_event->pkgid = NULL;
1337 int __esd_appcontrol_cb(const char *operation,
1338 const char *uri, const char *mime, void *data) {
1339 esd_appctrl_cb_data *cb_data = (esd_appctrl_cb_data *)data;
1342 char *event_name = NULL;
1345 if (cb_data == NULL) {
1349 appid = cb_data->appid;
1350 pkgid = cb_data->pkgid;
1353 _D("uid(%d), appid(%s), pkgid(%s), operation(%s), uri(%s), mime(%s)",
1354 uid, appid, pkgid, operation, uri, mime);
1356 if (!strcmp(operation, APPSVC_OPERATION_LAUNCH_ON_EVENT)) {
1357 if (uri && !strncmp(uri, SYSTEM_EVENT_NAME_PREFIX, strlen(SYSTEM_EVENT_NAME_PREFIX))) {
1358 event_name = strdup(&uri[8]);
1360 _D("appid(%s), event_name(%s)", appid, event_name);
1361 if (!__esd_check_event_launch_support(event_name))
1362 _E("failed to add item (not support event)");
1363 else if (!__esd_check_app_privileged_event(uid, appid, pkgid, event_name))
1364 _E("failed to add item (no privilege)");
1365 else if (__esd_add_launch_item(uid, event_name, appid, pkgid))
1366 _E("failed to add item");
1369 _E("out of memory");
1371 } else if (uri && !strncmp(uri, USER_EVENT_NAME_PREFIX, strlen(USER_EVENT_NAME_PREFIX))) {
1372 event_name = strdup(uri);
1374 _D("appid(%s), event_name(%s)", appid, event_name);
1375 if (__esd_check_platform_cert(pkgid, uid)) {
1376 if (__esd_add_launch_item(uid, event_name, appid, pkgid))
1377 _E("failed to add item");
1380 _E("out of memory");
1383 FREE_AND_NULL(event_name);
1389 int __esd_add_appinfo_handler(const pkgmgrinfo_appinfo_h handle, void *data) {
1393 uid_t *p_uid = NULL;
1400 p_uid = (uid_t *)data;
1402 ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
1404 _E("failed to get appid");
1408 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
1410 _E("failed to get appid");
1414 esd_appctrl_cb_data *cb_data = (esd_appctrl_cb_data *)calloc(1, sizeof(esd_appctrl_cb_data));
1416 if (cb_data == NULL) {
1417 _E("memory alloc failed");
1420 cb_data->appid = strdup(appid);
1421 if (cb_data->appid == NULL) {
1422 _E("out_of_memory");
1423 FREE_AND_NULL(cb_data);
1426 cb_data->pkgid = strdup(pkgid);
1427 if (cb_data->pkgid == NULL) {
1428 _E("out_of_memory");
1429 FREE_AND_NULL(cb_data->appid);
1430 FREE_AND_NULL(cb_data);
1433 cb_data->uid = *p_uid;
1435 ret = pkgmgrinfo_appinfo_foreach_appcontrol(handle,
1436 (pkgmgrinfo_app_control_list_cb)__esd_appcontrol_cb, cb_data);
1438 FREE_AND_NULL(cb_data->pkgid);
1439 FREE_AND_NULL(cb_data->appid);
1440 FREE_AND_NULL(cb_data);
1443 _E("failed to get appcontrol info");
1450 int __esd_pkgmgr_event_callback(uid_t target_uid, int req_id,
1451 const char *pkg_type, const char *pkgid, const char *key,
1452 const char *val, const void *pmsg, void *data) {
1453 esd_pkgmgr_event *pkg_event = (esd_pkgmgr_event *)data;
1454 pkgmgrinfo_pkginfo_h handle = NULL;
1457 _D("target_uid(%d), req_id(%d), pkg_type(%s), pkgid(%s), key(%s), val(%s)",
1458 target_uid, req_id, pkg_type, pkgid, key, val);
1460 if (strncmp(key, "start", strlen(key)) == 0) {
1461 if (strcmp(val, "install") == 0) {
1462 _D("install start");
1463 pkg_event->type = INSTALL;
1464 } else if (strcmp(val, "uninstall") == 0) {
1465 _D("unistall start");
1466 pkg_event->type = UNINSTALL;
1467 } else if (strcmp(val, "update") == 0) {
1469 pkg_event->type = UPDATE;
1471 _D("val(%s) start", val);
1472 __esd_pkgmgr_event_free(pkg_event);
1474 } else if (strcmp(key, "end") == 0 && strcmp(val, "ok") == 0) {
1475 if (pkg_event->type == INSTALL || pkg_event->type == UPDATE) {
1476 _D("install end (ok)");
1477 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, target_uid, &handle);
1479 _E("failed to get pkginfo");
1480 __esd_pkgmgr_event_free(pkg_event);
1483 ret = pkgmgrinfo_appinfo_get_usr_list(handle,
1484 PMINFO_SVC_APP, __esd_add_appinfo_handler, &target_uid, target_uid);
1486 _E("failed to get appinfo");
1487 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1488 __esd_pkgmgr_event_free(pkg_event);
1491 ret = pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1493 _E("failed to destroy pkginfo");
1494 __esd_pkgmgr_event_free(pkg_event);
1497 } else if (pkg_event->type == UNINSTALL) {
1498 _D("uninstall end (ok)");
1499 __esd_launch_table_remove_items(target_uid, pkgid);
1500 __esd_launch_table_print_items();
1502 __esd_pkgmgr_event_free(pkg_event);
1503 } else if (strcmp(key, "end") == 0 && strcmp(val, "fail") == 0) {
1504 _E("pkg_event(%d) falied", pkg_event->type);
1505 __esd_pkgmgr_event_free(pkg_event);
1507 if (strcmp(key, "install_percent") != 0)
1508 __esd_pkgmgr_event_free(pkg_event);
1514 void __esd_remove_esd_list_item(gpointer data, gpointer user_data) {
1515 esd_list_item_s *item = (esd_list_item_s *)data;
1523 namespace esd::module {
1525 bool DbusEventModule::Startup(api::ToolBox* tools) {
1529 return BeforeLoop();
1532 void DbusEventModule::Shutdown() {
1536 bool DbusEventModule::Init() {
1539 pkgmgr_client *client;
1540 esd_pkgmgr_event *pkg_event;
1542 __esd_init_cynara();
1544 client = pkgmgr_client_new(PC_LISTENING);
1545 if (client == NULL) {
1546 _E("set pkgmgr client failed");
1547 __esd_finish_cynara();
1551 pkg_event = (esd_pkgmgr_event *)calloc(1, sizeof(esd_pkgmgr_event));
1552 if (pkg_event == NULL) {
1553 _E("memory alloc failed");
1554 ret = pkgmgr_client_free(client);
1555 if (ret != PKGMGR_R_OK)
1556 _E("pkgmgr_client_free failed(%d)", ret);
1557 __esd_finish_cynara();
1561 req_id = pkgmgr_client_listen_status(client, __esd_pkgmgr_event_callback, pkg_event);
1563 _E("pkgmgr client listen failed");
1564 ret = pkgmgr_client_free(client);
1565 if (ret != PKGMGR_R_OK)
1566 _E("pkgmgr_client_free failed(%d)", ret);
1568 __esd_finish_cynara();
1572 s_info.client = client;
1574 _I("esd init done");
1579 void DbusEventModule::Fini() {
1582 GHashTableIter iter;
1584 event_launch_item *el_item;
1586 earlier_item *er_item;
1590 if (trusted_busname_table) {
1591 g_hash_table_iter_init(&iter, trusted_busname_table);
1592 while (g_hash_table_iter_next(&iter, &key, &value)) {
1593 item = (trusted_item *)value;
1596 free(item->bus_name);
1601 g_hash_table_iter_remove(&iter);
1603 g_hash_table_unref(trusted_busname_table);
1606 if (earlier_event_table) {
1607 g_hash_table_iter_init(&iter, earlier_event_table);
1608 while (g_hash_table_iter_next(&iter, &key, &value)) {
1609 er_item = (earlier_item *)value;
1611 eventsystem_unregister_event(er_item->reg_id);
1612 free(er_item->event_name);
1613 bundle_free(er_item->earlier_data);
1616 _E("ealier item is NULL");
1618 g_hash_table_iter_remove(&iter);
1620 g_hash_table_unref(earlier_event_table);
1623 g_hash_table_destroy(user_last_event_table);
1625 if (event_launch_table) {
1626 g_hash_table_iter_init(&iter, event_launch_table);
1627 while (g_hash_table_iter_next(&iter, &key, &value)) {
1628 el_item = (event_launch_item *)value;
1630 eventsystem_unregister_event(el_item->reg_id);
1631 free(el_item->event_name);
1632 g_list_foreach(el_item->app_list_evtlaunch,
1633 __esd_remove_esd_list_item, NULL);
1634 g_list_free(el_item->app_list_evtlaunch);
1639 g_hash_table_iter_remove(&iter);
1641 g_hash_table_unref(event_launch_table);
1644 if (introspection_data)
1645 g_dbus_node_info_unref(introspection_data);
1647 if (s_info.client) {
1648 ret = pkgmgr_client_free(s_info.client);
1649 if (ret != PKGMGR_R_OK)
1650 _E("pkgmgr_client_free failed(%d)", ret);
1653 __esd_finish_cynara();
1655 _D("esd finalize end");
1658 bool DbusEventModule::BeforeLoop() {
1660 GError *error = NULL;
1663 guint subscription_id = 0;
1674 earlier_event_table = g_hash_table_new(g_str_hash, g_str_equal);
1675 user_last_event_table = g_hash_table_new_full(g_str_hash,
1676 g_str_equal, NULL, (GDestroyNotify)free_saved_event);
1678 _I("register events for earlier_data");
1679 size = sizeof(earlier_event_list)/sizeof(*earlier_event_list);
1680 for (i = 0; i < size; i++) {
1681 event_name = (char *)earlier_event_list[i];
1682 _I("event_name(%s)", event_name);
1684 item = (earlier_item *)calloc(1, sizeof(earlier_item));
1686 _E("memery alloc failed");
1689 item->event_name = strdup(event_name);
1690 if (item->event_name == NULL) {
1691 _E("out of memory");
1696 /* set initial data */
1697 if (strcmp(event_name, SYS_EVENT_BOOT_COMPLETED) == 0) {
1698 fd = open(ESD_BOOT_COMPLETED, O_RDONLY);
1700 _D("open file error(%d)", fd);
1702 item->earlier_data = bundle_create();
1703 bundle_add_str(item->earlier_data, EVT_KEY_BOOT_COMPLETED,
1704 EVT_VAL_BOOT_COMPLETED_TRUE);
1707 } else if (strcmp(event_name, SYS_EVENT_SYSTEM_SHUTDOWN) == 0) {
1708 ret = vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val);
1709 if (ret != VCONF_OK) {
1710 _E("failed to get power_off status (%d)", ret);
1712 if (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT ||
1713 val == VCONFKEY_SYSMAN_POWER_OFF_RESTART) {
1714 /* power-off requested */
1715 item->earlier_data = bundle_create();
1716 bundle_add_str(item->earlier_data, EVT_KEY_SYSTEM_SHUTDOWN,
1717 EVT_VAL_SYSTEM_SHUTDOWN_TRUE);
1720 } else if (strcmp(event_name, SYS_EVENT_LOW_MEMORY) == 0) {
1721 ret = vconf_get_int(VCONFKEY_SYSMAN_LOW_MEMORY, &status);
1722 if (ret != VCONF_OK) {
1723 _E("failed to get low_memory status (%d)", ret);
1725 item->earlier_data = bundle_create();
1726 if (status == VCONFKEY_SYSMAN_LOW_MEMORY_SOFT_WARNING)
1727 bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
1728 EVT_VAL_MEMORY_SOFT_WARNING);
1729 else if (status == VCONFKEY_SYSMAN_LOW_MEMORY_HARD_WARNING)
1730 bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
1731 EVT_VAL_MEMORY_HARD_WARNING);
1733 bundle_add_str(item->earlier_data, EVT_KEY_LOW_MEMORY,
1734 EVT_VAL_MEMORY_NORMAL);
1736 } else if (strcmp(event_name, SYS_EVENT_BATTERY_CHARGER_STATUS) == 0) {
1737 ret = vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &charger_status);
1738 if (ret != VCONF_OK) {
1739 _E("failed to get charger_status (%d)", ret);
1741 ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW, &charge_now);
1742 if (ret != VCONF_OK)
1743 _E("failed to get charge_now (%d)", ret);
1746 if (ret == VCONF_OK) {
1747 item->earlier_data = bundle_create();
1748 if (charger_status == VCONFKEY_SYSMAN_CHARGER_CONNECTED) {
1749 if (charge_now == 0) {
1750 bundle_add_str(item->earlier_data,
1751 EVT_KEY_BATTERY_CHARGER_STATUS,
1752 EVT_VAL_BATTERY_CHARGER_DISCHARGING);
1754 bundle_add_str(item->earlier_data,
1755 EVT_KEY_BATTERY_CHARGER_STATUS,
1756 EVT_VAL_BATTERY_CHARGER_CHARGING);
1759 bundle_add_str(item->earlier_data,
1760 EVT_KEY_BATTERY_CHARGER_STATUS,
1761 EVT_VAL_BATTERY_CHARGER_DISCONNECTED);
1766 eventsystem_register_event(event_name, &subscription_id,
1767 (eventsystem_handler)__esd_event_handler, NULL);
1768 if (subscription_id == 0) {
1769 _E("signal subscription error, event_name(%s)", event_name);
1770 if (item->earlier_data)
1771 bundle_free(item->earlier_data);
1772 free(item->event_name);
1777 item->reg_id = subscription_id;
1780 g_hash_table_insert(earlier_event_table, event_name, item);
1783 __esd_earlier_table_print_items();
1785 event_launch_table = g_hash_table_new(g_str_hash, g_str_equal);
1786 trusted_busname_table = g_hash_table_new(g_str_hash, g_str_equal);
1788 /* gdbus setup for method call */
1789 introspection_data = g_dbus_node_info_new_for_xml(INTROSPECTION_XML, &error);
1790 if (!introspection_data) {
1791 _E("g_dbus_node_info_new_for_xml error(%s)", error->message);
1792 g_error_free(error);
1796 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
1798 G_BUS_NAME_OWNER_FLAGS_NONE,
1799 __esd_on_bus_acquired,
1800 __esd_on_name_acquired,
1804 _E("g_bus_own_name error");
1805 g_dbus_node_info_unref(introspection_data);
1809 _I("esd before_loop done");
1814 void DbusEventModule::HandleMethodCallCb(GDBusConnection *connection,
1815 const gchar *sender, const gchar *object_path,
1816 const gchar *interface_name, const gchar *method_name,
1817 GVariant *parameters, GDBusMethodInvocation *invocation,
1818 gpointer user_data) {
1820 static std::map<std::string,
1821 std::function<void (DbusEventModule&, GDBusConnection*,
1822 const gchar*, GVariant*, GDBusMethodInvocation*)>> dispatcher = {
1823 { "CheckSenderValidation", &DbusEventModule::CheckSenderValidMethodCall },
1824 { "GetTrustedPeerList", &DbusEventModule::GetTrustedPeerMethodCall },
1825 { "SetupTrustedPeer", &DbusEventModule::SetupTrustedPeerMethodCall },
1826 { "CheckPrivilegeValidation", &DbusEventModule::CheckPrivilegeValidMethodCall },
1827 { "CheckUserSendValidation", &DbusEventModule::CheckSendEventValidMethodCall },
1828 { "GetEarlierData", &DbusEventModule::GetEarlierDataMethodCall },
1829 { "KeepLastData", &DbusEventModule::KeepLastDataMethodCall },
1830 { "CheckLastData", &DbusEventModule::CheckLastDataMethodCall },
1831 { "LaunchOnEventFromUserEvent", &DbusEventModule::LaunchOnEventFromUserEventMethodCall },
1832 { "CionGetUuid", &DbusEventModule::GetUuidMethodCall },
1833 { "CionSetDisplayName", &DbusEventModule::SetDisplayNameMethodCall },
1834 { "CionGetDisplayName", &DbusEventModule::GetDisplayNameMethodCall },
1835 { "CionSetEnabled", &DbusEventModule::SetEnabledMethodCall },
1836 { "CionGetEnabled", &DbusEventModule::GetEnabledMethodCall }
1839 if (dispatcher.find(method_name) == dispatcher.end())
1842 auto* mod = reinterpret_cast<esd::module::DbusEventModule*>(user_data);
1843 dispatcher[method_name](*mod, connection, sender, parameters, invocation);
1846 std::string DbusEventModule::GetSenderAppId(GDBusConnection* connection,
1847 const gchar* sender) {
1848 int sender_pid = __get_sender_pid(connection, sender);
1849 char app_id[128] = { 0, };
1850 if (__esd_get_appid_by_pid(sender_pid, app_id, sizeof(app_id)) < 0) {
1851 _E("failed to get appid by pid");
1858 void DbusEventModule::CheckSendEventValidMethodCall(GDBusConnection* connection,
1859 const gchar* sender, GVariant* parameters,
1860 GDBusMethodInvocation* invocation) {
1861 GVariant *param = NULL;
1863 char *event_name = NULL;
1864 char app_id[128] = {0, };
1866 uid_t sender_uid = 0;
1868 g_variant_get(parameters, "(&s)", &event_name);
1869 _D("event_name(%s)", event_name);
1871 sender_pid = __get_sender_pid(connection, sender);
1872 sender_uid = (uid_t)__get_sender_uid(connection, sender);
1873 if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
1874 result = ES_R_ERROR;
1876 if (check_user_event_sender_valid(event_name, app_id) < 0) {
1877 _E("invalid sender");
1878 result = ES_R_EINVAL;
1884 param = g_variant_new("(i)", result);
1885 _D("event_name(%s), result(%d)", event_name, result);
1886 g_dbus_method_invocation_return_value(invocation, param);
1889 void DbusEventModule::CheckSenderValidMethodCall(GDBusConnection* connection,
1890 const gchar* sender, GVariant* parameters,
1891 GDBusMethodInvocation* invocation) {
1892 GVariant *param = NULL;
1894 char *event_name = NULL;
1895 char app_id[128] = {0, };
1896 int event_sender_pid = 0;
1897 uid_t sender_uid = 0;
1899 g_variant_get(parameters, "(i&s)", &event_sender_pid, &event_name);
1900 _D("event_sender_pid(%d), event_name(%s)", event_sender_pid, event_name);
1902 sender_uid = (uid_t)__get_sender_uid(connection, sender);
1903 if (__esd_get_appid_by_pid_for_uid(event_sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
1904 result = ES_R_ERROR;
1906 if (check_user_event_sender_valid(event_name, app_id) < 0) {
1907 _E("invalid sender");
1908 result = ES_R_EINVAL;
1914 param = g_variant_new("(is)", result, app_id);
1915 _D("event_name(%s), result(%d)", event_name, result);
1916 g_dbus_method_invocation_return_value(invocation, param);
1919 void DbusEventModule::GetTrustedPeerMethodCall(GDBusConnection* connection,
1920 const gchar* sender, GVariant* parameters,
1921 GDBusMethodInvocation* invocation) {
1922 GVariant *param = NULL;
1924 GVariantBuilder *builder = NULL;
1925 GHashTableIter iter;
1926 gpointer key, value;
1927 char *event_name = NULL;
1928 char app_id[128] = {0, };
1930 uid_t sender_uid = 0;
1933 char *_appid = NULL;
1934 char *_busname = NULL;
1937 g_variant_get(parameters, "(&s)", &event_name);
1938 _D("event_name(%s)", event_name);
1940 sender_pid = __get_sender_pid(connection, sender);
1941 sender_uid = (uid_t)__get_sender_uid(connection, sender);
1942 if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
1943 result = ES_R_ERROR;
1945 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1947 g_hash_table_iter_init(&iter, trusted_busname_table);
1948 while (g_hash_table_iter_next(&iter, &key, &value)) {
1949 item = (trusted_item *)value;
1951 _appid = item->app_id;
1952 _busname = item->bus_name;
1954 if (uid != GLOBAL_USER && uid != sender_uid)
1957 ret = __esd_check_certificate_match(uid, _appid, sender_uid, app_id);
1959 g_variant_builder_add(builder, "s", _busname);
1965 param = g_variant_new("(ias)", result, builder);
1966 _D("result(%d)", result);
1967 g_dbus_method_invocation_return_value(invocation, param);
1969 g_variant_builder_unref(builder);
1972 void DbusEventModule::SetupTrustedPeerMethodCall(GDBusConnection* connection,
1973 const gchar* sender, GVariant* parameters,
1974 GDBusMethodInvocation* invocation) {
1975 GVariant *param = NULL;
1977 char *event_name = NULL;
1978 char *destination_name = NULL;
1979 char app_id[128] = {0, };
1981 uid_t sender_uid = 0;
1984 g_variant_get(parameters, "(&s&s)", &event_name, &destination_name);
1985 _D("event_name(%s), destination_name(%s)", event_name, destination_name);
1987 if (destination_name && destination_name[0] != '\0') {
1988 sender_pid = __get_sender_pid(connection, sender);
1989 sender_uid = (uid_t)__get_sender_uid(connection, sender);
1990 if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
1991 result = ES_R_ERROR;
1993 ret = __esd_trusted_busname_add_item(sender_uid, app_id, destination_name,
1996 _E("failed to add trusted busname item");
1997 result = ES_R_ERROR;
2003 _E("invalid destination name");
2004 result = ES_R_ERROR;
2007 param = g_variant_new("(i)", result);
2008 _D("event_name(%s), result(%d)", event_name, result);
2009 g_dbus_method_invocation_return_value(invocation, param);
2012 void DbusEventModule::CheckPrivilegeValidMethodCall(GDBusConnection* connection,
2013 const gchar* sender, GVariant* parameters,
2014 GDBusMethodInvocation* invocation) {
2015 GVariant *param = NULL;
2017 char *event_name = NULL;
2018 char *privilege_name = NULL;
2019 char app_id[128] = {0, };
2021 uid_t sender_uid = 0;
2022 char *client = NULL;
2023 char *session = NULL;
2027 g_variant_get(parameters, "(&s)", &event_name);
2028 __esd_check_privilege_name(event_name, &privilege_name);
2029 _D("event_name(%s), privilege_name(%s)", event_name, privilege_name);
2031 if (privilege_name) {
2032 sender_pid = __get_sender_pid(connection, sender);
2033 sender_uid = (uid_t)__get_sender_uid(connection, sender);
2034 if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id, sizeof(app_id)) < 0) {
2035 result = ES_R_ERROR;
2037 ret = cynara_creds_gdbus_get_client(connection, sender, CLIENT_METHOD_DEFAULT, &client);
2038 if (ret != CYNARA_API_SUCCESS) {
2039 _E("failed to get client");
2040 result = ES_R_EINVAL;
2044 ret = cynara_creds_gdbus_get_user(connection, sender, USER_METHOD_DEFAULT, &user);
2045 if (ret != CYNARA_API_SUCCESS) {
2046 _E("failed to get user");
2047 result = ES_R_EINVAL;
2051 session = cynara_session_from_pid(sender_pid);
2052 if (session == NULL) {
2053 _E("failed to get session");
2054 result = ES_R_EINVAL;
2058 _D("app_id(%s), client(%s), session(%s), user(%s)", app_id, client, session, user);
2059 if (__esd_check_valid_privilege_by_cynara(app_id, client, session, user, privilege_name))
2062 result = ES_R_EINVAL;
2072 param = g_variant_new("(i)", result);
2073 _D("event_name(%s), result(%d)", event_name, result);
2074 g_dbus_method_invocation_return_value(invocation, param);
2077 void DbusEventModule::GetEarlierDataMethodCall(GDBusConnection* connection,
2078 const gchar* sender, GVariant* parameters,
2079 GDBusMethodInvocation* invocation) {
2080 GVariant *param = NULL;
2081 int result = ES_R_ERROR;
2082 char *event_name = NULL;
2084 bundle_raw *raw = NULL;
2088 g_variant_get(parameters, "(&s)", &event_name);
2089 _D("event_name(%s)", event_name);
2091 item = (earlier_item *)g_hash_table_lookup(earlier_event_table, event_name);
2093 if (item->earlier_data) {
2094 b = bundle_dup(item->earlier_data);
2095 bundle_add_str(b, "is_earlier_data", "true");
2100 if (result == ES_R_ERROR)
2101 b = bundle_create();
2103 bundle_encode(b, &raw, &len);
2106 param = g_variant_new("(iis)", result, len, raw);
2108 _D("result(%d), len(%d)", result, len);
2109 g_dbus_method_invocation_return_value(invocation, param);
2111 bundle_free_encoded_rawdata(&raw);
2114 void DbusEventModule::KeepLastDataMethodCall(GDBusConnection* connection,
2115 const gchar* sender, GVariant* parameters,
2116 GDBusMethodInvocation* invocation) {
2118 int result = ES_R_OK;
2125 struct __last_event_item *item;
2127 g_variant_get(parameters, "(&s&s)", &event_name, &own_name);
2129 if (!event_name || !own_name) {
2130 result = ES_R_ERROR;
2131 _E("invalid event_name and own_name");
2135 sender_pid = __get_sender_pid(connection, sender);
2136 sender_uid = (uid_t)__get_sender_uid(connection, sender);
2137 if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
2138 sizeof(app_id)) < 0) {
2139 _E("failed to get appid by pid");
2140 result = ES_R_ERROR;
2144 key = (char *)malloc(sizeof(event_name) + 10);
2146 result = ES_R_ENOMEM;
2147 _E("out of memory");
2151 snprintf(key, sizeof(event_name) + 10, "%s_%d", event_name, sender_uid);
2152 item = (struct __last_event_item *)g_hash_table_lookup(user_last_event_table,
2155 item = (struct __last_event_item *)calloc(1, sizeof(*item));
2157 result = ES_R_ERROR;
2161 item->event_name = strdup(event_name);
2162 item->own_name = strdup(own_name);
2163 item->uid = sender_uid;
2164 item->app_id = strdup(app_id);
2165 g_hash_table_insert(user_last_event_table,
2168 free(item->own_name);
2169 item->own_name = strdup(own_name);
2173 param = g_variant_new("(i)", result);
2175 g_dbus_method_invocation_return_value(invocation, param);
2178 void DbusEventModule::CheckLastDataMethodCall(GDBusConnection* connection,
2179 const gchar* sender, GVariant* parameters,
2180 GDBusMethodInvocation* invocation) {
2182 int result = ES_R_OK;
2189 struct __last_event_item *item;
2191 g_variant_get(parameters, "(&s&s)", &event_name, &own_name);
2193 if (!event_name || !own_name) {
2194 result = ES_R_ERROR;
2195 _E("invalid event_name and own_name");
2199 sender_pid = __get_sender_pid(connection, sender);
2200 sender_uid = (uid_t)__get_sender_uid(connection, sender);
2201 if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
2202 sizeof(app_id)) < 0) {
2203 result = ES_R_ERROR;
2204 _E("failed to get appid by pid");
2208 key = (char *)malloc(sizeof(event_name) + 10);
2210 result = ES_R_ENOMEM;
2211 _E("out of memory");
2215 snprintf(key, sizeof(event_name) + 10, "%s_%d", event_name, sender_uid);
2216 item = (struct __last_event_item *)g_hash_table_lookup(user_last_event_table,
2225 GError *error = NULL;
2227 b = bundle_create();
2229 result = ES_R_ERROR;
2232 bundle_add_str(b, EVT_KEY_KEPT_EVENT_NAME, event_name);
2233 bundle_add_str(b, EVT_KEY_KEPT_OWN_NAME, own_name);
2234 if (__esd_check_certificate_match(item->uid, item->app_id,
2235 sender_uid, app_id) == ES_R_OK)
2236 bundle_add_str(b, EVT_KEY_KEPT_IS_TRUSTED, "true");
2238 bundle_add_str(b, EVT_KEY_KEPT_IS_TRUSTED, "false");
2240 bundle_encode(b, &raw, &len);
2241 gv = g_variant_new("(us)", len, raw);
2242 ret = g_dbus_connection_emit_signal(connection,
2245 SYS_EVENT_NAME_PREFIX,
2250 _E("Unable to emit signal: %s", error->message);
2251 g_error_free(error);
2253 bundle_free_encoded_rawdata(&raw);
2258 param = g_variant_new("(i)", result);
2260 g_dbus_method_invocation_return_value(invocation, param);
2263 void DbusEventModule::LaunchOnEventFromUserEventMethodCall(GDBusConnection* connection,
2264 const gchar* sender, GVariant* parameters,
2265 GDBusMethodInvocation* invocation) {
2267 int result = ES_R_OK;
2277 g_variant_get(parameters, "(&s&sib)", &event_name, &buf, &len, &trusted);
2280 result = ES_R_ERROR;
2281 _E("invalid event_name");
2285 sender_pid = __get_sender_pid(connection, sender);
2286 sender_uid = (uid_t)__get_sender_uid(connection, sender);
2287 if (__esd_get_appid_by_pid_for_uid(sender_pid, sender_uid, app_id,
2288 sizeof(app_id)) < 0) {
2289 _E("failed to get appid by pid");
2290 result = ES_R_ERROR;
2294 b = bundle_decode((bundle_raw *)buf, len);
2296 _E("Out of memory");
2297 result = ES_R_ENOMEM;
2301 __esd_launch_event_handler(event_name, b, true, trusted,
2302 sender_uid, app_id, NULL);
2307 param = g_variant_new("(i)", result);
2309 g_dbus_method_invocation_return_value(invocation, param);
2312 void DbusEventModule::GetUuidMethodCall(GDBusConnection* connection,
2313 const gchar* sender, GVariant* parameters,
2314 GDBusMethodInvocation* invocation) {
2315 GVariant* param = nullptr;
2316 int result = ES_R_OK;
2317 std::optional<std::string> uuid;
2319 std::string app_id = GetSenderAppId(connection, sender);
2320 if (app_id.empty()) {
2321 param = g_variant_new("(is)", ES_R_ERROR, "");
2322 g_dbus_method_invocation_return_value(invocation, param);
2326 if (tools_->GetMethodBroker().Invoke("Cion.GetUuidWithGenerate",
2328 param = g_variant_new("(is)", ES_R_OK, (*uuid).c_str());
2330 result = ES_R_ERROR;
2333 if (param == nullptr)
2334 param = g_variant_new("(is)", result, "");
2336 g_dbus_method_invocation_return_value(invocation, param);
2339 void DbusEventModule::SetDisplayNameMethodCall(GDBusConnection* connection,
2340 const gchar* sender, GVariant* parameters,
2341 GDBusMethodInvocation* invocation) {
2342 GVariant* param = nullptr;
2343 int result = ES_R_OK;
2344 char* display_name = nullptr;
2345 char* service_name = nullptr;
2348 std::string app_id = GetSenderAppId(connection, sender);
2349 if (app_id.empty()) {
2350 param = g_variant_new("(i)", ES_R_ERROR);
2351 g_dbus_method_invocation_return_value(invocation, param);
2355 g_variant_get(parameters, "(&s&s)", &service_name, &display_name);
2357 if (!tools_->GetMethodBroker().Invoke("Cion.SetDisplayName", app_id,
2358 service_name, display_name, ret)) {
2359 result = ES_R_ERROR;
2363 result = ES_R_ERROR;
2365 param = g_variant_new("(i)", result);
2366 g_dbus_method_invocation_return_value(invocation, param);
2369 void DbusEventModule::GetDisplayNameMethodCall(GDBusConnection* connection,
2370 const gchar* sender, GVariant* parameters,
2371 GDBusMethodInvocation* invocation) {
2372 GVariant* param = nullptr;
2373 int result = ES_R_OK;
2374 char* service_name = nullptr;
2375 std::string display_name;
2378 std::string app_id = GetSenderAppId(connection, sender);
2379 if (app_id.empty()) {
2380 param = g_variant_new("(is)", ES_R_ERROR, "");
2381 g_dbus_method_invocation_return_value(invocation, param);
2385 g_variant_get(parameters, "(&s)", &service_name);
2387 if (tools_->GetMethodBroker().Invoke("Cion.GetDisplayName",
2388 app_id.c_str(), service_name, display_name, ret)) {
2390 param = g_variant_new("(is)", result, display_name);
2392 result = ES_R_ERROR;
2395 if (param == nullptr)
2396 param = g_variant_new("(is)", result, "");
2398 g_dbus_method_invocation_return_value(invocation, param);
2401 void DbusEventModule::SetEnabledMethodCall(GDBusConnection* connection,
2402 const gchar* sender, GVariant* parameters,
2403 GDBusMethodInvocation* invocation) {
2404 GVariant* param = nullptr;
2405 int result = ES_R_OK;
2407 char* service_name = nullptr;
2410 std::string app_id = GetSenderAppId(connection, sender);
2411 if (app_id.empty()) {
2412 param = g_variant_new("(i)", ES_R_ERROR);
2413 g_dbus_method_invocation_return_value(invocation, param);
2417 g_variant_get(parameters, "(&sb)", &service_name, &enabled);
2419 if (!tools_->GetMethodBroker().Invoke("Cion.SetEnabled", app_id,
2420 service_name, (bool)enabled, ret)) {
2421 result = ES_R_ERROR;
2425 result = ES_R_ERROR;
2427 param = g_variant_new("(i)", result);
2428 g_dbus_method_invocation_return_value(invocation, param);
2431 void DbusEventModule::GetEnabledMethodCall(GDBusConnection* connection,
2432 const gchar* sender, GVariant* parameters,
2433 GDBusMethodInvocation* invocation) {
2434 GVariant* param = nullptr;
2435 int result = ES_R_OK;
2436 char* service_name = nullptr;
2437 bool enabled = false;
2440 std::string app_id = GetSenderAppId(connection, sender);
2441 if (app_id.empty()) {
2442 param = g_variant_new("(ib)", ES_R_ERROR, false);
2443 g_dbus_method_invocation_return_value(invocation, param);
2447 g_variant_get(parameters, "(&s)", &service_name);
2448 if (!tools_->GetMethodBroker().Invoke("Cion.GetEnabled", app_id,
2449 service_name, enabled, ret)) {
2450 result = ES_R_ERROR;
2451 } else if (ret != 0) {
2452 result = ES_R_ERROR;
2454 param = g_variant_new("(ib)", result, enabled);
2457 if (param == nullptr)
2458 param = g_variant_new("(ib)", result, false);
2460 g_dbus_method_invocation_return_value(invocation, param);
2464 } // namespace esd::module