2 * Copyright 2012 Samsung Electronics Co., Ltd
\r
4 * Licensed under the Flora License, Version 1.0 (the License);
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.tizenopensource.org/license
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an AS IS BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
19 #include "lockscreen.h"
\r
22 #include "password-verification.h"
\r
24 #define MAX_PASSWORD_NUM 4
\r
25 #define PASSWORD_ATTEMPTS_MAX_NUM 5
\r
26 #define VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT VCONFKEY_SETAPPL_PREFIX"/phone_lock_attempts_left"
\r
27 #define VCONFKEY_SETAPPL_PASSWORD_TIMESTAMP_STR VCONFKEY_SETAPPL_PREFIX"/phone_lock_timestamp"
\r
28 #define PASSWORD_TIMESTAMP_STR_LENGTH 512
\r
29 #define PASSWORD_BLOCK_SECONDS 30
\r
31 static char simple_password[MAX_PASSWORD_NUM + 1] = {0};
\r
32 static int simple_password_length = 0;
\r
33 static Evas_Coord simple_pw_down_y = 0;
\r
35 static void __simple_password_password_show(struct appdata *ad)
\r
37 char buf1[50] = {0};
\r
38 char buf2[50] = {0};
\r
41 for(i = 1; i <= simple_password_length; i++){
\r
42 snprintf(buf1, sizeof(buf1), "show,password%d", i);
\r
43 snprintf(buf2, sizeof(buf2), "password%d", i);
\r
44 edje_object_signal_emit(_EDJ(ad->ly_simple_password), buf1, buf2);
\r
46 for(i = MAX_PASSWORD_NUM; i > simple_password_length; i--){
\r
47 snprintf(buf1, sizeof(buf1), "hide,password%d", i);
\r
48 snprintf(buf2, sizeof(buf2), "password%d", i);
\r
49 edje_object_signal_emit(_EDJ(ad->ly_simple_password), buf1, buf2);
\r
53 static void __simple_password_keypad_process(void *data, Evas_Object *obj, const char *emission, const char *source)
\r
55 struct appdata *ad = data;
\r
57 LOCK_SCREEN_TRACE_DBG("source = %s", source);
\r
58 if (strcmp("SOS", source) == 0) {
\r
61 } else if (strcmp("Backspace", source) == 0) {
\r
62 if(simple_password_length <= 0){
\r
63 simple_password[0] = '\0';
\r
66 simple_password_length--;
\r
67 simple_password[simple_password_length] = '\0';
\r
69 if(ad->is_disabled){
\r
72 if(simple_password_length >= MAX_PASSWORD_NUM){
\r
75 simple_password[simple_password_length] = *source;
\r
76 simple_password_length++;
\r
79 if(simple_password_length == MAX_PASSWORD_NUM){
\r
80 password_verification_verify(ad->h_password_policy, simple_password);
\r
84 LOCK_SCREEN_TRACE_DBG("simple_password = %s, simple_password_length = %d", simple_password, simple_password_length);
\r
85 __simple_password_password_show(ad);
\r
88 static void __simple_password_layout_destroy(void *data, Evas_Object *obj, const char *emission, const char *source)
\r
90 struct appdata *ad = data;
\r
92 LOCK_SCREEN_TRACE_DBG("__simple_password_layout_destroy");
\r
94 for(i = 0; i <= MAX_PASSWORD_NUM; i++){
\r
95 simple_password[i] = 0;
\r
97 simple_password_length = 0;
\r
98 if (ad->password_timer) {
\r
99 ecore_timer_del(ad->password_timer);
\r
100 ad->password_timer = NULL;
\r
102 if(ad->ly_simple_password){
\r
103 evas_object_del(ad->ly_simple_password);
\r
104 ad->ly_simple_password = NULL;
\r
106 password_verification_policy_destroy(ad->h_password_policy);
\r
107 lockscreen_info_show(ad);
\r
110 static void __simple_password_mouse_down_cb(void *data, Evas * evas, Evas_Object * obj,
\r
113 Evas_Event_Mouse_Down *ei = event_info;
\r
115 simple_pw_down_y = ei->output.y;
\r
117 LOCK_SCREEN_TRACE_DBG("simple_pw_down_y = %d", simple_pw_down_y);
\r
120 static void __simple_password_mouse_up_cb(void *data, Evas * evas, Evas_Object * obj,
\r
123 struct appdata *ad = data;
\r
124 Evas_Event_Mouse_Down *ei = event_info;
\r
126 Evas_Coord pos_up_y = ei->output.y;
\r
128 if((pos_up_y - simple_pw_down_y) > _X(300)){
\r
129 edje_object_signal_emit(_EDJ(ad->ly_simple_password), "hide,numberkeyboard", "sw.keypad.number");
\r
130 edje_object_signal_callback_add(_EDJ(ad->ly_simple_password), "hide,simplepw", "event", __simple_password_layout_destroy, ad);
\r
134 static void __simple_password_mouse_move_cb(void *data, Evas * evas, Evas_Object * obj,
\r
137 LOCK_SCREEN_TRACE_DBG("__simple_password_mouse_move_cb");
\r
140 void __simple_password_check_result(void *data)
\r
142 struct appdata *ad = (struct appdata *) data;
\r
146 vconf_get_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT, &value);
\r
149 if (value > 0 && value <= PASSWORD_ATTEMPTS_MAX_NUM) {
\r
150 char temp_str[200] = {0};
\r
151 char temp_left[50] = {0};
\r
153 vconf_set_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT,
\r
157 snprintf(temp_left, sizeof(temp_left), _L("1 attempt left."));
\r
161 snprintf(temp_left, sizeof(temp_left), _L("%d attempts left."), value);
\r
163 snprintf(temp_str, sizeof(temp_str), "%s, %s", _L("Wrong password"), temp_left);
\r
164 edje_object_part_text_set(_EDJ(ad->ly_simple_password), "txt.result", temp_str);
\r
165 } else if (value == 0) {
\r
166 time_t cur_time = time(NULL);
\r
167 char cur_timestamp[64] = {0};
\r
168 char temp_str[512] = {0};
\r
170 snprintf(cur_timestamp, sizeof(cur_timestamp), "%ld", cur_time);
\r
171 vconf_set_str(VCONFKEY_SETAPPL_PASSWORD_TIMESTAMP_STR, cur_timestamp);
\r
172 vconf_set_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT, value);
\r
173 ad->block_seconds = PASSWORD_BLOCK_SECONDS;
\r
175 snprintf(temp_str, sizeof(temp_str), _L("Input password again after %d seconds."), ad->block_seconds);
\r
176 edje_object_part_text_set(_EDJ(ad->ly_simple_password), "txt.result", temp_str);
\r
180 static void __simple_password_check_result_cb (const char *event, void *data)
\r
182 __simple_password_check_result(data);
\r
185 static void __simple_password_results_update(void *data)
\r
190 struct appdata *ad = (struct appdata *) data;
\r
195 LOCK_SCREEN_TRACE_DBG("%s", __FUNCTION__);
\r
198 vconf_get_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT,
\r
206 char timestamp_str[512] = {0};
\r
209 int temp_length = 0;
\r
210 temp = vconf_get_str(VCONFKEY_SETAPPL_PASSWORD_TIMESTAMP_STR);
\r
211 temp_length = strlen(temp);
\r
212 length = (temp_length <= PASSWORD_TIMESTAMP_STR_LENGTH) ? temp_length : PASSWORD_TIMESTAMP_STR_LENGTH;
\r
213 strncpy(timestamp_str, temp, length);
\r
214 if(length == PASSWORD_TIMESTAMP_STR_LENGTH) {
\r
215 timestamp_str[length-1] = '\0';
\r
217 timestamp_str[length] = '\0';
\r
219 if ((strcmp(timestamp_str, "") != 0)
\r
220 || (strlen(timestamp_str) != 0)) {
\r
221 time_t cur_time = time(NULL);
\r
222 time_t last_lock_time;
\r
223 sscanf(timestamp_str, "%ld", &last_lock_time);
\r
225 if ((cur_time - last_lock_time) < PASSWORD_BLOCK_SECONDS) {
\r
226 ad->block_seconds = PASSWORD_BLOCK_SECONDS - (cur_time - last_lock_time);
\r
227 LOCK_SCREEN_TRACE_DBG("ad->block_seconds = %d", ad->block_seconds);
\r
228 ad->is_disabled = EINA_TRUE;
\r
229 char temp_str[512] = {0};
\r
230 snprintf(temp_str, sizeof(temp_str), _L("Input password again after %d seconds."), ad->block_seconds);
\r
231 edje_object_part_text_set(_EDJ(ad->ly_simple_password), "txt.result", temp_str);
\r
233 ad->is_disabled = EINA_FALSE;
\r
234 vconf_set_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT, PASSWORD_ATTEMPTS_MAX_NUM);
\r
240 static Eina_Bool __simple_password_results_update_cb(void *data)
\r
242 __simple_password_results_update(data);
\r
246 static void __simple_password_check_vconf_value(void *data)
\r
248 int phone_lock_value = -1;
\r
249 struct appdata *ad = (struct appdata *) data;
\r
254 LOCK_SCREEN_TRACE_DBG("%s", __FUNCTION__);
\r
256 vconf_get_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT, &phone_lock_value);
\r
258 if (phone_lock_value == 0) {
\r
259 if (ad->password_timer) {
\r
262 ad->password_timer = ecore_timer_add(1, (Ecore_Task_Cb)__simple_password_results_update_cb, ad);
\r
264 if (ad->password_timer) {
\r
265 ecore_timer_del(ad->password_timer);
\r
266 ad->password_timer = NULL;
\r
268 ad->is_disabled = EINA_FALSE;
\r
272 static void __simple_password_check_vconf_value_cb(keynode_t * key, void *data)
\r
274 __simple_password_check_vconf_value(data);
\r
277 void simple_password_layout_create(void *data)
\r
279 struct appdata *ad = (struct appdata *)data;
\r
284 Evas_Object *keypad_layout = NULL;
\r
286 ad->h_password_policy = password_verification_policy_create();
\r
287 password_verification_callback_set(ad->h_password_policy, __simple_password_check_result_cb, ad);
\r
288 lockscreen_info_hide(ad);
\r
289 ad->ly_simple_password = elm_layout_add(ad->ly_main);
\r
290 elm_layout_file_set(ad->ly_simple_password, EDJEFILE, "lock-simple-password");
\r
291 elm_object_part_content_set(ad->ly_main, "sw.phone-lock", ad->ly_simple_password);
\r
292 edje_object_part_text_set(_EDJ(ad->ly_simple_password), "txt.title", _S("IDS_COM_BODY_ENTER_PASSWORD"));
\r
294 keypad_layout = elm_layout_add(ad->ly_simple_password);
\r
295 elm_layout_file_set(keypad_layout, EDJEFILE, "lock-keypad-number");
\r
296 elm_object_part_content_set(ad->ly_simple_password, "sw.keypad.number", keypad_layout);
\r
297 edje_object_signal_emit(_EDJ(ad->ly_simple_password), "show,numberkeyboard", "sw.keypad.number");
\r
298 edje_object_signal_callback_add(_EDJ(keypad_layout), "keypad_down_clicked", "*", __simple_password_keypad_process, ad);
\r
299 evas_object_event_callback_add(ad->ly_simple_password, EVAS_CALLBACK_MOUSE_DOWN, __simple_password_mouse_down_cb, ad);
\r
300 evas_object_event_callback_add(ad->ly_simple_password, EVAS_CALLBACK_MOUSE_MOVE, __simple_password_mouse_move_cb, ad);
\r
301 evas_object_event_callback_add(ad->ly_simple_password, EVAS_CALLBACK_MOUSE_UP, __simple_password_mouse_up_cb, ad);
\r
302 evas_object_show(keypad_layout);
\r
303 vconf_notify_key_changed(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT, __simple_password_check_vconf_value_cb, ad);
\r
304 __simple_password_check_vconf_value(ad);
\r