[UI]Remove prevent
[apps/core/preloaded/lockscreen.git] / src / simple-password.c
1 /*\r
2  * Copyright 2012  Samsung Electronics Co., Ltd\r
3  *\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
7  *\r
8  *  http://www.tizenopensource.org/license\r
9  *\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
15  */\r
16 \r
17 #include <vconf.h>\r
18 \r
19 #include "lockscreen.h"\r
20 #include "util.h"\r
21 #include "log.h"\r
22 #include "password-verification.h"\r
23 \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
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
34 \r
35 static void __simple_password_password_show(struct appdata *ad)\r
36 {\r
37         char buf1[50] = {0};\r
38         char buf2[50] = {0};\r
39         int i = 1;\r
40 \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
45         }\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
50         }\r
51 }\r
52 \r
53 static void __simple_password_keypad_process(void *data, Evas_Object *obj, const char *emission, const char *source)\r
54 {\r
55         struct appdata *ad = data;\r
56 \r
57         LOCK_SCREEN_TRACE_DBG("source = %s", source);\r
58         if (strcmp("SOS", source) == 0) {\r
59                 launch_emgcall(ad);\r
60                 return;\r
61         } else if (strcmp("Backspace", source) == 0) {\r
62                 if(simple_password_length <= 0){\r
63                         simple_password[0] = '\0';\r
64                         return;\r
65                 }\r
66                 simple_password_length--;\r
67                 simple_password[simple_password_length] = '\0';\r
68         } else {\r
69                 if(ad->is_disabled){\r
70                         return;\r
71                 }\r
72                 if(simple_password_length >= MAX_PASSWORD_NUM){\r
73                         return;\r
74                 }else {\r
75                         simple_password[simple_password_length] = *source;\r
76                         simple_password_length++;\r
77                 }\r
78 \r
79                 if(simple_password_length == MAX_PASSWORD_NUM){\r
80                         password_verification_verify(ad->h_password_policy, simple_password);\r
81                 }\r
82         }\r
83 \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
86 }\r
87 \r
88 static void __simple_password_layout_destroy(void *data, Evas_Object *obj, const char *emission, const char *source)\r
89 {\r
90         struct appdata *ad = data;\r
91         int i = 0;\r
92         LOCK_SCREEN_TRACE_DBG("__simple_password_layout_destroy");\r
93 \r
94         for(i = 0; i <= MAX_PASSWORD_NUM; i++){\r
95                 simple_password[i] = 0;\r
96         }\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
101         }\r
102         if(ad->ly_simple_password){\r
103                 evas_object_del(ad->ly_simple_password);\r
104                 ad->ly_simple_password = NULL;\r
105         }\r
106         password_verification_policy_destroy(ad->h_password_policy);\r
107         lockscreen_info_show(ad);\r
108 }\r
109 \r
110 static void __simple_password_mouse_down_cb(void *data, Evas * evas, Evas_Object * obj,\r
111                             void *event_info)\r
112 {\r
113         Evas_Event_Mouse_Down *ei = event_info;\r
114 \r
115         simple_pw_down_y = ei->output.y;\r
116 \r
117         LOCK_SCREEN_TRACE_DBG("simple_pw_down_y = %d", simple_pw_down_y);\r
118 }\r
119 \r
120 static void __simple_password_mouse_up_cb(void *data, Evas * evas, Evas_Object * obj,\r
121                           void *event_info)\r
122 {\r
123         struct appdata *ad = data;\r
124         Evas_Event_Mouse_Down *ei = event_info;\r
125 \r
126         Evas_Coord pos_up_y = ei->output.y;\r
127 \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
131         }\r
132 }\r
133 \r
134 static void __simple_password_mouse_move_cb(void *data, Evas * evas, Evas_Object * obj,\r
135                             void *event_info)\r
136 {\r
137         LOCK_SCREEN_TRACE_DBG("__simple_password_mouse_move_cb");\r
138 }\r
139 \r
140 void __simple_password_check_result(void *data)\r
141 {\r
142         struct appdata *ad = (struct appdata *) data;\r
143 \r
144         int value = -1;\r
145 \r
146         vconf_get_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT, &value);\r
147         value--;\r
148 \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
152 \r
153                 vconf_set_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT,\r
154                               value);\r
155                 if(value == 1)\r
156                 {\r
157                         snprintf(temp_left, sizeof(temp_left), _L("1 attempt left."));\r
158                 }\r
159                 else\r
160                 {\r
161                         snprintf(temp_left, sizeof(temp_left), _L("%d attempts left."), value);\r
162                 }\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
169 \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
174 \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
177         }\r
178 }\r
179 \r
180 static void __simple_password_check_result_cb (const char *event, void *data)\r
181 {\r
182         __simple_password_check_result(data);\r
183 }\r
184 \r
185 static void __simple_password_results_update(void *data)\r
186 {\r
187         int value = -1;\r
188         int ret = 0;\r
189 \r
190         struct appdata *ad = (struct appdata *) data;\r
191 \r
192         if (ad == NULL) {\r
193                 return;\r
194         }\r
195         LOCK_SCREEN_TRACE_DBG("%s", __FUNCTION__);\r
196 \r
197         ret =\r
198             vconf_get_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT,\r
199                           &value);\r
200 \r
201         if (ret != 0) {\r
202                 return;\r
203         }\r
204 \r
205         if (value == 0) {\r
206                 char timestamp_str[512] = {0};\r
207                 char *temp = NULL;\r
208                 int length = 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
216                 }else {\r
217                         timestamp_str[length] = '\0';\r
218                 }\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
224 \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
232                         } else {\r
233                                 ad->is_disabled = EINA_FALSE;\r
234                                 vconf_set_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT, PASSWORD_ATTEMPTS_MAX_NUM);\r
235                         }\r
236                 }\r
237         }\r
238 }\r
239 \r
240 static Eina_Bool __simple_password_results_update_cb(void *data)\r
241 {\r
242         __simple_password_results_update(data);\r
243         return EINA_TRUE;\r
244 }\r
245 \r
246 static void __simple_password_check_vconf_value(void *data)\r
247 {\r
248         int phone_lock_value = -1;\r
249         struct appdata *ad = (struct appdata *) data;\r
250 \r
251         if (ad == NULL) {\r
252                 return;\r
253         }\r
254         LOCK_SCREEN_TRACE_DBG("%s", __FUNCTION__);\r
255 \r
256         vconf_get_int(VCONFKEY_SETAPPL_PASSWORD_ATTEMPTS_LEFT_INT, &phone_lock_value);\r
257 \r
258         if (phone_lock_value == 0) {\r
259                 if (ad->password_timer) {\r
260                         return;\r
261                 }\r
262                 ad->password_timer = ecore_timer_add(1, (Ecore_Task_Cb)__simple_password_results_update_cb, ad);\r
263         } else {\r
264                 if (ad->password_timer) {\r
265                         ecore_timer_del(ad->password_timer);\r
266                         ad->password_timer = NULL;\r
267                 }\r
268                 ad->is_disabled = EINA_FALSE;\r
269         }\r
270 }\r
271 \r
272 static void __simple_password_check_vconf_value_cb(keynode_t * key, void *data)\r
273 {\r
274         __simple_password_check_vconf_value(data);\r
275 }\r
276 \r
277 void simple_password_layout_create(void *data)\r
278 {\r
279         struct appdata *ad = (struct appdata *)data;\r
280         if(ad == NULL){\r
281                 return;\r
282         }\r
283 \r
284         Evas_Object *keypad_layout = NULL;\r
285 \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
293 \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
305 }\r