4 * Copyright 2012 Samsung Electronics Co., Ltd
6 * Licensed under the Flora License, Version 1.1 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.tizenopensource.org/license
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <openssl/x509.h>
21 #include <openssl/pem.h>
22 #include <cert-svc/cpkcs12.h>
23 #include <cert-svc/cprimitives.h>
24 #include <ui-gadget.h>
25 #include <vconf-keys.h>
26 #include <glib/gstdio.h>
27 #include <efl_extension.h>
31 #include "common_eap_connect.h"
32 #include "i18nmanager.h"
33 #include "common_utils.h"
34 #include "common_ip_info.h"
36 #define GENLIST_ITEM_HEIGHT 96
37 #define MAX_LABEL_LENGTH 512
39 #define EAP_TLS_PATH "/tmp/"
40 #define EAP_TLS_CA_CERT_PATH "ca_cert.pem"
41 #define EAP_TLS_USER_CERT_PATH "user_cert.pem"
42 #define EAP_TLS_PRIVATEKEY_PATH "privatekey.pem"
44 #define EAP_TYPE_UNKNOWN "UNKNOWN"
45 #define EAP_TYPE_PEAP "PEAP"
46 #define EAP_TYPE_TLS "TLS"
47 #define EAP_TYPE_TTLS "TTLS"
48 #define EAP_TYPE_SIM "SIM"
49 #define EAP_TYPE_AKA "AKA"
50 #define EAP_TYPE_AKA_PRIME "AKA'"
51 #define EAP_TYPE_FAST "FAST"
52 #define EAP_TYPE_PWD "PWD"
54 #define EAP_AUTH_TYPE_PAP "PAP"
55 #define EAP_AUTH_TYPE_MSCHAP "MSCHAP"
56 #define EAP_AUTH_TYPE_MSCHAPV2 "MSCHAPV2"
57 #define EAP_AUTH_TYPE_GTC "GTC"
58 #define EAP_AUTH_TYPE_MD5 "MD5"
59 #define VCONF_TELEPHONY_DEFAULT_DATA_SERVICE "db/telephony/dualsim/default_data_service"
62 EAP_SEC_TYPE_UNKNOWN = 0,
68 EAP_SEC_TYPE_AKA_PRIME,
75 EAP_SEC_AUTH_NONE = 0,
78 EAP_SEC_AUTH_MSCHAPV2,
92 Elm_Genlist_Item_Type flags;
97 Evas_Object *btn_obj[3];
100 struct eap_info_list {
101 wifi_manager_ap_h ap;
103 Elm_Object_Item *eap_method_item;
104 Elm_Object_Item *eap_auth_item;
105 Elm_Object_Item *user_cert_item;
106 Elm_Object_Item *id_item;
107 Elm_Object_Item *pswd_item;
110 static const _Expand_List_t list_eap_type[] = {
111 {"UNKNOWN", ELM_GENLIST_ITEM_NONE},
112 {"PEAP", ELM_GENLIST_ITEM_NONE},
113 {"TLS", ELM_GENLIST_ITEM_NONE},
114 {"TTLS", ELM_GENLIST_ITEM_NONE},
115 {"SIM", ELM_GENLIST_ITEM_NONE},
116 {"AKA", ELM_GENLIST_ITEM_NONE},
117 {"AKA'", ELM_GENLIST_ITEM_NONE},
118 {"FAST", ELM_GENLIST_ITEM_NONE},
119 {"PWD", ELM_GENLIST_ITEM_NONE},
120 {NULL, ELM_GENLIST_ITEM_NONE}
123 static const _Expand_List_t list_eap_auth[] = {
124 {"IDS_ST_BODY_NONE", ELM_GENLIST_ITEM_NONE},
125 {"PAP", ELM_GENLIST_ITEM_NONE},
126 {"MSCHAP", ELM_GENLIST_ITEM_NONE},
127 {"MSCHAPV2", ELM_GENLIST_ITEM_NONE},
128 {"GTC", ELM_GENLIST_ITEM_NONE},
129 {NULL, ELM_GENLIST_ITEM_NONE}
132 static unsigned short selected_cert = 0;
134 struct common_eap_connect_data {
135 Elm_Object_Item *eap_type_item;
136 Elm_Object_Item *eap_auth_item;
137 Elm_Object_Item *eap_user_cert_item;
138 Elm_Object_Item *eap_id_item;
139 Elm_Object_Item *eap_pw_item;
140 Elm_Object_Item *eap_chkbox_item;
142 Evas_Object *sub_popup;
143 Evas_Object *info_popup;
144 Evas_Object *genlist;
145 Eina_Bool eap_done_ok;
148 const char *str_pkg_name;
149 wifi_manager_ap_h ap;
152 char *user_cert_path;
153 char *privatekey_path;
154 GSList *cert_candidates;
155 Evas_Object *confirm;
163 static Elm_Genlist_Item_Class g_eap_type_itc;
164 static Elm_Genlist_Item_Class g_eap_auth_itc;
165 static Elm_Genlist_Item_Class g_eap_user_cert_itc;
166 static Elm_Genlist_Item_Class g_eap_entry_itc;
167 static Elm_Genlist_Item_Class g_eap_chkbox_itc;
168 static Evas_Object *g_pwd_entry = NULL;
169 static gboolean keypad_state = FALSE;
170 static _Btn_click_t click;
172 static void (*_eap_view_deref_cb)(void) = NULL;
174 static void _create_and_update_list_items_based_on_rules(eap_type_t new_type, eap_connect_data_t *eap_data);
175 static void _update_eap_id_item_enter_key(eap_connect_data_t *eap_data);
176 static void _delete_eap_auth_item(eap_connect_data_t *eap_data);
177 static void _delete_eap_user_cert_item(eap_connect_data_t *eap_data);
178 static void _delete_eap_id_item(eap_connect_data_t *eap_data);
179 static void _delete_eap_pw_items(eap_connect_data_t *eap_data);
180 static void _delete_eap_entry_items(eap_connect_data_t *eap_data);
181 static eap_type_t __common_eap_connect_popup_get_eap_type(wifi_manager_ap_h ap);
182 static eap_auth_t __common_eap_connect_popup_get_auth_type(wifi_manager_ap_h ap);
183 static wifi_manager_eap_type_e __common_eap_connect_popup_get_wlan_eap_type(eap_type_t eap_type);
184 static wifi_manager_eap_auth_type_e __common_eap_connect_popup_get_wlan_auth_type(eap_auth_t auth_type);
185 static void _info_popup_ok_cb(void *data, Evas_Object *obj, void *event_info);
186 static gboolean __cert_extract_files(const char *cert_alias, eap_connect_data_t *eap_data);
187 static void _eap_popup_keypad_off_cb(void *data, Evas_Object *obj,
189 static void _eap_popup_keypad_on_cb(void *data, Evas_Object *obj,
192 static void ctxpopup_dismissed_cb(void *data, Evas_Object *obj,
195 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
197 if (eap_data->sub_popup != NULL) {
198 evas_object_del(eap_data->sub_popup);
199 eap_data->sub_popup = NULL;
203 static void cert_ctxpopup_dismissed_cb(void *data, Evas_Object *obj,
206 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
208 if (eap_data->sub_popup != NULL) {
209 evas_object_del(eap_data->sub_popup);
210 eap_data->sub_popup = NULL;
213 if (eap_data->cert_candidates != NULL) {
214 g_slist_free_full(eap_data->cert_candidates, g_free);
215 eap_data->cert_candidates = NULL;
219 static void move_dropdown(eap_connect_data_t *eap_data, Evas_Object *obj)
221 Evas_Coord x, y, w , h;
223 evas_object_geometry_get(obj, &x, &y, &w, &h);
224 evas_object_move(eap_data->sub_popup, x + (w / 2), y + h);
227 static void _gl_editbox_sel_cb(void *data, Evas_Object *obj, void *event_info)
229 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
230 elm_genlist_item_selected_set(item, FALSE);
233 static void _select_confirm_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
235 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
236 retm_if(eap_data == NULL);
238 if (eap_data->confirm != NULL) {
239 evas_object_del(eap_data->confirm);
240 eap_data->confirm = NULL;
244 static void __gl_eap_type_sub_sel_language_changed_cb(void *data, Evas_Object *obj, void *event_info)
246 __COMMON_FUNC_ENTER__;
247 retm_if(obj == NULL);
253 g_snprintf(str, 1024, sc(PACKAGE, I18N_TYPE_SIM_method_desc_popup),
254 (val == 1) ? "SIM2" : "SIM1");
255 txt = evas_textblock_text_utf8_to_markup(NULL, str);
256 elm_object_domain_translatable_text_set(obj, PACKAGE, txt);
258 __COMMON_FUNC_EXIT__;
261 static void _gl_eap_type_sub_sel(void *data, Evas_Object *obj, void *event_info)
263 eap_connect_data_t *eap_data = (eap_connect_data_t *) data;
264 eap_type_t sel_index = EAP_SEC_TYPE_UNKNOWN;
265 char buf[1024] = {'\0'};
267 eap_type_t pre_index = __common_eap_connect_popup_get_eap_type(eap_data->ap);
268 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
270 if (strcmp(label, EAP_TYPE_UNKNOWN) == 0)
271 sel_index = EAP_SEC_TYPE_UNKNOWN;
272 else if (strcmp(label, EAP_TYPE_PEAP) == 0)
273 sel_index = EAP_SEC_TYPE_PEAP;
274 else if (strcmp(label, EAP_TYPE_TLS) == 0)
275 sel_index = EAP_SEC_TYPE_TLS;
276 else if (strcmp(label, EAP_TYPE_TTLS) == 0)
277 sel_index = EAP_SEC_TYPE_TTLS;
278 else if (strcmp(label, EAP_TYPE_SIM) == 0)
279 sel_index = EAP_SEC_TYPE_SIM;
280 else if (strcmp(label, EAP_TYPE_AKA) == 0)
281 sel_index = EAP_SEC_TYPE_AKA;
282 else if (strcmp(label, EAP_TYPE_AKA_PRIME) == 0)
283 sel_index = EAP_SEC_TYPE_AKA_PRIME;
284 else if (strcmp(label, EAP_TYPE_FAST) == 0)
285 sel_index = EAP_SEC_TYPE_FAST;
286 else if (strcmp(label, EAP_TYPE_PWD) == 0)
287 sel_index = EAP_SEC_TYPE_PWD;
289 DEBUG_LOG(UG_NAME_NORMAL, "previous index = %d; selected index = %d;",
290 pre_index, sel_index);
291 if ((pre_index != EAP_SEC_TYPE_SIM && sel_index == EAP_SEC_TYPE_SIM) ||
292 (pre_index != EAP_SEC_TYPE_AKA && sel_index == EAP_SEC_TYPE_AKA) ||
293 (pre_index != EAP_SEC_TYPE_AKA_PRIME && sel_index == EAP_SEC_TYPE_AKA_PRIME)) {
294 popup_btn_info_t popup_data;
296 value = common_util_get_system_registry(
297 VCONF_TELEPHONY_DEFAULT_DATA_SERVICE);
299 memset(&popup_data, 0, sizeof(popup_data));
300 g_snprintf(buf, sizeof(buf),
301 sc(PACKAGE, I18N_TYPE_SIM_method_desc_popup),
302 (value == 1) ? "SIM2" : "SIM1");
303 popup_data.title_txt = "IDS_WIFI_BODY_EAP_METHOD";
304 popup_data.info_txt = evas_textblock_text_utf8_to_markup(NULL, buf);
305 popup_data.btn1_txt = "IDS_WIFI_SK2_OK";
306 popup_data.btn1_cb = _select_confirm_popup_ok_cb;
307 popup_data.btn1_data = eap_data;
309 eap_data->confirm = common_utils_show_info_popup(eap_data->win,
311 g_free(popup_data.info_txt);
312 evas_object_smart_callback_add(eap_data->confirm, "language,changed",
313 __gl_eap_type_sub_sel_language_changed_cb, (void *)value);
315 _create_and_update_list_items_based_on_rules(sel_index, data);
316 wifi_manager_eap_type_e type;
317 wifi_manager_ap_set_eap_type(eap_data->ap,
318 __common_eap_connect_popup_get_wlan_eap_type(sel_index));
319 wifi_manager_ap_get_eap_type(eap_data->ap, &type);
320 DEBUG_LOG(UG_NAME_NORMAL, "set to new index = %d", type);
323 if (eap_data->sub_popup != NULL) {
324 evas_object_del(eap_data->sub_popup);
325 eap_data->sub_popup = NULL;
328 if (pre_index != sel_index) {
329 wifi_manager_eap_type_e type;
330 wifi_manager_ap_set_eap_type(eap_data->ap,
331 __common_eap_connect_popup_get_wlan_eap_type(sel_index));
332 wifi_manager_ap_get_eap_type(eap_data->ap, &type);
333 DEBUG_LOG(UG_NAME_NORMAL, "set to new index = %d", type);
334 _create_and_update_list_items_based_on_rules(sel_index, eap_data);
336 if (sel_index == EAP_SEC_TYPE_PEAP) {
337 /* If previous auth type was PAP or MSCHAP & when PEAP
338 * EAP method is selected, then set back MSCHAPV2
340 eap_auth_t auth_type;
342 auth_type = __common_eap_connect_popup_get_auth_type(eap_data->ap);
343 if (auth_type == EAP_SEC_AUTH_PAP ||
344 auth_type == EAP_SEC_AUTH_MSCHAP) {
345 wifi_manager_ap_set_eap_auth_type(eap_data->ap,
346 WIFI_MANAGER_EAP_AUTH_TYPE_MSCHAPV2);
348 if (eap_data->eap_auth_item != NULL)
349 elm_genlist_item_update(eap_data->eap_auth_item);
353 DEBUG_LOG(UG_NAME_NORMAL, "pre_index == sel_index[%d]",
357 if (eap_data->eap_type_item != NULL)
358 elm_genlist_item_update(eap_data->eap_type_item);
361 static CertSvcInstance instance;
362 static CertSvcStoreCertList *certList = NULL;
364 static void _gl_eap_user_cert_sel(void *data, Evas_Object *obj,
367 eap_connect_data_t *eap_data = (eap_connect_data_t *) data;
368 const char *cert_alias = elm_object_item_text_get((Elm_Object_Item *) event_info);
373 if (eap_data->sub_popup != NULL) {
374 evas_object_del(eap_data->sub_popup);
375 eap_data->sub_popup = NULL;
378 if (eap_data->ca_cert_path) {
379 g_unlink(eap_data->ca_cert_path);
380 eap_data->ca_cert_path = NULL;
382 if (eap_data->user_cert_path) {
383 g_unlink(eap_data->user_cert_path);
384 eap_data->user_cert_path = NULL;
386 if (eap_data->privatekey_path) {
387 g_unlink(eap_data->privatekey_path);
388 eap_data->privatekey_path = NULL;
391 if (strcmp(cert_alias, sc(PACKAGE, I18N_TYPE_None)) == 0) {
392 if (eap_data->cert_alias != NULL) {
393 g_free(eap_data->cert_alias);
394 eap_data->cert_alias = NULL;
396 } else if (__cert_extract_files(cert_alias, eap_data)) {
397 if (eap_data->cert_alias != NULL) {
398 g_free(eap_data->cert_alias);
399 eap_data->cert_alias = NULL;
401 eap_data->cert_alias = g_strdup(cert_alias);
404 if (eap_data->eap_user_cert_item != NULL)
405 elm_genlist_item_update(eap_data->eap_user_cert_item);
407 if (eap_data->cert_candidates != NULL) {
408 g_slist_free_full(eap_data->cert_candidates, g_free);
409 eap_data->cert_candidates = NULL;
413 static void _create_eap_cert_list(eap_connect_data_t *eap_data,
416 size_t list_length = 0;
417 Evas_Object *ctxpopup;
418 Elm_Object_Item *it = NULL;
423 if (eap_data->sub_popup != NULL) {
424 evas_object_del(eap_data->sub_popup);
425 eap_data->sub_popup = NULL;
428 ctxpopup = elm_ctxpopup_add(eap_data->win);
429 eap_data->sub_popup = ctxpopup;
430 elm_object_style_set(ctxpopup, "dropdown/list");
431 eext_object_event_callback_add(ctxpopup, EEXT_CALLBACK_BACK,
432 cert_ctxpopup_dismissed_cb, NULL);
433 evas_object_smart_callback_add(ctxpopup, "dismissed",
434 cert_ctxpopup_dismissed_cb, eap_data);
435 elm_ctxpopup_direction_priority_set(ctxpopup,
436 ELM_CTXPOPUP_DIRECTION_DOWN,
437 ELM_CTXPOPUP_DIRECTION_UNKNOWN,
438 ELM_CTXPOPUP_DIRECTION_UNKNOWN,
439 ELM_CTXPOPUP_DIRECTION_UNKNOWN);
441 if (certsvc_instance_new(&instance) == CERTSVC_FAIL) {
442 INFO_LOG(UG_NAME_ERR, "Failed to create new instance");
446 if (certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList, &list_length) != CERTSVC_SUCCESS) {
447 INFO_LOG(UG_NAME_ERR, "Failed to get certificate list");
451 if (eap_data->cert_candidates) {
452 g_slist_free_full(eap_data->cert_candidates, g_free);
453 eap_data->cert_candidates = NULL;
456 it = elm_ctxpopup_item_append(ctxpopup, "IDS_ST_BODY_NONE", NULL,
457 _gl_eap_user_cert_sel, eap_data);
458 elm_object_item_domain_text_translatable_set(it,
461 while (certList != NULL) {
462 char *char_buffer = NULL;
463 CertSvcString buffer;
465 buffer.privateHandler = (char *)certList->gname;
466 buffer.privateLength = strlen(certList->gname);
467 INFO_LOG(UG_NAME_NORMAL, "gname in processing : %s", certList->gname);
469 char_buffer = g_strndup(buffer.privateHandler, buffer.privateLength);
470 if (char_buffer == NULL)
473 elm_ctxpopup_item_append(ctxpopup, char_buffer, NULL,
474 _gl_eap_user_cert_sel, eap_data);
475 eap_data->cert_candidates =
476 g_slist_prepend(eap_data->cert_candidates, char_buffer);
478 certsvc_string_free(buffer);
479 certList = certList->next;
482 move_dropdown(eap_data, btn);
483 evas_object_show(ctxpopup);
486 certsvc_instance_free(instance);
489 static void _gl_eap_cert_list_btn_cb(void *data, Evas_Object *obj,
492 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
493 eap_connect_data_t *eap_data = (eap_connect_data_t *) data;
496 elm_genlist_item_selected_set(item, EINA_FALSE);
498 if (keypad_state == FALSE) {
499 _create_eap_cert_list(eap_data, obj);
501 click.btn_click[EAP_CERT_BTN] = FALSE;
502 click.btn_obj[EAP_CERT_BTN] = NULL;
504 click.btn_click[EAP_CERT_BTN] = TRUE;
505 click.btn_obj[EAP_CERT_BTN] = obj;
509 static char *_gl_eap_user_cert_text_get(void *data, Evas_Object *obj, const char *part)
511 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
513 if (!g_strcmp0(part, "elm.text.sub")) {
514 return g_strdup(sc(eap_data->str_pkg_name,
515 I18N_TYPE_User_Certificate));
521 static Evas_Object *_gl_eap_user_cert_content_get(void *data,
522 Evas_Object *obj, const char *part)
524 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
525 Evas_Object *btn = NULL;
526 Evas_Object *ly = NULL;
530 if (!strcmp(part, "elm.swallow.icon.0")) {
531 ug_type = common_util_get_ug_type();
532 if (ug_type != UG_VIEW_OOBE) {
533 ly = elm_layout_add(obj);
534 elm_layout_file_set(ly, CUSTOM_EDITFIELD_PATH,
535 "eap_dropdown_button");
538 btn = elm_button_add(obj);
539 g_snprintf(buf, sizeof(buf), "%s",
540 eap_data->cert_alias ? eap_data->cert_alias
541 : sc(eap_data->str_pkg_name, I18N_TYPE_None));
543 elm_object_domain_translatable_text_set(btn, PACKAGE, buf);
544 elm_object_style_set(btn, ug_type == UG_VIEW_OOBE ? "cancel" : "dropdown/label");
545 evas_object_propagate_events_set(btn, EINA_FALSE);
546 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND,
548 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL,
550 evas_object_smart_callback_add(btn, "clicked",
551 _gl_eap_cert_list_btn_cb, eap_data);
553 if (ug_type != UG_VIEW_OOBE) {
554 elm_layout_content_set(ly, "btn", btn);
561 static void _gl_eap_item_sel_cb(void *data, Evas_Object *obj, void *event_info)
563 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
566 elm_genlist_item_selected_set(item, EINA_FALSE);
569 static void _create_eap_type_list(eap_connect_data_t *eap_data,
572 Evas_Object *ctxpopup = NULL;
573 int i = EAP_SEC_TYPE_PEAP;
574 int sim_state = VCONFKEY_TELEPHONY_SIM_UNKNOWN;
575 Elm_Object_Item *it = NULL;
577 sim_state = common_utils_get_sim_state();
579 if (eap_data->sub_popup != NULL)
580 evas_object_del(eap_data->sub_popup);
582 ctxpopup = elm_ctxpopup_add(eap_data->win);
583 eap_data->sub_popup = ctxpopup;
584 elm_object_style_set(ctxpopup, "dropdown/list");
585 eext_object_event_callback_add(ctxpopup, EEXT_CALLBACK_BACK,
586 eext_ctxpopup_back_cb, NULL);
587 evas_object_smart_callback_add(ctxpopup, "dismissed",
588 ctxpopup_dismissed_cb, eap_data);
589 elm_ctxpopup_direction_priority_set(ctxpopup,
590 ELM_CTXPOPUP_DIRECTION_DOWN,
591 ELM_CTXPOPUP_DIRECTION_UNKNOWN,
592 ELM_CTXPOPUP_DIRECTION_UNKNOWN,
593 ELM_CTXPOPUP_DIRECTION_UNKNOWN);
595 /* eap_type = __common_eap_connect_popup_get_eap_type(eap_data->ap); */
596 while (list_eap_type[i].name != NULL) {
597 it = elm_ctxpopup_item_append(ctxpopup, list_eap_type[i].name,
598 NULL, _gl_eap_type_sub_sel, eap_data);
600 if ((i == EAP_SEC_TYPE_SIM || i == EAP_SEC_TYPE_AKA ||
601 i == EAP_SEC_TYPE_AKA_PRIME) &&
602 sim_state != VCONFKEY_TELEPHONY_SIM_INSERTED) {
603 elm_object_item_disabled_set(it, EINA_TRUE);
609 move_dropdown(eap_data, btn);
610 evas_object_show(ctxpopup);
613 static void _gl_eap_type_btn_cb(void *data, Evas_Object *obj, void *event_info)
615 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
616 eap_connect_data_t *eap_data = (eap_connect_data_t *) data;
619 elm_genlist_item_selected_set(item, EINA_FALSE);
621 if (keypad_state == FALSE) {
622 _create_eap_type_list(eap_data, obj);
624 click.btn_click[EAP_TYPE_BTN] = FALSE;
625 click.btn_obj[EAP_TYPE_BTN] = NULL;
627 click.btn_click[EAP_TYPE_BTN] = TRUE;
628 click.btn_obj[EAP_TYPE_BTN] = obj;
632 static char *_gl_eap_type_text_get(void *data, Evas_Object *obj, const char *part)
634 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
636 if (!g_strcmp0(part, "elm.text.sub"))
637 return g_strdup(sc(eap_data->str_pkg_name, I18N_TYPE_EAP_method));
642 static Evas_Object *_gl_eap_type_content_get(void *data,
643 Evas_Object *obj, const char *part)
645 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
646 eap_type_t sel_sub_item_id = __common_eap_connect_popup_get_eap_type(eap_data->ap);
647 Evas_Object *btn = NULL;
648 Evas_Object *ly = NULL;
652 if (!strcmp(part, "elm.swallow.icon.0")) {
653 ug_type = common_util_get_ug_type();
654 if (ug_type != UG_VIEW_OOBE) {
655 ly = elm_layout_add(obj);
656 elm_layout_file_set(ly, CUSTOM_EDITFIELD_PATH,
657 "eap_dropdown_button");
659 btn = elm_button_add(obj);
660 g_snprintf(buf, sizeof(buf), "%s",
661 list_eap_type[sel_sub_item_id].name);
663 elm_object_text_set(btn, buf);
664 elm_object_style_set(btn, ug_type == UG_VIEW_OOBE ?
665 "cancel" : "dropdown/label");
666 evas_object_propagate_events_set(btn, EINA_FALSE);
667 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND,
669 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL,
671 evas_object_smart_callback_add(btn, "clicked",
672 _gl_eap_type_btn_cb, eap_data);
674 if (ug_type != UG_VIEW_OOBE) {
675 elm_layout_content_set(ly, "btn", btn);
683 static void _gl_eap_auth_sub_sel(void *data, Evas_Object *obj, void *event_info)
685 eap_connect_data_t *eap_data = (eap_connect_data_t *) data;
686 eap_auth_t sel_index = EAP_SEC_AUTH_NONE;
688 const char *label = elm_object_item_text_get((Elm_Object_Item *) event_info);
690 if (strcmp(label, sc(PACKAGE, I18N_TYPE_None)) == 0)
691 sel_index = EAP_SEC_AUTH_NONE;
692 else if (strcmp(label, EAP_AUTH_TYPE_PAP) == 0)
693 sel_index = EAP_SEC_AUTH_PAP;
694 else if (strcmp(label, EAP_AUTH_TYPE_MSCHAP) == 0)
695 sel_index = EAP_SEC_AUTH_MSCHAP;
696 else if (strcmp(label, EAP_AUTH_TYPE_MSCHAPV2) == 0)
697 sel_index = EAP_SEC_AUTH_MSCHAPV2;
698 else if (strcmp(label, EAP_AUTH_TYPE_GTC) == 0)
699 sel_index = EAP_SEC_AUTH_GTC;
700 else if (strcmp(label, EAP_AUTH_TYPE_MD5) == 0)
701 sel_index = EAP_SEC_AUTH_MD5;
703 wifi_manager_ap_set_eap_auth_type(eap_data->ap,
704 __common_eap_connect_popup_get_wlan_auth_type(sel_index));
706 if (eap_data->sub_popup != NULL) {
707 evas_object_del(eap_data->sub_popup);
708 eap_data->sub_popup = NULL;
711 if (eap_data->eap_auth_item != NULL)
712 elm_genlist_item_update(eap_data->eap_auth_item);
715 static void _create_eap_auth_list(eap_connect_data_t *eap_data,
718 Elm_Object_Item *it = NULL;
719 eap_type_t eap_type = EAP_SEC_TYPE_UNKNOWN;
720 Evas_Object *ctxpopup;
723 eap_type = __common_eap_connect_popup_get_eap_type(eap_data->ap);
725 if (eap_data->sub_popup != NULL)
726 evas_object_del(eap_data->sub_popup);
728 ctxpopup = elm_ctxpopup_add(eap_data->win);
729 eap_data->sub_popup = ctxpopup;
730 elm_object_style_set(ctxpopup, "dropdown/list");
731 eext_object_event_callback_add(ctxpopup, EEXT_CALLBACK_BACK, eext_ctxpopup_back_cb, NULL);
732 evas_object_smart_callback_add(ctxpopup, "dismissed", ctxpopup_dismissed_cb, eap_data);
733 elm_ctxpopup_direction_priority_set(ctxpopup,
734 ELM_CTXPOPUP_DIRECTION_DOWN,
735 ELM_CTXPOPUP_DIRECTION_UNKNOWN,
736 ELM_CTXPOPUP_DIRECTION_UNKNOWN,
737 ELM_CTXPOPUP_DIRECTION_UNKNOWN);
739 while (list_eap_auth[i].name != NULL) {
740 if ((eap_type != EAP_SEC_TYPE_PEAP && eap_type != EAP_SEC_TYPE_FAST) ||
741 (eap_type == EAP_SEC_TYPE_PEAP && i != 1 &&
743 (eap_type == EAP_SEC_TYPE_FAST && i !=1 &&
745 it = elm_ctxpopup_item_append(ctxpopup, list_eap_auth[i].name,
746 NULL, _gl_eap_auth_sub_sel, eap_data);
748 elm_object_item_domain_text_translatable_set(it,
754 move_dropdown(eap_data, btn);
755 evas_object_show(ctxpopup);
758 static void _gl_eap_auth_btn_cb(void *data, Evas_Object *obj, void *event_info)
760 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
761 eap_connect_data_t *eap_data = (eap_connect_data_t *) data;
764 elm_genlist_item_selected_set(item, EINA_FALSE);
766 if (keypad_state == FALSE) {
767 _create_eap_auth_list(eap_data, obj);
769 click.btn_click[EAP_AUTH_BTN] = FALSE;
770 click.btn_obj[EAP_AUTH_BTN] = NULL;
772 click.btn_click[EAP_AUTH_BTN] = TRUE;
773 click.btn_obj[EAP_AUTH_BTN] = obj;
777 static char *_gl_eap_auth_text_get(void *data, Evas_Object *obj, const char *part)
779 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
781 if (!g_strcmp0(part, "elm.text.sub")) {
782 return g_strdup(sc(eap_data->str_pkg_name,
783 I18N_TYPE_Phase_2_authentication));
789 static Evas_Object *_gl_eap_auth_content_get(void *data,
790 Evas_Object *obj, const char *part)
792 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
793 eap_auth_t sel_sub_item_id = __common_eap_connect_popup_get_auth_type(eap_data->ap);
794 Evas_Object *btn = NULL;
795 Evas_Object *ly = NULL;
799 if (!strcmp(part, "elm.swallow.icon.0")) {
800 ug_type = common_util_get_ug_type();
801 if (ug_type != UG_VIEW_OOBE) {
802 ly = elm_layout_add(obj);
803 elm_layout_file_set(ly, CUSTOM_EDITFIELD_PATH, "eap_dropdown_button");
806 btn = elm_button_add(obj);
807 if (sel_sub_item_id == EAP_SEC_AUTH_NONE) {
808 g_snprintf(buf, sizeof(buf), "%s",
809 sc(PACKAGE, I18N_TYPE_None));
811 g_snprintf(buf, sizeof(buf), "%s",
812 list_eap_auth[sel_sub_item_id].name);
815 elm_object_domain_translatable_text_set(btn, PACKAGE, buf);
816 elm_object_style_set(btn, ug_type == UG_VIEW_OOBE ? "cancel" : "dropdown/label");
817 evas_object_propagate_events_set(btn, EINA_FALSE);
818 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND,
820 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL,
822 evas_object_smart_callback_add(btn, "clicked",
823 _gl_eap_auth_btn_cb, eap_data);
825 if (ug_type != UG_VIEW_OOBE) {
826 elm_layout_content_set(ly, "btn", btn);
834 static void _gl_eap_entry_key_enter_cb(void *data, Evas_Object *obj, void *event_info)
836 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
840 Evas_Object *entry = NULL;
841 Elm_Object_Item *next_item = NULL;
844 switch (entry_info->entry_id) {
845 case ENTRY_TYPE_USER_ID:
846 eap_type = __common_eap_connect_popup_get_eap_type(
849 if (eap_type == EAP_SEC_TYPE_TLS) {
850 entry = elm_object_item_part_content_get(entry_info->item,
853 elm_object_focus_set(entry, EINA_FALSE);
856 next_item = elm_genlist_item_next_get(entry_info->item);
858 if (elm_object_item_disabled_get(next_item) == EINA_FALSE &&
859 elm_genlist_item_select_mode_get(next_item) !=
860 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) {
861 entry = elm_object_item_part_content_get(
862 next_item, "elm.icon.entry");
864 elm_object_focus_set(entry, EINA_TRUE);
869 next_item = elm_genlist_item_next_get(next_item);
873 case ENTRY_TYPE_PASSWORD:
874 entry = elm_object_item_part_content_get(entry_info->item,
877 elm_object_focus_set(entry, EINA_FALSE);
884 static void _gl_eap_entry_cursor_changed_cb(void* data, Evas_Object* obj, void* event_info)
886 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
890 if (elm_object_focus_get(obj)) {
891 if (elm_entry_is_empty(obj))
892 elm_object_item_signal_emit(entry_info->item, "elm,state,eraser,hide", "");
894 elm_object_item_signal_emit(entry_info->item, "elm,state,eraser,show", "");
897 if (entry_info->entry_txt) {
898 g_free(entry_info->entry_txt);
899 entry_info->entry_txt = NULL;
902 char *entry_text = elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
904 if (entry_text != NULL && entry_text[0] != '\0')
905 entry_info->entry_txt = elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
910 static void _gl_eap_entry_changed_cb(void* data, Evas_Object* obj, void* event_info)
912 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
919 if (elm_object_focus_get(obj)) {
920 if (elm_entry_is_empty(obj))
921 elm_object_item_signal_emit(entry_info->item, "elm,state,eraser,hide", "");
923 elm_object_item_signal_emit(entry_info->item, "elm,state,eraser,show", "");
927 static void _gl_eap_entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
929 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
933 if (!elm_entry_is_empty(obj))
934 elm_object_item_signal_emit(entry_info->item, "elm,state,eraser,show", "");
936 elm_object_item_signal_emit(entry_info->item, "elm,state,rename,hide", "");
939 static void _gl_eap_entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
941 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
945 if (entry_info->entry_txt) {
946 g_free(entry_info->entry_txt);
947 entry_info->entry_txt = NULL;
950 char *entry_text = elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
951 if (entry_text != NULL && entry_text[0] != '\0')
952 entry_info->entry_txt = elm_entry_markup_to_utf8(elm_entry_entry_get(obj));
956 elm_object_item_signal_emit(entry_info->item, "elm,state,eraser,hide", "");
957 elm_object_item_signal_emit(entry_info->item, "elm,state,rename,show", "");
960 static void _gl_eap_entry_maxlength_reached(void *data, Evas_Object *obj,
963 common_utils_send_message_to_net_popup("Password length",
964 "Lengthy Password", "notification", NULL);
967 static void _gl_eap_entry_eraser_clicked_cb(void *data, Evas_Object *obj, void *event_info)
969 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
973 Evas_Object *entry = elm_object_item_part_content_get(entry_info->item, "elm.icon.entry");
975 elm_object_focus_set(entry, EINA_TRUE);
976 elm_entry_entry_set(entry, "");
980 static char *_gl_eap_entry_item_text_get(void *data, Evas_Object *obj, const char *part)
982 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
986 if (!g_strcmp0(part, "elm.text.sub"))
987 return g_strdup(dgettext(PACKAGE, entry_info->title_txt));
992 static Evas_Object *_gl_eap_entry_item_content_get(void *data, Evas_Object *obj, const char *part)
994 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
998 if (g_strcmp0(part, "elm.swallow.content") == 0) {
999 Evas_Object *entry = NULL;
1000 Evas_Object *box = NULL;
1001 Evas_Object *tpad = NULL;
1002 Evas_Object *lpad = NULL;
1003 Evas_Object *label = NULL;
1004 Evas_Object *layout = NULL;
1005 Evas_Object *editfield = NULL;
1006 char buf[MAX_LABEL_LENGTH] = {0, };
1007 char *guide_txt = NULL;
1008 char *accepted = NULL;
1009 Eina_Bool hide_entry_txt = EINA_FALSE;
1010 Elm_Input_Panel_Layout panel_type;
1011 int return_key_type;
1012 eap_type_t eap_type;
1015 eap_type = __common_eap_connect_popup_get_eap_type(entry_info->ap);
1017 static Elm_Entry_Filter_Limit_Size limit_filter_data;
1019 switch (entry_info->entry_id) {
1020 case ENTRY_TYPE_USER_ID:
1021 panel_type = ELM_INPUT_PANEL_LAYOUT_NORMAL;
1022 guide_txt = entry_info->guide_txt;
1024 if (eap_type == EAP_SEC_TYPE_TLS)
1025 return_key_type = ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DONE;
1027 return_key_type = ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_NEXT;
1030 case ENTRY_TYPE_PASSWORD:
1031 panel_type = ELM_INPUT_PANEL_LAYOUT_PASSWORD;
1032 guide_txt = entry_info->guide_txt;
1033 hide_entry_txt = EINA_TRUE;
1034 return_key_type = ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DONE;
1040 entry = elm_box_add(obj);
1041 elm_box_align_set(entry, 0.0, 0.0);
1043 tpad = evas_object_rectangle_add(entry);
1044 evas_object_size_hint_min_set(tpad, 0, ELM_SCALE_SIZE(10));
1045 evas_object_show(tpad);
1046 elm_box_pack_end(entry, tpad);
1048 box = elm_box_add(entry);
1049 evas_object_size_hint_align_set(box, 0.0, 0.0);
1050 elm_box_horizontal_set(box, EINA_TRUE);
1051 elm_box_pack_end(entry, box);
1052 evas_object_show(box);
1054 lpad = evas_object_rectangle_add(box);
1055 evas_object_size_hint_min_set(lpad, ELM_SCALE_SIZE(15), 0);
1056 evas_object_show(lpad);
1057 elm_box_pack_end(box, lpad);
1058 evas_object_show(box);
1060 label = elm_label_add(box);
1061 snprintf(buf, MAX_LABEL_LENGTH, "<font_size=30>%s</font_size>",
1062 dgettext(PACKAGE, entry_info->title_txt));
1063 elm_object_text_set(label, buf);
1064 evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
1065 evas_object_size_hint_weight_set(label, 0.9, EVAS_HINT_EXPAND);
1066 elm_box_pack_end(box, label);
1067 evas_object_show(label);
1069 layout = elm_layout_add(entry);
1070 elm_layout_theme_set(layout, "layout", "editfield", "singleline");
1071 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1072 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1074 editfield = elm_entry_add(layout);
1075 elm_entry_single_line_set(editfield, EINA_TRUE);
1076 elm_entry_scrollable_set(editfield, EINA_TRUE);
1077 elm_entry_password_set(editfield, hide_entry_txt);
1078 elm_entry_prediction_allow_set(editfield, EINA_FALSE);
1079 elm_entry_autocapital_type_set(editfield, ELM_AUTOCAPITAL_TYPE_NONE);
1081 elm_object_domain_translatable_part_text_set(editfield, "elm.guide",
1082 PACKAGE, guide_txt);
1083 if (entry_info->entry_txt && (strlen(entry_info->entry_txt) > 0))
1084 elm_entry_entry_set(editfield, entry_info->entry_txt);
1086 elm_entry_input_panel_layout_set(editfield, panel_type);
1087 elm_entry_input_panel_return_key_type_set(editfield, return_key_type);
1089 limit_filter_data.max_char_count = 200;
1090 elm_entry_markup_filter_append(editfield, elm_entry_filter_limit_size, &limit_filter_data);
1092 Elm_Entry_Filter_Accept_Set digits_filter_data;
1093 memset(&digits_filter_data, 0, sizeof(Elm_Entry_Filter_Accept_Set));
1094 digits_filter_data.accepted = accepted;
1095 elm_entry_markup_filter_append(editfield, elm_entry_filter_accept_set, &digits_filter_data);
1097 Ecore_IMF_Context *imf_ctxt = elm_entry_imf_context_get(editfield);
1098 if (imf_ctxt && entry_info->input_panel_cb) {
1099 ecore_imf_context_input_panel_event_callback_add(imf_ctxt,
1100 ECORE_IMF_INPUT_PANEL_STATE_EVENT,
1101 entry_info->input_panel_cb,
1102 entry_info->input_panel_cb_data);
1103 DEBUG_LOG(UG_NAME_NORMAL, "set the imf ctxt cbs");
1106 evas_object_smart_callback_add(editfield, "activated", _gl_eap_entry_key_enter_cb, entry_info);
1107 evas_object_smart_callback_add(editfield, "cursor,changed", _gl_eap_entry_cursor_changed_cb, entry_info);
1108 evas_object_smart_callback_add(editfield, "changed", _gl_eap_entry_changed_cb, entry_info);
1109 evas_object_smart_callback_add(editfield, "focused", _gl_eap_entry_focused_cb, entry_info);
1110 evas_object_smart_callback_add(editfield, "unfocused", _gl_eap_entry_unfocused_cb, entry_info);
1111 evas_object_smart_callback_add(editfield, "maxlength,reached", _gl_eap_entry_maxlength_reached, NULL);
1113 elm_object_part_content_set(layout, "elm.swallow.content", editfield);
1114 evas_object_show(layout);
1115 elm_box_pack_end(entry, layout);
1117 evas_object_size_hint_min_set(entry, 0, ELM_SCALE_SIZE(height));
1118 elm_object_focus_set(entry, EINA_FALSE);
1119 evas_object_show(entry);
1121 if (entry_info->entry_id == ENTRY_TYPE_PASSWORD)
1122 g_pwd_entry = editfield;
1125 } else if (g_strcmp0(part, "elm.icon.eraser") == 0) {
1126 Evas_Object *btn = elm_button_add(obj);
1127 elm_object_style_set(btn, "editfield_clear");
1128 evas_object_smart_callback_add(btn, "clicked", _gl_eap_entry_eraser_clicked_cb, entry_info);
1135 static void _gl_eap_entry_item_del(void *data, Evas_Object *obj)
1137 common_utils_entry_info_t *entry_info = (common_utils_entry_info_t *)data;
1138 if (entry_info == NULL)
1141 if (entry_info->entry_txt)
1142 g_free(entry_info->entry_txt);
1147 static void _chk_changed_cb(void *data, Evas_Object *obj, void *ei)
1149 if (obj == NULL || g_pwd_entry == NULL)
1152 Eina_Bool state = elm_check_state_get(obj);
1154 elm_entry_password_set(g_pwd_entry, EINA_FALSE);
1156 elm_entry_password_set(g_pwd_entry, EINA_TRUE);
1157 elm_entry_cursor_end_set(g_pwd_entry);
1160 static char *_gl_eap_chkbox_item_text_get(void *data, Evas_Object *obj,
1163 char *str_pkg_name = (char *)data;
1165 if (!strcmp("elm.text", part)) {
1167 snprintf(buf, 1023, "%s", sc(str_pkg_name, I18N_TYPE_Show_password));
1174 static Evas_Object *_gl_eap_chkbox_item_content_get(void *data,
1175 Evas_Object *obj, const char *part)
1177 Evas_Object *check = NULL;
1179 if (!strcmp("elm.swallow.icon", part)) {
1180 check = elm_check_add(obj);
1181 if (common_util_get_ug_type() == UG_VIEW_OOBE)
1182 elm_object_style_set(check, "oobe-casual");
1184 evas_object_propagate_events_set(check, EINA_FALSE);
1185 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
1186 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1187 evas_object_smart_callback_add(check, "changed",
1188 _chk_changed_cb, NULL);
1190 elm_object_focus_allow_set(check, EINA_FALSE);
1197 static void _gl_eap_chkbox_sel(void *data, Evas_Object *obj, void *ei)
1199 Elm_Object_Item *item = NULL;
1201 item = (Elm_Object_Item *)ei;
1205 Evas_Object *ck = elm_object_item_part_content_get(ei, "elm.icon.right");
1207 elm_genlist_item_selected_set(item, EINA_FALSE);
1209 Eina_Bool state = elm_check_state_get(ck);
1210 elm_check_state_set(ck, !state);
1212 _chk_changed_cb(NULL, ck, NULL);
1215 static void gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
1217 elm_genlist_realized_items_update(obj);
1220 static void __common_eap_connect_popup_init_item_class(void *data)
1222 g_eap_type_itc.item_style = WIFI_GENLIST_2LINE_BOTTOM_SWALLOW_STYLE;
1223 g_eap_type_itc.func.text_get = _gl_eap_type_text_get;
1224 g_eap_type_itc.func.content_get = _gl_eap_type_content_get;
1225 g_eap_type_itc.func.state_get = NULL;
1226 g_eap_type_itc.func.del = NULL;
1228 g_eap_auth_itc.item_style = WIFI_GENLIST_2LINE_BOTTOM_SWALLOW_STYLE;
1229 g_eap_auth_itc.func.text_get = _gl_eap_auth_text_get;
1230 g_eap_auth_itc.func.content_get = _gl_eap_auth_content_get;
1231 g_eap_auth_itc.func.state_get = NULL;
1232 g_eap_auth_itc.func.del = NULL;
1234 g_eap_user_cert_itc.item_style = WIFI_GENLIST_2LINE_BOTTOM_SWALLOW_STYLE;
1235 g_eap_user_cert_itc.func.text_get = _gl_eap_user_cert_text_get;
1236 g_eap_user_cert_itc.func.content_get = _gl_eap_user_cert_content_get;
1237 g_eap_user_cert_itc.func.state_get = NULL;
1238 g_eap_user_cert_itc.func.del = NULL;
1240 g_eap_entry_itc.item_style = WIFI_GENLIST_FULL_STYLE;
1241 g_eap_entry_itc.func.text_get = _gl_eap_entry_item_text_get;
1242 g_eap_entry_itc.func.content_get = _gl_eap_entry_item_content_get;
1243 g_eap_entry_itc.func.state_get = NULL;
1244 g_eap_entry_itc.func.del = _gl_eap_entry_item_del;
1246 g_eap_chkbox_itc.item_style = WIFI_GENLIST_1LINE_TEXT_ICON_STYLE;
1247 g_eap_chkbox_itc.func.text_get = _gl_eap_chkbox_item_text_get;
1248 g_eap_chkbox_itc.func.content_get = _gl_eap_chkbox_item_content_get;
1249 g_eap_chkbox_itc.func.state_get = NULL;
1250 g_eap_chkbox_itc.func.del = NULL;
1253 static gboolean __cert_extract_files(const char *cert_alias,
1254 eap_connect_data_t *eap_data)
1258 size_t cert_counts = 0;
1260 gchar *ca_cert_path = NULL;
1261 gchar *user_cert_path = NULL;
1262 gchar *privatekey_path = NULL;
1264 CertSvcInstance cert_instance;
1265 CertSvcString cert_alias_str;
1266 CertSvcCertificateList cert_list;
1267 CertSvcCertificate user_certificate;
1268 CertSvcCertificate ca_certificate;
1269 CertSvcCertificate *selected_certificate = NULL;
1271 EVP_PKEY *privatekey = NULL;
1273 ret = certsvc_instance_new(&cert_instance);
1274 if (ret != CERTSVC_SUCCESS) {
1275 ERROR_LOG(UG_NAME_NORMAL, "failed to certsvc_instance_new");
1278 ret = certsvc_string_new(cert_instance, cert_alias, strlen(cert_alias), &cert_alias_str);
1279 if (ret != CERTSVC_SUCCESS) {
1280 ERROR_LOG(UG_NAME_NORMAL, "failed to certsvc_string_new");
1283 ret = certsvc_pkcs12_load_certificate_list_from_store(cert_instance, WIFI_STORE, cert_alias_str, &cert_list);
1284 if (ret != CERTSVC_SUCCESS) {
1285 ERROR_LOG(UG_NAME_NORMAL, "failed to certsvc_pkcs12_load_certificate_list_from_store");
1288 ret = certsvc_certificate_list_get_length(cert_list, &cert_counts);
1289 if (cert_counts < 1) {
1290 ERROR_LOG(UG_NAME_NORMAL, "there is no certificates");
1293 INFO_LOG(UG_NAME_NORMAL, "cert counts: %zd", cert_counts);
1294 selected_certificate = g_try_new0(CertSvcCertificate, cert_counts);
1295 if (selected_certificate == NULL) {
1296 ERROR_LOG(UG_NAME_NORMAL, "failed to allocate memory");
1299 ret = certsvc_certificate_list_get_one(cert_list, 0, &user_certificate);
1300 if (ret != CERTSVC_SUCCESS) {
1301 ERROR_LOG(UG_NAME_NORMAL, "failed to certsvc_certificate_list_get_one");
1304 cert_index = cert_counts - 1;
1306 selected_certificate[0] = user_certificate;
1308 ret = certsvc_certificate_dup_x509(user_certificate, &x509);
1310 user_cert_path = g_strdup_printf("%s%s_%s", EAP_TLS_PATH,
1311 cert_alias, EAP_TLS_USER_CERT_PATH);
1312 if ((fp = fopen(user_cert_path, "w")) == NULL)
1315 ret = PEM_write_X509(fp, x509);
1317 certsvc_certificate_free_x509(x509);
1318 INFO_LOG(UG_NAME_NORMAL, "success to save user_cert file");
1320 ca_cert_path = g_strdup_printf("%s%s_%s", EAP_TLS_PATH, cert_alias,
1321 EAP_TLS_CA_CERT_PATH);
1322 while (cert_index) {
1323 ret = certsvc_certificate_list_get_one(cert_list, cert_index, &ca_certificate);
1324 if (ret != CERTSVC_SUCCESS) {
1325 ERROR_LOG(UG_NAME_NORMAL, "failed to certsvc_certificate_list_get_one");
1329 selected_certificate[cert_counts-cert_index] = ca_certificate;
1332 ret = certsvc_certificate_dup_x509(ca_certificate, &x509);
1333 if ((fp = fopen(ca_cert_path, "a")) == NULL)
1336 ret = PEM_write_X509(fp, x509);
1338 certsvc_certificate_free_x509(x509);
1340 INFO_LOG(UG_NAME_NORMAL, "success to save ca_cert file");
1341 ret = certsvc_certificate_verify(selected_certificate[0], selected_certificate, cert_counts, NULL, 0, &validity);
1342 if (ret != CERTSVC_SUCCESS) {
1343 ERROR_LOG(UG_NAME_NORMAL, "failed to verify ca_certificate");
1346 if (validity == 0) {
1347 ERROR_LOG(UG_NAME_NORMAL, "Invalid certificate");
1351 ret = certsvc_pkcs12_dup_evp_pkey_from_store(cert_instance, WIFI_STORE, cert_alias_str, &privatekey);
1353 privatekey_path = g_strdup_printf("%s%s_%s", EAP_TLS_PATH,
1354 cert_alias, EAP_TLS_PRIVATEKEY_PATH);
1356 if ((fp = fopen(privatekey_path, "w")) == NULL)
1359 ret = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL);
1361 certsvc_pkcs12_free_evp_pkey(privatekey);
1362 INFO_LOG(UG_NAME_NORMAL, "success to save privatekey file");
1364 g_free(selected_certificate);
1365 certsvc_instance_free(cert_instance);
1367 eap_data->ca_cert_path = ca_cert_path;
1368 eap_data->user_cert_path = user_cert_path;
1369 eap_data->privatekey_path = privatekey_path;
1374 g_free(ca_cert_path);
1375 g_free(user_cert_path);
1376 g_free(privatekey_path);
1378 if (selected_certificate)
1379 g_free(selected_certificate);
1381 certsvc_instance_free(cert_instance);
1385 /* This creates EAP type, Auth type, CA certificate, User certificate,
1386 * User Id, Anonymous Id and Password items.
1388 static void _create_and_update_list_items_based_on_rules(eap_type_t new_type,
1389 eap_connect_data_t *eap_data)
1391 __COMMON_FUNC_ENTER__;
1392 Evas_Object* view_list = eap_data->genlist;
1393 Elm_Object_Item *insert_after_item = NULL;
1394 Elm_Object_Item *prev_item = NULL;
1395 common_utils_entry_info_t *edit_box_details;
1396 Eina_Bool auth_reqd = EINA_FALSE;
1397 Eina_Bool user_cert_reqd = EINA_FALSE;
1398 Eina_Bool id_reqd = EINA_FALSE;
1399 Eina_Bool pw_reqd = EINA_FALSE;
1401 if (NULL == eap_data->eap_type_item) {
1402 /* Create EAP method/type */
1403 eap_data->eap_type_item = elm_genlist_item_append(
1404 view_list, &g_eap_type_itc,
1406 ELM_GENLIST_ITEM_NONE,
1407 _gl_eap_item_sel_cb, eap_data);
1411 case EAP_SEC_TYPE_PEAP:
1412 insert_after_item = eap_data->eap_type_item;
1413 auth_reqd = EINA_TRUE;
1414 user_cert_reqd = EINA_FALSE;
1415 id_reqd = EINA_TRUE;
1416 pw_reqd = EINA_TRUE;
1418 case EAP_SEC_TYPE_TLS:
1419 insert_after_item = eap_data->eap_type_item;
1420 auth_reqd = EINA_FALSE;
1421 user_cert_reqd = EINA_TRUE;
1422 id_reqd = EINA_TRUE;
1423 pw_reqd = EINA_FALSE;
1425 case EAP_SEC_TYPE_TTLS:
1426 insert_after_item = eap_data->eap_type_item;
1427 auth_reqd = EINA_TRUE;
1428 user_cert_reqd = EINA_FALSE;
1429 id_reqd = EINA_TRUE;
1430 pw_reqd = EINA_TRUE;
1432 case EAP_SEC_TYPE_SIM:
1433 insert_after_item = eap_data->eap_type_item;
1434 auth_reqd = EINA_FALSE;
1435 user_cert_reqd = EINA_FALSE;
1436 id_reqd = EINA_FALSE;
1437 pw_reqd = EINA_FALSE;
1439 case EAP_SEC_TYPE_AKA:
1440 _delete_eap_entry_items(eap_data);
1441 insert_after_item = eap_data->eap_type_item;
1442 auth_reqd = EINA_FALSE;
1443 user_cert_reqd = EINA_FALSE;
1444 id_reqd = EINA_FALSE;
1445 pw_reqd = EINA_FALSE;
1447 case EAP_SEC_TYPE_AKA_PRIME:
1448 _delete_eap_entry_items(eap_data);
1449 insert_after_item = eap_data->eap_type_item;
1450 auth_reqd = EINA_FALSE;
1451 user_cert_reqd = EINA_FALSE;
1452 id_reqd = EINA_FALSE;
1453 pw_reqd = EINA_FALSE;
1455 case EAP_SEC_TYPE_FAST:
1456 insert_after_item = eap_data->eap_type_item;
1457 auth_reqd = EINA_TRUE;
1458 user_cert_reqd = EINA_FALSE;
1459 id_reqd = EINA_TRUE;
1460 pw_reqd = EINA_TRUE;
1462 case EAP_SEC_TYPE_PWD:
1463 insert_after_item = eap_data->eap_type_item;
1464 auth_reqd = EINA_FALSE;
1465 user_cert_reqd = EINA_FALSE;
1466 id_reqd = EINA_TRUE;
1467 pw_reqd = EINA_TRUE;
1473 if (auth_reqd == EINA_TRUE) {
1474 if (eap_data->eap_auth_item == NULL) {
1475 /* Add EAP phase2 authentication */
1476 eap_data->eap_auth_item = elm_genlist_item_insert_after(
1477 view_list, &g_eap_auth_itc, eap_data, NULL,
1478 insert_after_item, ELM_GENLIST_ITEM_NONE,
1479 _gl_eap_item_sel_cb, eap_data);
1482 _delete_eap_auth_item(eap_data);
1485 if (user_cert_reqd == EINA_TRUE) {
1486 if (eap_data->eap_user_cert_item == NULL) {
1487 prev_item = eap_data->eap_type_item;
1489 /* Add User certificate */
1490 eap_data->eap_user_cert_item = elm_genlist_item_insert_after(
1491 view_list, &g_eap_user_cert_itc, eap_data, NULL,
1492 prev_item, ELM_GENLIST_ITEM_NONE,
1493 _gl_eap_item_sel_cb, eap_data);
1496 _delete_eap_user_cert_item(eap_data);
1499 if (id_reqd == EINA_TRUE) {
1500 if (eap_data->eap_id_item == NULL) {
1501 if (new_type == EAP_SEC_TYPE_PEAP ||
1502 new_type == EAP_SEC_TYPE_TTLS) {
1503 prev_item = eap_data->eap_auth_item;
1504 } else if(new_type == EAP_SEC_TYPE_FAST ||
1505 new_type == EAP_SEC_TYPE_PWD) {
1506 prev_item = eap_data->eap_type_item;
1509 prev_item = eap_data->eap_user_cert_item;
1513 edit_box_details = g_try_new0(common_utils_entry_info_t, 1);
1514 if (edit_box_details == NULL)
1517 edit_box_details->ap = eap_data->ap;
1518 edit_box_details->entry_id = ENTRY_TYPE_USER_ID;
1519 edit_box_details->title_txt = "IDS_WIFI_BODY_IDENTITY";
1520 edit_box_details->guide_txt = "IDS_WIFI_BODY_ENTER_IDENTITY";
1521 edit_box_details->item = elm_genlist_item_insert_after(
1522 view_list, &g_eap_entry_itc, edit_box_details,
1524 ELM_GENLIST_ITEM_NONE, _gl_editbox_sel_cb, NULL);
1525 eap_data->eap_id_item = edit_box_details->item;
1528 _delete_eap_id_item(eap_data);
1531 if (pw_reqd == EINA_TRUE) {
1532 if (eap_data->eap_pw_item == NULL) {
1533 /* Add EAP Password */
1534 edit_box_details = g_try_new0(common_utils_entry_info_t, 1);
1535 if (edit_box_details == NULL)
1538 edit_box_details->ap = eap_data->ap;
1539 edit_box_details->entry_id = ENTRY_TYPE_PASSWORD;
1540 edit_box_details->title_txt = "IDS_WIFI_HEADER_PASSWORD";
1541 edit_box_details->guide_txt = "IDS_WIFI_HEADER_ENTER_PASSWORD";
1542 edit_box_details->item = elm_genlist_item_insert_after(
1543 view_list, &g_eap_entry_itc,
1544 edit_box_details, NULL,
1545 eap_data->eap_id_item,
1546 ELM_GENLIST_ITEM_NONE,
1547 _gl_editbox_sel_cb, NULL);
1548 eap_data->eap_pw_item = edit_box_details->item;
1550 _update_eap_id_item_enter_key(eap_data);
1553 if (eap_data->eap_chkbox_item == NULL) {
1554 /* Add Show Password checkbox */
1555 eap_data->eap_chkbox_item = elm_genlist_item_insert_after(
1556 view_list, &g_eap_chkbox_itc,
1557 eap_data->str_pkg_name, NULL,
1558 eap_data->eap_pw_item,
1559 ELM_GENLIST_ITEM_NONE,
1560 _gl_eap_chkbox_sel, NULL);
1563 _delete_eap_pw_items(eap_data);
1566 __COMMON_FUNC_EXIT__;
1570 static void _update_eap_id_item_enter_key(eap_connect_data_t *eap_data)
1572 if (eap_data->eap_id_item == NULL)
1575 Evas_Object *entry = NULL;
1576 eap_type_t eap_type;
1578 eap_type = __common_eap_connect_popup_get_eap_type(eap_data->ap);
1579 entry = elm_object_item_part_content_get(eap_data->eap_id_item,
1582 if (eap_type == EAP_SEC_TYPE_TLS) {
1583 elm_entry_input_panel_return_key_type_set(entry,
1584 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
1586 elm_entry_input_panel_return_key_type_set(entry,
1587 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_NEXT);
1592 static void _delete_eap_auth_item(eap_connect_data_t *eap_data)
1594 __COMMON_FUNC_ENTER__;
1596 if (eap_data->eap_auth_item != NULL) {
1597 elm_object_item_del(eap_data->eap_auth_item);
1598 eap_data->eap_auth_item = NULL;
1601 __COMMON_FUNC_EXIT__;
1605 static void _delete_eap_user_cert_item(eap_connect_data_t *eap_data)
1607 __COMMON_FUNC_ENTER__;
1609 if (eap_data->eap_user_cert_item != NULL) {
1610 elm_object_item_del(eap_data->eap_user_cert_item);
1611 eap_data->eap_user_cert_item = NULL;
1614 __COMMON_FUNC_EXIT__;
1618 static void _delete_eap_id_item(eap_connect_data_t *eap_data)
1620 __COMMON_FUNC_ENTER__;
1622 if (eap_data->eap_id_item != NULL) {
1623 elm_object_item_del(eap_data->eap_id_item);
1624 eap_data->eap_id_item = NULL;
1627 __COMMON_FUNC_EXIT__;
1631 static void _delete_eap_pw_items(eap_connect_data_t *eap_data)
1633 __COMMON_FUNC_ENTER__;
1635 _update_eap_id_item_enter_key(eap_data);
1637 if (eap_data->eap_pw_item != NULL) {
1638 elm_object_item_del(eap_data->eap_pw_item);
1639 eap_data->eap_pw_item = NULL;
1642 if (eap_data->eap_chkbox_item) {
1643 elm_object_item_del(eap_data->eap_chkbox_item);
1644 eap_data->eap_chkbox_item = NULL;
1647 __COMMON_FUNC_EXIT__;
1651 void _delete_eap_entry_items(eap_connect_data_t *eap_data)
1653 __COMMON_FUNC_ENTER__;
1655 if (eap_data->eap_auth_item != NULL) {
1656 elm_object_item_del(eap_data->eap_auth_item);
1657 eap_data->eap_auth_item = NULL;
1660 if (eap_data->eap_user_cert_item != NULL) {
1661 elm_object_item_del(eap_data->eap_user_cert_item);
1662 eap_data->eap_user_cert_item = NULL;
1665 if (eap_data->eap_id_item != NULL) {
1666 elm_object_item_del(eap_data->eap_id_item);
1667 eap_data->eap_id_item = NULL;
1670 if (eap_data->eap_pw_item != NULL) {
1671 elm_object_item_del(eap_data->eap_pw_item);
1672 eap_data->eap_pw_item = NULL;
1675 if (eap_data->eap_chkbox_item != NULL) {
1676 elm_object_item_del(eap_data->eap_chkbox_item);
1677 eap_data->eap_chkbox_item = NULL;
1680 __COMMON_FUNC_EXIT__;
1684 static Evas_Object* _create_list(Evas_Object* parent, void *data)
1686 __COMMON_FUNC_ENTER__;
1687 assertm_if(NULL == parent, "NULL!!");
1689 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
1690 Evas_Object* view_list = NULL;
1691 eap_type_t eap_type = EAP_SEC_TYPE_UNKNOWN;
1692 retvm_if(eap_data == NULL, NULL);
1694 __common_eap_connect_popup_init_item_class(eap_data);
1696 eap_data->eap_done_ok = FALSE;
1697 eap_data->genlist = view_list = elm_genlist_add(parent);
1698 //elm_genlist_realization_mode_set(view_list, EINA_TRUE);
1699 elm_genlist_mode_set(view_list, ELM_LIST_COMPRESS);
1700 elm_scroller_content_min_limit(view_list, EINA_FALSE, EINA_TRUE);
1702 evas_object_size_hint_weight_set(view_list, EVAS_HINT_EXPAND,
1704 evas_object_size_hint_align_set(view_list, EVAS_HINT_FILL, EVAS_HINT_FILL);
1706 /* Set default values. eap type = PEAP, auth type = MSCHAPv2 */
1707 eap_type = __common_eap_connect_popup_get_eap_type(eap_data->ap);
1708 wifi_manager_ap_set_eap_type(eap_data->ap,
1709 (eap_type == EAP_SEC_TYPE_UNKNOWN) ?
1710 WIFI_MANAGER_EAP_TYPE_PEAP :
1711 __common_eap_connect_popup_get_wlan_eap_type(eap_type));
1713 wifi_manager_ap_set_eap_auth_type(eap_data->ap,
1714 WIFI_MANAGER_EAP_AUTH_TYPE_MSCHAPV2);
1718 /* Create the entry items */
1719 _create_and_update_list_items_based_on_rules(eap_type, eap_data);
1721 evas_object_smart_callback_add(view_list, "language,changed",
1722 gl_lang_changed, NULL);
1724 __COMMON_FUNC_EXIT__;
1728 static Eina_Bool _enable_scan_updates_cb(void *data)
1730 /* Lets enable the scan updates */
1731 wlan_manager_enable_scan_result_update();
1733 /* Reset the ecore timer handle */
1734 common_util_manager_ecore_scan_update_timer_reset();
1736 return ECORE_CALLBACK_CANCEL;
1739 static void __common_eap_connect_cleanup(eap_connect_data_t *eap_data)
1741 if (eap_data == NULL)
1744 if (eap_data->conf != NULL) {
1745 evas_object_smart_callback_del(eap_data->conf,
1746 "virtualkeypad,state,on",
1747 _eap_popup_keypad_on_cb);
1748 evas_object_smart_callback_del(eap_data->conf,
1749 "virtualkeypad,state,off",
1750 _eap_popup_keypad_off_cb);
1753 if (eap_data->ssid != NULL) {
1754 g_free(eap_data->ssid);
1755 eap_data->ssid = NULL;
1758 if (eap_data->cert_alias) {
1759 g_free(eap_data->cert_alias);
1760 eap_data->cert_alias = NULL;
1763 if (eap_data->ca_cert_path) {
1764 g_free(eap_data->ca_cert_path);
1765 eap_data->ca_cert_path = NULL;
1768 if (eap_data->user_cert_path) {
1769 g_free(eap_data->user_cert_path);
1770 eap_data->user_cert_path = NULL;
1773 if (eap_data->privatekey_path) {
1774 g_free(eap_data->privatekey_path);
1775 eap_data->privatekey_path = NULL;
1778 wifi_manager_ap_destroy(eap_data->ap);
1779 eap_data->ap = NULL;
1781 if (eap_data->info_popup) {
1782 evas_object_del(eap_data->info_popup);
1783 eap_data->info_popup = NULL;
1786 if (eap_data->popup != NULL) {
1787 evas_object_hide(eap_data->popup);
1788 evas_object_del(eap_data->popup);
1791 if (_eap_view_deref_cb != NULL) {
1792 _eap_view_deref_cb();
1793 _eap_view_deref_cb = NULL;
1796 /* A delay is needed to get the smooth Input panel closing animation effect */
1797 common_util_managed_ecore_scan_update_timer_add(0.1,
1798 _enable_scan_updates_cb, NULL);
1801 static void __common_eap_connect_destroy_cb(void *data, Evas_Object *obj,
1804 __common_eap_connect_cleanup((eap_connect_data_t *)data);
1807 static void _info_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
1809 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
1811 if (eap_data->info_popup != NULL) {
1812 evas_object_del(eap_data->info_popup);
1813 eap_data->info_popup = NULL;
1817 static void __common_eap_connect_done_cb(void *data, Evas_Object *obj,
1820 char *str_id = NULL;
1821 char *str_pw = NULL;
1822 bool favorite = FALSE;
1823 wifi_manager_eap_type_e eap_type;
1824 wifi_manager_eap_auth_type_e eap_auth_type;
1825 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
1826 popup_btn_info_t popup_data;
1828 __COMMON_FUNC_ENTER__;
1829 if (eap_data->eap_done_ok == TRUE) {
1830 __COMMON_FUNC_EXIT__;
1834 eap_data->eap_done_ok = TRUE;
1836 wifi_manager_ap_get_eap_type(eap_data->ap, &eap_type);
1837 wifi_manager_ap_get_eap_auth_type(eap_data->ap, &eap_auth_type);
1839 wifi_manager_ap_is_favorite(eap_data->ap, &favorite);
1840 if (favorite == TRUE) {
1841 wlan_manager_forget(eap_data->ap);
1842 wifi_manager_ap_refresh(eap_data->ap);
1844 wifi_manager_ap_set_eap_type(eap_data->ap, eap_type);
1845 wifi_manager_ap_set_eap_auth_type(eap_data->ap, eap_auth_type);
1848 wifi_manager_ap_set_eap_ca_cert_file(eap_data->ap, "");
1849 wifi_manager_ap_set_eap_client_cert_file(eap_data->ap, "");
1850 wifi_manager_ap_set_eap_private_key_info(eap_data->ap, "", "");
1853 case WIFI_MANAGER_EAP_TYPE_PEAP:
1854 case WIFI_MANAGER_EAP_TYPE_TTLS:
1856 str_id = common_utils_get_list_item_entry_txt(eap_data->eap_id_item);
1857 if (str_id == NULL || str_id[0] == '\0') {
1858 memset(&popup_data, 0, sizeof(popup_data));
1859 popup_data.title_txt = eap_data->ssid;
1860 popup_data.btn1_txt = "IDS_WIFI_SK2_OK";
1861 popup_data.btn1_cb = _info_popup_ok_cb;
1862 popup_data.btn1_data = eap_data;
1863 popup_data.info_txt = "IDS_WIFI_BODY_ENTER_IDENTITY";
1864 eap_data->eap_done_ok = FALSE;
1865 eap_data->info_popup = common_utils_show_info_popup(eap_data->win,
1873 str_pw = common_utils_get_list_item_entry_txt(eap_data->eap_pw_item);
1874 if (str_pw == NULL || str_pw[0] == '\0') {
1875 memset(&popup_data, 0, sizeof(popup_data));
1876 popup_data.title_txt = eap_data->ssid;
1877 popup_data.btn1_txt = "IDS_WIFI_SK2_OK";
1878 popup_data.btn1_cb = _info_popup_ok_cb;
1879 popup_data.btn1_data = eap_data;
1880 popup_data.info_txt = "IDS_WIFI_HEADER_ENTER_PASSWORD";
1881 eap_data->eap_done_ok = FALSE;
1882 eap_data->info_popup = common_utils_show_info_popup(eap_data->win,
1891 wifi_manager_ap_set_eap_type(eap_data->ap, eap_type);
1892 wifi_manager_ap_set_eap_auth_type(eap_data->ap, eap_auth_type);
1893 wifi_manager_ap_set_eap_passphrase(eap_data->ap, str_id, str_pw);
1896 case WIFI_MANAGER_EAP_TYPE_TLS:
1897 str_id = common_utils_get_list_item_entry_txt(eap_data->eap_id_item);
1898 str_pw = common_utils_get_list_item_entry_txt(eap_data->eap_pw_item);
1900 wifi_manager_ap_set_eap_type(eap_data->ap, eap_type);
1901 wifi_manager_ap_set_eap_auth_type(eap_data->ap, eap_auth_type);
1902 wifi_manager_ap_set_eap_passphrase(eap_data->ap, str_id, str_pw);
1903 wifi_manager_ap_set_eap_ca_cert_file(eap_data->ap, eap_data->ca_cert_path);
1904 wifi_manager_ap_set_eap_client_cert_file(eap_data->ap, eap_data->user_cert_path);
1905 wifi_manager_ap_set_eap_private_key_info(eap_data->ap,
1906 eap_data->privatekey_path, NULL);
1909 case WIFI_MANAGER_EAP_TYPE_SIM:
1910 case WIFI_MANAGER_EAP_TYPE_AKA:
1911 case WIFI_MANAGER_EAP_TYPE_AKA_PRIME:
1912 wifi_manager_ap_set_eap_type(eap_data->ap, eap_type);
1914 case WIFI_MANAGER_EAP_TYPE_FAST:
1915 case WIFI_MANAGER_EAP_TYPE_PWD:
1916 str_id = common_utils_get_list_item_entry_txt(eap_data->eap_id_item);
1917 str_pw = common_utils_get_list_item_entry_txt(eap_data->eap_pw_item);
1919 wifi_manager_ap_set_eap_type(eap_data->ap, eap_type);
1920 wifi_manager_ap_set_eap_auth_type(eap_data->ap, eap_auth_type);
1921 wifi_manager_ap_set_eap_passphrase(eap_data->ap, str_id, str_pw);
1925 ERROR_LOG(UG_NAME_NORMAL, "Unknown EAP method %d", eap_type);
1929 if (eap_data->is_hidden) {
1930 wifi_manager_ap_h hidden_ap;
1932 wifi_manager_ap_get_essid(eap_data->ap, &ssid);
1933 wlan_manager_ap_hidden_create(ssid, &hidden_ap);
1937 case WIFI_MANAGER_EAP_TYPE_PEAP:
1938 case WIFI_MANAGER_EAP_TYPE_TTLS:
1939 wifi_manager_ap_set_eap_type(hidden_ap, eap_type);
1940 wifi_manager_ap_set_eap_auth_type(hidden_ap, eap_auth_type);
1941 wifi_manager_ap_set_eap_passphrase(hidden_ap, str_id, str_pw);
1943 case WIFI_MANAGER_EAP_TYPE_TLS:
1944 wifi_manager_ap_set_eap_type(hidden_ap, eap_type);
1945 wifi_manager_ap_set_eap_auth_type(hidden_ap, eap_auth_type);
1946 wifi_manager_ap_set_eap_passphrase(hidden_ap, str_id, str_pw);
1947 wifi_manager_ap_set_eap_ca_cert_file(hidden_ap, eap_data->ca_cert_path);
1948 wifi_manager_ap_set_eap_client_cert_file(hidden_ap, eap_data->user_cert_path);
1949 wifi_manager_ap_set_eap_private_key_info(hidden_ap, eap_data->privatekey_path, NULL);
1951 case WIFI_MANAGER_EAP_TYPE_SIM:
1952 case WIFI_MANAGER_EAP_TYPE_AKA:
1953 case WIFI_MANAGER_EAP_TYPE_AKA_PRIME:
1954 case WIFI_MANAGER_EAP_TYPE_FAST:
1955 case WIFI_MANAGER_EAP_TYPE_PWD:
1958 wlan_manager_connect(hidden_ap);
1960 wlan_manager_connect(eap_data->ap);
1962 __common_eap_connect_cleanup(eap_data);
1967 __COMMON_FUNC_EXIT__;
1970 static gboolean delay_create_context_popup(gpointer data)
1972 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
1974 if (click.btn_click[EAP_CERT_BTN] == TRUE) {
1975 _create_eap_cert_list(eap_data, click.btn_obj[EAP_CERT_BTN]);
1977 click.btn_click[EAP_CERT_BTN] = FALSE;
1978 click.btn_obj[EAP_CERT_BTN] = NULL;
1979 } else if (click.btn_click[EAP_AUTH_BTN] == TRUE) {
1980 _create_eap_auth_list(eap_data, click.btn_obj[EAP_AUTH_BTN]);
1982 click.btn_click[EAP_AUTH_BTN] = FALSE;
1983 click.btn_obj[EAP_AUTH_BTN] = NULL;
1984 } else if (click.btn_click[EAP_TYPE_BTN] == TRUE) {
1985 _create_eap_type_list(eap_data, click.btn_obj[EAP_TYPE_BTN]);
1987 click.btn_click[EAP_TYPE_BTN] = FALSE;
1988 click.btn_obj[EAP_TYPE_BTN] = NULL;
1993 static void _eap_popup_keypad_off_cb(void *data, Evas_Object *obj,
1999 eap_connect_data_t *eap_data = (eap_connect_data_t *)data;
2001 keypad_state = FALSE;
2003 common_util_managed_idle_add(delay_create_context_popup,
2004 (gpointer)eap_data);
2006 INFO_LOG(UG_NAME_NORMAL, "Keypad is down");
2009 static void _eap_popup_keypad_on_cb(void *data, Evas_Object *obj,
2015 keypad_state = TRUE;
2016 INFO_LOG(UG_NAME_NORMAL, "Keypad is up");
2019 eap_connect_data_t *create_eap_view(Evas_Object *layout_main, Evas_Object *win,
2020 Evas_Object *conf, const char *pkg_name,
2021 wifi_device_info_t *device_info, void (*deref_func)(void))
2023 __COMMON_FUNC_ENTER__;
2025 Evas_Object *popup = NULL;
2026 Evas_Object *list = NULL;
2028 if (layout_main == NULL || device_info == NULL || pkg_name == NULL)
2031 eap_connect_data_t *eap_data = g_try_new0(eap_connect_data_t, 1);
2032 if (eap_data == NULL)
2035 eap_data->str_pkg_name = pkg_name;
2036 eap_data->win = win;
2037 eap_data->conf = conf;
2038 eap_data->ssid = g_strdup(device_info->ssid);
2040 if (device_info->is_hidden == true) {
2041 /* Hidden Wi-Fi network */
2044 wifi_manager_ap_get_essid(device_info->ap, &ssid);
2047 g_free(eap_data->ssid);
2052 wlan_manager_ap_hidden_create(ssid, &(eap_data->ap));
2055 eap_data->is_hidden = TRUE;
2057 /* Clone the Wi-Fi AP handle */
2058 wifi_manager_ap_clone(&(eap_data->ap), device_info->ap);
2061 /* Lets disable the scan updates so that the UI is not refreshed unnecessarily */
2062 wlan_manager_disable_scan_result_update();
2064 _eap_view_deref_cb = deref_func;
2065 click.btn_click[EAP_TYPE_BTN] = FALSE;
2066 click.btn_obj[EAP_TYPE_BTN] = NULL;
2067 click.btn_click[EAP_AUTH_BTN] = FALSE;
2068 click.btn_obj[EAP_AUTH_BTN] = NULL;
2069 click.btn_click[EAP_CERT_BTN] = FALSE;
2070 click.btn_obj[EAP_CERT_BTN] = NULL;
2071 keypad_state = FALSE;
2073 popup_btn_info_t popup_btn_data;
2074 memset(&popup_btn_data, 0, sizeof(popup_btn_data));
2076 popup_btn_data.title_txt = device_info->ssid;
2077 popup_btn_data.sub_title_txt = common_utils_get_ap_security_type_info_txt(PACKAGE,
2078 device_info, false);
2079 popup_btn_data.btn1_cb = __common_eap_connect_destroy_cb;
2080 popup_btn_data.btn1_data = eap_data;
2081 popup_btn_data.btn1_txt = "IDS_WIFI_SK_CANCEL";
2082 popup_btn_data.btn2_cb = __common_eap_connect_done_cb;
2083 popup_btn_data.btn2_data = eap_data;
2084 popup_btn_data.btn2_txt = "IDS_WIFI_BODY_CONNECT";
2086 popup = common_utils_show_info_popup(layout_main,
2088 eap_data->popup = popup;
2089 evas_object_show(popup);
2090 elm_object_focus_set(popup, EINA_TRUE);
2092 /* Create an EAP connect view list */
2093 list = _create_list(popup, eap_data);
2094 elm_object_content_set(popup, list);
2096 evas_object_smart_callback_add(eap_data->conf,
2097 "virtualkeypad,state,on", _eap_popup_keypad_on_cb,
2099 evas_object_smart_callback_add(eap_data->conf,
2100 "virtualkeypad,state,off", _eap_popup_keypad_off_cb,
2103 __COMMON_FUNC_EXIT__;
2107 static wifi_manager_eap_type_e __common_eap_connect_popup_get_wlan_eap_type(eap_type_t eap_type)
2109 wifi_manager_eap_type_e wlan_eap_type = WIFI_MANAGER_EAP_TYPE_PEAP;
2111 case EAP_SEC_TYPE_PEAP:
2112 wlan_eap_type = WIFI_MANAGER_EAP_TYPE_PEAP;
2114 case EAP_SEC_TYPE_TLS:
2115 wlan_eap_type = WIFI_MANAGER_EAP_TYPE_TLS;
2117 case EAP_SEC_TYPE_TTLS:
2118 wlan_eap_type = WIFI_MANAGER_EAP_TYPE_TTLS;
2120 case EAP_SEC_TYPE_SIM:
2121 wlan_eap_type = WIFI_MANAGER_EAP_TYPE_SIM;
2123 case EAP_SEC_TYPE_AKA:
2124 wlan_eap_type = WIFI_MANAGER_EAP_TYPE_AKA;
2126 case EAP_SEC_TYPE_AKA_PRIME:
2127 wlan_eap_type = WIFI_MANAGER_EAP_TYPE_AKA_PRIME;
2129 case EAP_SEC_TYPE_FAST:
2130 wlan_eap_type = WIFI_MANAGER_EAP_TYPE_FAST;
2132 case EAP_SEC_TYPE_PWD:
2133 wlan_eap_type = WIFI_MANAGER_EAP_TYPE_PWD;
2136 ERROR_LOG(UG_NAME_NORMAL, "Err! This case should never occur");
2140 return wlan_eap_type;
2143 static wifi_manager_eap_auth_type_e __common_eap_connect_popup_get_wlan_auth_type(eap_auth_t auth_type)
2145 wifi_manager_eap_auth_type_e wlan_auth_type = WIFI_MANAGER_EAP_AUTH_TYPE_NONE;
2146 switch (auth_type) {
2147 case EAP_SEC_AUTH_NONE:
2148 wlan_auth_type = WIFI_MANAGER_EAP_AUTH_TYPE_NONE;
2150 case EAP_SEC_AUTH_PAP:
2151 wlan_auth_type = WIFI_MANAGER_EAP_AUTH_TYPE_PAP;
2153 case EAP_SEC_AUTH_MSCHAP:
2154 wlan_auth_type = WIFI_MANAGER_EAP_AUTH_TYPE_MSCHAP;
2156 case EAP_SEC_AUTH_MSCHAPV2:
2157 wlan_auth_type = WIFI_MANAGER_EAP_AUTH_TYPE_MSCHAPV2;
2159 case EAP_SEC_AUTH_GTC:
2160 wlan_auth_type = WIFI_MANAGER_EAP_AUTH_TYPE_GTC;
2162 case EAP_SEC_AUTH_MD5:
2163 wlan_auth_type = WIFI_MANAGER_EAP_AUTH_TYPE_MD5;
2166 /* This case should never occur */
2167 ERROR_LOG(UG_NAME_NORMAL, "Err!");
2170 return wlan_auth_type;
2173 static eap_type_t __common_eap_connect_popup_get_eap_type(wifi_manager_ap_h ap)
2175 wifi_manager_eap_type_e wlan_eap_type = 0;
2176 int ret = wifi_manager_ap_get_eap_type(ap, &wlan_eap_type);
2177 if (WIFI_MANAGER_ERROR_OPERATION_FAILED == ret)
2178 ret = wifi_manager_ap_set_eap_type(ap, WIFI_MANAGER_EAP_TYPE_PEAP);
2180 if (WIFI_MANAGER_ERROR_NONE != ret) {
2181 ERROR_LOG(UG_NAME_ERR, "Unable to get the eap type. err = %d", ret);
2182 return EAP_SEC_TYPE_UNKNOWN;
2185 switch (wlan_eap_type) {
2186 case WIFI_MANAGER_EAP_TYPE_PEAP: /**< EAP PEAP type */
2187 return EAP_SEC_TYPE_PEAP;
2189 case WIFI_MANAGER_EAP_TYPE_TLS: /**< EAP TLS type */
2190 return EAP_SEC_TYPE_TLS;
2192 case WIFI_MANAGER_EAP_TYPE_TTLS: /**< EAP TTLS type */
2193 return EAP_SEC_TYPE_TTLS;
2195 case WIFI_MANAGER_EAP_TYPE_SIM: /**< EAP SIM type */
2196 return EAP_SEC_TYPE_SIM;
2198 case WIFI_MANAGER_EAP_TYPE_AKA: /**< EAP AKA type */
2199 return EAP_SEC_TYPE_AKA;
2201 case WIFI_MANAGER_EAP_TYPE_AKA_PRIME: /**< EAP AKA PRIME type */
2202 return EAP_SEC_TYPE_AKA_PRIME;
2204 case WIFI_MANAGER_EAP_TYPE_FAST: /**< EAP FAST type */
2205 return EAP_SEC_TYPE_FAST;
2207 case WIFI_MANAGER_EAP_TYPE_PWD: /**< EAP PWD type */
2208 return EAP_SEC_TYPE_PWD;
2211 return EAP_SEC_TYPE_PEAP;
2213 return EAP_SEC_TYPE_PEAP;
2216 static eap_auth_t __common_eap_connect_popup_get_auth_type(wifi_manager_ap_h ap)
2218 wifi_manager_eap_auth_type_e wlan_auth_type = 0;
2219 int ret = wifi_manager_ap_get_eap_auth_type(ap, &wlan_auth_type);
2220 if (WIFI_MANAGER_ERROR_OPERATION_FAILED == ret)
2221 ret = wifi_manager_ap_set_eap_auth_type(ap, EAP_SEC_AUTH_NONE);
2223 if (WIFI_MANAGER_ERROR_NONE != ret) {
2224 ERROR_LOG(UG_NAME_ERR, "Unable to get the eap auth type. err = %d", ret);
2225 return EAP_SEC_AUTH_NONE;
2228 switch (wlan_auth_type) {
2229 case WIFI_MANAGER_EAP_AUTH_TYPE_NONE: /**< EAP phase2 authentication none */
2230 return EAP_SEC_AUTH_NONE;
2232 case WIFI_MANAGER_EAP_AUTH_TYPE_PAP: /**< EAP phase2 authentication PAP */
2233 return EAP_SEC_AUTH_PAP;
2235 case WIFI_MANAGER_EAP_AUTH_TYPE_MSCHAP: /**< EAP phase2 authentication MSCHAP */
2236 return EAP_SEC_AUTH_MSCHAP;
2238 case WIFI_MANAGER_EAP_AUTH_TYPE_MSCHAPV2: /**< EAP phase2 authentication MSCHAPv2 */
2239 return EAP_SEC_AUTH_MSCHAPV2;
2241 case WIFI_MANAGER_EAP_AUTH_TYPE_GTC: /**< EAP phase2 authentication GTC */
2242 return EAP_SEC_AUTH_GTC;
2244 case WIFI_MANAGER_EAP_AUTH_TYPE_MD5: /**< EAP phase2 authentication MD5 */
2245 return EAP_SEC_AUTH_MD5;
2248 return EAP_SEC_AUTH_NONE;
2250 return EAP_SEC_AUTH_NONE;
2253 static char *_eap_info_get_user_cert_alias(wifi_manager_ap_h ap)
2257 char *filename = NULL;
2258 char *cert_name = NULL;
2260 int filename_len = 0;
2262 wifi_manager_ap_get_eap_client_cert_file(ap, &path);
2266 filename = strrchr(path, '/');
2267 if (filename == NULL) {
2268 ERROR_LOG(UG_NAME_ERR, "Invalid file name");
2273 cert_name = strstr(filename, EAP_TLS_USER_CERT_PATH);
2274 if (cert_name == NULL) {
2275 /* For truncated path, available filename will be followed
2276 * with ellipsis(...) & excluding any remaining part of
2277 * "_user_cert.pem" - 14 chars (-14+3+1=10)*/
2278 filename_len = strlen(filename);
2279 alias = g_try_malloc0(filename_len - 10);
2280 if (alias == NULL) {
2281 ERROR_LOG(UG_NAME_ERR, "malloc fail");
2284 g_strlcpy(alias, filename, filename_len - 13);
2285 g_strlcat(alias, "...", filename_len - 10);
2286 INFO_LOG(UG_NAME_NORMAL, "Truncated alias [%s]", alias);
2291 alias_len = cert_name - filename;
2293 alias = g_try_malloc0(alias_len + 1);
2294 if (alias == NULL) {
2295 ERROR_LOG(UG_NAME_ERR, "malloc fail");
2299 g_strlcpy(alias, filename, alias_len + 1);
2300 INFO_LOG(UG_NAME_NORMAL, "Alias [%s] length [%d]", alias, alias_len);
2308 /* This creates Auth type, ID, Anonymous Id and Password items
2309 * This function should be called after creating the EAP type item
2311 eap_info_list_t *eap_info_append_items(wifi_manager_ap_h ap, Evas_Object* view_list,
2312 const char *str_pkg_name, imf_ctxt_panel_cb_t input_panel_cb,
2313 void *input_panel_cb_data)
2315 __COMMON_FUNC_ENTER__;
2317 eap_type_t eap_type;
2318 eap_auth_t auth_type;
2319 char *temp_str = NULL;
2320 Eina_Bool append_continue = TRUE;
2321 eap_info_list_t *eap_info_list_data = NULL;
2322 Elm_Object_Item* item = NULL;
2323 if (!view_list || !str_pkg_name || !ap) {
2324 ERROR_LOG(UG_NAME_ERR, "Invalid params passed!");
2328 eap_info_list_data = g_try_new0(eap_info_list_t, 1);
2329 if (eap_info_list_data == NULL)
2332 eap_info_list_data->ap = ap;
2333 eap_type = __common_eap_connect_popup_get_eap_type(ap);
2334 auth_type = __common_eap_connect_popup_get_auth_type(ap);
2336 item = common_utils_add_2_line_txt_disabled_item(view_list,
2337 WIFI_GENLIST_2LINE_TOP_TEXT_STYLE,
2338 sc(str_pkg_name, I18N_TYPE_EAP_method),
2339 list_eap_type[eap_type].name);
2340 eap_info_list_data->eap_method_item = item;
2342 eap_info_list_data->eap_type = eap_type;
2345 case EAP_SEC_TYPE_UNKNOWN:
2346 case EAP_SEC_TYPE_PEAP:
2347 case EAP_SEC_TYPE_TLS:
2348 case EAP_SEC_TYPE_TTLS:
2349 case EAP_SEC_TYPE_SIM:
2350 case EAP_SEC_TYPE_AKA:
2351 case EAP_SEC_TYPE_AKA_PRIME:
2352 case EAP_SEC_TYPE_FAST:
2353 case EAP_SEC_TYPE_PWD:
2356 append_continue = FALSE;
2360 if (append_continue) {
2361 if (eap_type == EAP_SEC_TYPE_PEAP ||
2362 eap_type == EAP_SEC_TYPE_TTLS) {
2363 /* Add EAP phase2 authentication */
2364 item = common_utils_add_2_line_txt_disabled_item(view_list,
2365 WIFI_GENLIST_2LINE_TOP_TEXT_STYLE,
2366 sc(str_pkg_name, I18N_TYPE_Phase_2_authentication),
2367 list_eap_auth[auth_type].name);
2368 eap_info_list_data->eap_auth_item = item;
2371 if (eap_type == EAP_SEC_TYPE_TLS) {
2372 /* Add User certificate */
2373 temp_str = _eap_info_get_user_cert_alias(ap);
2375 if (temp_str == NULL || strlen(temp_str) == 0) {
2376 if (temp_str != NULL)
2379 temp_str = g_strdup(sc(str_pkg_name,
2380 I18N_TYPE_Unspecified));
2383 item = common_utils_add_2_line_txt_disabled_item(view_list,
2384 WIFI_GENLIST_2LINE_TOP_TEXT_STYLE,
2385 sc(str_pkg_name, I18N_TYPE_User_Certificate),
2387 eap_info_list_data->user_cert_item = item;
2394 if (wifi_manager_ap_get_eap_passphrase(ap, &temp_str, &is_paswd_set) != WIFI_MANAGER_ERROR_NONE) {
2395 ERROR_LOG(UG_NAME_ERR, "Faile to get EAP passphrase!");
2396 g_free(eap_info_list_data);
2399 item = common_utils_add_2_line_txt_disabled_item(view_list,
2400 WIFI_GENLIST_2LINE_TOP_TEXT_STYLE,
2401 sc(str_pkg_name, I18N_TYPE_Identity),
2403 eap_info_list_data->id_item = item;
2407 common_utils_entry_info_t *edit_box_details;
2409 /* Add EAP Password */
2410 g_eap_entry_itc.item_style = "entry.main";
2411 g_eap_entry_itc.func.text_get = _gl_eap_entry_item_text_get;
2412 g_eap_entry_itc.func.content_get = _gl_eap_entry_item_content_get;
2413 g_eap_entry_itc.func.state_get = NULL;
2414 g_eap_entry_itc.func.del = _gl_eap_entry_item_del;
2416 edit_box_details = g_try_new0(common_utils_entry_info_t, 1);
2417 if (edit_box_details == NULL) {
2418 g_free(eap_info_list_data);
2422 edit_box_details->entry_id = ENTRY_TYPE_PASSWORD;
2423 edit_box_details->title_txt = sc(str_pkg_name, I18N_TYPE_Password);
2424 edit_box_details->entry_txt = NULL;
2425 edit_box_details->guide_txt = sc(str_pkg_name, I18N_TYPE_Enter_password);
2426 edit_box_details->input_panel_cb = input_panel_cb;
2427 edit_box_details->input_panel_cb_data = input_panel_cb_data;
2428 edit_box_details->item = elm_genlist_item_append(view_list,
2429 &g_eap_entry_itc, edit_box_details, NULL,
2430 ELM_GENLIST_ITEM_NONE, _gl_editbox_sel_cb, NULL);
2431 elm_genlist_item_select_mode_set(edit_box_details->item,
2432 ELM_OBJECT_SELECT_MODE_NONE);
2433 eap_info_list_data->pswd_item = edit_box_details->item;
2437 __COMMON_FUNC_EXIT__;
2438 return eap_info_list_data;
2442 void eap_info_save_data(eap_info_list_t *eap_info_list_data)
2444 if (!eap_info_list_data) {
2445 ERROR_LOG(UG_NAME_ERR, "Invalid params passed!");
2448 char *txt = common_utils_get_list_item_entry_txt(eap_info_list_data->pswd_item);
2450 wifi_manager_ap_set_eap_passphrase(eap_info_list_data->ap, NULL, txt);
2456 void eap_info_remove(eap_info_list_t *eap_info_list_data)
2458 if (!eap_info_list_data) {
2459 ERROR_LOG(UG_NAME_ERR, "Invalid params passed!");
2463 g_free(eap_info_list_data);
2466 void eap_connect_data_free(eap_connect_data_t *eap_data)
2468 __common_eap_connect_cleanup(eap_data);