Add codes for checking caller 63/181963/5
authorInkyun Kil <inkyun.kil@samsung.com>
Tue, 19 Jun 2018 07:42:04 +0000 (16:42 +0900)
committerInkyun Kil <inkyun.kil@samsung.com>
Wed, 20 Jun 2018 04:45:44 +0000 (13:45 +0900)
- When an application requests to delete or update an alarm, should be
verified that the application is correct

Change-Id: Ic947e58a88d4e37fa3ebf61ca9c9f5d4e320f055
Signed-off-by: Inkyun Kil <inkyun.kil@samsung.com>
alarm-manager.c

index b44cb6c..4d3224f 100644 (file)
@@ -2778,6 +2778,52 @@ cynara_out:
        return ret;
 }
 
+static int __check_modifiable(uid_t uid, pid_t pid, int alarm_id)
+{
+       bool caller_is_app = false;
+       char app_name[MAX_APP_ID] = { 0 };
+       GSList *gs_iter = NULL;
+       __alarm_info_t *entry = NULL;
+       char *caller_pkgid = NULL;
+       pkgmgrinfo_pkginfo_h caller_handle;
+
+       if (__get_cached_unique_name(pid, app_name, sizeof(app_name),
+                               &caller_is_app, uid) == false)
+               return ERR_ALARM_SYSTEM_FAIL;
+
+       if (!caller_is_app) {
+               ALARM_MGR_LOG_PRINT("Daemon process is possible to modify alarms[%s]",
+                               app_name);
+               return ALARMMGR_RESULT_SUCCESS;
+       } else {
+               if (pkgmgrinfo_appinfo_get_usr_appinfo(app_name, uid, &caller_handle) != PMINFO_R_OK) {
+                       ALARM_MGR_EXCEPTION_PRINT("Failed to get appinfo %s", app_name);
+                       return ERR_ALARM_SYSTEM_FAIL;
+               } else {
+                       if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) != PMINFO_R_OK) {
+                               ALARM_MGR_EXCEPTION_PRINT("Failed to get pkgid %s", app_name);
+                               pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
+                               return ERR_ALARM_SYSTEM_FAIL;
+                       }
+               }
+       }
+
+       for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) {
+               entry = gs_iter->data;
+               if (entry->uid == uid && entry->alarm_id == alarm_id &&
+                               strcmp(caller_pkgid, entry->caller_pkgid) == 0) {
+                       ALARM_MGR_LOG_PRINT("Found alarm of app (uid:%d, pid:%d, caller_pkgid:%s) ", uid, pid, caller_pkgid);
+                       pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
+                       return ALARMMGR_RESULT_SUCCESS;
+               }
+       }
+
+       ALARM_MGR_EXCEPTION_PRINT("[%s] is not permitted to modify alarm_id[%d]", app_name, alarm_id);
+       pkgmgrinfo_appinfo_destroy_appinfo(caller_handle);
+
+       return ERR_ALARM_NOT_PERMITTED_APP;
+}
+
 gboolean alarm_manager_alarm_set_rtc_time(AlarmManager *pObj, GDBusMethodInvocation *invoc,
                                int year, int mon, int day,
                                int hour, int min, int sec,
@@ -3419,6 +3465,11 @@ gboolean alarm_manager_alarm_delete(AlarmManager *obj, GDBusMethodInvocation *in
                return true;
        }
 
+       return_code = __check_modifiable(uid, pid, alarm_id);
+       if (return_code != ALARMMGR_RESULT_SUCCESS) {
+               g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
+               return true;
+       }
 
        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);
@@ -3550,6 +3601,12 @@ gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *i
                return true;
        }
 
+       return_code = __check_modifiable(uid, pid, alarm_id);
+       if (return_code != ALARMMGR_RESULT_SUCCESS) {
+               g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code));
+               return true;
+       }
+
        alarm_info.start.year = start_year;
        alarm_info.start.month = start_month;
        alarm_info.start.day = start_day;