2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <setting-password.h>
20 #define UG_MODULE_API __attribute__ ((visibility("default")))
23 static tapi_request_event tapi_req_events[] = {
24 {-1, TAPI_EVENT_SIM_CHANGE_PINS_CNF},
25 {-1, TAPI_EVENT_SIM_DISABLE_SEC_CNF},
26 {-1, TAPI_EVENT_SIM_ENABLE_SEC_CNF},
27 {-1, TAPI_EVENT_SIM_VERIFY_SEC_CNF},
28 {-1, TAPI_EVENT_SIM_VERIFY_PUK_CNF},
29 {-1, TAPI_EVENT_SIM_DISABLE_FDNMODE_CNF},
30 {-1, TAPI_EVENT_SIM_ENABLE_FDNMODE_CNF},
31 {-1, TAPI_EVENT_SIM_ENABLE_PERS_CNF},
32 {-1, TAPI_EVENT_SIM_DISABLE_PERS_CNF},
33 {-1, TAPI_EVENT_SIM_PERS_STATUS_CNF},
36 static struct _pw_item pw_its[] = {
37 { SETTING_PW_TYPE_POWER_ON_LOCK, "SETTING_PW_TYPE_POWER_ON_LOCK" },
38 { SETTING_PW_TYPE_PHONE_LOCK, "SETTING_PW_TYPE_PHONE_LOCK" },
39 { SETTING_PW_TYPE_PHONE_LOCK_ON, "SETTING_PW_TYPE_PHONE_LOCK_ON" },
40 { SETTING_PW_TYPE_SET_PASSWORD, "SETTING_PW_TYPE_SET_PASSWORD" },
41 { SETTING_PW_TYPE_SIMPLE_PASSWORD, "SETTING_PW_TYPE_SIMPLE_PASSWORD" },
42 { SETTING_PW_TYPE_CHANGE_PASSWORD, "SETTING_PW_TYPE_CHANGE_PASSWORD" },
43 { SETTING_PW_TYPE_SIM_LOCK_ON, "SETTING_PW_TYPE_SIM_LOCK_ON" },
44 { SETTING_PW_TYPE_SIM_LOCK_OFF, "SETTING_PW_TYPE_SIM_LOCK_OFF" },
45 { SETTING_PW_TYPE_PIN_LOCK_ON, "SETTING_PW_TYPE_PIN_LOCK_ON" },
46 { SETTING_PW_TYPE_PIN_LOCK_OFF, "SETTING_PW_TYPE_PIN_LOCK_OFF" },
47 { SETTING_PW_TYPE_CHANGE_PIN1, "SETTING_PW_TYPE_CHANGE_PIN1" },
48 { SETTING_PW_TYPE_FDN_MODE_ON, "SETTING_PW_TYPE_FDN_MODE_ON" },
49 { SETTING_PW_TYPE_FDN_MODE_OFF, "SETTING_PW_TYPE_FDN_MODE_OFF" },
50 { SETTING_PW_TYPE_CHANGE_PIN2, "SETTING_PW_TYPE_CHANGE_PIN2" },
51 { SETTING_PW_TYPE_PIN1_BLOCKED, "SETTING_PW_TYPE_PIN1_BLOCKED" },
52 { SETTING_PW_TYPE_PIN2_BLOCKED, "SETTING_PW_TYPE_PIN2_BLOCKED" },
53 { SETTING_PW_TYPE_RESET, "SETTING_PW_TYPE_RESET" },
54 { SETTING_PW_TYPE_CLEAR, "SETTING_PW_TYPE_CLEAR"},
55 { SETTING_PW_TYPE_LOCK_FOR_APP, "SETTING_PW_TYPE_LOCK_FOR_APP"}, /* used by other app */
56 { SETTING_PW_TYPE_MAX, NULL }
59 static void setting_tapi_init(SettingPasswordUG *ad);
60 static void setting_password_ug_display_result_popup(tapi_receive_info *result, SettingPasswordUG *ad);
61 static int setting_password_ug_sim_event_callback(const TelTapiEvent_t *event, void *data);
63 static void setting_password_ug_cb_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
65 SettingPasswordUG *ad = (SettingPasswordUG *) data;
66 setting_view_update(&setting_view_password_main, ad);
69 static void setting_tapi_init(SettingPasswordUG *ad)
72 switch (ad->view_type) {
73 case SETTING_PW_TYPE_SIM_LOCK_ON:
74 case SETTING_PW_TYPE_SIM_LOCK_OFF:
75 case SETTING_PW_TYPE_PIN_LOCK_ON:
76 case SETTING_PW_TYPE_PIN_LOCK_OFF:
77 case SETTING_PW_TYPE_CHANGE_PIN1:
78 case SETTING_PW_TYPE_CHANGE_PIN2:
79 case SETTING_PW_TYPE_FDN_MODE_ON:
80 case SETTING_PW_TYPE_FDN_MODE_OFF:
81 case SETTING_PW_TYPE_PIN1_BLOCKED:
82 case SETTING_PW_TYPE_PIN2_BLOCKED:
83 /* subscribe tapi events */
84 if (setting_password_ug_subscribe_sim_events(ad) != SETTING_RETURN_SUCCESS) {
86 ("%s*** [ERR] setting_security_subscribe_sim_events. ***%s",
87 SETTING_FONT_RED, SETTING_FONT_BLACK);
88 setting_password_ug_create_popup_notitle_nobtn(ad,
89 _("IDS_COM_POP_ERROR"),
99 static void setting_tapi_finize(SettingPasswordUG *ad)
102 switch (ad->view_type) {
103 case SETTING_PW_TYPE_SIM_LOCK_ON:
104 case SETTING_PW_TYPE_SIM_LOCK_OFF:
105 case SETTING_PW_TYPE_PIN_LOCK_ON:
106 case SETTING_PW_TYPE_PIN_LOCK_OFF:
107 case SETTING_PW_TYPE_CHANGE_PIN1:
108 case SETTING_PW_TYPE_CHANGE_PIN2:
109 case SETTING_PW_TYPE_FDN_MODE_ON:
110 case SETTING_PW_TYPE_FDN_MODE_OFF:
111 case SETTING_PW_TYPE_PIN1_BLOCKED:
112 case SETTING_PW_TYPE_PIN2_BLOCKED:
113 /* unsubscribe tapi events */
114 if (setting_password_ug_unsubscribe_sim_events(ad) != SETTING_RETURN_SUCCESS) {
116 ("%s*** [ERR] setting_security_subscribe_sim_events. ***%s",
117 SETTING_FONT_RED, SETTING_FONT_BLACK);
118 setting_password_ug_create_popup_notitle_nobtn(ad,
119 _("IDS_COM_POP_ERROR"),
129 setting_pw_type __get_password_view_type(SettingPasswordUG *ad, bundle *data)
132 setting_retvm_if(NULL == data, -1, "NULL == data");
133 ad->view_type_string = bundle_get_val(data, "viewtype");
134 SETTING_TRACE("viewtype:%s", ad->view_type_string);
135 setting_pw_type ret_pw_type = 0;
138 for(i = 0; i < SETTING_PW_TYPE_MAX; i++)
140 if (0 == safeStrCmp(ad->view_type_string, pw_its[i].pw_type_string))
142 ret_pw_type = pw_its[i].pw_type_num;
147 if( (ret_pw_type == SETTING_PW_TYPE_PHONE_LOCK) ||
148 (ret_pw_type == SETTING_PW_TYPE_SIMPLE_PASSWORD) ||
149 (ret_pw_type == SETTING_PW_TYPE_LOCK_FOR_APP) ||
150 (ret_pw_type == SETTING_PW_TYPE_CHANGE_PASSWORD) ||
151 (ret_pw_type == SETTING_PW_TYPE_RESET) )
153 if(setting_password_is_password_empty() == TRUE)
155 ret_pw_type = SETTING_PW_TYPE_SET_PASSWORD;
162 static void setting_password_ug_set_password_cb(void *data, Evas_Object *obj,
166 retm_if(data == NULL, "Data parameter is NULL");
168 SettingPasswordUG *ad = (SettingPasswordUG *) data;
170 switch (btn_type(obj)) {
171 case POPUP_RESPONSE_OK:
173 /* creating a view. */
174 setting_view_create(&setting_view_password_main, (void *)ad);
175 evas_object_event_callback_add(ad->win_main_layout,
176 EVAS_CALLBACK_RESIZE,
177 setting_password_ug_cb_resize,
181 evas_object_del(ad->setpw_notify);
182 ad->setpw_notify = NULL;
187 case POPUP_RESPONSE_CANCEL:
189 if (ad->setpw_notify)
191 evas_object_del(ad->setpw_notify);
192 ad->setpw_notify = NULL;
195 ug_destroy_me(ad->ug);
203 static char *__gl_err_desc_text_get(void *data, Evas_Object *obj, const char *part)
205 retv_if(data == NULL, NULL);
206 char buf[256] = {0,};
208 snprintf(buf, sizeof(buf)-1, "<font color=#ff0000>%s</font>", (char*)data);
213 static void *setting_password_ug_on_create(struct ui_gadget *ug,
214 enum ug_mode mode, bundle *data,
217 setting_retvm_if((!ug || !priv), NULL, "!ug || !priv");
219 SettingPasswordUG *passwordUG = (SettingPasswordUG *)priv;
221 passwordUG->win_main_layout = (Evas_Object *) ug_get_parent_layout(ug);
222 passwordUG->win_get = (Evas_Object *) ug_get_window();
223 evas_object_show(passwordUG->win_main_layout);
224 passwordUG->evas = evas_object_evas_get(passwordUG->win_main_layout);
226 setting_retvm_if(passwordUG->win_main_layout == NULL, NULL,
227 "cannot get main window ");
229 /* --------------------------------------------------------- */
230 char *pa_path = NULL;;
232 pa_path = vconf_get_str(VCONFKEY_LANGSET);
235 ("%s*** language setting has no proper value (nil) ***%s",
236 SETTING_FONT_BGREEN, SETTING_FONT_BLACK);
240 setlocale(LC_ALL, "");
241 bindtextdomain(SETTING_PACKAGE, SETTING_LOCALEDIR);
243 /* --------------------------------------------------------- */
245 setting_create_Gendial_itc("dialogue/title", &(passwordUG->itc_title));
246 setting_create_Gendial_itc("dialogue/1icon",&(passwordUG->itc_variable_height));
247 passwordUG->itc_seperator.item_style = "dialogue/separator/21/with_line";
248 passwordUG->itc_seperator.func.text_get = NULL;
249 passwordUG->itc_seperator.func.content_get = NULL;
250 passwordUG->itc_seperator.func.state_get = NULL;
251 passwordUG->itc_seperator.func.del = NULL;
253 passwordUG->itc_err_desc.item_style = "multiline/1text";
254 passwordUG->itc_err_desc.func.text_get = __gl_err_desc_text_get;
255 passwordUG->itc_err_desc.func.content_get = NULL;
256 passwordUG->itc_err_desc.func.state_get = NULL;
257 passwordUG->itc_err_desc.func.del = NULL;
261 passwordUG->view_type = __get_password_view_type(passwordUG, data);
262 setting_tapi_init(passwordUG);
264 /* get simple password flag */
265 if(vconf_get_bool(VCONFKEY_SETAPPL_STATE_SIMPLE_PASSWORD_BOOL, &(passwordUG->is_simple_password_on)) < 0)
266 passwordUG->is_simple_password_on = 0;
268 SETTING_TRACE_DEBUG("simple password is %d", passwordUG->is_simple_password_on);
270 if (SETTING_PW_TYPE_SET_PASSWORD == passwordUG->view_type)
272 if( strcmp(passwordUG->view_type_string, "SETTING_PW_TYPE_RESET") == 0)
273 { /* no need to set password, in this case.*/
274 bundle *b = bundle_create();
278 bundle_add(b, "result", passwordUG->view_type_string);
279 ug_send_result(passwordUG->ug, b);
280 SETTING_TRACE("Send Result : %s\n", passwordUG->view_type_string);
282 /* Send destroy request */
283 ug_destroy_me(passwordUG->ug);
286 passwordUG->setpw_notify = setting_create_popup_with_btn(passwordUG,
287 (Evas_Object *) ug_get_window(),
288 _("IDS_ST_POP_NO_PASSWORD_SET_PASSWORD_Q"),
290 setting_password_ug_set_password_cb,
291 0, 2, _("IDS_COM_SK_YES"),_("IDS_COM_SK_NO"));
294 passwordUG->ly_main = elm_layout_add(passwordUG->win_main_layout);
295 if (passwordUG->ly_main == NULL)
297 evas_object_hide(passwordUG->ly_main);
299 return passwordUG->ly_main;
301 /* creating a view. */
302 setting_view_create(&setting_view_password_main,(void *)passwordUG);
303 evas_object_event_callback_add(passwordUG->win_main_layout,
304 EVAS_CALLBACK_RESIZE,
305 setting_password_ug_cb_resize,
307 return passwordUG->ly_main;
311 static void setting_password_ug_on_start(struct ui_gadget *ug, bundle *data, void *priv)
313 SettingPasswordUG *passwordUG = (SettingPasswordUG *)priv;
315 /* handle focus of entry */
316 if(passwordUG->sp_entry1 != NULL)
318 SETTING_TRACE_DEBUG("sp_entry1 is exist.");
319 elm_object_focus_set(passwordUG->sp_entry1, EINA_TRUE);
320 passwordUG->sp_focused = passwordUG->sp_entry1;
324 static void setting_password_ug_on_pause(struct ui_gadget *ug, bundle *data, void *priv)
328 static void setting_password_ug_on_resume(struct ui_gadget *ug, bundle *data, void *priv)
332 static void setting_password_ug_on_destroy(struct ui_gadget *ug, bundle *data, void *priv)
334 SettingPasswordUG *passwordUG = (SettingPasswordUG *)priv;
336 evas_object_event_callback_del(passwordUG->win_main_layout, EVAS_CALLBACK_RESIZE, setting_password_ug_cb_resize); /* fix flash issue for gallery */
338 setting_tapi_finize(passwordUG);
340 if (passwordUG->t_info) {
341 FREE(passwordUG->t_info);
344 if(passwordUG->remove_timer)
346 ecore_timer_del(passwordUG->remove_timer);
347 passwordUG->remove_timer = NULL;
351 ecore_imf_shutdown();
353 /* delete the allocated objects. */
354 setting_view_destroy(&setting_view_password_main, passwordUG);
355 if (NULL != ug_get_layout(passwordUG->ug)) {
356 evas_object_hide((Evas_Object *) ug_get_layout(passwordUG->ug));
357 evas_object_del((Evas_Object *) ug_get_layout(passwordUG->ug));
361 static void setting_password_ug_on_message(struct ui_gadget *ug, bundle *msg,
362 bundle *data, void *priv)
367 static void setting_password_ug_on_event(struct ui_gadget *ug,
368 enum ug_event event, bundle *data,
372 case UG_EVENT_LOW_MEMORY:
374 case UG_EVENT_LOW_BATTERY:
376 case UG_EVENT_LANG_CHANGE:
378 case UG_EVENT_ROTATE_PORTRAIT:
380 case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
382 case UG_EVENT_ROTATE_LANDSCAPE:
384 case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
386 case UG_EVENT_REGION_CHANGE:
393 static void setting_password_ug_on_key_event(struct ui_gadget *ug,
394 enum ug_key_event event,
395 bundle *data, void *priv)
400 SettingPasswordUG *ad = (SettingPasswordUG*)priv;
403 case UG_KEY_EVENT_END:
406 ecore_timer_del(ad->remove_timer);
407 ad->remove_timer = NULL;
416 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
418 SettingPasswordUG *passwordUG = calloc(1, sizeof(SettingPasswordUG));
419 setting_retvm_if(!passwordUG, -1, "Create SettingPasswordUG obj failed");
421 ops->create = setting_password_ug_on_create;
422 ops->start = setting_password_ug_on_start;
423 ops->pause = setting_password_ug_on_pause;
424 ops->resume = setting_password_ug_on_resume;
425 ops->destroy = setting_password_ug_on_destroy;
426 ops->message = setting_password_ug_on_message;
427 ops->event = setting_password_ug_on_event;
428 ops->key_event = setting_password_ug_on_key_event;
429 ops->priv = passwordUG;
430 ops->opt = UG_OPT_INDICATOR_ENABLE;
435 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
437 struct SettingPasswordUG *passwordUG;
438 setting_retm_if(!ops, "ops == NULL");
440 passwordUG = ops->priv;
445 int setting_password_ug_subscribe_sim_events(SettingPasswordUG *ad)
448 int ret = SETTING_RETURN_SUCCESS;
449 int tapi_ret = TAPI_API_SUCCESS;
450 tapi_request_tapi_info *t_info;
452 if (tel_init() != TAPI_API_SUCCESS) {
453 SETTING_TRACE_DEBUG("%s*** [ERR] tel_init. ***%s",
454 SETTING_FONT_RED, SETTING_FONT_BLACK);
455 return SETTING_TAPI_INIT_ECORE_ERR;
458 SETTING_TRACE_DEBUG("Tapi Init : %d", tapi_ret);
460 t_info = calloc(1, sizeof(tapi_request_tapi_info));
462 if (NULL == t_info) {
463 SETTING_TRACE_DEBUG("Tapi calloc data error\n");
464 return SETTING_RETURN_FAIL;
467 t_info->evt = tapi_req_events;
468 t_info->evt_sz = sizeof(tapi_req_events) / sizeof(tapi_req_events[0]);
470 t_info->cb_data = NULL;
472 SETTING_TRACE_DEBUG("Tapi Info Size : %d", t_info->evt_sz);
473 for (i = 0; i < t_info->evt_sz; i++) {
475 tel_register_event(t_info->evt[i].event,
476 &(t_info->evt[i].sid),
478 setting_password_ug_sim_event_callback,
481 ("TAPI Register Return : %d Event : %d sid: %d", tapi_ret,
482 t_info->evt[i].event, t_info->evt[i].sid);
485 if (TAPI_API_SUCCESS == tapi_ret) {
486 tapi_ret = tel_register_app_name("org.tizen.setting");
488 if (tapi_ret != TAPI_API_SUCCESS) {
490 ("%s*** [ERR] tel_register_app_name. ***%s",
491 SETTING_FONT_RED, SETTING_FONT_BLACK);
492 FREE(t_info); /* memory leak */
493 return SETTING_TAPI_REG_EVENT_ECORE_ERR;
500 int setting_password_ug_unsubscribe_sim_events(SettingPasswordUG *ad)
502 retv_if(ad == NULL, SETTING_GENERAL_ERR_WRONG_PARAMETER);
505 int ret = SETTING_RETURN_SUCCESS;
506 int tapi_ret = TAPI_API_SUCCESS;
509 tapi_request_tapi_info *t_info = ad->t_info;
510 SETTING_TRACE("T_INFO size : %d\n", t_info->evt_sz);
511 for (i = 0; i < t_info->evt_sz; i++) {
512 if (t_info->evt[i].sid == -1)
515 /* tapi_ret = tel_deregister_event_at_ecore_loop(t_info->evt[i].sid); */
516 tapi_ret = tel_deregister_event(t_info->evt[i].sid);
517 if (tapi_ret != TAPI_API_SUCCESS) {
519 ("%s*** [ERR] tel_deregister_event. %dth , sid =%d, tapi_ret=%d ***%s\n",
520 SETTING_FONT_RED, i, t_info->evt[i].sid,
521 tapi_ret, SETTING_FONT_BLACK);
522 return SETTING_TAPI_DEREG_EVENT_ECORE_ERR;
526 ("Event unregistering succeeded [%dth : %d] [subscription ID: %d]",
527 i, t_info->evt[i].event,
534 tapi_ret = tel_deinit();
535 if (tapi_ret != TAPI_API_SUCCESS) {
536 SETTING_TRACE_DEBUG("%s*** [ERR] tel_deinit. tapi_ret=%d ***%s",
537 SETTING_FONT_RED, tapi_ret,
539 return SETTING_TAPI_DEREG_EVENT_ECORE_ERR;
549 setting_password_ug_sim_event_callback(const TelTapiEvent_t *event, void *data)
551 retv_if(data == NULL || event == NULL, SETTING_GENERAL_ERR_WRONG_PARAMETER);
552 SETTING_TRACE("event->EventClass=\t%d", (int)(event->EventClass));
553 SETTING_TRACE("event->EventType=\t%d", event->EventType);
554 SETTING_TRACE("event->Status=\t%d", event->Status);
555 SETTING_TRACE("event->RequestId=\t%d", event->RequestId);
556 SettingPasswordUG *ad = data;
558 tapi_receive_info result_info = { 0, };
559 TelSimSecResult_t *sim_event_data = NULL;
560 sim_event_data = (TelSimSecResult_t *) event->pData;
562 if (TAPI_EVENT_CLASS_SIM != event->EventClass || NULL == sim_event_data) {
564 ("EventClass is not EVENT_CLASS_SIM or sim_event_data is NULL!\n");
565 SETTING_TRACE_DEBUG("sim_event_data %p\n", sim_event_data);
566 return SETTING_RETURN_FAIL;
569 switch (event->EventType) {
571 case TAPI_EVENT_SIM_ENABLE_SEC_CNF:
574 ("CASE: TAPI_EVENT_SIM_ENABLE_SEC_CNF [Event Data Type: %d]",
575 sim_event_data->type);
578 if (TAPI_SIM_PTYPE_SIM == sim_event_data->type) {
579 if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status)
580 result_info.stat = SIM_LOCK_ON_SUCCESS;
581 else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status)
582 result_info.stat = SIM_LOCK_INCORRECT_PASSWORD;
584 SETTING_TRACE_DEBUG("%s*** [ERR] INCORRECTED ***%s",
587 return SETTING_RETURN_FAIL;
591 else if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type) {
592 if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status)
593 result_info.stat = SIM_PIN_LOCK_ON_SUCCESS;
594 else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status) {
595 result_info.stat = SIM_INCORRECT_PIN1_CODE;
596 result_info.retry_cnt = sim_event_data->retry_count;
597 } else if (TAPI_SIM_PUK_REQUIRED == event->Status)
598 result_info.stat = SIM_PIN1_BLOCKED;
601 else if (TAPI_SIM_INCOMPATIBLE_PIN_OPERATION == event->Status
602 || TAPI_SIM_CARD_ERROR == event->Status) {
604 result_info.stat = SIM_OPERATION_UNAVAILABLE;
608 ("%s*** [ERR] INCORRECTED ***%s",
611 return SETTING_RETURN_FAIL;
618 case TAPI_EVENT_SIM_DISABLE_SEC_CNF:
621 ("CASE: TAPI_EVENT_SIM_DISABLE_SEC_CNF [Event Data Type: %d]",
622 sim_event_data->type);
625 if (TAPI_SIM_PTYPE_SIM == sim_event_data->type) {
626 if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status)
627 result_info.stat = SIM_LOCK_OFF_SUCCESS;
628 else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status)
629 result_info.stat = SIM_LOCK_INCORRECT_PASSWORD;
632 ("%s*** [ERR] INCORRECTED ***%s",
635 return SETTING_RETURN_FAIL;
639 else if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type) {
640 if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status)
641 result_info.stat = SIM_PIN_LOCK_OFF_SUCCESS;
642 else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status) {
643 result_info.stat = SIM_INCORRECT_PIN1_CODE;
644 result_info.retry_cnt = sim_event_data->retry_count;
645 } else if (TAPI_SIM_PUK_REQUIRED == event->Status)
646 result_info.stat = SIM_PIN1_BLOCKED;
649 else if (TAPI_SIM_INCOMPATIBLE_PIN_OPERATION == event->Status
650 || TAPI_SIM_CARD_ERROR == event->Status) {
652 result_info.stat = SIM_OPERATION_UNAVAILABLE;
656 ("%s*** [ERR] INCORRECTED ***%s",
659 return SETTING_RETURN_FAIL;
665 /* Verify PUK1, PUK2 */
666 case TAPI_EVENT_SIM_VERIFY_PUK_CNF:
669 ("CASE: TAPI_EVENT_SIM_VERIFY_PUK_CNF [Event Data Type: %d]",
670 sim_event_data->type);
672 TelSimPinStatus_t pin_status = -1;
673 TelSimPinType_t pin_type = 0;
675 if (TAPI_SIM_PTYPE_PUK1 == sim_event_data->type)
676 pin_type = TAPI_SIM_PTYPE_PIN1;
677 else if (TAPI_SIM_PTYPE_PUK2 == sim_event_data->type)
678 pin_type = TAPI_SIM_PTYPE_PIN2;
681 ("%s*** [ERR] Invalid pin_type ***%s",
682 SETTING_FONT_RED, SETTING_FONT_BLACK);
683 return SETTING_RETURN_FAIL;
686 int tapi_ret = tel_get_sim_security_status(pin_type, &pin_status);
688 ("TAPI RET : %d PIN_TYPE : %d PIN_STATUS : %d\n",
689 tapi_ret, pin_type, pin_status);
690 if (TAPI_API_SUCCESS != tapi_ret) {
692 ("%s*** [ERR] tel_get_sim_security_status ***%s",
693 SETTING_FONT_RED, SETTING_FONT_BLACK);
694 return SETTING_RETURN_FAIL;
697 if (TAPI_SIM_PIN_STATUS_PUK_BLOCKED == pin_status) {
698 if (TAPI_SIM_PTYPE_PIN1 == pin_type)
699 result_info.stat = SIM_PUK1_BLOCKED;
701 result_info.stat = SIM_PUK2_BLOCKED;
703 /* Pin Blocked and verifying puk code */
704 else if (TAPI_SIM_PIN_STATUS_ENABLED == pin_status) {
705 if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status) {
706 if (TAPI_SIM_PTYPE_PIN1 == pin_type)
707 result_info.stat = SIM_PIN1_UNBLOCKED;
709 result_info.stat = SIM_PIN2_UNBLOCKED;
713 else if (TAPI_SIM_PIN_STATUS_BLOCKED == pin_status) {
714 if (TAPI_SIM_PTYPE_PIN1 == pin_type) {
715 result_info.stat = SIM_INCORRECT_PUK1_CODE;
716 result_info.retry_cnt = sim_event_data->retry_count;
718 result_info.stat = SIM_INCORRECT_PUK2_CODE;
719 result_info.retry_cnt = sim_event_data->retry_count;
723 ("%s*** [ERR] INCORRECTED ***%s",
724 SETTING_FONT_RED, SETTING_FONT_BLACK);
725 result_info.stat = SIM_UNKNOWN_ERROR;
730 /* Change PIN1, PIN2 */
731 case TAPI_EVENT_SIM_CHANGE_PINS_CNF:
734 ("CASE: TAPI_EVENT_SIM_CHANGE_PINS_CNF [Event Data Type: %d]",
735 sim_event_data->type);
737 if (TAPI_SIM_PIN_OPERATION_SUCCESS == event->Status) {
738 if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type)
739 result_info.stat = SIM_PIN1_CHANGE_SUCCESS;
740 else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type)
741 result_info.stat = SIM_PIN2_CHANGE_SUCCESS;
742 } else if (TAPI_SIM_PIN_INCORRECT_PASSWORD == event->Status) {
743 if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type) {
744 result_info.stat = SIM_INCORRECT_PIN1_CODE;
745 result_info.retry_cnt = sim_event_data->retry_count;
746 } else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type) {
747 result_info.stat = SIM_INCORRECT_PIN2_CODE;
748 result_info.retry_cnt = sim_event_data->retry_count;
750 } else if (TAPI_SIM_PUK_REQUIRED == event->Status) {
751 if (TAPI_SIM_PTYPE_PIN1 == sim_event_data->type)
752 result_info.stat = SIM_PIN1_BLOCKED;
753 else if (TAPI_SIM_PTYPE_PIN2 == sim_event_data->type)
754 result_info.stat = SIM_PIN2_BLOCKED;
757 ("%s*** [ERR] INCORRECTED ***%s",
758 SETTING_FONT_RED, SETTING_FONT_BLACK);
759 return SETTING_RETURN_FAIL;
768 setting_password_ug_display_result_popup(&result_info, ad);
773 static void setting_password_ug_display_result_popup(tapi_receive_info *result,
774 SettingPasswordUG *ad)
776 switch (result->stat) {
777 case SIM_OPERATION_OK:
778 case SIM_LOCK_ON_SUCCESS:
779 case SIM_LOCK_OFF_SUCCESS:
780 case SIM_PIN_LOCK_ON_SUCCESS:
781 case SIM_PIN_LOCK_OFF_SUCCESS:
784 SETTING_PW_TYPE_SIM_LOCK_OFF) {
785 int err = SETTING_RETURN_SUCCESS;
787 setting_set_int_slp_key
788 (INT_SLP_SETTING_SIM_LOCK_ATTEMPTS_LEFT,
789 SIM_LOCK_ATTEMPS_MAX, &err);
790 setting_retm_if(err == SETTING_RETURN_FAIL,
791 "[Error] set value of vconf fail.");
793 /* Success to Operate */
798 bundle_add(b, "result", ad->view_type_string);
799 ug_send_result(ad->ug, b);
800 SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
802 /* Send destroy request */
803 ug_destroy_me(ad->ug);
806 case SIM_LOCK_INCORRECT_PASSWORD:
807 ad->focus_data = ad->ed_pw1;
808 setting_password_ug_check_attemps_left(ad);
810 case SIM_INCORRECT_PIN1_CODE:
812 const char *ret_str = NULL;
813 char tmp_str[SETTING_STR_SLP_LEN] = {0,};
815 if (result->retry_cnt > 1) {
816 /* there has '%d' in 'IDS_ST_POP_INCORRECT_PIN_PD_ATTEMPTS_LEFT', must transform */
817 int ret = snprintf(tmp_str, SETTING_STR_SLP_LEN, PIN_ERR_DESC, result->retry_cnt);
818 setting_retm_if(ret < 0, "snprintf fail");
821 ret_str = _("IDS_ST_POP_INCORRECT_PIN1_ATTEMPT_LEFT");
823 ad->focus_data = ad->ed_pw1;
824 setting_password_ug_display_desc(ad, (char *)ret_str, FALSE);
827 case SIM_INCORRECT_PIN2_CODE:
829 char *ret_str = NULL;
830 char tmp_str[SETTING_STR_SLP_LEN] = {0,};
832 if (result->retry_cnt > 1) {
833 /* there has '%d' in 'IDS_ST_POP_INCORRECT_PIN_PD_ATTEMPTS_LEFT', must transform */
834 int ret = snprintf(tmp_str, SETTING_STR_SLP_LEN, PIN_ERR_DESC, result->retry_cnt);
835 setting_retm_if(ret < 0, "snprintf fail");
838 ret_str = _("IDS_ST_POP_INCORRECT_PIN1_ATTEMPT_LEFT");
840 ad->focus_data = ad->ed_pw1;
841 setting_password_ug_display_desc(ad, ret_str, FALSE);
844 case SIM_INCORRECT_PUK1_CODE:
846 char *ret_str = NULL;
847 char tmp_str[SETTING_STR_SLP_LEN] = {0,};
849 if (result->retry_cnt > 1) {
850 /* there has '%d' in 'IDS_ST_POP_INCORRECT_PUK1_PD_ATTEMPTS_LEFT', must transform */
851 int ret = snprintf(tmp_str, SETTING_STR_SLP_LEN, PUK1_ERR_DESC, result->retry_cnt);
852 setting_retm_if(ret < 0, "snprintf fail");
855 ret_str = _("IDS_ST_POP_INCORRECT_PUK1_1_ATTEMPT_LEFT");
857 ad->focus_data = ad->ed_pw1;
858 setting_password_ug_display_desc(ad, ret_str, FALSE);
861 case SIM_INCORRECT_PUK2_CODE:
863 char *ret_str = NULL;
864 char tmp_str[SETTING_STR_SLP_LEN] = {0,};
865 if (result->retry_cnt > 1) {
866 /* there has '%d' in 'IDS_ST_POP_INCORRECT_PUK2_PD_ATTEMPTS_LEFT', must transform*/
867 int ret = snprintf(tmp_str, SETTING_STR_SLP_LEN, PUK2_ERR_DESC, result->retry_cnt);
868 setting_retm_if(ret < 0, "snprintf fail");
871 ret_str = _("IDS_ST_POP_INCORRECT_PUK2_1_ATTEMPT_LEFT");
873 ad->focus_data = ad->ed_pw1;
874 setting_password_ug_display_desc(ad, ret_str, FALSE);
877 case SIM_PIN1_CHANGE_SUCCESS:
878 setting_password_ug_create_popup_notitle_nobtn(ad,
879 _("IDS_ST_POP_PIN1_CHANGED"), TRUE);
881 case SIM_PIN2_CHANGE_SUCCESS:
882 setting_password_ug_create_popup_notitle_nobtn(ad,
883 _("IDS_ST_POP_PIN2_CHANGED"), TRUE);
885 case SIM_PIN1_BLOCKED:
886 setting_password_ug_create_popup_notitle_nobtn(ad,
887 _("IDS_ST_POP_PIN1_BLOCKED"), TRUE);
889 case SIM_PIN2_BLOCKED:
890 setting_password_ug_create_popup_notitle_nobtn(ad,
891 _("IDS_ST_POP_PIN2_BLOCKED"), TRUE);
893 case SIM_PIN1_UNBLOCKED:
894 setting_password_ug_create_popup_notitle_nobtn(ad,
895 _("IDS_ST_POP_PIN_UNBLOCKED"), TRUE);
897 case SIM_PIN2_UNBLOCKED:
898 setting_password_ug_create_popup_notitle_nobtn(ad,
899 _("IDS_ST_POP_PIN2_UNBLOCKED"), TRUE);
901 case SIM_PUK1_BLOCKED:
902 setting_password_ug_create_popup_notitle_nobtn(ad,
903 _("IDS_ST_BODY_PUK1_BLOCKED"), TRUE);
904 /* Call Permernent UG */
906 case SIM_PUK2_BLOCKED:
907 setting_password_ug_create_popup_notitle_nobtn(ad,
908 _("IDS_ST_BODY_PUK2_BLOCKED"), TRUE);
909 /* Call Permernent UG */
911 case SIM_REQUIRED_PUK_CODE:
913 case SIM_OPERATION_UNAVAILABLE:
914 setting_password_ug_create_popup_notitle_nobtn(ad,
915 _("IDS_ST_POP_SERVICE_UNAVAILABLE"), TRUE);
917 case SIM_UNKNOWN_ERROR:
918 setting_password_ug_create_popup_notitle_nobtn(ad,
919 _("IDS_ST_POP_UNKNOWN_OPERATION"), FALSE);
923 case SIM_OPERATION_OFF:
924 case SIM_LOCK_ON_FAIL:
925 case SIM_PIN1_CHANGE_FAIL:
926 case SIM_PIN2_CHANGE_FAIL:
935 void setting_password_ug_popup_resp_cb(void *data, Evas_Object *obj,
938 retm_if(data == NULL, "Data parameter is NULL");
940 SettingPasswordUG *ad = (SettingPasswordUG *) data;
942 /* Success to Operate */
946 bundle_add(b, "result", ad->view_type_string);
947 ug_send_result(ad->ug, b);
948 SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
951 /* Send destroy request */
952 ug_destroy_me(ad->ug);
954 char *diable_view_type = NULL;
955 if (ad->disable_item_type == SETTING_PW_TYPE_PHONE_LOCK) {
956 diable_view_type = "SETTING_PW_TYPE_PHONE_LOCK_DISABLE";
957 } else if (ad->disable_item_type == SETTING_PW_TYPE_SIM_LOCK_OFF) {
958 diable_view_type = "SETTING_PW_TYPE_SIM_LOCK_DISABLE";
961 if (diable_view_type) {
962 /* Success to Operate */
966 bundle_add(b, "result", diable_view_type);
967 ug_send_result(ad->ug, b);
970 /* Send destroy request */
971 ug_destroy_me(ad->ug);
973 if (ad->focus_data) {
974 ad->focus_data->isFocusFlag = TRUE;
975 elm_object_item_data_set(ad->focus_data->item, ad->focus_data);
976 elm_genlist_item_update(ad->focus_data->item);
980 static Eina_Bool __remove_desc(void *data)
983 retv_if(data == NULL, EINA_FALSE);
985 SettingPasswordUG *ad = (SettingPasswordUG *)data;
989 elm_object_item_del(ad->err_desc);
995 ecore_timer_del(ad->remove_timer);
996 ad->remove_timer = NULL;
1000 /* Success to Operate */
1001 bundle *b = bundle_create();
1004 bundle_add(b, "result", ad->view_type_string);
1005 ug_send_result(ad->ug, b);
1006 SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
1009 /* Send destroy request */
1010 ug_destroy_me(ad->ug);
1012 char *diable_view_type = NULL;
1013 if (ad->disable_item_type == SETTING_PW_TYPE_PHONE_LOCK) {
1014 diable_view_type = "SETTING_PW_TYPE_PHONE_LOCK_DISABLE";
1015 } else if (ad->disable_item_type == SETTING_PW_TYPE_SIM_LOCK_OFF) {
1016 diable_view_type = "SETTING_PW_TYPE_SIM_LOCK_DISABLE";
1019 if (diable_view_type) {
1020 /* Success to Operate */
1021 bundle *b = bundle_create();
1024 bundle_add(b, "result", diable_view_type);
1025 ug_send_result(ad->ug, b);
1028 /* Send destroy request */
1029 ug_destroy_me(ad->ug);
1032 return ECORE_CALLBACK_CANCEL;
1035 void setting_password_ug_display_desc(void *data, char *desc, int destroy)
1037 SETTING_TRACE_BEGIN;
1038 ret_if(data == NULL || desc == NULL);
1040 SettingPasswordUG *ad = (SettingPasswordUG *)data;
1042 ad->destroy= destroy;
1044 if(ad->scroller == NULL)
1049 elm_object_item_del(ad->err_desc);
1050 ad->err_desc = NULL;
1053 ad->err_desc = elm_genlist_item_append(ad->scroller, &(ad->itc_err_desc), desc, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1054 ad->remove_timer = ecore_timer_add(2.0, __remove_desc, ad);
1056 /* if pw incorrect, show keyboard again. */
1059 SETTING_TRACE_DEBUG("FOCUS IN");
1060 ad->ed_pw1->isFocusFlag = TRUE;
1061 elm_object_focus_set(ad->ed_pw1->eo_check, EINA_TRUE);
1066 setting_password_ug_create_popup_notitle_nobtn(void *data, char *str,
1070 retm_if(data == NULL, "Data parameter is NULL");
1072 SettingPasswordUG *ad = (SettingPasswordUG *) data;
1074 ad->destroy = destroy;
1075 ad->notify = setting_create_popup_without_btn(ad, ad->ly_main, str,
1077 setting_password_ug_popup_resp_cb,
1081 void setting_password_ug_check_attemps_left(void *data)
1084 SettingPasswordUG *ad = (SettingPasswordUG *) data;
1086 setting_int_slp_list item_attempts_left;
1087 setting_str_slp_list item_lock_timestamp;
1088 int attemps_left_max = 5;
1090 if (ad->view_type == SETTING_PW_TYPE_PHONE_LOCK) {
1091 item_attempts_left = INT_SLP_SETTING_PHONE_LOCK_ATTEMPTS_LEFT;
1092 item_lock_timestamp = STR_SLP_SETTING_PHONE_LOCK_TIMESTAMP;
1093 attemps_left_max = PHONE_LOCK_ATTEMPS_MAX;
1094 } else if (ad->view_type == SETTING_PW_TYPE_SIM_LOCK_OFF) {
1095 item_attempts_left = INT_SLP_SETTING_SIM_LOCK_ATTEMPTS_LEFT;
1096 item_lock_timestamp = STR_SLP_SETTING_SIM_LOCK_TIMESTAMP;
1097 attemps_left_max = SIM_LOCK_ATTEMPS_MAX;
1103 int err = SETTING_RETURN_SUCCESS;
1104 setting_get_int_slp_key(item_attempts_left, &value, &err);
1105 setting_retm_if(err == SETTING_RETURN_FAIL,
1106 "[Error] get value of vconf fail.");
1110 if (value > 0 && value <= attemps_left_max) {
1111 setting_set_int_slp_key(item_attempts_left, value, &err);
1112 setting_retm_if(err == SETTING_RETURN_FAIL, "[Error] set value of vconf fail.");
1113 char temp_str[MAX_SPECIALIZITION_LEN] = {0,};
1114 char temp[MAX_SPECIALIZITION_LEN] ={0,};
1117 snprintf(temp, sizeof(temp), "%s. %s.", PW_ERR_DESC, ATTEMPTS_DESC);
1119 snprintf(temp, sizeof(temp), "%s. %s.", PW_ERR_DESC, ATTEMPT_DESC);
1121 int ret = snprintf(temp_str, MAX_SPECIALIZITION_LEN, temp, value);
1125 setting_password_ug_display_desc(ad, temp_str, FALSE);
1127 } else if (value == 0) {
1128 /* store the lock timestamp */
1129 time_t cur_time = time(NULL);
1130 char cur_timestamp[LOCK_TIMESTAMP_LEN] = { 0, };
1131 int ret = snprintf(cur_timestamp, sizeof(cur_timestamp), "%ld", cur_time);
1134 setting_set_string_slp_key(item_lock_timestamp, cur_timestamp, &err);
1135 setting_retm_if(err == SETTING_RETURN_FAIL,
1136 "[Error] set value of vconf fail.");
1138 setting_set_int_slp_key(item_attempts_left, value, &err);
1139 setting_retm_if(err == SETTING_RETURN_FAIL,
1140 "[Error] set value of vconf fail.");
1142 ad->disable_item_type = ad->view_type;
1144 char temp[MAX_SPECIALIZITION_LEN] = {0,};
1145 snprintf(temp, sizeof(temp), PW_ERR_DELAY_DESC, PW_ERR_DELAY_TIME);
1147 setting_password_ug_create_popup_notitle_nobtn(ad, temp, FALSE);
1149 setting_password_ug_create_popup_notitle_nobtn(ad,
1150 _("IDS_COM_POP_ERROR"), FALSE);
1155 int setting_password_is_password_empty()
1157 SETTING_TRACE_BEGIN;
1159 unsigned int attempt = 0;
1160 unsigned int max_attempt = 0;
1161 unsigned int expire_sec = 0;
1163 ret = security_server_is_pwd_valid(&attempt, &max_attempt, &expire_sec);
1164 SETTING_TRACE_DEBUG("status of password : %d", ret);
1166 if(ret == SECURITY_SERVER_API_ERROR_NO_PASSWORD)
1167 return SETTING_RETURN_SUCCESS;
1169 return SETTING_RETURN_FAIL;
1171 int setting_password_check_password(const char *challenge)
1173 SETTING_TRACE_BEGIN;
1174 retv_if(challenge == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1177 unsigned int current_attempt = 0;
1178 unsigned int max_attempt = 0;
1179 unsigned int valid_secs = 0;
1181 ret = security_server_chk_pwd(challenge, ¤t_attempt, &max_attempt, &valid_secs);
1183 SETTING_TRACE_DEBUG("chk password : %d", ret);
1185 if(ret == SECURITY_SERVER_API_SUCCESS)
1186 return SETTING_RETURN_SUCCESS;
1188 return SETTING_RETURN_FAIL;
1190 int setting_password_set_password(const char *cur_pwd, const char *new_pwd, void *data)
1192 SETTING_TRACE_BEGIN;
1193 retv_if(new_pwd == NULL || data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
1195 SettingPasswordUG *ad = (SettingPasswordUG*)data;
1198 /* max attempt count will be handled in passwordug for a while. */
1199 ret = security_server_set_pwd(cur_pwd, new_pwd, 0, PW_ERR_DELAY_TIME);
1200 SETTING_TRACE_DEBUG("set password : %d", ret);
1202 if(ret == SECURITY_SERVER_API_SUCCESS)
1203 return SETTING_RETURN_SUCCESS;
1205 return SETTING_RETURN_FAIL;