Add check privilege by cynara 11/62411/3
authorsungwook79.park <sungwook79.park@samsung.com>
Wed, 16 Mar 2016 04:28:12 +0000 (13:28 +0900)
committersungwook79.park <sungwook79.park@samsung.com>
Wed, 16 Mar 2016 04:57:14 +0000 (13:57 +0900)
Change-Id: Icc3069b3b98a8b6eadac44ebd307687593ed6f20
Signed-off-by: sungwook79.park <sungwook79.park@samsung.com>
CMakeLists.txt
include/privilege_checker_private.h [new file with mode: 0644]
packaging/capi-ui-inputmethod.spec
src/inputmethod.cpp
src/privilege_checker.cpp [new file with mode: 0644]

index c37ccc5fd4eb3c8f1fe4ad430655da2b13f8f51b..34a17751bade82f82dafa7bd6abf2691ed6f2051 100644 (file)
@@ -7,7 +7,7 @@ SET(maintainer "Ji-hoon Lee <dalton.lee@samsung.com>")
 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 (file)
index 0000000..f9b8967
--- /dev/null
@@ -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
index 42726b230ced06704d7f207f4a8f67748e72caff..55926a8df7f4f01c04d8933ac4e3b5a4f2ae69e8 100644 (file)
@@ -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
 
index a592a4a8c6aebd9d957cee60bb3921724ec89362..db9e4b1779b695b51903ea43f8377274655d90ae 100644 (file)
@@ -19,6 +19,8 @@
 #include <string.h>
 #include <dlog.h>
 #include <sclcore.h>
+#include <unistd.h>
+#include <privilege_checker_private.h>
 #include "inputmethod_private.h"
 #include <inputmethod.h>
 
@@ -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<Evas_Object*>(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<ime_layout_variation_e>(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<bool>(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<bool>(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<bool>(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 (file)
index 0000000..bba0f35
--- /dev/null
@@ -0,0 +1,71 @@
+#include "privilege_checker_private.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <dlog.h>
+#include <unistd.h>
+
+#include <cynara-client.h>
+#include <cynara-error.h>
+#include <cynara-session.h>
+
+#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;
+}
+