Support multi-user feature 68/43568/3 accepted/tizen/mobile/20150713.110917 accepted/tizen/tv/20150713.110925 accepted/tizen/wearable/20150713.110934 submit/tizen/20150713.065427
authorSangyoon Jang <s89.jang@samsung.com>
Fri, 10 Jul 2015 07:04:28 +0000 (16:04 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Mon, 13 Jul 2015 04:25:38 +0000 (13:25 +0900)
each user can access own alarm only
add uid column to alarmmgr db

Change-Id: Ifaf117d56b2d93429001866c681610676dc828a4
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
alarm-manager-registry.c
alarm-manager-schedule.c
alarm-manager.c
include/alarm-internal.h

index 21c4c12..3465859 100644 (file)
@@ -57,7 +57,7 @@ bool _save_alarms(__alarm_info_t *__alarm_info)
        alarm_mode_t *mode = &alarm_info->mode;
 
        char *query = sqlite3_mprintf("insert into alarmmgr( alarm_id, start,\
-                       end, pid, caller_pkgid, callee_pkgid, app_unique_name, app_service_name, app_service_name_mod, bundle, year,\
+                       end, uid, pid, caller_pkgid, callee_pkgid, app_unique_name, app_service_name, app_service_name_mod, bundle, year,\
                        month, day, hour, min, sec, day_of_week, repeat,\
                        alarm_type, reserved_info, dst_service_name, dst_service_name_mod)\
                        values (%d,%d,%d,%d,%Q,%Q,%Q,%Q,%Q,%Q,%d,%d,%d,%d,%d,%d,%d,%d,\
@@ -65,6 +65,7 @@ bool _save_alarms(__alarm_info_t *__alarm_info)
                        __alarm_info->alarm_id,
                        (int)__alarm_info->start,
                        (int)__alarm_info->end,
+                       __alarm_info->uid,
                        __alarm_info->pid,
                        (char *)g_quark_to_string(__alarm_info->quark_caller_pkgid),
                        (char *)g_quark_to_string(__alarm_info->quark_callee_pkgid),
@@ -110,13 +111,14 @@ bool _update_alarms(__alarm_info_t *__alarm_info)
        alarm_mode_t *mode = &alarm_info->mode;
 
        char *query = sqlite3_mprintf("update alarmmgr set start=%d, end=%d,\
-                       pid=%d, caller_pkgid=%Q, callee_pkgid=%Q, app_unique_name=%Q, app_service_name=%Q, app_service_name_mod=%Q,\
+                       uid=%d, pid=%d, caller_pkgid=%Q, callee_pkgid=%Q, app_unique_name=%Q, app_service_name=%Q, app_service_name_mod=%Q,\
                        bundle=%Q, year=%d, month=%d, day=%d, hour=%d, min=%d, sec=%d,\
                        day_of_week=%d, repeat=%d, alarm_type=%d,\
                        reserved_info=%d, dst_service_name=%Q, dst_service_name_mod=%Q\
                        where alarm_id=%d",\
                        (int)__alarm_info->start,
                        (int)__alarm_info->end,
+                       __alarm_info->uid,
                        __alarm_info->pid,
                        (char *)g_quark_to_string(__alarm_info->quark_caller_pkgid),
                        (char *)g_quark_to_string(__alarm_info->quark_callee_pkgid),
@@ -172,6 +174,7 @@ bool _delete_alarms(alarm_id_t alarm_id)
 bool _load_alarms_from_registry()
 {
        int i = 0;
+       int col_idx;
        char query[MAX_QUERY_LEN] = {0,};
        sqlite3_stmt *stmt = NULL;
        const char *tail = NULL;
@@ -196,6 +199,7 @@ bool _load_alarms_from_registry()
        }
 
        for (i = 0; SQLITE_ROW == sqlite3_step(stmt); i++) {
+               col_idx = 0;
                __alarm_info = malloc(sizeof(__alarm_info_t));
 
                if (G_UNLIKELY(__alarm_info == NULL)) {
@@ -206,36 +210,37 @@ bool _load_alarms_from_registry()
                start = &alarm_info->start;
                mode = &alarm_info->mode;
 
-               __alarm_info->alarm_id = sqlite3_column_int(stmt, 0);
-               __alarm_info->start = sqlite3_column_int(stmt, 1);
-               __alarm_info->end = sqlite3_column_int(stmt, 2);
-               __alarm_info->pid = sqlite3_column_int(stmt, 3);
+               __alarm_info->alarm_id = sqlite3_column_int(stmt, col_idx++);
+               __alarm_info->start = sqlite3_column_int(stmt, col_idx++);
+               __alarm_info->end = sqlite3_column_int(stmt, col_idx++);
+               __alarm_info->uid = sqlite3_column_int(stmt, col_idx++);
+               __alarm_info->pid = sqlite3_column_int(stmt, col_idx++);
 
-               strncpy(caller_pkgid, (const char *)sqlite3_column_text(stmt, 4),
+               strncpy(caller_pkgid, (const char *)sqlite3_column_text(stmt, col_idx++),
                        MAX_PKG_ID_LEN - 1);
-               strncpy(callee_pkgid, (const char *)sqlite3_column_text(stmt, 5),
+               strncpy(callee_pkgid, (const char *)sqlite3_column_text(stmt, col_idx++),
                        MAX_PKG_ID_LEN - 1);
-               strncpy(app_unique_name, (const char *)sqlite3_column_text(stmt, 6),
+               strncpy(app_unique_name, (const char *)sqlite3_column_text(stmt, col_idx++),
                        MAX_SERVICE_NAME_LEN - 1);
-               strncpy(app_service_name, (const char *)sqlite3_column_text(stmt, 7),
+               strncpy(app_service_name, (const char *)sqlite3_column_text(stmt, col_idx++),
                        MAX_SERVICE_NAME_LEN - 1);
-               strncpy(app_service_name_mod, (const char *)sqlite3_column_text(stmt, 8),
+               strncpy(app_service_name_mod, (const char *)sqlite3_column_text(stmt, col_idx++),
                        MAX_SERVICE_NAME_LEN - 1);
-               strncpy(bundle, (const char *)sqlite3_column_text(stmt, 9),
+               strncpy(bundle, (const char *)sqlite3_column_text(stmt, col_idx++),
                        MAX_BUNDLE_NAME_LEN - 1);
-               start->year = sqlite3_column_int(stmt, 10);
-               start->month = sqlite3_column_int(stmt, 11);
-               start->day = sqlite3_column_int(stmt, 12);
-               start->hour = sqlite3_column_int(stmt, 13);
-               start->min = sqlite3_column_int(stmt, 14);
-               start->sec = sqlite3_column_int(stmt, 15);
-               mode->u_interval.day_of_week = sqlite3_column_int(stmt, 16);
-               mode->repeat = sqlite3_column_int(stmt, 17);
-               alarm_info->alarm_type = sqlite3_column_int(stmt, 18);
-               alarm_info->reserved_info = sqlite3_column_int(stmt, 19);
-               strncpy(dst_service_name, (const char *)sqlite3_column_text(stmt, 20),
+               start->year = sqlite3_column_int(stmt, col_idx++);
+               start->month = sqlite3_column_int(stmt, col_idx++);
+               start->day = sqlite3_column_int(stmt, col_idx++);
+               start->hour = sqlite3_column_int(stmt, col_idx++);
+               start->min = sqlite3_column_int(stmt, col_idx++);
+               start->sec = sqlite3_column_int(stmt, col_idx++);
+               mode->u_interval.day_of_week = sqlite3_column_int(stmt, col_idx++);
+               mode->repeat = sqlite3_column_int(stmt, col_idx++);
+               alarm_info->alarm_type = sqlite3_column_int(stmt, col_idx++);
+               alarm_info->reserved_info = sqlite3_column_int(stmt, col_idx++);
+               strncpy(dst_service_name, (const char *)sqlite3_column_text(stmt, col_idx++),
                        MAX_SERVICE_NAME_LEN - 1);
-               strncpy(dst_service_name_mod, (const char *)sqlite3_column_text(stmt, 21),
+               strncpy(dst_service_name_mod, (const char *)sqlite3_column_text(stmt, col_idx++),
                        MAX_SERVICE_NAME_LEN - 1);
 
                __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid);
index c000c31..e882051 100644 (file)
@@ -87,11 +87,12 @@ bool _add_to_scheduled_alarm_list(__alarm_info_t *__alarm_info)
 
        alarm->used = true;
        alarm->alarm_id = __alarm_info->alarm_id;
+       alarm->uid = __alarm_info->uid;
        alarm->pid = __alarm_info->pid;
        alarm->__alarm_info = __alarm_info;
 
-       SECURE_LOGD("%s :alarm->pid =%d, app_service_name=%s(%u)\n",
-                       __FUNCTION__, alarm->pid,
+       SECURE_LOGD("%s :alarm->uid =%d, alarm->pid =%d, app_service_name=%s(%u)\n",
+                       __FUNCTION__, alarm->uid, alarm->pid,
                        g_quark_to_string(alarm->__alarm_info->quark_app_service_name),
                        alarm->__alarm_info->quark_app_service_name);
 
@@ -121,7 +122,7 @@ bool _add_to_scheduled_alarm_list(__alarm_info_t *__alarm_info)
        return true;
 }
 
-bool _remove_from_scheduled_alarm_list(int pid, alarm_id_t alarm_id)
+bool _remove_from_scheduled_alarm_list(uid_t uid, alarm_id_t alarm_id)
 {
        bool result = false;
        GSList *iter = NULL;
@@ -129,7 +130,7 @@ bool _remove_from_scheduled_alarm_list(int pid, alarm_id_t alarm_id)
 
        for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) {
                alarm = iter->data;
-               if (alarm->alarm_id == alarm_id) {
+               if (alarm->uid == uid && alarm->alarm_id == alarm_id) {
                        g_scheduled_alarm_list = g_slist_remove(g_scheduled_alarm_list, iter->data);
                        g_free(alarm);
                        result = true;
index 1b3ded2..a4be97c 100644 (file)
@@ -131,24 +131,23 @@ bool is_time_changed = false;     // for calculating next duetime
 
 static bool __alarm_add_to_list(__alarm_info_t *__alarm_info);
 static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id);
-static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id,
-                                  __alarm_info_t *__alarm_info,
+static bool __alarm_update_in_list(__alarm_info_t *__alarm_info,
                                   int *error_code);
-static bool __alarm_remove_from_list(int pid, alarm_id_t alarm_id,
+static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
                                     int *error_code);
 static bool __alarm_set_start_and_end_time(alarm_info_t *alarm_info,
                                           __alarm_info_t *__alarm_info);
 static bool __alarm_update_due_time_of_all_items_in_list(double diff_time);
-static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
+static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
                        int pid, periodic_method_e method, long requested_interval, int is_ref,
                        char *app_service_name, char *app_service_name_mod,
                        const char *dst_service_name, const char *dst_service_name_mod,
                        int *error_code);
 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
-                          int pid, char *bundle_data, int *error_code);
+                          uid_t uid, int pid, char *bundle_data, int *error_code);
 
-static bool __alarm_delete(int pid, alarm_id_t alarm_id, int *error_code);
-static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id,
+static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code);
+static bool __alarm_update(uid_t uid, int pid, char *app_service_name, alarm_id_t alarm_id,
                           alarm_info_t *alarm_info, int *error_code);
 static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id);
 static void __alarm_expired();
@@ -359,8 +358,7 @@ static bool __alarm_add_to_list(__alarm_info_t *__alarm_info)
        return true;
 }
 
-static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id,
-                                  __alarm_info_t *__alarm_info,
+static bool __alarm_update_in_list(__alarm_info_t *__alarm_info,
                                   int *error_code)
 {
        bool found = false;
@@ -371,8 +369,8 @@ static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id,
        for (iter = alarm_context.alarms; iter != NULL;
             iter = g_slist_next(iter)) {
                entry = iter->data;
-               if (entry->alarm_id == alarm_id) {
-
+               if (entry->uid == __alarm_info->uid &&
+                               entry->alarm_id == __alarm_info->alarm_id) {
                        found = true;
                        __alarm_info->quark_app_unique_name =
                            entry->quark_app_unique_name;
@@ -399,7 +397,7 @@ static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id,
        return true;
 }
 
-static bool __alarm_remove_from_list(int pid, alarm_id_t alarm_id,
+static bool __alarm_remove_from_list(uid_t uid, alarm_id_t alarm_id,
                                     int *error_code)
 {
        bool found = false;
@@ -414,7 +412,7 @@ static bool __alarm_remove_from_list(int pid, alarm_id_t alarm_id,
 
        for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
                entry = iter->data;
-               if (entry->alarm_id == alarm_id) {
+               if (entry->uid == uid && entry->alarm_id == alarm_id) {
                        alarm_info = &entry->alarm_info;
 
                        ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Remove alarm id(%d)", entry->alarm_id);
@@ -654,7 +652,7 @@ static bool __alarm_update_due_time_of_all_items_in_list(double diff_time)
 }
 
 static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
-                          int pid, char *bundle_data, int *error_code)
+                          uid_t uid, int pid, char *bundle_data, int *error_code)
 {
        time_t current_time;
        time_t due_time;
@@ -680,6 +678,7 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id
                return false;
        }
 
+       __alarm_info->uid = uid;
        __alarm_info->pid = pid;
        __alarm_info->alarm_id = -1;
 
@@ -695,7 +694,7 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id
        __alarm_info->quark_caller_pkgid = g_quark_from_string("null");
 
        if (aul_app_get_appid_bypid(pid, caller_appid, 256) == AUL_R_OK) {
-               if (pkgmgrinfo_appinfo_get_appinfo(caller_appid, &caller_handle) == PMINFO_R_OK) {
+               if (pkgmgrinfo_appinfo_get_usr_appinfo(caller_appid, uid, &caller_handle) == PMINFO_R_OK) {
                        if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) {
                                if (caller_pkgid) {
                                        __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid);
@@ -710,7 +709,7 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id
 
        b = bundle_decode((bundle_raw *)bundle_data, strlen(bundle_data));
        callee_appid = appsvc_get_appid(b);
-       if (pkgmgrinfo_appinfo_get_appinfo(callee_appid, &callee_handle) == PMINFO_R_OK) {
+       if (pkgmgrinfo_appinfo_get_usr_appinfo(callee_appid, uid, &callee_handle) == PMINFO_R_OK) {
                if (pkgmgrinfo_appinfo_get_pkgid(callee_handle, &callee_pkgid) == PMINFO_R_OK) {
                        if (callee_pkgid) {
                                __alarm_info->quark_callee_pkgid = g_quark_from_string(callee_pkgid);
@@ -790,7 +789,7 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id
        return true;
 }
 
-static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
+static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, uid_t uid,
                        int pid, periodic_method_e method, long requested_interval, int is_ref,
                        char *app_service_name, char *app_service_name_mod,
                        const char *dst_service_name, const char *dst_service_name_mod,
@@ -812,6 +811,7 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
                *error_code = ERR_ALARM_SYSTEM_FAIL;
                return false;
        }
+       __alarm_info->uid = uid;
        __alarm_info->pid = pid;
        __alarm_info->alarm_id = -1;
        __alarm_info->quark_caller_pkgid = g_quark_from_string("null");
@@ -821,7 +821,7 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
 
        // Get caller_appid to get caller's package id. There is no callee.
        if (aul_app_get_appid_bypid(pid, caller_appid, 256) == AUL_R_OK) {
-               if (pkgmgrinfo_appinfo_get_appinfo(caller_appid, &caller_handle) == PMINFO_R_OK) {
+               if (pkgmgrinfo_appinfo_get_usr_appinfo(caller_appid, uid, &caller_handle) == PMINFO_R_OK) {
                        if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) {
                                if (caller_pkgid) {
                                        __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid);
@@ -907,7 +907,7 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id,
        return true;
 }
 
-static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id,
+static bool __alarm_update(uid_t uid, int pid, char *app_service_name, alarm_id_t alarm_id,
                           alarm_info_t *alarm_info, int *error_code)
 {
        time_t current_time;
@@ -923,6 +923,7 @@ static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id,
                return false;
        }
 
+       __alarm_info->uid = uid;
        __alarm_info->pid = pid;
        __alarm_info->alarm_id = alarm_id;
 
@@ -943,14 +944,14 @@ static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id,
        }
 
        due_time = _alarm_next_duetime(__alarm_info);
-       if (!__alarm_update_in_list(pid, alarm_id, __alarm_info, error_code)) {
+       if (!__alarm_update_in_list(__alarm_info, error_code)) {
                free(__alarm_info);
                ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: requested alarm_id "
                "(%d) does not exist. so this value is invalid id.", alarm_id);
                return false;
        }
 
-       result = _remove_from_scheduled_alarm_list(pid, alarm_id);
+       result = _remove_from_scheduled_alarm_list(uid, alarm_id);
 
        if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) {
                /*there is no scheduled alarm */
@@ -1014,18 +1015,18 @@ static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id,
        return true;
 }
 
-static bool __alarm_delete(int pid, alarm_id_t alarm_id, int *error_code)
+static bool __alarm_delete(uid_t uid, alarm_id_t alarm_id, int *error_code)
 {
        bool result = false;
 
-       SECURE_LOGD("[alarm-server]:delete alarm: alarm(%d) pid(%d)\n", alarm_id, pid);
-       result = _remove_from_scheduled_alarm_list(pid, alarm_id);
+       SECURE_LOGD("[alarm-server]:delete alarm: alarm(%d) uid(%d)\n", alarm_id, uid);
+       result = _remove_from_scheduled_alarm_list(uid, alarm_id);
 
-       if (!__alarm_remove_from_list(pid, alarm_id, error_code)) {
+       if (!__alarm_remove_from_list(uid, alarm_id, error_code)) {
 
                SECURE_LOGE("[alarm-server]:delete alarm: "
-                                         "alarm(%d) pid(%d) has failed with error_code(%d)\n",
-                                         alarm_id, pid, *error_code);
+                                         "alarm(%d) uid(%d) has failed with error_code(%d)\n",
+                                         alarm_id, uid, *error_code);
                return false;
        }
 
@@ -1111,6 +1112,30 @@ static void __alarm_send_noti_to_application(const char *app_service_name, alarm
                                                NULL);
 }
 
+static uid_t __get_caller_uid(const char *name)
+{
+       guint uid;
+       GVariant *ret;
+       GError *error = NULL;
+
+       ret = g_dbus_connection_call_sync(
+                       alarm_context.connection,
+                       "org.freedesktop.DBus",
+                       "/org/freedesktop/DBus",
+                       "org.freedesktop.DBus",
+                       "GetConnectionUnixUser",
+                       g_variant_new("(s)", name),
+                       NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       -1,
+                       NULL,
+                       &error);
+       g_variant_get(ret, "(u)", &uid);
+       g_variant_unref(ret);
+
+       return uid;
+}
+
 static int __get_caller_pid(const char *name)
 {
        guint pid;
@@ -1341,7 +1366,7 @@ static void __alarm_expired()
                                char alarm_id_str[32] = { 0, };
 
                                if (__alarm_info->alarm_info.alarm_type & ALARM_TYPE_WITHCB) {
-                                       __alarm_remove_from_list(__alarm_info->pid, alarm_id, NULL);
+                                       __alarm_remove_from_list(__alarm_info->uid, alarm_id, NULL);
                                        goto done;
                                }
 
@@ -1386,7 +1411,7 @@ static void __alarm_expired()
 #endif
 
                if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) {
-                       __alarm_remove_from_list(__alarm_info->pid, alarm_id, NULL);
+                       __alarm_remove_from_list(__alarm_info->uid, alarm_id, NULL);
                } else {
                        _alarm_next_duetime(__alarm_info);
                }
@@ -1520,7 +1545,7 @@ static int __on_app_uninstalled(uid_t target_uid, int req_id, const char *pkg_ty
                        if ((caller_pkgid && strncmp(pkgid, caller_pkgid, strlen(pkgid)) == 0) ||
                                (callee_pkgid && strncmp(pkgid, callee_pkgid, strlen(pkgid)) == 0))
                        {
-                               if (_remove_from_scheduled_alarm_list(entry->pid, entry->alarm_id))
+                               if (_remove_from_scheduled_alarm_list(entry->uid, entry->alarm_id))
                                {
                                        is_deleted = true;
                                }
@@ -2069,9 +2094,11 @@ gboolean alarm_manager_alarm_create_appsvc(AlarmManager *pObject, GDBusMethodInv
        char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
 #endif
        bool ret = true;
+       uid_t uid;
        int pid;
        const char *name = g_dbus_method_invocation_get_sender(invoc);
 
+       uid = __get_caller_uid(name);
        pid = __get_caller_pid(name);
 
        alarm_info.start.year = start_year;
@@ -2091,7 +2118,7 @@ gboolean alarm_manager_alarm_create_appsvc(AlarmManager *pObject, GDBusMethodInv
        alarm_info.alarm_type = alarm_type;
        alarm_info.reserved_info = reserved_info;
 
-       if (!__alarm_create_appsvc(&alarm_info, &alarm_id, pid, bundle_data, &return_code)) {
+       if (!__alarm_create_appsvc(&alarm_info, &alarm_id, uid, pid, bundle_data, &return_code)) {
                ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code);
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
                strncpy(log_tag, "FAIL: CREATE", strlen("FAIL: CREATE"));
@@ -2107,8 +2134,8 @@ gboolean alarm_manager_alarm_create_appsvc(AlarmManager *pObject, GDBusMethodInv
        g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
 
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
-       sprintf(log_message, "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
-               alarm_id, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
+       sprintf(log_message, "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
+               alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
        __save_module_log(log_tag, log_message);
 #endif
 
@@ -2135,10 +2162,12 @@ gboolean alarm_manager_alarm_create(AlarmManager *obj, GDBusMethodInvocation *in
        char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
 #endif
        bool ret = true;
+       uid_t uid;
        int pid;
        const char *name = g_dbus_method_invocation_get_sender(invoc);
 
        pid = __get_caller_pid(name);
+       uid = __get_caller_uid(name);
 
        alarm_info.start.year = start_year;
        alarm_info.start.month = start_month;
@@ -2157,7 +2186,7 @@ gboolean alarm_manager_alarm_create(AlarmManager *obj, GDBusMethodInvocation *in
        alarm_info.alarm_type = alarm_type;
        alarm_info.reserved_info = reserved_info;
 
-       if (!__alarm_create(&alarm_info, &alarm_id, pid, 0, 0, 0, app_service_name,app_service_name_mod,
+       if (!__alarm_create(&alarm_info, &alarm_id, uid, pid, 0, 0, 0, app_service_name,app_service_name_mod,
                       reserved_service_name, reserved_service_name_mod, &return_code)) {
                ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code);
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
@@ -2174,8 +2203,8 @@ gboolean alarm_manager_alarm_create(AlarmManager *obj, GDBusMethodInvocation *in
        g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code));
 
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
-       sprintf(log_message, "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
-               alarm_id, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
+       sprintf(log_message, "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
+               alarm_id, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
        __save_module_log(log_tag, log_message);
 #endif
 
@@ -2193,9 +2222,11 @@ gboolean alarm_manager_alarm_create_periodic(AlarmManager *obj, GDBusMethodInvoc
        char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
        char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
        bool ret = true;
+       uid_t uid;
        int pid;
        const char *name = g_dbus_method_invocation_get_sender(invoc);
 
+       uid = __get_caller_uid(name);
        pid = __get_caller_pid(name);
 
        if (retval != ALARMMGR_RESULT_SUCCESS) {
@@ -2203,12 +2234,13 @@ gboolean alarm_manager_alarm_create_periodic(AlarmManager *obj, GDBusMethodInvoc
                g_dbus_method_invocation_return_value(invoc,
                        g_variant_new("(ii)", alarm_id, return_code));
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
+               /* TODO: fix the log message */
                if (is_ref)
                        sprintf(log_message,
-                               "pid: %d, Smack denied (alarm-server::alarm-ref-periodic, w)", pid);
+                               "uid: %d, pid: %d, Smack denied (alarm-server::alarm-ref-periodic, w)", uid, pid);
                else
                        sprintf(log_message,
-                               "pid: %d, Smack denied (alarm-server::alarm-periodic, w)", pid);
+                               "uid: %d, pid: %d, Smack denied (alarm-server::alarm-periodic, w)", uid, pid);
 
                __save_module_log("FAIL: CREATE", log_message);
 #endif
@@ -2243,7 +2275,7 @@ gboolean alarm_manager_alarm_create_periodic(AlarmManager *obj, GDBusMethodInvoc
                        alarm_info.mode.u_interval.interval = __get_proper_interval(interval * 60);
        }
 
-       if (!__alarm_create(&alarm_info, &alarm_id, pid, method, interval * 60, is_ref,
+       if (!__alarm_create(&alarm_info, &alarm_id, uid, pid, method, interval * 60, is_ref,
                            app_service_name, app_service_name_mod,
                            "null", "null", &return_code)) {
                ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code);
@@ -2261,8 +2293,8 @@ gboolean alarm_manager_alarm_create_periodic(AlarmManager *obj, GDBusMethodInvoc
        g_dbus_method_invocation_return_value(invoc,
                        g_variant_new("(ii)", alarm_id, return_code));
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
-       sprintf(log_message, "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
-                       alarm_id, pid, alarm_info.start.year, alarm_info.start.month,
+       sprintf(log_message, "alarmID: %d, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
+                       alarm_id, uid, pid, alarm_info.start.year, alarm_info.start.month,
                        alarm_info.start.day, alarm_info.start.hour,
                        alarm_info.start.min, alarm_info.start.sec);
        __save_module_log(log_tag, log_message);
@@ -2280,13 +2312,15 @@ gboolean alarm_manager_alarm_delete(AlarmManager *obj, GDBusMethodInvocation *in
        char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
 #endif
        bool ret = true;
+       uid_t uid;
        int pid;
        const char *name = g_dbus_method_invocation_get_sender(invoc);
 
+       uid = __get_caller_uid(name);
        pid = __get_caller_pid(name);
 
 
-       if (!__alarm_delete(pid, alarm_id, &return_code)) {
+       if (!__alarm_delete(uid, alarm_id, &return_code)) {
                ALARM_MGR_EXCEPTION_PRINT("Unable to delete the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
                strncpy(log_tag, "FAIL: DELETE", strlen("FAIL: DELETE"));
@@ -2302,7 +2336,7 @@ gboolean alarm_manager_alarm_delete(AlarmManager *obj, GDBusMethodInvocation *in
        g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
 
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
-       sprintf(log_message, "alarmID: %d, pid: %d", alarm_id, pid);
+       sprintf(log_message, "alarmID: %d, uid: %d, pid: %d", alarm_id, uid, pid);
        __save_module_log(log_tag, log_message);
 #endif
 
@@ -2322,9 +2356,11 @@ gboolean alarm_manager_alarm_delete_all(AlarmManager *obj, GDBusMethodInvocation
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
        char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
 #endif
+       uid_t uid;
        int pid;
        const char *name = g_dbus_method_invocation_get_sender(invoc);
 
+       uid = __get_caller_uid(name);
        pid = __get_caller_pid(name);
 
        if (!__get_caller_unique_name(pid, app_name)) {
@@ -2347,7 +2383,7 @@ gboolean alarm_manager_alarm_delete_all(AlarmManager *obj, GDBusMethodInvocation
                SECURE_LOGD("Try to remove app_name[%s], alarm_id[%d]\n", tmp_appname, entry->alarm_id);
                if (tmp_appname && strncmp(app_name, tmp_appname, strlen(tmp_appname)) == 0)
                {
-                       if (_remove_from_scheduled_alarm_list(pid, entry->alarm_id))
+                       if (_remove_from_scheduled_alarm_list(uid, entry->alarm_id))
                        {
                                is_deleted = true;
                        }
@@ -2381,7 +2417,7 @@ gboolean alarm_manager_alarm_delete_all(AlarmManager *obj, GDBusMethodInvocation
        }
 
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
-       sprintf(log_message, "pid: %d, unique_name: %s", pid, app_name);
+       sprintf(log_message, "uid: %d, pid: %d, unique_name: %s", uid, pid, app_name);
        __save_module_log("DELETE ALL", log_message);
 #endif
 
@@ -2407,9 +2443,11 @@ gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *i
        char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,};
        char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,};
 #endif
+       int uid;
        int pid;
        const char *name = g_dbus_method_invocation_get_sender(invoc);
 
+       uid = __get_caller_uid(name);
        pid = __get_caller_pid(name);
 
        alarm_info.start.year = start_year;
@@ -2429,7 +2467,7 @@ gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *i
        alarm_info.alarm_type = alarm_type;
        alarm_info.reserved_info = reserved_info;
 
-       if (!__alarm_update(pid, app_service_name, alarm_id, &alarm_info, &return_code)) {
+       if (!__alarm_update(uid, pid, app_service_name, alarm_id, &alarm_info, &return_code)) {
                ALARM_MGR_EXCEPTION_PRINT("Unable to update the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code);
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
                strncpy(log_tag, "FAIL: UPDATE", strlen("FAIL: UPDATE"));
@@ -2445,8 +2483,8 @@ gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *i
        g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
 
 #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG
-       sprintf(log_message, "alarmID: %d, appname: %s, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
-               alarm_id, app_service_name, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
+       sprintf(log_message, "alarmID: %d, appname: %s, uid: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d",
+               alarm_id, app_service_name, uid, pid, start_year, start_month, start_day, start_hour, start_min, start_sec);
        __save_module_log(log_tag, log_message);
 #endif
 
@@ -2462,9 +2500,11 @@ gboolean alarm_manager_alarm_get_number_of_ids(AlarmManager *pObject, GDBusMetho
        int retval = 0;
        int num_of_ids = 0;
        int return_code = ALARMMGR_RESULT_SUCCESS;
+       uid_t uid;
        int pid;
        const char *name = g_dbus_method_invocation_get_sender(invoc);
 
+       uid = __get_caller_uid(name);
        pid = __get_caller_pid(name);
 
        if (!__get_caller_unique_name(pid, app_name)) {
@@ -2473,18 +2513,19 @@ gboolean alarm_manager_alarm_get_number_of_ids(AlarmManager *pObject, GDBusMetho
                return true;
        }
 
-       SECURE_LOGD("Called by process (pid:%d, unique_name:%s)", pid, app_name);
+       SECURE_LOGD("Called by process (uid:%d, pid:%d, unique_name:%s)", uid, pid, app_name);
 
        for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
                entry = gs_iter->data;
                SECURE_LOGD("app_name=%s, quark_app_unique_name=%s", app_name, g_quark_to_string(entry->quark_app_unique_name));
-               if (strncmp(app_name, g_quark_to_string(entry->quark_app_unique_name), strlen(app_name)) == 0) {
+               if (entry->uid == uid &&
+                               strncmp(app_name, g_quark_to_string(entry->quark_app_unique_name), strlen(app_name)) == 0) {
                        (num_of_ids)++;
-                       SECURE_LOGD("inc number of alarms of app (pid:%d, unique_name:%s) is %d.", pid, app_name, num_of_ids);
+                       SECURE_LOGD("inc number of alarms of app (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, num_of_ids);
                }
        }
 
-       SECURE_LOGD("number of alarms of the process (pid:%d, unique_name:%s) is %d.", pid, app_name, num_of_ids);
+       SECURE_LOGD("number of alarms of the process (uid:%d, pid:%d, unique_name:%s) is %d.", uid, pid, app_name, num_of_ids);
        g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", num_of_ids, return_code));
        return true;
 }
@@ -2500,13 +2541,15 @@ gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodI
        GVariantBuilder* builder = NULL;
        int num_of_ids = 0;
        int return_code = ALARMMGR_RESULT_SUCCESS;
+       uid_t uid;
        int pid;
        const char *name = g_dbus_method_invocation_get_sender(invoc);
 
+       uid = __get_caller_uid(name);
        pid = __get_caller_pid(name);
 
        if (max_number_of_ids <= 0) {
-               SECURE_LOGE("called for pid(%d), but max_number_of_ids(%d) is less than 0.", pid, max_number_of_ids);
+               SECURE_LOGE("called for uid(%d) pid(%d), but max_number_of_ids(%d) is less than 0.", uid, pid, max_number_of_ids);
                g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", g_variant_new("ai", NULL), num_of_ids, return_code));
                return true;
        }
@@ -2517,12 +2560,13 @@ gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodI
                return true;
        }
 
-       SECURE_LOGD("Called by process (pid:%d, unique_name=%s).", pid, app_name);
+       SECURE_LOGD("Called by process (uid: %d, pid:%d, unique_name=%s).", uid, pid, app_name);
 
        builder = g_variant_builder_new(G_VARIANT_TYPE ("ai"));
        for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
                entry = gs_iter->data;
-               if (strncmp(app_name, g_quark_to_string(entry->quark_app_unique_name), strlen(app_name)) == 0) {
+               if (entry->uid == uid &&
+                               strncmp(app_name, g_quark_to_string(entry->quark_app_unique_name), strlen(app_name)) == 0) {
                        g_variant_builder_add (builder, "i", entry->alarm_id);
                        index ++;
                        SECURE_LOGE("called for alarmid(%d), but max_number_of_ids(%d) index %d.", entry->alarm_id, max_number_of_ids, index);
@@ -2532,7 +2576,7 @@ gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodI
        arr = g_variant_new("ai", builder);
        num_of_ids = index;
 
-       SECURE_LOGE("Called by pid (%d), but max_number_of_ids(%d) return code %d.", pid, num_of_ids, return_code);
+       SECURE_LOGE("Called by uid (%d), pid (%d), but max_number_of_ids(%d) return code %d.", uid, pid, num_of_ids, return_code);
        g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", arr, num_of_ids, return_code));
 
        g_variant_builder_unref(builder);
@@ -2548,12 +2592,16 @@ gboolean alarm_manager_alarm_get_appsvc_info(AlarmManager *pObject, GDBusMethodI
        int retval = 0;
        int return_code = ALARMMGR_RESULT_SUCCESS;
        gchar *b_data = NULL;
+       uid_t uid;
+       const char *name = g_dbus_method_invocation_get_sender(invoc);
 
-       SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
+       uid = __get_caller_uid(name);
+
+       SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
 
        for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
                entry = gs_iter->data;
-               if (entry->alarm_id == alarm_id) {
+               if (entry->uid == uid && entry->alarm_id == alarm_id) {
                        found = true;
                        b_data = g_strdup(g_quark_to_string(entry->quark_bundle));
                        break;
@@ -2583,11 +2631,15 @@ gboolean alarm_manager_alarm_get_info(AlarmManager *pObject, GDBusMethodInvocati
        alarm_info_t *alarm_info = NULL;
        int retval = 0;
        int return_code = ALARMMGR_RESULT_SUCCESS;
+       uid_t uid;
+       const char *name = g_dbus_method_invocation_get_sender(invoc);
 
-       SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
+       uid = __get_caller_uid(name);
+
+       SECURE_LOGD("called for uid(%d), alarm_id(%d)\n", uid, alarm_id);
        for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
                entry = gs_iter->data;
-               if (entry->alarm_id == alarm_id) {
+               if (entry->uid == uid && entry->alarm_id == alarm_id) {
                        alarm_info = &(entry->alarm_info);
                        break;
                }
@@ -2616,11 +2668,15 @@ gboolean alarm_manager_alarm_get_next_duetime(AlarmManager *pObject, GDBusMethod
        int retval = 0;
        int return_code = ALARMMGR_RESULT_SUCCESS;
        time_t duetime = 0;
+       uid_t uid;
+       const char *name = g_dbus_method_invocation_get_sender(invoc);
+
+       uid = __get_caller_uid(name);
 
        SECURE_LOGD("called for alarm_id(%d)\n", alarm_id);
        for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
                entry = gs_iter->data;
-               if (entry->alarm_id == alarm_id) {
+               if (entry->uid == uid && entry->alarm_id == alarm_id) {
                        find_item = entry;
                        break;
                }
@@ -2667,6 +2723,10 @@ gboolean alarm_manager_alarm_get_all_info(AlarmManager *pObject, GDBusMethodInvo
        GSList *gs_iter = NULL;
        __alarm_info_t *entry = NULL;
        char *error_message = NULL;
+       uid_t uid;
+       const char *name = g_dbus_method_invocation_get_sender(invoc);
+
+       uid = __get_caller_uid(name);
 
        // Open a DB
        time(&current_time);
@@ -2702,6 +2762,8 @@ gboolean alarm_manager_alarm_get_all_info(AlarmManager *pObject, GDBusMethodInvo
        int index = 0;
        for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
                entry = gs_iter->data;
+               if (entry->uid != uid)
+                       continue;
                ++index;
                SECURE_LOGD("#%d alarm id[%d] app_name[%s] duetime[%d]",
                        index, entry->alarm_id, g_quark_to_string(entry->quark_app_unique_name), entry->start);
@@ -2968,6 +3030,7 @@ static bool __initialize_dbus()
                                (alarm_id integer primary key,\
                                                start integer,\
                                                end integer,\
+                                               uid integer,\
                                                pid integer,\
                                                caller_pkgid text,\
                                                callee_pkgid text,\
index e0071a7..87b8d8b 100644 (file)
@@ -131,7 +131,7 @@ bool _send_alarm_get_info(alarm_context_t context, alarm_id_t alarm_id, alarm_in
 bool _send_alarm_get_next_duetime(alarm_context_t context, alarm_id_t alarm_id, time_t* duetime, int *error_code);
 bool _send_alarm_get_all_info(alarm_context_t context, char ** db_path, int *error_code);
 bool _send_alarm_reset(alarm_context_t context, int *error_code);
-bool _remove_from_scheduled_alarm_list(int pid, alarm_id_t alarm_id);
+bool _remove_from_scheduled_alarm_list(uid_t uid, alarm_id_t alarm_id);
 bool _load_alarms_from_registry();
 bundle *_send_alarm_get_appsvc_info(alarm_context_t context, alarm_id_t alarm_id, int *error_code);
 bool _send_alarm_set_rtc_time(alarm_context_t context, alarm_date_t *time, int *error_code);
@@ -144,6 +144,7 @@ typedef struct {
        time_t end;
 
        alarm_id_t alarm_id;
+       uid_t uid;
        int pid;
        GQuark quark_caller_pkgid;
        GQuark quark_callee_pkgid;
@@ -185,6 +186,7 @@ typedef struct {
 typedef struct {
        bool used;
        alarm_id_t alarm_id;
+       uid_t uid;
        int pid;
        __alarm_info_t *__alarm_info;
 } __scheduled_alarm_t;