From: sungwook79.park Date: Wed, 16 Mar 2016 04:28:12 +0000 (+0900) Subject: Add check privilege by cynara X-Git-Tag: submit/tizen/20160316.061526~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ca1034de21470f585187448a098300ce650a7aa9;p=platform%2Fcore%2Fapi%2Finputmethod.git Add check privilege by cynara Change-Id: Icc3069b3b98a8b6eadac44ebd307687593ed6f20 Signed-off-by: sungwook79.park --- diff --git a/CMakeLists.txt b/CMakeLists.txt index c37ccc5..34a1775 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ SET(maintainer "Ji-hoon Lee ") SET(description "Input Method APIs") SET(service "ui") SET(submodule "inputmethod") -SET(dependents "capi-base-common dlog elementary ecore-imf libscl-core isf") +SET(dependents "capi-base-common dlog elementary ecore-imf libscl-core isf cynara-client cynara-session") SET(LIBDIR ${LIB_INSTALL_DIR}) SET(Services diff --git a/include/privilege_checker_private.h b/include/privilege_checker_private.h new file mode 100644 index 0000000..f9b8967 --- /dev/null +++ b/include/privilege_checker_private.h @@ -0,0 +1,10 @@ +#ifndef __PRIVILEGE_CHECKER_H +#define __PRIVILEGE_CHECKER_H + +#define IME_PRIVILEGE "http://tizen.org/privilege/ime" + +bool inputmethod_cynara_initialize(); +void inputmethod_cynara_finish(); +bool check_privilege(const char *uid, const char *privilege); + +#endif //__PRIVILEGE_CHECKER_H diff --git a/packaging/capi-ui-inputmethod.spec b/packaging/capi-ui-inputmethod.spec index 42726b2..55926a8 100644 --- a/packaging/capi-ui-inputmethod.spec +++ b/packaging/capi-ui-inputmethod.spec @@ -12,6 +12,8 @@ BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(ecore-imf) BuildRequires: pkgconfig(libscl-core) BuildRequires: pkgconfig(isf) +BuildRequires: pkgconfig(cynara-client) +BuildRequires: pkgconfig(cynara-session) Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig diff --git a/src/inputmethod.cpp b/src/inputmethod.cpp index a592a4a..db9e4b1 100644 --- a/src/inputmethod.cpp +++ b/src/inputmethod.cpp @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "inputmethod_private.h" #include @@ -341,8 +343,32 @@ void CCoreEventCallback::on_check_option_window_availability(sclboolean *ret) } } +ime_error_e _check_privilege() +{ + char uid[16]; + ime_error_e ret = IME_ERROR_NONE; + + if (inputmethod_cynara_initialize() == false) { + LOGE("inputmethod_cynara_initialize () == false"); + return IME_ERROR_PERMISSION_DENIED; + } + + snprintf(uid, 16, "%d", getuid()); + if (check_privilege(uid, IME_PRIVILEGE) == false) { + LOGE("check_privilege(uid, IME_PRIVILEGE) == false"); + LOGE("uid : %s.", uid); + ret = IME_ERROR_PERMISSION_DENIED; + } + + inputmethod_cynara_finish (); + + return ret; +} + int ime_run(ime_callback_s *basic_cb, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (g_running) { LOGE("inputmethod main loop is already running."); return IME_ERROR_OPERATION_FAILED; @@ -353,6 +379,12 @@ int ime_run(ime_callback_s *basic_cb, void *user_data) return IME_ERROR_INVALID_PARAMETER; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_basic_callback = *basic_cb; if (!g_basic_callback.create || !g_basic_callback.terminate || @@ -378,6 +410,8 @@ int ime_run(ime_callback_s *basic_cb, void *user_data) int ime_event_set_focus_in_cb(ime_focus_in_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -388,6 +422,12 @@ int ime_event_set_focus_in_cb(ime_focus_in_cb callback_func, void *user_data) return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.focus_in = callback_func; g_event_callback.focus_in_user_data = user_data; @@ -396,6 +436,8 @@ int ime_event_set_focus_in_cb(ime_focus_in_cb callback_func, void *user_data) int ime_event_set_focus_out_cb(ime_focus_out_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -406,6 +448,12 @@ int ime_event_set_focus_out_cb(ime_focus_out_cb callback_func, void *user_data) return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.focus_out = callback_func; g_event_callback.focus_out_user_data = user_data; @@ -414,6 +462,8 @@ int ime_event_set_focus_out_cb(ime_focus_out_cb callback_func, void *user_data) int ime_event_set_surrounding_text_updated_cb(ime_surrounding_text_updated_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -424,6 +474,12 @@ int ime_event_set_surrounding_text_updated_cb(ime_surrounding_text_updated_cb ca return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.surrounding_text_updated = callback_func; g_event_callback.surrounding_text_updated_user_data = user_data; @@ -432,6 +488,8 @@ int ime_event_set_surrounding_text_updated_cb(ime_surrounding_text_updated_cb ca int ime_event_set_input_context_reset_cb(ime_input_context_reset_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -442,6 +500,12 @@ int ime_event_set_input_context_reset_cb(ime_input_context_reset_cb callback_fun return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.input_context_reset = callback_func; g_event_callback.input_context_reset_user_data = user_data; @@ -450,6 +514,8 @@ int ime_event_set_input_context_reset_cb(ime_input_context_reset_cb callback_fun int ime_event_set_cursor_position_updated_cb(ime_cursor_position_updated_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -460,6 +526,12 @@ int ime_event_set_cursor_position_updated_cb(ime_cursor_position_updated_cb call return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.cursor_position_updated = callback_func; g_event_callback.cursor_position_updated_user_data = user_data; @@ -468,6 +540,8 @@ int ime_event_set_cursor_position_updated_cb(ime_cursor_position_updated_cb call int ime_event_set_language_requested_cb(ime_language_requested_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -478,6 +552,12 @@ int ime_event_set_language_requested_cb(ime_language_requested_cb callback_func, return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.language_requested = callback_func; g_event_callback.language_requested_user_data = user_data; @@ -486,6 +566,8 @@ int ime_event_set_language_requested_cb(ime_language_requested_cb callback_func, int ime_event_set_language_set_cb(ime_language_set_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -496,6 +578,12 @@ int ime_event_set_language_set_cb(ime_language_set_cb callback_func, void *user_ return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.language_set = callback_func; g_event_callback.language_set_user_data = user_data; @@ -504,6 +592,8 @@ int ime_event_set_language_set_cb(ime_language_set_cb callback_func, void *user_ int ime_event_set_imdata_set_cb(ime_imdata_set_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -514,6 +604,12 @@ int ime_event_set_imdata_set_cb(ime_imdata_set_cb callback_func, void *user_data return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.imdata_set = callback_func; g_event_callback.imdata_set_user_data = user_data; @@ -522,6 +618,8 @@ int ime_event_set_imdata_set_cb(ime_imdata_set_cb callback_func, void *user_data int ime_event_set_imdata_requested_cb(ime_imdata_requested_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -532,6 +630,12 @@ int ime_event_set_imdata_requested_cb(ime_imdata_requested_cb callback_func, voi return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.imdata_requested = callback_func; g_event_callback.imdata_requested_user_data = user_data; @@ -540,6 +644,8 @@ int ime_event_set_imdata_requested_cb(ime_imdata_requested_cb callback_func, voi int ime_event_set_layout_set_cb(ime_layout_set_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -550,6 +656,12 @@ int ime_event_set_layout_set_cb(ime_layout_set_cb callback_func, void *user_data return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.layout_set = callback_func; g_event_callback.layout_set_user_data = user_data; @@ -558,6 +670,8 @@ int ime_event_set_layout_set_cb(ime_layout_set_cb callback_func, void *user_data int ime_event_set_return_key_type_set_cb(ime_return_key_type_set_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -568,6 +682,12 @@ int ime_event_set_return_key_type_set_cb(ime_return_key_type_set_cb callback_fun return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.return_key_type_set = callback_func; g_event_callback.return_key_type_set_user_data = user_data; @@ -576,6 +696,8 @@ int ime_event_set_return_key_type_set_cb(ime_return_key_type_set_cb callback_fun int ime_event_set_return_key_state_set_cb(ime_return_key_state_set_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -586,6 +708,12 @@ int ime_event_set_return_key_state_set_cb(ime_return_key_state_set_cb callback_f return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.return_key_state_set = callback_func; g_event_callback.return_key_state_set_user_data = user_data; @@ -594,6 +722,8 @@ int ime_event_set_return_key_state_set_cb(ime_return_key_state_set_cb callback_f int ime_event_set_geometry_requested_cb(ime_geometry_requested_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -604,6 +734,12 @@ int ime_event_set_geometry_requested_cb(ime_geometry_requested_cb callback_func, return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.geometry_requested = callback_func; g_event_callback.geometry_requested_user_data = user_data; @@ -612,6 +748,8 @@ int ime_event_set_geometry_requested_cb(ime_geometry_requested_cb callback_func, int ime_event_set_process_key_event_cb(ime_process_key_event_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -622,6 +760,12 @@ int ime_event_set_process_key_event_cb(ime_process_key_event_cb callback_func, v return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.process_key_event = callback_func; g_event_callback.process_key_event_user_data = user_data; @@ -630,6 +774,8 @@ int ime_event_set_process_key_event_cb(ime_process_key_event_cb callback_func, v int ime_event_set_display_language_changed_cb(ime_display_language_changed_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -640,6 +786,12 @@ int ime_event_set_display_language_changed_cb(ime_display_language_changed_cb ca return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.display_language_changed = callback_func; g_event_callback.display_language_changed_user_data = user_data; @@ -648,6 +800,8 @@ int ime_event_set_display_language_changed_cb(ime_display_language_changed_cb ca int ime_event_set_rotation_degree_changed_cb(ime_rotation_degree_changed_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -658,6 +812,12 @@ int ime_event_set_rotation_degree_changed_cb(ime_rotation_degree_changed_cb call return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.rotation_degree_changed = callback_func; g_event_callback.rotation_degree_changed_user_data = user_data; @@ -666,6 +826,8 @@ int ime_event_set_rotation_degree_changed_cb(ime_rotation_degree_changed_cb call int ime_event_set_accessibility_state_changed_cb(ime_accessibility_state_changed_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -676,6 +838,12 @@ int ime_event_set_accessibility_state_changed_cb(ime_accessibility_state_changed return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.accessibility_state_changed = callback_func; g_event_callback.accessibility_state_changed_user_data = user_data; @@ -684,6 +852,8 @@ int ime_event_set_accessibility_state_changed_cb(ime_accessibility_state_changed int ime_event_set_option_window_created_cb(ime_option_window_created_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -694,6 +864,12 @@ int ime_event_set_option_window_created_cb(ime_option_window_created_cb callback return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.option_window_created = callback_func; g_event_callback.option_window_created_user_data = user_data; @@ -702,6 +878,8 @@ int ime_event_set_option_window_created_cb(ime_option_window_created_cb callback int ime_event_set_option_window_destroyed_cb(ime_option_window_destroyed_cb callback_func, void *user_data) { + ime_error_e retVal = IME_ERROR_NONE; + if (!callback_func) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -712,6 +890,12 @@ int ime_event_set_option_window_destroyed_cb(ime_option_window_destroyed_cb call return IME_ERROR_OPERATION_FAILED; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_event_callback.option_window_destroyed = callback_func; g_event_callback.option_window_destroyed_user_data = user_data; @@ -720,11 +904,19 @@ int ime_event_set_option_window_destroyed_cb(ime_option_window_destroyed_cb call int ime_send_key_event(ime_key_code_e keycode, ime_key_mask_e keymask, bool forward_key) { + ime_error_e retVal = IME_ERROR_NONE; + if (!g_running) { LOGW("IME_ERROR_NOT_RUNNING"); return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + if (forward_key) g_core.forward_key_event(-1, NULL, (sclu32)keycode, (sclu16)keymask); else @@ -735,6 +927,8 @@ int ime_send_key_event(ime_key_code_e keycode, ime_key_mask_e keymask, bool forw int ime_commit_string(const char *str) { + ime_error_e retVal = IME_ERROR_NONE; + if (!str) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -745,6 +939,12 @@ int ime_commit_string(const char *str) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_core.commit_string(-1, NULL, str); return IME_ERROR_NONE; @@ -752,11 +952,19 @@ int ime_commit_string(const char *str) int ime_show_preedit_string(void) { + ime_error_e retVal = IME_ERROR_NONE; + if (!g_running) { LOGW("IME_ERROR_NOT_RUNNING"); return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_core.show_preedit_string(-1, NULL); return IME_ERROR_NONE; @@ -764,11 +972,19 @@ int ime_show_preedit_string(void) int ime_hide_preedit_string(void) { + ime_error_e retVal = IME_ERROR_NONE; + if (!g_running) { LOGW("IME_ERROR_NOT_RUNNING"); return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_core.hide_preedit_string(-1, NULL); return IME_ERROR_NONE; @@ -776,6 +992,8 @@ int ime_hide_preedit_string(void) int ime_update_preedit_string(const char *str, Eina_List *attrs) { + ime_error_e retVal = IME_ERROR_NONE; + if (!str) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -786,6 +1004,12 @@ int ime_update_preedit_string(const char *str, Eina_List *attrs) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + scim::AttributeList attrv; void *data = NULL; ime_preedit_attribute *attr = NULL; @@ -807,6 +1031,8 @@ int ime_update_preedit_string(const char *str, Eina_List *attrs) int ime_request_surrounding_text(int maxlen_before, int maxlen_after) { + ime_error_e retVal = IME_ERROR_NONE; + if (!g_event_callback.surrounding_text_updated) { LOGW("IME_ERROR_NO_CALLBACK_FUNCTION"); return IME_ERROR_NO_CALLBACK_FUNCTION; @@ -817,6 +1043,12 @@ int ime_request_surrounding_text(int maxlen_before, int maxlen_after) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_core.get_surrounding_text(NULL, maxlen_before, maxlen_after); return IME_ERROR_NONE; @@ -824,6 +1056,8 @@ int ime_request_surrounding_text(int maxlen_before, int maxlen_after) int ime_delete_surrounding_text(int offset, int len) { + ime_error_e retVal = IME_ERROR_NONE; + if (len <= 0) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -834,6 +1068,12 @@ int ime_delete_surrounding_text(int offset, int len) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_core.delete_surrounding_text(offset, len); return IME_ERROR_NONE; @@ -841,6 +1081,8 @@ int ime_delete_surrounding_text(int offset, int len) Evas_Object* ime_get_main_window(void) { + ime_error_e retVal = IME_ERROR_NONE; + Evas_Object *win = NULL; if (!g_running) { @@ -849,6 +1091,13 @@ Evas_Object* ime_get_main_window(void) return NULL; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + set_last_result(retVal); + return NULL; + } + win = static_cast(g_core.get_main_window()); if (win) { set_last_result(IME_ERROR_NONE); @@ -863,6 +1112,8 @@ Evas_Object* ime_get_main_window(void) int ime_set_size(int portrait_width, int portrait_height, int landscape_width, int landscape_height) { + ime_error_e retVal = IME_ERROR_NONE; + SclSize portrait_size, landscape_size; if (portrait_width < 1 || portrait_height < 1 || landscape_width < 1 || landscape_height < 1) { @@ -875,6 +1126,12 @@ int ime_set_size(int portrait_width, int portrait_height, int landscape_width, i return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + portrait_size.width = portrait_width; portrait_size.height = portrait_height; @@ -888,6 +1145,8 @@ int ime_set_size(int portrait_width, int portrait_height, int landscape_width, i int ime_create_option_window(void) { + ime_error_e retVal = IME_ERROR_NONE; + if (!g_event_callback.option_window_created || !g_event_callback.option_window_destroyed) { LOGW("ime_create_option_window_cb() and ime_destroy_option_window_cb() callback functions are not set."); return IME_ERROR_NO_CALLBACK_FUNCTION; @@ -898,6 +1157,12 @@ int ime_create_option_window(void) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + if (g_core.create_option_window()) return IME_ERROR_NONE; else { @@ -908,6 +1173,8 @@ int ime_create_option_window(void) int ime_destroy_option_window(Evas_Object *window) { + ime_error_e retVal = IME_ERROR_NONE; + if (!g_event_callback.option_window_created || !g_event_callback.option_window_destroyed) { LOGW("ime_create_option_window_cb() and ime_destroy_option_window_cb() callback functions are not set."); return IME_ERROR_NO_CALLBACK_FUNCTION; @@ -923,6 +1190,12 @@ int ime_destroy_option_window(Evas_Object *window) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + g_core.destroy_option_window(window); return IME_ERROR_NONE; @@ -930,6 +1203,8 @@ int ime_destroy_option_window(Evas_Object *window) int ime_context_get_layout(ime_context_h context, Ecore_IMF_Input_Panel_Layout *layout) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !layout) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -940,6 +1215,12 @@ int ime_context_get_layout(ime_context_h context, Ecore_IMF_Input_Panel_Layout * return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *layout = context->layout; return IME_ERROR_NONE; @@ -947,6 +1228,8 @@ int ime_context_get_layout(ime_context_h context, Ecore_IMF_Input_Panel_Layout * int ime_context_get_layout_variation(ime_context_h context, ime_layout_variation_e *layout_variation) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !layout_variation) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -957,6 +1240,12 @@ int ime_context_get_layout_variation(ime_context_h context, ime_layout_variation return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *layout_variation = static_cast(context->layout_variation); return IME_ERROR_NONE; @@ -964,6 +1253,8 @@ int ime_context_get_layout_variation(ime_context_h context, ime_layout_variation int ime_context_get_cursor_position(ime_context_h context, int *cursor_pos) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !cursor_pos) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -974,6 +1265,12 @@ int ime_context_get_cursor_position(ime_context_h context, int *cursor_pos) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *cursor_pos = context->cursor_pos; return IME_ERROR_NONE; @@ -981,6 +1278,8 @@ int ime_context_get_cursor_position(ime_context_h context, int *cursor_pos) int ime_context_get_autocapital_type(ime_context_h context, Ecore_IMF_Autocapital_Type *autocapital_type) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !autocapital_type) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -991,6 +1290,12 @@ int ime_context_get_autocapital_type(ime_context_h context, Ecore_IMF_Autocapita return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *autocapital_type = context->autocapital_type; return IME_ERROR_NONE; @@ -998,6 +1303,8 @@ int ime_context_get_autocapital_type(ime_context_h context, Ecore_IMF_Autocapita int ime_context_get_return_key_type(ime_context_h context, Ecore_IMF_Input_Panel_Return_Key_Type *return_key_type) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !return_key_type) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1008,6 +1315,12 @@ int ime_context_get_return_key_type(ime_context_h context, Ecore_IMF_Input_Panel return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *return_key_type = context->return_key_type; return IME_ERROR_NONE; @@ -1015,6 +1328,8 @@ int ime_context_get_return_key_type(ime_context_h context, Ecore_IMF_Input_Panel int ime_context_get_return_key_state(ime_context_h context, bool *return_key_state) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !return_key_state) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1025,6 +1340,12 @@ int ime_context_get_return_key_state(ime_context_h context, bool *return_key_sta return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *return_key_state = static_cast(context->return_key_disabled); return IME_ERROR_NONE; @@ -1032,6 +1353,8 @@ int ime_context_get_return_key_state(ime_context_h context, bool *return_key_sta int ime_context_get_prediction_mode(ime_context_h context, bool *prediction_mode) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !prediction_mode) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1042,6 +1365,12 @@ int ime_context_get_prediction_mode(ime_context_h context, bool *prediction_mode return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *prediction_mode = static_cast(context->prediction_allow); return IME_ERROR_NONE; @@ -1049,6 +1378,8 @@ int ime_context_get_prediction_mode(ime_context_h context, bool *prediction_mode int ime_context_get_password_mode(ime_context_h context, bool *password_mode) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !password_mode) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1059,6 +1390,12 @@ int ime_context_get_password_mode(ime_context_h context, bool *password_mode) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *password_mode = static_cast(context->password_mode); return IME_ERROR_NONE; @@ -1066,6 +1403,8 @@ int ime_context_get_password_mode(ime_context_h context, bool *password_mode) int ime_context_get_input_hint(ime_context_h context, Ecore_IMF_Input_Hints *input_hint) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !input_hint) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1076,6 +1415,12 @@ int ime_context_get_input_hint(ime_context_h context, Ecore_IMF_Input_Hints *inp return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *input_hint = context->input_hint; return IME_ERROR_NONE; @@ -1083,6 +1428,8 @@ int ime_context_get_input_hint(ime_context_h context, Ecore_IMF_Input_Hints *inp int ime_context_get_bidi_direction(ime_context_h context, Ecore_IMF_BiDi_Direction *bidi) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !bidi) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1093,6 +1440,12 @@ int ime_context_get_bidi_direction(ime_context_h context, Ecore_IMF_BiDi_Directi return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *bidi = context->bidi_direction; return IME_ERROR_NONE; @@ -1100,6 +1453,8 @@ int ime_context_get_bidi_direction(ime_context_h context, Ecore_IMF_BiDi_Directi int ime_context_get_language(ime_context_h context, Ecore_IMF_Input_Panel_Lang *language) { + ime_error_e retVal = IME_ERROR_NONE; + if (!context || !language) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1110,6 +1465,12 @@ int ime_context_get_language(ime_context_h context, Ecore_IMF_Input_Panel_Lang * return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *language = context->language; return IME_ERROR_NONE; @@ -1117,6 +1478,8 @@ int ime_context_get_language(ime_context_h context, Ecore_IMF_Input_Panel_Lang * int ime_device_info_get_name(ime_device_info_h dev_info, char **dev_name) { + ime_error_e retVal = IME_ERROR_NONE; + if (!dev_info || !dev_name) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1127,6 +1490,12 @@ int ime_device_info_get_name(ime_device_info_h dev_info, char **dev_name) return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + if (!dev_info->dev_name) *dev_name = strdup(""); else @@ -1137,6 +1506,8 @@ int ime_device_info_get_name(ime_device_info_h dev_info, char **dev_name) int ime_device_info_get_class(ime_device_info_h dev_info, Ecore_IMF_Device_Class *dev_class) { + ime_error_e retVal = IME_ERROR_NONE; + if (!dev_info || !dev_class) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1147,6 +1518,12 @@ int ime_device_info_get_class(ime_device_info_h dev_info, Ecore_IMF_Device_Class return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *dev_class = dev_info->dev_class; return IME_ERROR_NONE; @@ -1154,6 +1531,8 @@ int ime_device_info_get_class(ime_device_info_h dev_info, Ecore_IMF_Device_Class int ime_device_info_get_subclass(ime_device_info_h dev_info, Ecore_IMF_Device_Subclass *dev_subclass) { + ime_error_e retVal = IME_ERROR_NONE; + if (!dev_info || !dev_subclass) { LOGW("IME_ERROR_INVALID_PARAMETER"); return IME_ERROR_INVALID_PARAMETER; @@ -1164,6 +1543,12 @@ int ime_device_info_get_subclass(ime_device_info_h dev_info, Ecore_IMF_Device_Su return IME_ERROR_NOT_RUNNING; } + retVal = _check_privilege(); + if (retVal != IME_ERROR_NONE) { + LOGE("_check_privilege returned %d.", retVal); + return retVal; + } + *dev_subclass = dev_info->dev_subclass; return IME_ERROR_NONE; diff --git a/src/privilege_checker.cpp b/src/privilege_checker.cpp new file mode 100644 index 0000000..bba0f35 --- /dev/null +++ b/src/privilege_checker.cpp @@ -0,0 +1,71 @@ +#include "privilege_checker_private.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "INPUTMETHOD" + +namespace +{ + +cynara *p_cynara = NULL; + +} + +bool +inputmethod_cynara_initialize() +{ + int ret = cynara_initialize(&p_cynara, NULL); + LOGD("[inputmethod_cynara_initialize]_check_privilege returned %d.", ret); + return ret == CYNARA_API_SUCCESS; +} + +void +inputmethod_cynara_finish() +{ + if (p_cynara) + cynara_finish(p_cynara); + + p_cynara = NULL; +} + +bool +check_privilege(const char *uid, const char *privilege) +{ + FILE *fp = NULL; + char smack_label[1024] = "/proc/self/attr/current"; + + if (!p_cynara) { + return false; + } + + fp = fopen("/proc/self/attr/current", "r"); + if (fp != NULL) { + if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0) + LOGW("Error : fread"); + + fclose(fp); + } + + pid_t pid = getpid(); + char *session = cynara_session_from_pid(pid); + int ret = cynara_check(p_cynara, smack_label, session, uid, privilege); + LOGD("[check_privilege]_check_privilege returned %d.", ret); + if (session) + free(session); + + if (ret != CYNARA_API_ACCESS_ALLOWED) + return false; + return true; +} +