From c333f6094e1eff566535d42fda45fc48aed724d0 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Thu, 24 Mar 2016 17:20:10 +0900 Subject: [PATCH 01/16] Add gdbus permission check logic & fix shorcut get list bug Change-Id: Ic04cdedd32a90e00c885bbbe442f5109b5a1946c Signed-off-by: Hyunho Kang --- data-provider-master.conf.in | 17 ++++++++++++----- src/shortcut_service.c | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/data-provider-master.conf.in b/data-provider-master.conf.in index 4767630..7770ed6 100644 --- a/data-provider-master.conf.in +++ b/data-provider-master.conf.in @@ -7,9 +7,16 @@ - - - - - + + + + + + + + + + + + diff --git a/src/shortcut_service.c b/src/shortcut_service.c index 647fbfc..f43d4a5 100755 --- a/src/shortcut_service.c +++ b/src/shortcut_service.c @@ -179,7 +179,7 @@ int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_bo shortcut = iter_list->data; body = g_variant_new("(&s&s&s&s&s)", shortcut->package_name, shortcut->icon, shortcut->name, shortcut->extra_key, shortcut->extra_data); - g_variant_builder_add(builder, "v", body); + g_variant_builder_add(builder, "(v)", body); } g_list_free_full(shortcut_list, (GDestroyNotify)_release_shortcut_info); } -- 2.7.4 From 309ec6d4ed0f3c9610699b6076439ed55399a1fc Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Mon, 11 Apr 2016 18:16:49 +0900 Subject: [PATCH 02/16] Remove security-server dependencies Change-Id: I80a03d58070559a80bde97615c379c957e0b1419 Signed-off-by: Hyunho Kang --- data-provider-master.rule | 36 ------------------------------------ packaging/data-provider-master.spec | 1 - 2 files changed, 37 deletions(-) delete mode 100644 data-provider-master.rule diff --git a/data-provider-master.rule b/data-provider-master.rule deleted file mode 100644 index b8bc56e..0000000 --- a/data-provider-master.rule +++ /dev/null @@ -1,36 +0,0 @@ -data-provider-master::bin samsung::vconf::dynamicbox rw---- ------ -data-provider-master::bin xorg rwx--- ------ -data-provider-master::bin tizen::vconf::setting::admin rw---- ------ -data-provider-master::bin tizen::vconf::platform::r r----- ------ -data-provider-master::bin device::app_logging rw---- ------ -data-provider-master::bin device::sys_logging rw---- ------ -data-provider-master::bin tizen::vconf::public::r r----l ------ -data-provider-master::bin data-provider-master::data r-x--- ------ -data-provider-master::bin data-provider-master::share rwx--- ------ -data-provider-master::bin data-provider-master::db rw---- ------ -data-provider-master::bin data-provider-master rwx--- ------ -data-provider-master::bin pkgmgr::info r----- ------ -data-provider-master::bin pkgmgr::db rwx---l ------ -data-provider-master::bin ail::db r-x---l ------ -data-provider-master::bin _ rw---- ------ -data-provider-master::bin security-server::api-privilege-by-pid rw---- ------ -data-provider-master::bin wrt-security-daemon r----- ------ -data-provider-master::bin security-server r----- ------ -data-provider-master::bin aul::launch --x--- ------ -data-provider-master::bin device::input rw---- ------ -data-provider-master::bin resourced r----- ------ -data-provider-master::bin syslogd r-x--- ------ -data-provider-master::bin deviced r-x--- ------ -data-provider-master::bin alarm-server r-x--- ------ -data-provider-master::bin dbus r-x--- ------ -data-provider-master::bin secure-storage r-x-- ------ -data-provider-master::bin telephony_framework r-x-- ------ -data-provider-master::bin system::media r-x-- ------ -data-provider-master::bin system::vconf --x--- ------ -data-provider-master::bin system::vconf_system r----- ------ -data-provider-master::bin notification::db rw---- ------ -data-provider-master::bin shortcut-service::db rw---- ------ -data-provider-master::bin badge::db rw---- ------ -_ data-provider-master::bin r-x--- ------ -data-provider-master::bin sdbd r----- ------ -data-provider-master::bin system::homedir rwxa-- ------ diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index c3abd50..4d636b5 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -29,7 +29,6 @@ BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(notification) BuildRequires: pkgconfig(badge) BuildRequires: pkgconfig(shortcut) -BuildRequires: pkgconfig(security-server) BuildRequires: pkgconfig(libsystemd-daemon) BuildRequires: pkgconfig(cynara-client) BuildRequires: pkgconfig(cynara-session) -- 2.7.4 From d52404cef15141ea7c52e4655db2db5ed2854b5a Mon Sep 17 00:00:00 2001 From: Myungki Lee Date: Tue, 26 Apr 2016 16:40:01 +0900 Subject: [PATCH 03/16] Adjust coding rule Change-Id: I9043599bc973d50ac8f53ce0ad3c39894d9944f3 Signed-off-by: Myungki Lee --- include/pkgmgr.h | 1 - packaging/data-provider-master.spec | 1 - src/badge_service.c | 2 +- src/notification_service.c | 11 +++++------ src/service_common.c | 13 +++++++------ src/shortcut_service.c | 4 ++-- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/include/pkgmgr.h b/include/pkgmgr.h index 0c2f0af..d00e0f3 100755 --- a/include/pkgmgr.h +++ b/include/pkgmgr.h @@ -34,7 +34,6 @@ extern int pkgmgr_init(void); extern int pkgmgr_fini(void); extern int pkgmgr_add_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data); - extern void *pkgmgr_del_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data); /* End of a file */ diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index 4d636b5..23c4309 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -20,7 +20,6 @@ BuildRequires: pkgconfig(gio-2.0) BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(bundle) BuildRequires: pkgconfig(capi-appfw-app-manager) - BuildRequires: pkgconfig(ecore) BuildRequires: pkgconfig(eina) BuildRequires: pkgconfig(libxml-2.0) diff --git a/src/badge_service.c b/src/badge_service.c index 49b9794..398ede4 100755 --- a/src/badge_service.c +++ b/src/badge_service.c @@ -481,7 +481,7 @@ HAPI int badge_service_init(void) int result; result = badge_register_dbus_interface(); - if(result != SERVICE_COMMON_ERROR_NONE) { + if (result != SERVICE_COMMON_ERROR_NONE) { ErrPrint("badge register dbus fail %d", result); } diff --git a/src/notification_service.c b/src/notification_service.c index 665edf3..f87dbb7 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -65,7 +65,7 @@ static void _on_name_vanished(GDBusConnection *connection, DbgPrint("name vanished : %s", name); monitoring_info_s *info = (monitoring_info_s *)user_data; - if(info) { + if (info) { g_bus_unwatch_name(info->watcher_id); if (info->bus_name) { @@ -457,7 +457,6 @@ int notification_load_grouping_list(GVariant *parameters, GVariant **reply_body) builder = g_variant_builder_new(G_VARIANT_TYPE("a(v)")); if (get_list) { - list_iter = notification_list_get_head(get_list); do { noti = notification_list_get_data(list_iter); @@ -506,7 +505,7 @@ int notification_get_setting_array(GVariant *parameters, GVariant **reply_body) body = notification_ipc_make_gvariant_from_setting(temp); g_variant_builder_add(builder, "(v)", body); - if(temp->package_name) + if (temp->package_name) free(temp->package_name); } free(setting_array); @@ -572,13 +571,13 @@ int notification_load_system_setting(GVariant *parameters, GVariant **reply_body } else { return ret; } + *reply_body = g_variant_new("(v)", body); if (*reply_body == NULL) { ErrPrint("cannot make reply_body"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; } DbgPrint("load system setting done !!"); - return ret; } @@ -702,7 +701,7 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body) int num_deleted = 0; int *list_deleted = NULL; GVariant *deleted_noti_list; - GVariantBuilder * builder; + GVariantBuilder *builder; int i; g_variant_get(parameters, "(&si)", &pkgname, &type); @@ -887,7 +886,7 @@ HAPI int notification_service_init(void) int result; result = notification_register_dbus_interface(); - if(result != SERVICE_COMMON_ERROR_NONE) { + if (result != SERVICE_COMMON_ERROR_NONE) { ErrPrint("notification register dbus fail %d", result); return result; } diff --git a/src/service_common.c b/src/service_common.c index a3037ca..1cb8851 100755 --- a/src/service_common.c +++ b/src/service_common.c @@ -35,7 +35,8 @@ static GDBusConnection *_gdbus_conn = NULL; -void print_noti(notification_h noti) { +void print_noti(notification_h noti) +{ char *pkgname = NULL; char *text = NULL; char *content = NULL; @@ -49,10 +50,10 @@ void print_noti(notification_h noti) { notification_get_tag(noti, &tag); notification_get_vibration(noti, &type, &vibration_path); - DbgPrint("provider print_noti pkgname = %s ", pkgname ); - DbgPrint("provider print_noti title = %s ", text ); - DbgPrint("provider print_noti content = %s ", content ); - DbgPrint("provider print_noti tag = %s ", tag ); + DbgPrint("provider print_noti pkgname = %s", pkgname); + DbgPrint("provider print_noti title = %s", text); + DbgPrint("provider print_noti content = %s", content); + DbgPrint("provider print_noti tag = %s", tag); DbgPrint("provider print_noti vibration_path = %s %d", vibration_path, type); } @@ -165,7 +166,7 @@ static int _dbus_init(void) { GError *error = NULL; - if(_gdbus_conn == NULL) { + if (_gdbus_conn == NULL) { _gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); if (_gdbus_conn == NULL) { if (error != NULL) { diff --git a/src/shortcut_service.c b/src/shortcut_service.c index f43d4a5..c850bff 100755 --- a/src/shortcut_service.c +++ b/src/shortcut_service.c @@ -168,7 +168,7 @@ int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_bo g_variant_get(parameters, "(v)", ¶m_body); g_variant_dict_init(&dict, param_body); g_variant_dict_lookup(&dict, "package_name", "&s", &package_name); - g_variant_dict_end (&dict); + g_variant_dict_end(&dict); count = shortcut_db_get_list(package_name, &shortcut_list); DbgPrint("shortcut count : %d", count); @@ -246,7 +246,7 @@ HAPI int shortcut_service_init(void) int result; result = shortcut_register_dbus_interface(); - if(result != SERVICE_COMMON_ERROR_NONE) { + if (result != SERVICE_COMMON_ERROR_NONE) { ErrPrint("shortcut register dbus fail %d", result); } return result; -- 2.7.4 From ac2b9abdd1c473a326b3f99c129fa3111878f338 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Mon, 2 May 2016 15:10:46 +0900 Subject: [PATCH 04/16] Add translate localized text feature Change-Id: Iba312066d8cba9c946b5c81b0dbdc29b28ccde88 Signed-off-by: Hyunho Kang --- src/main.c | 27 +++++++++++++++++++++++++++ src/notification_service.c | 12 ++++++------ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 7a2c470..05c4a7b 100755 --- a/src/main.c +++ b/src/main.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "debug.h" #include "util.h" @@ -40,10 +41,36 @@ #include "notification_service.h" #include "badge_service.h" +static void lang_key_changed_cb(keynode_t *node EINA_UNUSED, void *first) +{ + char *lang; + char *r; + + lang = vconf_get_str(VCONFKEY_LANGSET); + if (lang) { + setenv("LANG", lang, 1); + setenv("LC_MESSAGES", lang, 1); + r = setlocale(LC_ALL, ""); + if (r == NULL) { + r = setlocale(LC_ALL, lang); + if (r != NULL) + DbgPrint("setlocale = %s", r); + } + DbgPrint("setlocale = %s", r); + free(lang); + } +} + static inline int app_create(void) { int ret; + ret = vconf_notify_key_changed(VCONFKEY_LANGSET, lang_key_changed_cb, NULL); + if (ret < 0) + DbgPrint("VCONFKEY_LANGSET notify key chenaged: %d\n", ret); + + lang_key_changed_cb(NULL, NULL); + ret = shortcut_service_init(); if (ret < 0) DbgPrint("shortcut: %d\n", ret); diff --git a/src/notification_service.c b/src/notification_service.c index f87dbb7..0a2913a 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -261,7 +261,7 @@ static int _add_noti(GVariant **reply_body, notification_h noti) return ret; } - body = notification_ipc_make_gvariant_from_noti(noti); + body = notification_ipc_make_gvariant_from_noti(noti, true); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; @@ -328,7 +328,7 @@ static int _update_noti(GVariant **reply_body, notification_h noti) if (ret != NOTIFICATION_ERROR_NONE) return ret; - body = notification_ipc_make_gvariant_from_noti(noti); + body = notification_ipc_make_gvariant_from_noti(noti, true); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return NOTIFICATION_ERROR_IO_ERROR; @@ -390,7 +390,7 @@ int notification_load_noti_by_tag(GVariant *parameters, GVariant **reply_body) DbgPrint("notification_noti_get_by_tag ret : %d", ret); print_noti(noti); - *reply_body = notification_ipc_make_gvariant_from_noti(noti); + *reply_body = notification_ipc_make_gvariant_from_noti(noti, true); notification_free(noti); if (*reply_body == NULL) { @@ -421,7 +421,7 @@ int notification_load_noti_by_priv_id(GVariant *parameters, GVariant **reply_bod DbgPrint("notification_noti_get_by_priv_id ret : %d", ret); print_noti(noti); - *reply_body = notification_ipc_make_gvariant_from_noti(noti); + *reply_body = notification_ipc_make_gvariant_from_noti(noti, true); notification_free(noti); if (*reply_body == NULL) { @@ -460,7 +460,7 @@ int notification_load_grouping_list(GVariant *parameters, GVariant **reply_body) list_iter = notification_list_get_head(get_list); do { noti = notification_list_get_data(list_iter); - body = notification_ipc_make_gvariant_from_noti(noti); + body = notification_ipc_make_gvariant_from_noti(noti, true); g_variant_builder_add(builder, "(v)", body); list_iter = notification_list_get_next(list_iter); @@ -610,7 +610,7 @@ int notification_load_detail_list(GVariant *parameters, GVariant **reply_body) list_iter = notification_list_get_head(get_list); do { noti = notification_list_get_data(list_iter); - body = notification_ipc_make_gvariant_from_noti(noti); + body = notification_ipc_make_gvariant_from_noti(noti, true); if (body) { g_variant_builder_add(builder, "(v)", body); list_iter = notification_list_get_next(list_iter); -- 2.7.4 From 858eeff348d3b167cf7d485fae8e35e0709f679c Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 3 May 2016 19:46:08 +0900 Subject: [PATCH 05/16] Change uid from root to app_fw Change-Id: Ib34012cc54590884109596a73d2ca3cad4ba3934 Signed-off-by: Hyunho Kang --- data-provider-master.conf.in | 2 +- packaging/data-provider-master.service | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/data-provider-master.conf.in b/data-provider-master.conf.in index 7770ed6..6bb3c42 100644 --- a/data-provider-master.conf.in +++ b/data-provider-master.conf.in @@ -3,7 +3,7 @@ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> - + diff --git a/packaging/data-provider-master.service b/packaging/data-provider-master.service index 8d7e2fb..89e9122 100644 --- a/packaging/data-provider-master.service +++ b/packaging/data-provider-master.service @@ -2,6 +2,8 @@ Description=Data Provider Master [Service] +User=app_fw +Group=app_fw BusName=org.tizen.data_provider_service Type=dbus ExecStart=/usr/bin/data-provider-master -- 2.7.4 From 65a5fb7dac1a33fdc8b626fcbcd3e1aa609a98f6 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Wed, 4 May 2016 15:18:09 +0900 Subject: [PATCH 06/16] Add badge_get_badge_existing and badge_get_badge_list service Change-Id: I15a5c987060873eada9993dd56faa7376ca7e10e Signed-off-by: Hyunho Kang --- include/badge_service.h | 2 ++ src/badge_service.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/include/badge_service.h b/include/badge_service.h index 573b4d8..29f3d29 100755 --- a/include/badge_service.h +++ b/include/badge_service.h @@ -19,6 +19,8 @@ extern int badge_service_init(void); extern int badge_service_fini(void); +int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body); +int badge_get_badge_list(GVariant *parameters, GVariant **reply_body); int badge_insert(GVariant *parameters, GVariant **reply_body); int badge_delete(GVariant *parameters, GVariant **reply_body); int badge_set_badge_count(GVariant *parameters, GVariant **reply_body); diff --git a/src/badge_service.c b/src/badge_service.c index 398ede4..080eedc 100755 --- a/src/badge_service.c +++ b/src/badge_service.c @@ -71,6 +71,10 @@ static void _badge_dbus_method_call_handler(GDBusConnection *conn, if (g_strcmp0(method_name, "badge_service_register") == 0) ret = service_register(parameters, &reply_body, sender, _on_name_appeared, _on_name_vanished, &_monitoring_list); + else if (g_strcmp0(method_name, "get_badge_existing") == 0) + ret = badge_get_badge_existing(parameters, &reply_body); + else if (g_strcmp0(method_name, "get_list") == 0) + ret = badge_get_badge_list(parameters, &reply_body); else if (g_strcmp0(method_name, "insert_badge") == 0) ret = badge_insert(parameters, &reply_body); else if (g_strcmp0(method_name, "delete_badge") == 0) @@ -115,7 +119,13 @@ int badge_register_dbus_interface() " " " " " " - + " " + " " + " " + " " + " " + " " + " " " " " " " " @@ -166,6 +176,81 @@ int badge_register_dbus_interface() return service_common_register_dbus_interface(introspection_xml, _badge_interface_vtable); } +static void _release_badge_info(gpointer data) +{ + badge_info_s *badge = (badge_info_s *)data; + if (badge == NULL) + return; + if (badge->pkg) + free(badge->pkg); + free(badge); +} + +/* get_badge_existing */ +int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body) +{ + int ret = BADGE_ERROR_NONE; + char *pkgname = NULL; + bool existing = 0; + + g_variant_get(parameters, "(&s)", &pkgname); + DbgPrint("badge_get_badge_existing %s", pkgname); + if (pkgname != NULL) + ret = badge_db_is_existing(pkgname, &existing); + else + return BADGE_ERROR_INVALID_PARAMETER; + + if (ret != BADGE_ERROR_NONE) { + ErrPrint("failed to get badge existing :%d\n", ret); + return ret; + } + + *reply_body = g_variant_new("(i)", existing); + if (*reply_body == NULL) { + ErrPrint("cannot make gvariant to noti"); + return BADGE_ERROR_OUT_OF_MEMORY; + } + DbgPrint("badge_get_badge_existing service done"); + return ret; +} + +/* get_list */ +int badge_get_badge_list(GVariant *parameters, GVariant **reply_body) +{ + GList *badge_list = NULL; + GList *iter_list = NULL; + GVariant *body = NULL; + badge_info_s *badge; + GVariantBuilder *builder; + int ret; + + ret = badge_db_get_list(&badge_list); + if (ret != BADGE_ERROR_NONE) { + ErrPrint("badge get list fail : %d", ret); + return ret; + } + + builder = g_variant_builder_new(G_VARIANT_TYPE("a(v)")); + iter_list = g_list_first(badge_list); + for (; iter_list != NULL; iter_list = iter_list->next) { + badge = iter_list->data; + body = g_variant_new("(&si)", badge->pkg, badge->badge_count); + g_variant_builder_add(builder, "(v)", body); + } + g_list_free_full(badge_list, (GDestroyNotify)_release_badge_info); + + *reply_body = g_variant_new("(a(v))", builder); + g_variant_builder_unref(builder); + + if (*reply_body == NULL) { + ErrPrint("cannot make reply_body"); + return BADGE_ERROR_OUT_OF_MEMORY; + } + + DbgPrint("badge_get_badge_list done !!"); + return BADGE_ERROR_NONE; +} + /* insert_badge */ int badge_insert(GVariant *parameters, GVariant **reply_body) { -- 2.7.4 From be558726513bf710c4a6ae84f47a0a2ac9ac69d5 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Mon, 9 May 2016 18:25:51 +0900 Subject: [PATCH 07/16] Add db create logic Change-Id: Ia3b26af2276ca4d08d89556d56115a8f79286741 Signed-off-by: Hyunho Kang --- org.tizen.data-provider-master.service.in | 2 +- src/badge_service.c | 9 +++++++-- src/notification_service.c | 17 ++++++++++------- src/service_common.c | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/org.tizen.data-provider-master.service.in b/org.tizen.data-provider-master.service.in index 641d3bd..5d60061 100644 --- a/org.tizen.data-provider-master.service.in +++ b/org.tizen.data-provider-master.service.in @@ -2,4 +2,4 @@ Name=org.tizen.data_provider_service Exec=/bin/false SystemdService=data-provider-master.service -User=root +User=app_fw diff --git a/src/badge_service.c b/src/badge_service.c index 080eedc..3b4a51d 100755 --- a/src/badge_service.c +++ b/src/badge_service.c @@ -27,7 +27,6 @@ #include "debug.h" #define PROVIDER_BADGE_INTERFACE_NAME "org.tizen.data_provider_badge_service" - static GList *_monitoring_list = NULL; static void _on_name_appeared(GDBusConnection *connection, @@ -564,13 +563,19 @@ int badge_get_setting_property(GVariant *parameters, GVariant **reply_body) HAPI int badge_service_init(void) { int result; + result = badge_db_init(); + if (result != BADGE_ERROR_NONE) { + ErrPrint("badge db init fail %d", result); + return result; + } result = badge_register_dbus_interface(); if (result != SERVICE_COMMON_ERROR_NONE) { ErrPrint("badge register dbus fail %d", result); + return BADGE_ERROR_IO_ERROR; } - return result; + return BADGE_ERROR_NONE; } HAPI int badge_service_fini(void) diff --git a/src/notification_service.c b/src/notification_service.c index 0a2913a..0dc7fa5 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -35,11 +35,10 @@ #include #include #include +#include #define PROVIDER_NOTI_INTERFACE_NAME "org.tizen.data_provider_noti_service" - static GList *_monitoring_list = NULL; - static int _update_noti(GVariant **reply_body, notification_h noti); /*! @@ -884,14 +883,18 @@ static int _package_uninstall_cb(const char *pkgname, enum pkgmgr_status status, HAPI int notification_service_init(void) { int result; - result = notification_register_dbus_interface(); + result = notification_db_init(); + if (result != NOTIFICATION_ERROR_NONE) { + ErrPrint("notification db init fail %d", result); + return result; + } + result = notification_register_dbus_interface(); if (result != SERVICE_COMMON_ERROR_NONE) { ErrPrint("notification register dbus fail %d", result); - return result; + return NOTIFICATION_ERROR_IO_ERROR; } _notification_data_init(); - notification_setting_refresh_setting_table(); pkgmgr_init(); @@ -899,14 +902,14 @@ HAPI int notification_service_init(void) pkgmgr_add_event_callback(PKGMGR_EVENT_UPDATE, _package_install_cb, NULL); pkgmgr_add_event_callback(PKGMGR_EVENT_UNINSTALL, _package_uninstall_cb, NULL); DbgPrint("Successfully initiated\n"); - return SERVICE_COMMON_ERROR_NONE; + return NOTIFICATION_ERROR_NONE; } HAPI int notification_service_fini(void) { pkgmgr_fini(); DbgPrint("Successfully Finalized\n"); - return SERVICE_COMMON_ERROR_NONE; + return NOTIFICATION_ERROR_NONE; } /* End of a file */ diff --git a/src/service_common.c b/src/service_common.c index 1cb8851..a66ff23 100755 --- a/src/service_common.c +++ b/src/service_common.c @@ -235,4 +235,4 @@ out: g_dbus_node_info_unref(introspection_data); return result; -} +} \ No newline at end of file -- 2.7.4 From 643a54dcc089ed438e827bf268268c93530c7546 Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Wed, 25 May 2016 19:35:20 +0900 Subject: [PATCH 08/16] Add check_privilege for shortcut service Signed-off-by: seungha.son Change-Id: I8b65abff1dce4076476674b61bcdf5c4535ca98b --- include/shortcut_service.h | 3 ++- src/shortcut_service.c | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/include/shortcut_service.h b/include/shortcut_service.h index 32b5b58..ded685d 100755 --- a/include/shortcut_service.h +++ b/include/shortcut_service.h @@ -22,5 +22,6 @@ extern int shortcut_service_fini(void); int shortcut_add(GVariant *parameters, GVariant **reply_body); int shortcut_add_widget(GVariant *parameters, GVariant **reply_body); int shortcut_register_dbus_interface(); - +int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_body); +int shortcut_check_privilege(void); /* End of a file */ diff --git a/src/shortcut_service.c b/src/shortcut_service.c index c850bff..73b6839 100755 --- a/src/shortcut_service.c +++ b/src/shortcut_service.c @@ -25,8 +25,6 @@ static GList *_monitoring_list = NULL; -int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_body); - static void _on_name_appeared(GDBusConnection *connection, const gchar *name, const gchar *name_owner, @@ -74,8 +72,10 @@ static void _shortcut_dbus_method_call_handler(GDBusConnection *conn, ret = shortcut_add_widget(parameters, &reply_body); else if (g_strcmp0(method_name, "get_list") == 0) ret = shortcut_get_shortcut_service_list(parameters, &reply_body); + else if (g_strcmp0(method_name, "check_privilege") == 0) + ret = shortcut_check_privilege(); - if (ret == SHORTCUT_ERROR_NONE) { + if (ret == SERVICE_COMMON_ERROR_NONE) { DbgPrint("shortcut service success : %d", ret); g_dbus_method_invocation_return_value( invocation, reply_body); @@ -102,11 +102,13 @@ int shortcut_register_dbus_interface() " " " " " " + " " " " " " " " " " + " " " " " " @@ -127,6 +129,9 @@ int shortcut_register_dbus_interface() " " " " " " + + " " + " " " " " "; @@ -236,6 +241,12 @@ int shortcut_add_widget(GVariant *parameters, GVariant **reply_body) return ret; } +/* check shortcut privilege */ +int shortcut_check_privilege(void) +{ + return SERVICE_COMMON_ERROR_NONE; +} + /*! * MAIN THREAD * Do not try to do anyother operation in these functions -- 2.7.4 From f447ce957a85460137674d5c42490af2330e6e27 Mon Sep 17 00:00:00 2001 From: Hyunho Kang Date: Tue, 7 Jun 2016 16:44:41 +0900 Subject: [PATCH 09/16] Add multi-user feature Change-Id: I219d685577b341fe6a6fbcf0852593a65110884b Signed-off-by: Hyunho Kang --- include/badge_service.h | 20 +-- include/notification_service.h | 35 +++-- include/pkgmgr.h | 4 +- include/service_common.h | 8 +- include/shortcut_service.h | 6 +- src/badge_service.c | 69 +++++---- src/notification_service.c | 316 ++++++++++++++++++++++++++++++----------- src/pkgmgr.c | 99 +++++++------ src/service_common.c | 90 ++++++++++-- src/shortcut_service.c | 36 +++-- 10 files changed, 451 insertions(+), 232 deletions(-) diff --git a/include/badge_service.h b/include/badge_service.h index 29f3d29..478c984 100755 --- a/include/badge_service.h +++ b/include/badge_service.h @@ -19,16 +19,16 @@ extern int badge_service_init(void); extern int badge_service_fini(void); -int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body); -int badge_get_badge_list(GVariant *parameters, GVariant **reply_body); -int badge_insert(GVariant *parameters, GVariant **reply_body); -int badge_delete(GVariant *parameters, GVariant **reply_body); -int badge_set_badge_count(GVariant *parameters, GVariant **reply_body); -int badge_get_badge_count(GVariant *parameters, GVariant **reply_body); -int badge_set_display_option(GVariant *parameters, GVariant **reply_body); -int badge_get_display_option(GVariant *parameters, GVariant **reply_body); -int badge_set_setting_property(GVariant *parameters, GVariant **reply_body); -int badge_get_setting_property(GVariant *parameters, GVariant **reply_body); +int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body, uid_t uid); +int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid); +int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_get_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid); +int badge_set_display_option(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_get_display_option(GVariant *parameters, GVariant **reply_body, uid_t uid); +int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_get_setting_property(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_register_dbus_interface(); /* End of a file */ diff --git a/include/notification_service.h b/include/notification_service.h index c6637aa..1ba4d00 100755 --- a/include/notification_service.h +++ b/include/notification_service.h @@ -19,24 +19,23 @@ extern int notification_service_init(void); extern int notification_service_fini(void); -int notification_server_register(GVariant *parameters, GVariant **reply_body); -int notification_add_noti(GVariant *parameters, GVariant **reply_body); -int notification_update_noti(GVariant *parameters, GVariant **reply_body); -int notification_refresh_noti(GVariant *parameters, GVariant **reply_body); -int notification_del_noti_single(GVariant *parameters, GVariant **reply_body); -int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body); -int notification_set_noti_property(GVariant *parameters, GVariant **reply_body); -int notification_get_noti_property(GVariant *parameters, GVariant **reply_body); -int notification_get_noti_count(GVariant *parameters, GVariant **reply_body); -int notification_update_noti_setting(GVariant *parameters, GVariant **reply_body); -int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_body); -int notification_load_noti_by_tag(GVariant *parameters, GVariant **reply_body); -int notification_load_noti_by_priv_id(GVariant *parameters, GVariant **reply_body); -int notification_load_grouping_list(GVariant *parameters, GVariant **reply_body); -int notification_load_detail_list(GVariant *parameters, GVariant **reply_body); -int notification_get_setting_array(GVariant *parameters, GVariant **reply_body); -int notification_get_setting_by_package_name(GVariant *parameters, GVariant **reply_body); -int notification_load_system_setting(GVariant *parameters, GVariant **reply_body); +int notification_add_noti(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_update_noti(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_refresh_noti(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_del_noti_single(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_set_noti_property(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_get_noti_property(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_get_noti_count(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_update_noti_setting(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_load_noti_by_tag(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_load_noti_by_priv_id(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_load_grouping_list(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_load_detail_list(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_get_setting_array(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_get_setting_by_package_name(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_load_system_setting(GVariant *parameters, GVariant **reply_body, uid_t uid); int notification_register_dbus_interface(); /* End of a file */ diff --git a/include/pkgmgr.h b/include/pkgmgr.h index d00e0f3..9eb3c32 100755 --- a/include/pkgmgr.h +++ b/include/pkgmgr.h @@ -33,7 +33,7 @@ enum pkgmgr_status { extern int pkgmgr_init(void); extern int pkgmgr_fini(void); -extern int pkgmgr_add_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data); -extern void *pkgmgr_del_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data); +extern int pkgmgr_add_event_callback(enum pkgmgr_event_type type, int (*cb)(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data); +extern void *pkgmgr_del_event_callback(enum pkgmgr_event_type type, int (*cb)(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data); /* End of a file */ diff --git a/include/service_common.h b/include/service_common.h index 43f0a48..709aa45 100755 --- a/include/service_common.h +++ b/include/service_common.h @@ -20,6 +20,8 @@ #include #include +#define NORMAL_UID_BASE 5000 + typedef enum { NOTIFICATION_SERVICE = 0, SHORTCUT_SERVICE, @@ -41,6 +43,7 @@ enum service_common_error { typedef struct monitoring_info { int watcher_id; char *bus_name; + uid_t uid; } monitoring_info_s; void print_noti(notification_h noti); @@ -48,8 +51,11 @@ int send_notify(GVariant *body, char *cmd, GList *monitoring_app_list, char *int int service_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, - GList **monitoring_list); + GHashTable **monitoring_hash, + uid_t uid); GDBusConnection *service_common_get_connection(); int service_common_register_dbus_interface(char *introspection_xml, GDBusInterfaceVTable interface_vtable); +uid_t get_sender_uid(const char *sender_name); +void free_monitoring_list(gpointer data); /* End of a file */ diff --git a/include/shortcut_service.h b/include/shortcut_service.h index ded685d..d031dea 100755 --- a/include/shortcut_service.h +++ b/include/shortcut_service.h @@ -19,9 +19,9 @@ extern int shortcut_service_init(void); extern int shortcut_service_fini(void); -int shortcut_add(GVariant *parameters, GVariant **reply_body); -int shortcut_add_widget(GVariant *parameters, GVariant **reply_body); +int shortcut_add(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int shortcut_add_widget(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); int shortcut_register_dbus_interface(); -int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_body); +int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_body, uid_t uid); int shortcut_check_privilege(void); /* End of a file */ diff --git a/src/badge_service.c b/src/badge_service.c index 3b4a51d..92d2b99 100755 --- a/src/badge_service.c +++ b/src/badge_service.c @@ -27,7 +27,7 @@ #include "debug.h" #define PROVIDER_BADGE_INTERFACE_NAME "org.tizen.data_provider_badge_service" -static GList *_monitoring_list = NULL; +static GHashTable *_monitoring_hash = NULL; static void _on_name_appeared(GDBusConnection *connection, const gchar *name, @@ -43,15 +43,9 @@ static void _on_name_vanished(GDBusConnection *connection, { DbgPrint("name vanished : %s", name); monitoring_info_s *info = (monitoring_info_s *)user_data; - if (info) { + DbgPrint("name vanished uid : %d", info->uid); g_bus_unwatch_name(info->watcher_id); - - if (info->bus_name) { - _monitoring_list = g_list_remove(_monitoring_list, info->bus_name); - free(info->bus_name); - } - free(info); } } @@ -61,35 +55,37 @@ static void _badge_dbus_method_call_handler(GDBusConnection *conn, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data) { - /* TODO : sender authority(privilege) check */ DbgPrint("badge method_name: %s", method_name); GVariant *reply_body = NULL; int ret = BADGE_ERROR_INVALID_PARAMETER; + uid_t uid = get_sender_uid(sender); + GList *monitoring_list = NULL; + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, &uid); if (g_strcmp0(method_name, "badge_service_register") == 0) ret = service_register(parameters, &reply_body, sender, - _on_name_appeared, _on_name_vanished, &_monitoring_list); + _on_name_appeared, _on_name_vanished, &_monitoring_hash, uid); else if (g_strcmp0(method_name, "get_badge_existing") == 0) - ret = badge_get_badge_existing(parameters, &reply_body); + ret = badge_get_badge_existing(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_list") == 0) - ret = badge_get_badge_list(parameters, &reply_body); + ret = badge_get_badge_list(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "insert_badge") == 0) - ret = badge_insert(parameters, &reply_body); + ret = badge_insert(parameters, &reply_body, monitoring_list, uid); else if (g_strcmp0(method_name, "delete_badge") == 0) - ret = badge_delete(parameters, &reply_body); + ret = badge_delete(parameters, &reply_body, monitoring_list, uid); else if (g_strcmp0(method_name, "set_badge_count") == 0) - ret = badge_set_badge_count(parameters, &reply_body); + ret = badge_set_badge_count(parameters, &reply_body, monitoring_list, uid); else if (g_strcmp0(method_name, "get_badge_count") == 0) - ret = badge_get_badge_count(parameters, &reply_body); + ret = badge_get_badge_count(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "set_disp_option") == 0) - ret = badge_set_display_option(parameters, &reply_body); + ret = badge_set_display_option(parameters, &reply_body, monitoring_list, uid); else if (g_strcmp0(method_name, "get_disp_option") == 0) - ret = badge_get_display_option(parameters, &reply_body); + ret = badge_get_display_option(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "set_noti_property") == 0) - ret = badge_set_setting_property(parameters, &reply_body); + ret = badge_set_setting_property(parameters, &reply_body, monitoring_list, uid); else if (g_strcmp0(method_name, "get_noti_property") == 0) - ret = badge_get_setting_property(parameters, &reply_body); + ret = badge_get_setting_property(parameters, &reply_body, uid); if (ret == BADGE_ERROR_NONE) { DbgPrint("badge service success : %d", ret); @@ -117,6 +113,7 @@ int badge_register_dbus_interface() " " " " " " + " " " " " " " " @@ -186,7 +183,7 @@ static void _release_badge_info(gpointer data) } /* get_badge_existing */ -int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body) +int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; @@ -214,7 +211,7 @@ int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body) } /* get_list */ -int badge_get_badge_list(GVariant *parameters, GVariant **reply_body) +int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid) { GList *badge_list = NULL; GList *iter_list = NULL; @@ -251,7 +248,7 @@ int badge_get_badge_list(GVariant *parameters, GVariant **reply_body) } /* insert_badge */ -int badge_insert(GVariant *parameters, GVariant **reply_body) +int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; @@ -276,7 +273,7 @@ int badge_insert(GVariant *parameters, GVariant **reply_body) return BADGE_ERROR_OUT_OF_MEMORY; } - ret = send_notify(body, "insert_badge_notify", _monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); + ret = send_notify(body, "insert_badge_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); if (ret != BADGE_ERROR_NONE) { @@ -294,7 +291,7 @@ int badge_insert(GVariant *parameters, GVariant **reply_body) } /* delete_badge */ -int badge_delete(GVariant *parameters, GVariant **reply_body) +int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; @@ -318,7 +315,7 @@ int badge_delete(GVariant *parameters, GVariant **reply_body) ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } - ret = send_notify(body, "delete_badge_notify", _monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); + ret = send_notify(body, "delete_badge_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); if (ret != BADGE_ERROR_NONE) { @@ -335,7 +332,7 @@ int badge_delete(GVariant *parameters, GVariant **reply_body) } /* set_badge_count */ -int badge_set_badge_count(GVariant *parameters, GVariant **reply_body) +int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; @@ -360,7 +357,7 @@ int badge_set_badge_count(GVariant *parameters, GVariant **reply_body) return BADGE_ERROR_OUT_OF_MEMORY; } - ret = send_notify(body, "set_badge_count_notify", _monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); + ret = send_notify(body, "set_badge_count_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); if (ret != BADGE_ERROR_NONE) { @@ -378,7 +375,7 @@ int badge_set_badge_count(GVariant *parameters, GVariant **reply_body) } /* get_badge_count */ -int badge_get_badge_count(GVariant *parameters, GVariant **reply_body) +int badge_get_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; @@ -405,7 +402,7 @@ int badge_get_badge_count(GVariant *parameters, GVariant **reply_body) } /* set_disp_option */ -int badge_set_display_option(GVariant *parameters, GVariant **reply_body) +int badge_set_display_option(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; @@ -432,7 +429,7 @@ int badge_set_display_option(GVariant *parameters, GVariant **reply_body) return BADGE_ERROR_OUT_OF_MEMORY; } - ret = send_notify(body, "set_disp_option_notify", _monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); + ret = send_notify(body, "set_disp_option_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); if (ret != BADGE_ERROR_NONE) { @@ -450,7 +447,7 @@ int badge_set_display_option(GVariant *parameters, GVariant **reply_body) } /* get_disp_option */ -int badge_get_display_option(GVariant *parameters, GVariant **reply_body) +int badge_get_display_option(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; @@ -478,7 +475,7 @@ int badge_get_display_option(GVariant *parameters, GVariant **reply_body) } /* set_noti_property */ -int badge_set_setting_property(GVariant *parameters, GVariant **reply_body) +int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) { int ret = 0; int is_display = 0; @@ -510,7 +507,7 @@ int badge_set_setting_property(GVariant *parameters, GVariant **reply_body) ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } - ret = send_notify(body, "set_disp_option_notify", _monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); + ret = send_notify(body, "set_disp_option_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); if (ret != BADGE_ERROR_NONE) { ErrPrint("failed to send notify:%d\n", ret); @@ -530,7 +527,7 @@ int badge_set_setting_property(GVariant *parameters, GVariant **reply_body) } /* get_noti_property */ -int badge_get_setting_property(GVariant *parameters, GVariant **reply_body) +int badge_get_setting_property(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = 0; char *pkgname = NULL; @@ -563,6 +560,8 @@ int badge_get_setting_property(GVariant *parameters, GVariant **reply_body) HAPI int badge_service_init(void) { int result; + + _monitoring_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_monitoring_list); result = badge_db_init(); if (result != BADGE_ERROR_NONE) { ErrPrint("badge db init fail %d", result); diff --git a/src/notification_service.c b/src/notification_service.c index 0dc7fa5..ff5302b 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -30,7 +30,6 @@ #include "notification_service.h" #include "debug.h" - #include #include #include @@ -38,8 +37,9 @@ #include #define PROVIDER_NOTI_INTERFACE_NAME "org.tizen.data_provider_noti_service" -static GList *_monitoring_list = NULL; -static int _update_noti(GVariant **reply_body, notification_h noti); + +static GHashTable *_monitoring_hash = NULL; +static int _update_noti(GVariant **reply_body, notification_h noti, GList *monitoring_list); /*! * SERVICE HANDLER @@ -63,15 +63,9 @@ static void _on_name_vanished(GDBusConnection *connection, { DbgPrint("name vanished : %s", name); monitoring_info_s *info = (monitoring_info_s *)user_data; - if (info) { + DbgPrint("name vanished uid : %d", info->uid); g_bus_unwatch_name(info->watcher_id); - - if (info->bus_name) { - _monitoring_list = g_list_remove(_monitoring_list, info->bus_name); - free(info->bus_name); - } - free(info); } } @@ -86,40 +80,41 @@ static void _noti_dbus_method_call_handler(GDBusConnection *conn, GVariant *reply_body = NULL; int ret = NOTIFICATION_ERROR_INVALID_OPERATION; + int uid = get_sender_uid(sender); if (g_strcmp0(method_name, "noti_service_register") == 0) ret = service_register(parameters, &reply_body, sender, - _on_name_appeared, _on_name_vanished, &_monitoring_list); + _on_name_appeared, _on_name_vanished, &_monitoring_hash, uid); else if (g_strcmp0(method_name, "update_noti") == 0) - ret = notification_update_noti(parameters, &reply_body); + ret = notification_update_noti(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "add_noti") == 0) - ret = notification_add_noti(parameters, &reply_body); + ret = notification_add_noti(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "refresh_noti") == 0) - ret = notification_refresh_noti(parameters, &reply_body); + ret = notification_refresh_noti(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "del_noti_single") == 0) - ret = notification_del_noti_single(parameters, &reply_body); + ret = notification_del_noti_single(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "del_noti_multiple") == 0) - ret = notification_del_noti_multiple(parameters, &reply_body); + ret = notification_del_noti_multiple(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_noti_count") == 0) - ret = notification_get_noti_count(parameters, &reply_body); + ret = notification_get_noti_count(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "update_noti_setting") == 0) - ret = notification_update_noti_setting(parameters, &reply_body); + ret = notification_update_noti_setting(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "update_noti_sys_setting") == 0) - ret = notification_update_noti_sys_setting(parameters, &reply_body); + ret = notification_update_noti_sys_setting(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "load_noti_by_tag") == 0) - ret = notification_load_noti_by_tag(parameters, &reply_body); + ret = notification_load_noti_by_tag(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "load_noti_by_priv_id") == 0) - ret = notification_load_noti_by_priv_id(parameters, &reply_body); + ret = notification_load_noti_by_priv_id(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "load_noti_grouping_list") == 0) - ret = notification_load_grouping_list(parameters, &reply_body); + ret = notification_load_grouping_list(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "load_noti_detail_list") == 0) - ret = notification_load_detail_list(parameters, &reply_body); + ret = notification_load_detail_list(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_setting_array") == 0) - ret = notification_get_setting_array(parameters, &reply_body); + ret = notification_get_setting_array(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_setting_by_package_name") == 0) - ret = notification_get_setting_by_package_name(parameters, &reply_body); + ret = notification_get_setting_by_package_name(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "load_system_setting") == 0) - ret = notification_load_system_setting(parameters, &reply_body); + ret = notification_load_system_setting(parameters, &reply_body, uid); if (ret == NOTIFICATION_ERROR_NONE) { DbgPrint("notification service success : %d", ret); @@ -148,6 +143,7 @@ int notification_register_dbus_interface() " " " " " " + " " " " " " @@ -161,35 +157,41 @@ int notification_register_dbus_interface() " " " " + " " " " " " " " " " + " " " " " " " " " " " " + " " " " " " " " " " " " + " " " " " " " " " " " " + " " " " " " " " " " " " + " " " " " " @@ -198,6 +200,7 @@ int notification_register_dbus_interface() " " " " " " + " " " " " " @@ -206,6 +209,7 @@ int notification_register_dbus_interface() " " " " " " + " " " " " " @@ -214,24 +218,29 @@ int notification_register_dbus_interface() " " " " " " + " " " " " " " " " " + " " " " " " + " " " " " " " " " " " " + " " " " " " " " + " " " " " " @@ -244,7 +253,7 @@ int notification_register_dbus_interface() } /* add noti */ -static int _add_noti(GVariant **reply_body, notification_h noti) +static int _add_noti(GVariant **reply_body, notification_h noti, GList *monitoring_list) { int ret; int priv_id = NOTIFICATION_PRIV_ID_NONE; @@ -265,7 +274,7 @@ static int _add_noti(GVariant **reply_body, notification_h noti) ErrPrint("cannot make gvariant to noti"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; } - ret = send_notify(body, "add_noti_notify", _monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); + ret = send_notify(body, "add_noti_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); g_variant_unref(body); if (ret != NOTIFICATION_ERROR_NONE) { @@ -283,11 +292,68 @@ static int _add_noti(GVariant **reply_body, notification_h noti) return ret; } -int notification_add_noti(GVariant *parameters, GVariant **reply_body) +static int _validate_and_set_noti_with_uid(uid_t uid, notification_h noti, uid_t *noti_uid) +{ + int ret = NOTIFICATION_ERROR_NONE; + + ret = notification_get_uid(noti, noti_uid); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("notification_get_uid fail ret : %d", ret); + return ret; + } + + if (uid > NORMAL_UID_BASE && uid != *noti_uid) { + ErrPrint("invalid seder uid : %d, noti_uid : %d", uid, *noti_uid); + return NOTIFICATION_ERROR_INVALID_PARAMETER; + } else if (uid <= NORMAL_UID_BASE) { + if (*noti_uid <= NORMAL_UID_BASE) { + if (*noti_uid != uid) + return NOTIFICATION_ERROR_INVALID_PARAMETER; + + DbgPrint("system defualt noti post change noti_uid to default"); + /* + IF system (uid <= NORMAL_UID_BASE) try to send noti without specipic destination uid (using notification_pot API) + Send it to default user (TZ_SYS_DEFAULT_USER) + */ + *noti_uid = tzplatform_getuid(TZ_SYS_DEFAULT_USER); + ret = notification_set_uid(noti, *noti_uid); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("notification_set_uid fail ret : %d", ret); + return ret; + } + DbgPrint("changed noti_uid %d", *noti_uid); + } + } + return ret; +} + +static int _validate_and_set_param_uid_with_uid(uid_t uid, uid_t *param_uid) +{ + int ret = NOTIFICATION_ERROR_NONE; + if (uid > NORMAL_UID_BASE && uid != *param_uid) { + ErrPrint("invalid seder uid : %d, param_uid : %d", uid, *param_uid); + return NOTIFICATION_ERROR_INVALID_PARAMETER; + } else if (uid <= NORMAL_UID_BASE) { + if (*param_uid <= NORMAL_UID_BASE) { + if (*param_uid != uid) + return NOTIFICATION_ERROR_INVALID_PARAMETER; + /* + IF system (uid <= NORMAL_UID_BASE) try to send noti without specipic destination uid (using notification_pot API) + Send it to default user (TZ_SYS_DEFAULT_USER) + */ + *param_uid = tzplatform_getuid(TZ_SYS_DEFAULT_USER); + } + } + return ret; +} + +int notification_add_noti(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; notification_h noti; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t noti_uid = 0; noti = notification_create(NOTIFICATION_TYPE_NOTI); if (noti != NULL) { @@ -295,12 +361,17 @@ int notification_add_noti(GVariant *parameters, GVariant **reply_body) ret = notification_ipc_make_noti_from_gvariant(noti, body); g_variant_unref(body); + ret = _validate_and_set_noti_with_uid(uid, noti, ¬i_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; + + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¬i_uid); if (ret == NOTIFICATION_ERROR_NONE) { ret = notification_noti_check_tag(noti); if (ret == NOTIFICATION_ERROR_NOT_EXIST_ID) - ret = _add_noti(reply_body, noti); + ret = _add_noti(reply_body, noti, monitoring_list); else if (ret == NOTIFICATION_ERROR_ALREADY_EXIST_ID) - ret = _update_noti(reply_body, noti); + ret = _update_noti(reply_body, noti, monitoring_list); } notification_free(noti); @@ -313,7 +384,7 @@ int notification_add_noti(GVariant *parameters, GVariant **reply_body) } /* update noti */ -static int _update_noti(GVariant **reply_body, notification_h noti) +static int _update_noti(GVariant **reply_body, notification_h noti, GList *monitoring_list) { int ret; GVariant *body = NULL; @@ -333,7 +404,7 @@ static int _update_noti(GVariant **reply_body, notification_h noti) return NOTIFICATION_ERROR_IO_ERROR; } - ret = send_notify(body, "update_noti_notify", _monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); + ret = send_notify(body, "update_noti_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); g_variant_unref(body); if (ret != NOTIFICATION_ERROR_NONE) { @@ -350,11 +421,13 @@ static int _update_noti(GVariant **reply_body, notification_h noti) return ret; } -int notification_update_noti(GVariant *parameters, GVariant **reply_body) +int notification_update_noti(GVariant *parameters, GVariant **reply_body, uid_t uid) { notification_h noti; int ret; GVariant *body = NULL; + uid_t noti_uid; + GList *monitoring_list = NULL; noti = notification_create(NOTIFICATION_TYPE_NOTI); if (noti != NULL) { @@ -362,8 +435,13 @@ int notification_update_noti(GVariant *parameters, GVariant **reply_body) ret = notification_ipc_make_noti_from_gvariant(noti, body); g_variant_unref(body); + ret = _validate_and_set_noti_with_uid(uid, noti, ¬i_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; + + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¬i_uid); if (ret == NOTIFICATION_ERROR_NONE) - ret = _update_noti(reply_body, noti); + ret = _update_noti(reply_body, noti, monitoring_list); notification_free(noti); } else { @@ -373,18 +451,23 @@ int notification_update_noti(GVariant *parameters, GVariant **reply_body) } /* load_noti_by_tag */ -int notification_load_noti_by_tag(GVariant *parameters, GVariant **reply_body) +int notification_load_noti_by_tag(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; char *tag = NULL; char *pkgname = NULL; notification_h noti; + uid_t param_uid; noti = notification_create(NOTIFICATION_TYPE_NOTI); if (noti != NULL) { - g_variant_get(parameters, "(&s&s)", &pkgname, &tag); + g_variant_get(parameters, "(&s&si)", &pkgname, &tag, ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; + DbgPrint("_load_noti_by_tag pkgname : %s, tag : %s ", pkgname, tag); - ret = notification_noti_get_by_tag(noti, pkgname, tag); + ret = notification_noti_get_by_tag(noti, pkgname, tag, param_uid); DbgPrint("notification_noti_get_by_tag ret : %d", ret); print_noti(noti); @@ -404,18 +487,23 @@ int notification_load_noti_by_tag(GVariant *parameters, GVariant **reply_body) } /* load_noti_by_priv_id */ -int notification_load_noti_by_priv_id(GVariant *parameters, GVariant **reply_body) +int notification_load_noti_by_priv_id(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; int priv_id = NOTIFICATION_PRIV_ID_NONE; char *pkgname = NULL; notification_h noti; + uid_t param_uid; noti = notification_create(NOTIFICATION_TYPE_NOTI); if (noti != NULL) { - g_variant_get(parameters, "(&si)", &pkgname, &priv_id); + g_variant_get(parameters, "(&sii)", &pkgname, &priv_id, ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; + DbgPrint("load_noti_by_priv_id pkgname : %s, priv_id : %d ", pkgname, priv_id); - ret = notification_noti_get_by_priv_id(noti, pkgname, priv_id); + ret = notification_noti_get_by_priv_id(noti, pkgname, priv_id, param_uid); DbgPrint("notification_noti_get_by_priv_id ret : %d", ret); print_noti(noti); @@ -436,7 +524,7 @@ int notification_load_noti_by_priv_id(GVariant *parameters, GVariant **reply_bod } /* load_noti_grouping_list */ -int notification_load_grouping_list(GVariant *parameters, GVariant **reply_body) +int notification_load_grouping_list(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; notification_h noti; @@ -446,11 +534,15 @@ int notification_load_grouping_list(GVariant *parameters, GVariant **reply_body) notification_list_h list_iter; GVariantBuilder *builder; int count = 0; + uid_t param_uid; - g_variant_get(parameters, "(ii)", &type, &count); + g_variant_get(parameters, "(iii)", &type, &count, ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; DbgPrint("load grouping list type : %d, count : %d ", type, count); - ret = notification_noti_get_grouping_list(type, count, &get_list); + ret = notification_noti_get_grouping_list(type, count, &get_list, param_uid); if (ret != NOTIFICATION_ERROR_NONE) return ret; @@ -481,7 +573,7 @@ int notification_load_grouping_list(GVariant *parameters, GVariant **reply_body) } /* get_setting_array */ -int notification_get_setting_array(GVariant *parameters, GVariant **reply_body) +int notification_get_setting_array(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; GVariant *body; @@ -490,8 +582,14 @@ int notification_get_setting_array(GVariant *parameters, GVariant **reply_body) int i; notification_setting_h setting_array = NULL; notification_setting_h temp; + uid_t param_uid; + + g_variant_get(parameters, "(i)", ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; - ret = noti_setting_get_setting_array(&setting_array, &count); + ret = noti_setting_get_setting_array(&setting_array, &count, param_uid); if (ret != NOTIFICATION_ERROR_NONE) return ret; @@ -520,17 +618,21 @@ int notification_get_setting_array(GVariant *parameters, GVariant **reply_body) } /* get_setting_array */ -int notification_get_setting_by_package_name(GVariant *parameters, GVariant **reply_body) +int notification_get_setting_by_package_name(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; GVariant *body; char *pkgname = NULL; notification_setting_h setting = NULL; + uid_t param_uid; - g_variant_get(parameters, "(&s)", &pkgname); + g_variant_get(parameters, "(&si)", &pkgname, ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; DbgPrint("get setting by pkgname : %s", pkgname); - ret = noti_setting_service_get_setting_by_package_name(pkgname, &setting); + ret = noti_setting_service_get_setting_by_package_name(pkgname, &setting, param_uid); if (ret == NOTIFICATION_ERROR_NONE) { body = notification_ipc_make_gvariant_from_setting(setting); notification_setting_free_notification(setting); @@ -552,13 +654,19 @@ int notification_get_setting_by_package_name(GVariant *parameters, GVariant **re } /* load_system_setting */ -int notification_load_system_setting(GVariant *parameters, GVariant **reply_body) +int notification_load_system_setting(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; GVariant *body; notification_system_setting_h setting = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(i)", ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; - ret = noti_system_setting_load_system_setting(&setting); + ret = noti_system_setting_load_system_setting(&setting, param_uid); if (ret == NOTIFICATION_ERROR_NONE) { body = notification_ipc_make_gvariant_from_system_setting(setting); notification_system_setting_free_system_setting(setting); @@ -581,7 +689,7 @@ int notification_load_system_setting(GVariant *parameters, GVariant **reply_body } /* load_noti_detail_list */ -int notification_load_detail_list(GVariant *parameters, GVariant **reply_body) +int notification_load_detail_list(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; notification_h noti; @@ -593,13 +701,17 @@ int notification_load_detail_list(GVariant *parameters, GVariant **reply_body) int group_id = NOTIFICATION_GROUP_ID_NONE; int priv_id = NOTIFICATION_PRIV_ID_NONE; int count = 0; + uid_t param_uid; - g_variant_get(parameters, "(&siii)", &pkgname, &group_id, &priv_id, &count); + g_variant_get(parameters, "(&siiii)", &pkgname, &group_id, &priv_id, &count, ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; DbgPrint("load detail list pkgname : %s, group_id : %d, priv_id : %d, count : %d ", pkgname, group_id, priv_id, count); ret = notification_noti_get_detail_list(pkgname, group_id, priv_id, - count, &get_list); + count, &get_list, param_uid); if (ret != NOTIFICATION_ERROR_NONE) return ret; @@ -631,10 +743,19 @@ int notification_load_detail_list(GVariant *parameters, GVariant **reply_body) } /* refresh_noti */ -int notification_refresh_noti(GVariant *parameters, GVariant **reply_body) +int notification_refresh_noti(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; - ret = send_notify(parameters, "refresh_noti_notify", _monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); + uid_t param_uid; + GList *monitoring_list = NULL; + + g_variant_get(parameters, "(i)", ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; + + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + ret = send_notify(parameters, "refresh_noti_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to send notify:%d\n", ret); return ret; @@ -651,18 +772,22 @@ int notification_refresh_noti(GVariant *parameters, GVariant **reply_body) } /* del_noti_single */ -int notification_del_noti_single(GVariant *parameters, GVariant **reply_body) +int notification_del_noti_single(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; int num_changes = 0; int priv_id = NOTIFICATION_PRIV_ID_NONE; char *pkgname = NULL; GVariant *body = NULL; + uid_t param_uid; + GList *monitoring_list = NULL; - g_variant_get(parameters, "(&si)", &pkgname, &priv_id); - ret = notification_noti_delete_by_priv_id_get_changes(pkgname, priv_id, &num_changes); + g_variant_get(parameters, "(&sii)", &pkgname, &priv_id, ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; + ret = notification_noti_delete_by_priv_id_get_changes(pkgname, priv_id, &num_changes, param_uid); DbgPrint("priv_id: [%d] num_delete:%d\n", priv_id, num_changes); - if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to delete a notification:%d %d\n", ret, num_changes); return ret; @@ -674,7 +799,8 @@ int notification_del_noti_single(GVariant *parameters, GVariant **reply_body) ErrPrint("cannot make gvariant to noti"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; } - ret = send_notify(body, "delete_single_notify", _monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + ret = send_notify(body, "delete_single_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); g_variant_unref(body); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to send notify:%d\n", ret); @@ -692,7 +818,7 @@ int notification_del_noti_single(GVariant *parameters, GVariant **reply_body) } /* del_noti_multiple */ -int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body) +int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; char *pkgname = NULL; @@ -702,11 +828,16 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body) GVariant *deleted_noti_list; GVariantBuilder *builder; int i; + uid_t param_uid; + GList *monitoring_list = NULL; - g_variant_get(parameters, "(&si)", &pkgname, &type); + g_variant_get(parameters, "(&sii)", &pkgname, &type, ¶m_uid); DbgPrint("pkgname: [%s] type: [%d]\n", pkgname, type); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; - ret = notification_noti_delete_all(type, pkgname, &num_deleted, &list_deleted); + ret = notification_noti_delete_all(type, pkgname, &num_deleted, &list_deleted, param_uid); DbgPrint("ret: [%d] num_deleted: [%d]\n", ret, num_deleted); if (ret != NOTIFICATION_ERROR_NONE) { @@ -723,7 +854,8 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body) g_variant_builder_add(builder, "(i)", *(list_deleted + i)); } deleted_noti_list = g_variant_new("(a(i))", builder); - ret = send_notify(deleted_noti_list, "delete_multiple_notify", _monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + ret = send_notify(deleted_noti_list, "delete_multiple_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); g_variant_builder_unref(builder); g_variant_unref(deleted_noti_list); @@ -745,7 +877,7 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body) } /* get_noti_count */ -int notification_get_noti_count(GVariant *parameters, GVariant **reply_body) +int notification_get_noti_count(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; notification_type_e type = NOTIFICATION_TYPE_NONE; @@ -753,11 +885,17 @@ int notification_get_noti_count(GVariant *parameters, GVariant **reply_body) int group_id = NOTIFICATION_GROUP_ID_NONE; int priv_id = NOTIFICATION_PRIV_ID_NONE; int noti_count = 0; + uid_t param_uid; - g_variant_get(parameters, "(i&sii)", &type, &pkgname, &group_id, &priv_id); + g_variant_get(parameters, "(i&siii)", &type, &pkgname, &group_id, &priv_id, ¶m_uid); + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("_validate_uid fail ret : %d", ret); + return NOTIFICATION_ERROR_IO_ERROR; + } ret = notification_noti_get_count(type, pkgname, group_id, priv_id, - ¬i_count); + ¬i_count, param_uid); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to get count : %d\n", ret); return ret; @@ -773,23 +911,29 @@ int notification_get_noti_count(GVariant *parameters, GVariant **reply_body) } /* update_noti_setting */ -int notification_update_noti_setting(GVariant *parameters, GVariant **reply_body) +int notification_update_noti_setting(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; char *pkgname = NULL; int allow_to_notify = 0; int do_not_disturb_except = 0; int visivility_class = 0; + uid_t param_uid; - g_variant_get(parameters, "(&siii)", + g_variant_get(parameters, "(&siiii)", &pkgname, &allow_to_notify, &do_not_disturb_except, - &visivility_class); + &visivility_class, + ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; DbgPrint("package_name: [%s] allow_to_notify: [%d] do_not_disturb_except: [%d] visivility_class: [%d]\n", pkgname, allow_to_notify, do_not_disturb_except, visivility_class); - ret = notification_setting_db_update(pkgname, allow_to_notify, do_not_disturb_except, visivility_class); + ret = notification_setting_db_update(pkgname, allow_to_notify, do_not_disturb_except, visivility_class, param_uid); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to setting db update : %d\n", ret); return ret; @@ -805,18 +949,24 @@ int notification_update_noti_setting(GVariant *parameters, GVariant **reply_body } /* update_noti_sys_setting */ -int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_body) +int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; int do_not_disturb = 0; int visivility_class = 0; + uid_t param_uid; - g_variant_get(parameters, "(ii)", + g_variant_get(parameters, "(iii)", &do_not_disturb, - &visivility_class); + &visivility_class, + ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) + return ret; DbgPrint("do_not_disturb [%d] visivility_class [%d]\n", do_not_disturb, visivility_class); - ret = notification_setting_db_update_system_setting(do_not_disturb, visivility_class); + ret = notification_setting_db_update_system_setting(do_not_disturb, visivility_class, param_uid); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to setting db update system setting : %d\n", ret); return ret; @@ -841,7 +991,7 @@ static void _notification_data_init(void) notification_list_h noti_list_head = NULL; notification_type_e noti_type = NOTIFICATION_TYPE_NONE; - notification_noti_get_grouping_list(NOTIFICATION_TYPE_NONE, -1, ¬i_list); + notification_noti_get_grouping_list(NOTIFICATION_TYPE_NONE, -1, ¬i_list, NOTIFICATION_GLOBAL_UID); noti_list_head = noti_list; while (noti_list != NULL) { @@ -864,15 +1014,15 @@ static void _notification_data_init(void) notification_free_list(noti_list_head); } -static int _package_install_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data) +static int _package_install_cb(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value, void *data) { - notification_setting_insert_package(pkgname); + notification_setting_insert_package_for_uid(pkgname, uid); return 0; } -static int _package_uninstall_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data) +static int _package_uninstall_cb(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value, void *data) { - notification_setting_delete_package(pkgname); + notification_setting_delete_package_for_uid(pkgname, uid); return 0; } @@ -883,6 +1033,8 @@ static int _package_uninstall_cb(const char *pkgname, enum pkgmgr_status status, HAPI int notification_service_init(void) { int result; + + _monitoring_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_monitoring_list); result = notification_db_init(); if (result != NOTIFICATION_ERROR_NONE) { ErrPrint("notification db init fail %d", result); @@ -895,7 +1047,7 @@ HAPI int notification_service_init(void) return NOTIFICATION_ERROR_IO_ERROR; } _notification_data_init(); - notification_setting_refresh_setting_table(); + notification_setting_refresh_setting_table(tzplatform_getuid(TZ_SYS_DEFAULT_USER)); pkgmgr_init(); pkgmgr_add_event_callback(PKGMGR_EVENT_INSTALL, _package_install_cb, NULL); diff --git a/src/pkgmgr.c b/src/pkgmgr.c index bb42a3a..dc2f2e5 100755 --- a/src/pkgmgr.c +++ b/src/pkgmgr.c @@ -29,6 +29,7 @@ #include "conf.h" struct item { + uid_t uid; char *pkgname; char *icon; @@ -57,82 +58,82 @@ static struct { }; struct event_item { - int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data); + int (*cb)(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value, void *data); void *data; }; -static inline void invoke_install_event_handler(const char *pkgname, enum pkgmgr_status status, double value) +static inline void invoke_install_event_handler(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value) { Eina_List *l; struct event_item *item; EINA_LIST_FOREACH(s_info.install_event, l, item) { if (item->cb) - item->cb(pkgname, status, value, item->data); + item->cb(uid, pkgname, status, value, item->data); } } -static inline void invoke_uninstall_event_handler(const char *pkgname, enum pkgmgr_status status, double value) +static inline void invoke_uninstall_event_handler(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value) { Eina_List *l; struct event_item *item; EINA_LIST_FOREACH(s_info.uninstall_event, l, item) { if (item->cb) - item->cb(pkgname, status, value, item->data); + item->cb(uid, pkgname, status, value, item->data); } } -static inline void invoke_update_event_handler(const char *pkgname, enum pkgmgr_status status, double value) +static inline void invoke_update_event_handler(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value) { Eina_List *l; struct event_item *item; EINA_LIST_FOREACH(s_info.update_event, l, item) { if (item->cb) - item->cb(pkgname, status, value, item->data); + item->cb(uid, pkgname, status, value, item->data); } } -static inline void invoke_download_event_handler(const char *pkgname, enum pkgmgr_status status, double value) +static inline void invoke_download_event_handler(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value) { Eina_List *l; struct event_item *item; EINA_LIST_FOREACH(s_info.download_event, l, item) { if (item->cb) - item->cb(pkgname, status, value, item->data); + item->cb(uid, pkgname, status, value, item->data); } } -static inline void invoke_recover_event_handler(const char *pkgname, enum pkgmgr_status status, double value) +static inline void invoke_recover_event_handler(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value) { Eina_List *l; struct event_item *item; EINA_LIST_FOREACH(s_info.recover_event, l, item) { if (item->cb) - item->cb(pkgname, status, value, item->data); + item->cb(uid, pkgname, status, value, item->data); } } -static inline void invoke_callback(const char *pkgname, struct item *item, double value) +static inline void invoke_callback(uid_t uid, const char *pkgname, struct item *item, double value) { switch (item->type) { case PKGMGR_EVENT_DOWNLOAD: - invoke_download_event_handler(pkgname, item->status, value); + invoke_download_event_handler(uid, pkgname, item->status, value); break; case PKGMGR_EVENT_UNINSTALL: - invoke_uninstall_event_handler(pkgname, item->status, value); + invoke_uninstall_event_handler(uid, pkgname, item->status, value); break; case PKGMGR_EVENT_INSTALL: - invoke_install_event_handler(pkgname, item->status, value); + invoke_install_event_handler(uid, pkgname, item->status, value); break; case PKGMGR_EVENT_UPDATE: - invoke_update_event_handler(pkgname, item->status, value); + invoke_update_event_handler(uid, pkgname, item->status, value); break; case PKGMGR_EVENT_RECOVER: - invoke_recover_event_handler(pkgname, item->status, value); + invoke_recover_event_handler(uid, pkgname, item->status, value); break; default: ErrPrint("Unknown type: %d\n", item->type); @@ -167,7 +168,7 @@ static inline int is_valid_status(struct item *item, const char *status) return !strcasecmp(status, expected_status); } -static struct item *find_item(const char *pkgname) +static struct item *find_item(const char *pkgname, uid_t uid) { Eina_List *l; struct item *item; @@ -178,7 +179,7 @@ static struct item *find_item(const char *pkgname) } EINA_LIST_FOREACH(s_info.item_list, l, item) { - if (strcmp(item->pkgname, pkgname)) + if (uid != item->uid || strcmp(item->pkgname, pkgname)) continue; return item; @@ -188,7 +189,7 @@ static struct item *find_item(const char *pkgname) return NULL; } -static int start_cb(const char *pkgname, const char *val, void *data) +static int start_cb(uid_t uid, const char *pkgname, const char *val, void *data) { struct item *item; @@ -207,6 +208,7 @@ static int start_cb(const char *pkgname, const char *val, void *data) return SERVICE_COMMON_ERROR_OUT_OF_MEMORY; } + item->uid = uid; item->status = PKGMGR_STATUS_START; if (!strcasecmp(val, "download")) { @@ -225,20 +227,19 @@ static int start_cb(const char *pkgname, const char *val, void *data) ErrPrint("Invalid val: %s\n", val); return SERVICE_COMMON_ERROR_INVALID_PARAMETER; } - s_info.item_list = eina_list_append(s_info.item_list, item); - invoke_callback(pkgname, item, 0.0f); + invoke_callback(uid, pkgname, item, 0.0f); return SERVICE_COMMON_ERROR_NONE; } -static int icon_path_cb(const char *pkgname, const char *val, void *data) +static int icon_path_cb(uid_t uid, const char *pkgname, const char *val, void *data) { struct item *item; DbgPrint("[%s] %s\n", pkgname, val); - item = find_item(pkgname); + item = find_item(pkgname, uid); if (!item) return SERVICE_COMMON_ERROR_NOT_EXIST; @@ -254,13 +255,13 @@ static int icon_path_cb(const char *pkgname, const char *val, void *data) return SERVICE_COMMON_ERROR_NONE; } -static int command_cb(const char *pkgname, const char *val, void *data) +static int command_cb(uid_t uid, const char *pkgname, const char *val, void *data) { struct item *item; DbgPrint("[%s] %s\n", pkgname, val); - item = find_item(pkgname); + item = find_item(pkgname, uid); if (!item) return SERVICE_COMMON_ERROR_NOT_EXIST; @@ -270,34 +271,34 @@ static int command_cb(const char *pkgname, const char *val, void *data) } item->status = PKGMGR_STATUS_COMMAND; - invoke_callback(pkgname, item, 0.0f); + invoke_callback(uid, pkgname, item, 0.0f); return SERVICE_COMMON_ERROR_NONE; } -static int error_cb(const char *pkgname, const char *val, void *data) +static int error_cb(uid_t uid, const char *pkgname, const char *val, void *data) { /* val = error */ struct item *item; DbgPrint("[%s] %s\n", pkgname, val); - item = find_item(pkgname); + item = find_item(pkgname, uid); if (!item) return SERVICE_COMMON_ERROR_NOT_EXIST; item->status = PKGMGR_STATUS_ERROR; - invoke_callback(pkgname, item, 0.0f); + invoke_callback(uid, pkgname, item, 0.0f); return SERVICE_COMMON_ERROR_NONE; } -static int change_pkgname_cb(const char *pkgname, const char *val, void *data) +static int change_pkgname_cb(uid_t uid, const char *pkgname, const char *val, void *data) { struct item *item; char *new_pkgname; DbgPrint("[%s] %s\n", pkgname, val); - item = find_item(pkgname); + item = find_item(pkgname, uid); if (!item) return SERVICE_COMMON_ERROR_NOT_EXIST; @@ -312,7 +313,7 @@ static int change_pkgname_cb(const char *pkgname, const char *val, void *data) return SERVICE_COMMON_ERROR_NONE; } -static int download_cb(const char *pkgname, const char *val, void *data) +static int download_cb(uid_t uid, const char *pkgname, const char *val, void *data) { /* val = integer */ struct item *item; @@ -320,7 +321,7 @@ static int download_cb(const char *pkgname, const char *val, void *data) DbgPrint("[%s] %s\n", pkgname, val); - item = find_item(pkgname); + item = find_item(pkgname, uid); if (!item) { DbgPrint("ITEM is not started from the start_cb\n"); return SERVICE_COMMON_ERROR_INVALID_PARAMETER; @@ -349,11 +350,11 @@ static int download_cb(const char *pkgname, const char *val, void *data) value = (double)SERVICE_COMMON_ERROR_INVALID_PARAMETER; } - invoke_download_event_handler(pkgname, item->status, value); + invoke_download_event_handler(uid, pkgname, item->status, value); return SERVICE_COMMON_ERROR_NONE; } -static int progress_cb(const char *pkgname, const char *val, void *data) +static int progress_cb(uid_t uid, const char *pkgname, const char *val, void *data) { /* val = integer */ struct item *item; @@ -361,7 +362,7 @@ static int progress_cb(const char *pkgname, const char *val, void *data) DbgPrint("[%s] %s\n", pkgname, val); - item = find_item(pkgname); + item = find_item(pkgname, uid); if (!item) { ErrPrint("ITEM is not started from the start_cb\n"); return SERVICE_COMMON_ERROR_INVALID_PARAMETER; @@ -385,23 +386,23 @@ static int progress_cb(const char *pkgname, const char *val, void *data) value = (double)SERVICE_COMMON_ERROR_INVALID_PARAMETER; } - invoke_callback(pkgname, item, value); + invoke_callback(uid, pkgname, item, value); return SERVICE_COMMON_ERROR_NONE; } -static int end_cb(const char *pkgname, const char *val, void *data) +static int end_cb(uid_t uid, const char *pkgname, const char *val, void *data) { struct item *item; DbgPrint("[%s] %s\n", pkgname, val); - item = find_item(pkgname); + item = find_item(pkgname, uid); if (!item) return SERVICE_COMMON_ERROR_NOT_EXIST; item->status = !strcasecmp(val, "ok") ? PKGMGR_STATUS_END : PKGMGR_STATUS_ERROR; - invoke_callback(pkgname, item, 0.0f); + invoke_callback(uid, pkgname, item, 0.0f); s_info.item_list = eina_list_remove(s_info.item_list, item); free(item->icon); @@ -412,7 +413,7 @@ static int end_cb(const char *pkgname, const char *val, void *data) static struct pkgmgr_handler { const char *key; - int (*func)(const char *package, const char *val, void *data); + int (*func)(uid_t uid, const char *package, const char *val, void *data); } handler[] = { { "install_percent", progress_cb }, { "download_percent", download_cb }, @@ -425,11 +426,7 @@ static struct pkgmgr_handler { { NULL, NULL }, }; -#ifdef __FEATURE_TIZEN_2_4_PKGMGR__ -static int pkgmgr_cb(int req_id, const char *type, const char *pkgname, const char *key, const char *val, const void *pmsg, void *data) -#else /* __FEATURE_TIZEN_2_4_PKGMGR__ */ static int pkgmgr_cb(uid_t target_uid, int req_id, const char *type, const char *pkgname, const char *key, const char *val, const void *pmsg, void *data) -#endif /* __FEATURE_TIZEN_2_4_PKGMGR__ */ { register int i; int ret; @@ -438,10 +435,10 @@ static int pkgmgr_cb(uid_t target_uid, int req_id, const char *type, const char if (strcasecmp(key, handler[i].key)) continue; - ret = handler[i].func(pkgname, val, data); + ret = handler[i].func(target_uid, pkgname, val, data); if (ret < 0) { - DbgPrint("REQ[%d] pkgname[%s], type[%s], key[%s], val[%s], ret = %d\n", - req_id, pkgname, type, key, val, ret); + DbgPrint("REQ[%d], UID[%d], pkgname[%s], type[%s], key[%s], val[%s], ret = %d\n", + req_id, target_uid, pkgname, type, key, val, ret); } } @@ -505,7 +502,7 @@ HAPI int pkgmgr_fini(void) return SERVICE_COMMON_ERROR_NONE; } -HAPI int pkgmgr_add_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data) +HAPI int pkgmgr_add_event_callback(enum pkgmgr_event_type type, int (*cb)(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data) { struct event_item *item; @@ -542,7 +539,7 @@ HAPI int pkgmgr_add_event_callback(enum pkgmgr_event_type type, int (*cb)(const return SERVICE_COMMON_ERROR_NONE; } -HAPI void *pkgmgr_del_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data) +HAPI void *pkgmgr_del_event_callback(enum pkgmgr_event_type type, int (*cb)(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data) { struct event_item *item; Eina_List *l; diff --git a/src/service_common.c b/src/service_common.c index a66ff23..d5a7279 100755 --- a/src/service_common.c +++ b/src/service_common.c @@ -57,6 +57,61 @@ void print_noti(notification_h noti) DbgPrint("provider print_noti vibration_path = %s %d", vibration_path, type); } +static void _free_monitoring_info(gpointer data) +{ + monitoring_info_s *info = (monitoring_info_s *)data; + if (info) { + free(info->bus_name); + g_bus_unwatch_name(info->watcher_id); + free(info); + } +} + +void free_monitoring_list(gpointer data) +{ + GList *monitoring_list = (GList *)data; + g_list_free_full(monitoring_list, _free_monitoring_info); +} + +uid_t get_sender_uid(const char *sender_name) +{ + GDBusMessage *msg = NULL; + GDBusMessage *reply = NULL; + GError *err = NULL; + GVariant *body; + uid_t uid = 0; + + msg = g_dbus_message_new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus", + "org.freedesktop.DBus", "GetConnectionUnixUser"); + if (!msg) { + LOGE("Can't allocate new method call"); + goto out; + } + + g_dbus_message_set_body(msg, g_variant_new("(s)", sender_name)); + reply = g_dbus_connection_send_message_with_reply_sync(_gdbus_conn, msg, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &err); + + if (!reply) { + if (err != NULL) { + LOGE("Failed to get uid [%s]", err->message); + g_error_free(err); + } + goto out; + } + + body = g_dbus_message_get_body(reply); + g_variant_get(body, "(u)", &uid); + +out: + if (msg) + g_object_unref(msg); + if (reply) + g_object_unref(reply); + + return uid; +} + int send_notify(GVariant *body, char *cmd, GList *monitoring_app_list, char *interface_name) { GError *err = NULL; @@ -103,21 +158,32 @@ static int _monitoring_app_list_compare_cb(gconstpointer a, gconstpointer b) } int service_register(GVariant *parameters, GVariant **reply_body, const gchar *sender, - GBusNameAppearedCallback name_appeared_handler, - GBusNameVanishedCallback name_vanished_handler, - GList **monitoring_list) + GBusNameAppearedCallback name_appeared_handler, + GBusNameVanishedCallback name_vanished_handler, + GHashTable **monitoring_hash, + uid_t uid) { - GList *added_list; + GList *added_list = NULL; const char *bus_name = sender; monitoring_info_s *m_info = NULL; + uid_t request_uid = 0; + GList *monitoring_list = NULL; + int *hash_key; if (sender == NULL) return SERVICE_COMMON_ERROR_IO_ERROR; - added_list = g_list_find_custom(*monitoring_list, bus_name, + g_variant_get(parameters, "(i)", &request_uid); + if (uid > NORMAL_UID_BASE && uid != request_uid) + return SERVICE_COMMON_ERROR_IO_ERROR; + + DbgPrint("service_register : uid %d , request_uid %d", uid, request_uid); + monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, &request_uid); + added_list = g_list_find_custom(monitoring_list, bus_name, (GCompareFunc)_monitoring_app_list_compare_cb); if (added_list == NULL) { + DbgPrint("add new sender to list"); m_info = (monitoring_info_s *)calloc(1, sizeof(monitoring_info_s)); if (m_info == NULL) { ErrPrint("Can not alloc monitoring_info_s"); @@ -142,9 +208,14 @@ int service_register(GVariant *parameters, GVariant **reply_body, const gchar *s DbgPrint("watch on %s success", bus_name); } - *monitoring_list = g_list_append(*monitoring_list, strdup(bus_name)); + monitoring_list = g_list_append(monitoring_list, strdup(bus_name)); DbgPrint("service_register : register success sender is %s , length : %d", - sender, g_list_length(*monitoring_list)); + sender, g_list_length(monitoring_list)); + if (g_hash_table_lookup(*monitoring_hash, &request_uid) == NULL) { + hash_key = (int *)calloc(1, sizeof(int)); + *hash_key = request_uid; + g_hash_table_insert(*monitoring_hash, hash_key, monitoring_list); + } } else { ErrPrint("service_register : register sender %s already exist", sender); @@ -154,11 +225,10 @@ int service_register(GVariant *parameters, GVariant **reply_body, const gchar *s if (*reply_body == NULL) { free(m_info->bus_name); free(m_info); - *monitoring_list = g_list_remove(*monitoring_list, bus_name); + monitoring_list = g_list_remove(monitoring_list, bus_name); ErrPrint("cannot make reply_body"); return SERVICE_COMMON_ERROR_OUT_OF_MEMORY; } - return SERVICE_COMMON_ERROR_NONE; } @@ -235,4 +305,4 @@ out: g_dbus_node_info_unref(introspection_data); return result; -} \ No newline at end of file +} diff --git a/src/shortcut_service.c b/src/shortcut_service.c index 73b6839..1184bf6 100755 --- a/src/shortcut_service.c +++ b/src/shortcut_service.c @@ -22,8 +22,7 @@ #include "debug.h" #define PROVIDER_SHORTCUT_INTERFACE_NAME "org.tizen.data_provider_shortcut_service" - -static GList *_monitoring_list = NULL; +static GHashTable *_monitoring_hash = NULL; static void _on_name_appeared(GDBusConnection *connection, const gchar *name, @@ -39,17 +38,10 @@ static void _on_name_vanished(GDBusConnection *connection, { DbgPrint("name vanished : %s", name); monitoring_info_s *info = (monitoring_info_s *)user_data; - if (info) { + DbgPrint("name vanished uid : %d", info->uid); g_bus_unwatch_name(info->watcher_id); - - if (info->bus_name) { - _monitoring_list = g_list_remove(_monitoring_list, info->bus_name); - free(info->bus_name); - } - free(info); } - } static void _shortcut_dbus_method_call_handler(GDBusConnection *conn, @@ -62,16 +54,19 @@ static void _shortcut_dbus_method_call_handler(GDBusConnection *conn, DbgPrint("shortcut method_name: %s", method_name); GVariant *reply_body = NULL; int ret = SHORTCUT_ERROR_NOT_SUPPORTED; + uid_t uid = get_sender_uid(sender); + GList *monitoring_list = NULL; + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, &uid); if (g_strcmp0(method_name, "shortcut_service_register") == 0) ret = service_register(parameters, &reply_body, sender, - _on_name_appeared, _on_name_vanished, &_monitoring_list); + _on_name_appeared, _on_name_vanished, &_monitoring_hash, uid); else if (g_strcmp0(method_name, "add_shortcut") == 0) - ret = shortcut_add(parameters, &reply_body); + ret = shortcut_add(parameters, &reply_body, monitoring_list, uid); else if (g_strcmp0(method_name, "add_shortcut_widget") == 0) - ret = shortcut_add_widget(parameters, &reply_body); + ret = shortcut_add_widget(parameters, &reply_body, monitoring_list, uid); else if (g_strcmp0(method_name, "get_list") == 0) - ret = shortcut_get_shortcut_service_list(parameters, &reply_body); + ret = shortcut_get_shortcut_service_list(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "check_privilege") == 0) ret = shortcut_check_privilege(); @@ -101,6 +96,7 @@ int shortcut_register_dbus_interface() " " " " " " + " " " " " " @@ -158,7 +154,7 @@ static void _release_shortcut_info(gpointer data) } /* get_list */ -int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_body) +int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_body, uid_t uid) { int count; GList *shortcut_list = NULL; @@ -202,11 +198,11 @@ int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_bo } /* add_shortcut */ -int shortcut_add(GVariant *parameters, GVariant **reply_body) +int shortcut_add(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) { int ret = SERVICE_COMMON_ERROR_NONE; - ret = send_notify(parameters, "add_shortcut_notify", _monitoring_list, PROVIDER_SHORTCUT_INTERFACE_NAME); + ret = send_notify(parameters, "add_shortcut_notify", monitoring_list, PROVIDER_SHORTCUT_INTERFACE_NAME); if (ret != SERVICE_COMMON_ERROR_NONE) { ErrPrint("failed to send notify:%d\n", ret); return ret; @@ -222,11 +218,11 @@ int shortcut_add(GVariant *parameters, GVariant **reply_body) } /* add_shortcut_widget */ -int shortcut_add_widget(GVariant *parameters, GVariant **reply_body) +int shortcut_add_widget(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) { int ret = SERVICE_COMMON_ERROR_NONE; - ret = send_notify(parameters, "add_shortcut_widget_notify", _monitoring_list, PROVIDER_SHORTCUT_INTERFACE_NAME); + ret = send_notify(parameters, "add_shortcut_widget_notify", monitoring_list, PROVIDER_SHORTCUT_INTERFACE_NAME); if (ret != SERVICE_COMMON_ERROR_NONE) { ErrPrint("failed to send notify:%d\n", ret); return ret; @@ -255,7 +251,7 @@ HAPI int shortcut_service_init(void) { DbgPrint("Successfully initiated\n"); int result; - + _monitoring_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_monitoring_list); result = shortcut_register_dbus_interface(); if (result != SERVICE_COMMON_ERROR_NONE) { ErrPrint("shortcut register dbus fail %d", result); -- 2.7.4 From 80895f44cd939544948c207604fea3c886bbf18a Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Fri, 10 Jun 2016 17:10:21 +0900 Subject: [PATCH 10/16] Exclude shortcut package from wearable Signed-off-by: seungha.son Change-Id: I058747689c64c48c981ff9106c80e6f49bd9e070 --- CMakeLists.txt | 107 ++++++++++++++++++++++++------------ include/service_common.h | 4 +- packaging/data-provider-master.spec | 4 +- src/main.c | 12 ++-- src/service_common.c | 2 + 5 files changed, 87 insertions(+), 42 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39b3d46..72edd7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,31 +6,56 @@ SET(EXEC_PREFIX "\${prefix}") SET(LIBDIR ${LIB_INSTALL_DIR}) SET(INCLUDEDIR "\${prefix}/include") - -INCLUDE(FindPkgConfig) -pkg_check_modules(pkg REQUIRED - dlog - aul - vconf - sqlite3 - db-util - glib-2.0 - gio-2.0 - bundle - ecore - eina - pkgmgr - notification - badge - libsmack - shortcut - pkgmgr-info - libsystemd-daemon - capi-appfw-app-manager - cynara-client - cynara-session - cynara-creds-socket -) +IF (MOBILE) + INCLUDE(FindPkgConfig) + pkg_check_modules(pkg REQUIRED + dlog + aul + vconf + sqlite3 + db-util + glib-2.0 + gio-2.0 + bundle + ecore + eina + pkgmgr + notification + badge + shortcut + libsmack + pkgmgr-info + libsystemd-daemon + capi-appfw-app-manager + cynara-client + cynara-session + cynara-creds-socket + ) +ELSEIF (WEARABLE) + INCLUDE(FindPkgConfig) + pkg_check_modules(pkg REQUIRED + dlog + aul + vconf + sqlite3 + db-util + glib-2.0 + gio-2.0 + bundle + ecore + eina + pkgmgr + notification + badge + libsmack + pkgmgr-info + libsystemd-daemon + capi-appfw-app-manager + cynara-client + cynara-session + cynara-creds-socket + ) +ENDIF (MOBILE) SET(PACKAGE "${PROJECT_NAME}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Winline -Werror -fno-builtin-malloc -fno-omit-frame-pointer -g -fPIE") @@ -61,16 +86,28 @@ ELSEIF (WEARABLE) ADD_DEFINITIONS("-DWEARABLE") ENDIF (MOBILE) -SET(BUILD_SOURCE - src/main.c - src/util.c - src/pkgmgr.c - src/shortcut_service.c - src/badge_service.c - src/notification_service.c - src/service_common.c - src/critical_log.c -) +IF (MOBILE) + SET(BUILD_SOURCE + src/main.c + src/util.c + src/pkgmgr.c + src/badge_service.c + src/notification_service.c + src/service_common.c + src/critical_log.c + src/shortcut_service.c + ) +ELSEIF (WEARABLE) + SET(BUILD_SOURCE + src/main.c + src/util.c + src/pkgmgr.c + src/badge_service.c + src/notification_service.c + src/service_common.c + src/critical_log.c + ) +ENDIF (MOBILE) STRING(REPLACE "-L-l" "-l" pkg_fixed_LDFLAGS ${pkg_LDFLAGS}) STRING(REPLACE "-l" " -l" pkg_LDFLAGS ${pkg_fixed_LDFLAGS}) diff --git a/include/service_common.h b/include/service_common.h index 709aa45..5cafa69 100755 --- a/include/service_common.h +++ b/include/service_common.h @@ -17,8 +17,10 @@ #include #include #include -#include #include +#ifndef WEARABLE +#include +#endif #define NORMAL_UID_BASE 5000 diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index 23c4309..5fcf011 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -27,7 +27,9 @@ BuildRequires: pkgconfig(pkgmgr) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(notification) BuildRequires: pkgconfig(badge) +%if "%{profile}" == "mobile" BuildRequires: pkgconfig(shortcut) +%endif BuildRequires: pkgconfig(libsystemd-daemon) BuildRequires: pkgconfig(cynara-client) BuildRequires: pkgconfig(cynara-session) @@ -56,7 +58,7 @@ export FFLAGS="${FFLAGS} -DTIZEN_ENGINEER_MODE" export ENGINEER=true %endif -%if "%{_repository}" == "wearable" +%if "%{profile}" == "wearable" export MOBILE=Off export WEARABLE=On %else diff --git a/src/main.c b/src/main.c index 05c4a7b..8e44bcf 100755 --- a/src/main.c +++ b/src/main.c @@ -37,9 +37,11 @@ #include "util.h" #include "critical_log.h" #include "service_common.h" -#include "shortcut_service.h" #include "notification_service.h" #include "badge_service.h" +#ifndef WEARABLE +#include "shortcut_service.h" +#endif static void lang_key_changed_cb(keynode_t *node EINA_UNUSED, void *first) { @@ -70,11 +72,11 @@ static inline int app_create(void) DbgPrint("VCONFKEY_LANGSET notify key chenaged: %d\n", ret); lang_key_changed_cb(NULL, NULL); - +#ifndef WEARABLE ret = shortcut_service_init(); if (ret < 0) DbgPrint("shortcut: %d\n", ret); - +#endif ret = notification_service_init(); if (ret < 0) DbgPrint("noti: %d\n", ret); @@ -97,11 +99,11 @@ static inline int app_terminate(void) ret = notification_service_fini(); if (ret < 0) DbgPrint("noti: %d\n", ret); - +#ifndef WEARABLE ret = shortcut_service_fini(); if (ret < 0) DbgPrint("shortcut: %d\n", ret); - +#endif DbgPrint("Terminated\n"); return 0; } diff --git a/src/service_common.c b/src/service_common.c index d5a7279..31e1863 100755 --- a/src/service_common.c +++ b/src/service_common.c @@ -28,7 +28,9 @@ #include "notification_service.h" #include "badge_service.h" +#ifndef WEARABLE #include "shortcut_service.h" +#endif #define PROVIDER_BUS_NAME "org.tizen.data_provider_service" #define PROVIDER_OBJECT_PATH "/org/tizen/data_provider_service" -- 2.7.4 From 2044f61581bd0282b79e41b5735de0d3e4c4bfbd Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Tue, 14 Jun 2016 10:04:06 +0900 Subject: [PATCH 11/16] Exclude shortcut package from only wearable profile Signed-off-by: seungha.son Change-Id: I5402ebbb5c61be30283927592dfcaa72d4bccb4e --- CMakeLists.txt | 16 ++++++++-------- packaging/data-provider-master.spec | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 72edd7a..6026500 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ SET(EXEC_PREFIX "\${prefix}") SET(LIBDIR ${LIB_INSTALL_DIR}) SET(INCLUDEDIR "\${prefix}/include") -IF (MOBILE) +IF (WEARABLE) INCLUDE(FindPkgConfig) pkg_check_modules(pkg REQUIRED dlog @@ -22,7 +22,6 @@ IF (MOBILE) pkgmgr notification badge - shortcut libsmack pkgmgr-info libsystemd-daemon @@ -31,7 +30,7 @@ IF (MOBILE) cynara-session cynara-creds-socket ) -ELSEIF (WEARABLE) +ELSE (WEARABLE) INCLUDE(FindPkgConfig) pkg_check_modules(pkg REQUIRED dlog @@ -47,6 +46,7 @@ ELSEIF (WEARABLE) pkgmgr notification badge + shortcut libsmack pkgmgr-info libsystemd-daemon @@ -55,7 +55,7 @@ ELSEIF (WEARABLE) cynara-session cynara-creds-socket ) -ENDIF (MOBILE) +ENDIF (WEARABLE) SET(PACKAGE "${PROJECT_NAME}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Winline -Werror -fno-builtin-malloc -fno-omit-frame-pointer -g -fPIE") @@ -86,7 +86,7 @@ ELSEIF (WEARABLE) ADD_DEFINITIONS("-DWEARABLE") ENDIF (MOBILE) -IF (MOBILE) +IF (WEARABLE) SET(BUILD_SOURCE src/main.c src/util.c @@ -95,9 +95,8 @@ IF (MOBILE) src/notification_service.c src/service_common.c src/critical_log.c - src/shortcut_service.c ) -ELSEIF (WEARABLE) +ELSE (WEARABLE) SET(BUILD_SOURCE src/main.c src/util.c @@ -105,9 +104,10 @@ ELSEIF (WEARABLE) src/badge_service.c src/notification_service.c src/service_common.c + src/shortcut_service.c src/critical_log.c ) -ENDIF (MOBILE) +ENDIF (WEARABLE) STRING(REPLACE "-L-l" "-l" pkg_fixed_LDFLAGS ${pkg_LDFLAGS}) STRING(REPLACE "-l" " -l" pkg_LDFLAGS ${pkg_fixed_LDFLAGS}) diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index 5fcf011..23aad81 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -27,7 +27,7 @@ BuildRequires: pkgconfig(pkgmgr) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(notification) BuildRequires: pkgconfig(badge) -%if "%{profile}" == "mobile" +%if "%{profile}" != "wearable" BuildRequires: pkgconfig(shortcut) %endif BuildRequires: pkgconfig(libsystemd-daemon) -- 2.7.4 From 93dc2ddf1348c0908ec39c24fe08a603a6d43575 Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Mon, 27 Jun 2016 12:46:24 +0900 Subject: [PATCH 12/16] Add variable for uid Signed-off-by: seungha.son Change-Id: I85728dce02d99396529ec55025486d3145f6586d --- src/notification_service.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/notification_service.c b/src/notification_service.c index ff5302b..5be8190 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -794,7 +794,7 @@ int notification_del_noti_single(GVariant *parameters, GVariant **reply_body, ui } if (num_changes > 0) { - body = g_variant_new("(ii)", 1, priv_id); + body = g_variant_new("(iii)", 1, priv_id, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; @@ -853,7 +853,7 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body, for (i = 0; i < num_deleted; i++) { g_variant_builder_add(builder, "(i)", *(list_deleted + i)); } - deleted_noti_list = g_variant_new("(a(i))", builder); + deleted_noti_list = g_variant_new("(a(i)i)", builder, param_uid); monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(deleted_noti_list, "delete_multiple_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); -- 2.7.4 From fbd319c3175dc9bffc621b35a88d3e3183dc9bd4 Mon Sep 17 00:00:00 2001 From: Myungki Lee Date: Tue, 5 Jul 2016 14:33:17 +0900 Subject: [PATCH 13/16] Add do_not_disturb schedule in system_setting Change-Id: I69291b8ee4f05fe3b50d7cba536543dbbb2805e0 Signed-off-by: Myungki Lee --- CMakeLists.txt | 2 + packaging/data-provider-master.spec | 1 + src/notification_service.c | 172 +++++++++++++++++++++++++++++++++--- 3 files changed, 161 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6026500..a992be1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ IF (WEARABLE) cynara-client cynara-session cynara-creds-socket + alarm-service ) ELSE (WEARABLE) INCLUDE(FindPkgConfig) @@ -54,6 +55,7 @@ ELSE (WEARABLE) cynara-client cynara-session cynara-creds-socket + alarm-service ) ENDIF (WEARABLE) diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index 23aad81..abe0bbc 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -34,6 +34,7 @@ BuildRequires: pkgconfig(libsystemd-daemon) BuildRequires: pkgconfig(cynara-client) BuildRequires: pkgconfig(cynara-session) BuildRequires: pkgconfig(cynara-creds-socket) +BuildRequires: pkgconfig(alarm-service) Requires(post): dbus diff --git a/src/notification_service.c b/src/notification_service.c index 5be8190..7812207 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -24,6 +24,7 @@ #include #include +#include #include "pkgmgr.h" #include "service_common.h" @@ -41,6 +42,9 @@ static GHashTable *_monitoring_hash = NULL; static int _update_noti(GVariant **reply_body, notification_h noti, GList *monitoring_list); +static alarm_id_t dnd_schedule_start_alarm_id; +static alarm_id_t dnd_schedule_end_alarm_id; + /*! * SERVICE HANDLER */ @@ -224,6 +228,12 @@ int notification_register_dbus_interface() " " " " " " + " " + " " + " " + " " + " " + " " " " " " @@ -948,25 +958,91 @@ int notification_update_noti_setting(GVariant *parameters, GVariant **reply_body return ret; } +static int _dnd_schedule_alarm_cb(alarm_id_t alarm_id, void *data) +{ + /* need to get current uid, use default user here. temporarily */ + if (alarm_id == dnd_schedule_start_alarm_id) { + notification_setting_db_update_do_not_disturb(1, tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + } else if (alarm_id == dnd_schedule_end_alarm_id) { + notification_setting_db_update_do_not_disturb(0, tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + } else { + ErrPrint("notification wrong alarm [%d]", alarm_id); + return -1; + } + + return 0; +} + +static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_min, int dnd_end_hour, int dnd_end_min) +{ + int ret = NOTIFICATION_ERROR_NONE; + + if (dnd_schedule_start_alarm_id) + alarmmgr_remove_alarm(dnd_schedule_start_alarm_id); + + ret = noti_system_setting_set_alarm(dnd_schedule_day, + dnd_start_hour, dnd_start_min, + _dnd_schedule_alarm_cb, &dnd_schedule_start_alarm_id); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("_add_alarm fail %d", ret); + return ret; + } + + if (dnd_schedule_end_alarm_id) + alarmmgr_remove_alarm(dnd_schedule_end_alarm_id); + + ret = noti_system_setting_set_alarm(dnd_schedule_day, + dnd_end_hour, dnd_end_min, + _dnd_schedule_alarm_cb, &dnd_schedule_end_alarm_id); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("_add_alarm fail %d", ret); + return ret; + } + + return ret; +} + /* update_noti_sys_setting */ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; int do_not_disturb = 0; int visivility_class = 0; + int dnd_schedule_enabled = 0; + int dnd_schedule_day = 0; + int dnd_start_hour = 0; + int dnd_start_min = 0; + int dnd_end_hour = 0; + int dnd_end_min = 0; uid_t param_uid; - g_variant_get(parameters, "(iii)", - &do_not_disturb, - &visivility_class, - ¶m_uid); + g_variant_get(parameters, "(iiiiiiiii)", + &do_not_disturb, + &visivility_class, + &dnd_schedule_enabled, + &dnd_schedule_day, + &dnd_start_hour, + &dnd_start_min, + &dnd_end_hour, + &dnd_end_min, + ¶m_uid); ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); if (ret != NOTIFICATION_ERROR_NONE) return ret; - DbgPrint("do_not_disturb [%d] visivility_class [%d]\n", do_not_disturb, visivility_class); - ret = notification_setting_db_update_system_setting(do_not_disturb, visivility_class, param_uid); + DbgPrint("do_not_disturb [%d] visivility_class [%d] set_schedule [%d]\n", + do_not_disturb, visivility_class, dnd_schedule_enabled); + + ret = notification_setting_db_update_system_setting(do_not_disturb, + visivility_class, + dnd_schedule_enabled, + dnd_schedule_day, + dnd_start_hour, + dnd_start_min, + dnd_end_hour, + dnd_end_min, + param_uid); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to setting db update system setting : %d\n", ret); return ret; @@ -977,7 +1053,16 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ ErrPrint("cannot make reply_body"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; } + + if (dnd_schedule_enabled) { + ret = _add_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, + dnd_end_hour, dnd_end_min); + if (ret != NOTIFICATION_ERROR_NONE) + ErrPrint("failed to add alarm for dnd_schedule"); + } + DbgPrint("_update_noti_sys_setting_service done !! %d", ret); + return ret; } @@ -1026,29 +1111,88 @@ static int _package_uninstall_cb(uid_t uid, const char *pkgname, enum pkgmgr_sta return 0; } +static int _check_dnd_schedule(void) +{ + int ret; + notification_system_setting_h setting = NULL; + bool dnd_schedule_enabled = false; + int dnd_schedule_day = 0; + int dnd_start_hour = 0; + int dnd_start_min = 0; + int dnd_end_hour = 0; + int dnd_end_min = 0; + + ret = noti_system_setting_load_system_setting(&setting, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("noti_system_setting_load_system_setting fail %d", ret); + return ret; + } + + ret = notification_system_setting_dnd_schedule_get_enabled(setting, + &dnd_schedule_enabled); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("system_setting_dnd_schedule_get_enabled fail %d", ret); + goto out; + } + + if (dnd_schedule_enabled) { + ret = notification_system_setting_dnd_schedule_get_day(setting, + &dnd_schedule_day); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("system_setting_dnd_schedule_get_day fail %d", ret); + goto out; + } + + ret = notification_system_setting_dnd_schedule_get_start_time(setting, + &dnd_start_hour, &dnd_start_min); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("system_setting_dnd_schedule_get_start_time fail %d", ret); + goto out; + } + + ret = notification_system_setting_dnd_schedule_get_end_time(setting, + &dnd_end_hour, &dnd_end_min); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("system_setting_dnd_schedule_get_end_time fail %d", ret); + goto out; + } + + _add_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, dnd_end_hour, dnd_end_min); + } + +out: + notification_system_setting_free_system_setting(setting); + + return ret; +} + /*! * MAIN THREAD * Do not try to do any other operation in these functions */ HAPI int notification_service_init(void) { - int result; + int ret; _monitoring_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_monitoring_list); - result = notification_db_init(); - if (result != NOTIFICATION_ERROR_NONE) { - ErrPrint("notification db init fail %d", result); - return result; + ret = notification_db_init(); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("notification db init fail %d", ret); + return ret; } - result = notification_register_dbus_interface(); - if (result != SERVICE_COMMON_ERROR_NONE) { - ErrPrint("notification register dbus fail %d", result); + ret = notification_register_dbus_interface(); + if (ret != SERVICE_COMMON_ERROR_NONE) { + ErrPrint("notification register dbus fail %d", ret); return NOTIFICATION_ERROR_IO_ERROR; } + _notification_data_init(); notification_setting_refresh_setting_table(tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + _check_dnd_schedule(); + pkgmgr_init(); pkgmgr_add_event_callback(PKGMGR_EVENT_INSTALL, _package_install_cb, NULL); pkgmgr_add_event_callback(PKGMGR_EVENT_UPDATE, _package_install_cb, NULL); -- 2.7.4 From 3de2aa353e49730154fb25a35d78e542cd09eb50 Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Wed, 29 Jun 2016 20:40:38 +0900 Subject: [PATCH 14/16] Add multiuser feature for badge Signed-off-by: seungha.son Change-Id: Ie48fa8c5aad60ce1b54d1f8fbdeee7cf3765fcf6 --- include/badge_service.h | 11 ++-- src/badge_service.c | 169 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 140 insertions(+), 40 deletions(-) diff --git a/include/badge_service.h b/include/badge_service.h index 478c984..7c9d0e5 100755 --- a/include/badge_service.h +++ b/include/badge_service.h @@ -15,19 +15,20 @@ */ #include +#include extern int badge_service_init(void); extern int badge_service_fini(void); int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid); -int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); -int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); -int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_insert(GVariant *parameters, GVariant **reply_body, uid_t uid); +int badge_delete(GVariant *parameters, GVariant **reply_body, uid_t uid); +int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_get_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid); -int badge_set_display_option(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_set_display_option(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_get_display_option(GVariant *parameters, GVariant **reply_body, uid_t uid); -int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_get_setting_property(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_register_dbus_interface(); diff --git a/src/badge_service.c b/src/badge_service.c index 92d2b99..56dce5f 100755 --- a/src/badge_service.c +++ b/src/badge_service.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "service_common.h" #include "badge_service.h" @@ -60,9 +61,7 @@ static void _badge_dbus_method_call_handler(GDBusConnection *conn, GVariant *reply_body = NULL; int ret = BADGE_ERROR_INVALID_PARAMETER; uid_t uid = get_sender_uid(sender); - GList *monitoring_list = NULL; - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, &uid); if (g_strcmp0(method_name, "badge_service_register") == 0) ret = service_register(parameters, &reply_body, sender, _on_name_appeared, _on_name_vanished, &_monitoring_hash, uid); @@ -71,19 +70,19 @@ static void _badge_dbus_method_call_handler(GDBusConnection *conn, else if (g_strcmp0(method_name, "get_list") == 0) ret = badge_get_badge_list(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "insert_badge") == 0) - ret = badge_insert(parameters, &reply_body, monitoring_list, uid); + ret = badge_insert(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "delete_badge") == 0) - ret = badge_delete(parameters, &reply_body, monitoring_list, uid); + ret = badge_delete(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "set_badge_count") == 0) - ret = badge_set_badge_count(parameters, &reply_body, monitoring_list, uid); + ret = badge_set_badge_count(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_badge_count") == 0) ret = badge_get_badge_count(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "set_disp_option") == 0) - ret = badge_set_display_option(parameters, &reply_body, monitoring_list, uid); + ret = badge_set_display_option(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_disp_option") == 0) ret = badge_get_display_option(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "set_noti_property") == 0) - ret = badge_set_setting_property(parameters, &reply_body, monitoring_list, uid); + ret = badge_set_setting_property(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_noti_property") == 0) ret = badge_get_setting_property(parameters, &reply_body, uid); @@ -117,30 +116,36 @@ int badge_register_dbus_interface() " " " " " " + " " " " " " " " + " " " " " " " " " " " " " " + " " " " " " " " " " + " " " " " " " " " " " " + " " " " " " " " + " " " " " " @@ -148,10 +153,12 @@ int badge_register_dbus_interface() " " " " " " + " " " " " " " " + " " " " " " @@ -159,11 +166,13 @@ int badge_register_dbus_interface() " " " " " " + " " " " " " " " " " + " " " " " " " " @@ -172,6 +181,23 @@ int badge_register_dbus_interface() return service_common_register_dbus_interface(introspection_xml, _badge_interface_vtable); } +static int _validate_and_set_param_uid_with_uid(uid_t uid, uid_t *param_uid) +{ + int ret = BADGE_ERROR_NONE; + + if (uid > NORMAL_UID_BASE && uid != *param_uid) { + ErrPrint("invalid sender uid : %d, param_uid : %d", uid, *param_uid); + return BADGE_ERROR_INVALID_PARAMETER; + } else if (uid <= NORMAL_UID_BASE) { + if (*param_uid <= NORMAL_UID_BASE) { + if (*param_uid != uid) + return BADGE_ERROR_INVALID_PARAMETER; + *param_uid = tzplatform_getuid(TZ_SYS_DEFAULT_USER); + } + } + return ret; +} + static void _release_badge_info(gpointer data) { badge_info_s *badge = (badge_info_s *)data; @@ -188,11 +214,17 @@ int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body, uid_t int ret = BADGE_ERROR_NONE; char *pkgname = NULL; bool existing = 0; + uid_t param_uid; - g_variant_get(parameters, "(&s)", &pkgname); + g_variant_get(parameters, "(&si)", &pkgname, ¶m_uid); DbgPrint("badge_get_badge_existing %s", pkgname); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; + if (pkgname != NULL) - ret = badge_db_is_existing(pkgname, &existing); + ret = badge_db_is_existing(pkgname, &existing, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -219,8 +251,15 @@ int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid) badge_info_s *badge; GVariantBuilder *builder; int ret; + uid_t param_uid; + + g_variant_get(parameters, "(i)", ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - ret = badge_db_get_list(&badge_list); + ret = badge_db_get_list(&badge_list, param_uid); if (ret != BADGE_ERROR_NONE) { ErrPrint("badge get list fail : %d", ret); return ret; @@ -248,17 +287,24 @@ int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid) } /* insert_badge */ -int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_insert(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; char *writable_pkg = NULL; char *caller = NULL; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&s&si)", &pkgname, &writable_pkg, &caller, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&s&s)", &pkgname, &writable_pkg, &caller); if (pkgname != NULL && writable_pkg != NULL && caller != NULL) - ret = badge_db_insert(pkgname, writable_pkg, caller); + ret = badge_db_insert(pkgname, writable_pkg, caller, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -267,12 +313,13 @@ int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_ return ret; } - body = g_variant_new("(s)", pkgname); + body = g_variant_new("(si)", pkgname, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "insert_badge_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -291,16 +338,23 @@ int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_ } /* delete_badge */ -int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_delete(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; char *caller = NULL; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&si)", &pkgname, &caller, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&s)", &pkgname, &caller); if (pkgname != NULL && caller != NULL) { - ret = badge_db_delete(pkgname, caller); + ret = badge_db_delete(pkgname, caller, param_uid); } else { return BADGE_ERROR_INVALID_PARAMETER; } @@ -310,11 +364,13 @@ int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_ return ret; } - body = g_variant_new("(s)", pkgname); + body = g_variant_new("(si)", pkgname, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "delete_badge_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -332,17 +388,24 @@ int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_ } /* set_badge_count */ -int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; char *caller = NULL; unsigned int count = 0; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&sii)", &pkgname, &caller, &count, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&si)", &pkgname, &caller, &count); if (pkgname != NULL && caller != NULL) - ret = badge_db_set_count(pkgname, caller, count); + ret = badge_db_set_count(pkgname, caller, count, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -351,12 +414,13 @@ int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, GList *mo return ret; } - body = g_variant_new("(si)", pkgname, count); + body = g_variant_new("(sii)", pkgname, count, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "set_badge_count_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -380,10 +444,16 @@ int badge_get_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid int ret = BADGE_ERROR_NONE; char *pkgname = NULL; unsigned int count = 0; + uid_t param_uid; + + g_variant_get(parameters, "(&si)", &pkgname, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s)", &pkgname); if (pkgname != NULL) - ret = badge_db_get_count(pkgname, &count); + ret = badge_db_get_count(pkgname, &count, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -402,19 +472,26 @@ int badge_get_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid } /* set_disp_option */ -int badge_set_display_option(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_set_display_option(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; char *caller = NULL; unsigned int is_display = 0; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&sii)", &pkgname, &caller, &is_display, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&si)", &pkgname, &caller, &is_display); DbgPrint("set disp option : %s, %s, %d", pkgname, caller, is_display); if (pkgname != NULL && caller != NULL) - ret = badge_db_set_display_option(pkgname, caller, is_display); + ret = badge_db_set_display_option(pkgname, is_display, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -423,12 +500,13 @@ int badge_set_display_option(GVariant *parameters, GVariant **reply_body, GList return ret; } - body = g_variant_new("(si)", pkgname, is_display); + body = g_variant_new("(sii)", pkgname, is_display, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "set_disp_option_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -452,12 +530,18 @@ int badge_get_display_option(GVariant *parameters, GVariant **reply_body, uid_t int ret = BADGE_ERROR_NONE; char *pkgname = NULL; unsigned int is_display = 0; + uid_t param_uid; + + g_variant_get(parameters, "(&si)", &pkgname, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s)", &pkgname); DbgPrint("get disp option : %s", pkgname); if (pkgname != NULL) - ret = badge_db_get_display_option(pkgname, &is_display); + ret = badge_db_get_display_option(pkgname, &is_display, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -475,7 +559,7 @@ int badge_get_display_option(GVariant *parameters, GVariant **reply_body, uid_t } /* set_noti_property */ -int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = 0; int is_display = 0; @@ -483,10 +567,17 @@ int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GLis char *property = NULL; char *value = NULL; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&s&si)", &pkgname, &property, &value, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&s&s)", &pkgname, &property, &value); if (pkgname != NULL && property != NULL && value != NULL) - ret = badge_setting_db_set(pkgname, property, value); + ret = badge_setting_db_set(pkgname, property, value, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -507,6 +598,8 @@ int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GLis ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "set_disp_option_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); if (ret != BADGE_ERROR_NONE) { @@ -533,10 +626,16 @@ int badge_get_setting_property(GVariant *parameters, GVariant **reply_body, uid_ char *pkgname = NULL; char *property = NULL; char *value = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&si)", &pkgname, &property, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&s)", &pkgname, &property); if (pkgname != NULL && property != NULL) - ret = badge_setting_db_get(pkgname, property, &value); + ret = badge_setting_db_get(pkgname, property, &value, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; -- 2.7.4 From 466c04bed02192f437168dd8ea856481233ba4b8 Mon Sep 17 00:00:00 2001 From: Myungki Lee Date: Tue, 5 Jul 2016 22:35:56 +0900 Subject: [PATCH 15/16] Add lock_screen_level in system_setting Change-Id: I371f302b9522a72dc3cd36f20143e12074615197 Signed-off-by: Myungki Lee --- src/notification_service.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/notification_service.c b/src/notification_service.c index 7812207..3d06064 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -234,6 +234,7 @@ int notification_register_dbus_interface() " " " " " " + " " " " " " @@ -1014,9 +1015,10 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ int dnd_start_min = 0; int dnd_end_hour = 0; int dnd_end_min = 0; + int lock_screen_level = 0; uid_t param_uid; - g_variant_get(parameters, "(iiiiiiiii)", + g_variant_get(parameters, "(iiiiiiiiii)", &do_not_disturb, &visivility_class, &dnd_schedule_enabled, @@ -1025,14 +1027,15 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ &dnd_start_min, &dnd_end_hour, &dnd_end_min, + &lock_screen_level, ¶m_uid); ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); if (ret != NOTIFICATION_ERROR_NONE) return ret; - DbgPrint("do_not_disturb [%d] visivility_class [%d] set_schedule [%d]\n", - do_not_disturb, visivility_class, dnd_schedule_enabled); + DbgPrint("do_not_disturb [%d] visivility_class [%d] set_schedule [%d] lock_screen_level [%d]\n", + do_not_disturb, visivility_class, dnd_schedule_enabled, lock_screen_level); ret = notification_setting_db_update_system_setting(do_not_disturb, visivility_class, @@ -1042,6 +1045,7 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ dnd_start_min, dnd_end_hour, dnd_end_min, + lock_screen_level, param_uid); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to setting db update system setting : %d\n", ret); -- 2.7.4 From c5acaf1a45676826e7675ad5a2c26a3fcaf01e07 Mon Sep 17 00:00:00 2001 From: jooseong lee Date: Wed, 20 Jul 2016 20:21:24 +0900 Subject: [PATCH 16/16] Set the SMACK security label to run given executable file in systemd services Change-Id: I62ff40352f3d872a73c58cfb8c8911884cfce14e Signed-off-by: jooseong lee --- packaging/data-provider-master.service | 1 + 1 file changed, 1 insertion(+) diff --git a/packaging/data-provider-master.service b/packaging/data-provider-master.service index 89e9122..95e3d3f 100644 --- a/packaging/data-provider-master.service +++ b/packaging/data-provider-master.service @@ -6,6 +6,7 @@ User=app_fw Group=app_fw BusName=org.tizen.data_provider_service Type=dbus +SmackProcessLabel=System ExecStart=/usr/bin/data-provider-master TimeoutStopSec=3s Restart=always -- 2.7.4