1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/options/wifi_config_view.h"
7 #include "ash/system/chromeos/network/network_connect.h"
9 #include "base/strings/string_util.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/chromeos/enrollment_dialog_view.h"
13 #include "chrome/browser/chromeos/net/onc_utils.h"
14 #include "chrome/browser/chromeos/options/passphrase_textfield.h"
15 #include "chrome/browser/profiles/profile_manager.h"
16 #include "chromeos/login/login_state.h"
17 #include "chromeos/network/favorite_state.h"
18 #include "chromeos/network/network_configuration_handler.h"
19 #include "chromeos/network/network_event_log.h"
20 #include "chromeos/network/network_handler.h"
21 #include "chromeos/network/network_state.h"
22 #include "chromeos/network/network_state_handler.h"
23 #include "chromeos/network/network_ui_data.h"
24 #include "chromeos/network/shill_property_util.h"
25 #include "chromeos/tpm_token_loader.h"
26 #include "components/onc/onc_constants.h"
27 #include "grit/chromium_strings.h"
28 #include "grit/generated_resources.h"
29 #include "grit/locale_settings.h"
30 #include "grit/theme_resources.h"
31 #include "third_party/cros_system_api/dbus/service_constants.h"
32 #include "ui/base/l10n/l10n_util.h"
33 #include "ui/base/resource/resource_bundle.h"
34 #include "ui/events/event.h"
35 #include "ui/views/controls/button/checkbox.h"
36 #include "ui/views/controls/button/image_button.h"
37 #include "ui/views/controls/combobox/combobox.h"
38 #include "ui/views/controls/label.h"
39 #include "ui/views/controls/textfield/textfield.h"
40 #include "ui/views/layout/grid_layout.h"
41 #include "ui/views/layout/layout_constants.h"
42 #include "ui/views/widget/widget.h"
43 #include "ui/views/window/dialog_client_view.h"
49 // Combobox that supports a preferred width. Used by Server CA combobox
50 // because the strings inside it are too wide.
51 class ComboboxWithWidth
: public views::Combobox
{
53 ComboboxWithWidth(ui::ComboboxModel
* model
, int width
)
57 virtual ~ComboboxWithWidth() {}
58 virtual gfx::Size
GetPreferredSize() OVERRIDE
{
59 gfx::Size size
= Combobox::GetPreferredSize();
60 size
.set_width(width_
);
65 DISALLOW_COPY_AND_ASSIGN(ComboboxWithWidth
);
68 enum SecurityComboboxIndex
{
69 SECURITY_INDEX_NONE
= 0,
70 SECURITY_INDEX_WEP
= 1,
71 SECURITY_INDEX_PSK
= 2,
72 SECURITY_INDEX_COUNT
= 3
75 // Methods in alphabetical order.
76 enum EAPMethodComboboxIndex
{
77 EAP_METHOD_INDEX_NONE
= 0,
78 EAP_METHOD_INDEX_LEAP
= 1,
79 EAP_METHOD_INDEX_PEAP
= 2,
80 EAP_METHOD_INDEX_TLS
= 3,
81 EAP_METHOD_INDEX_TTLS
= 4,
82 EAP_METHOD_INDEX_COUNT
= 5
85 enum Phase2AuthComboboxIndex
{
86 PHASE_2_AUTH_INDEX_AUTO
= 0, // LEAP, EAP-TLS have only this auth.
87 PHASE_2_AUTH_INDEX_MD5
= 1,
88 PHASE_2_AUTH_INDEX_MSCHAPV2
= 2, // PEAP has up to this auth.
89 PHASE_2_AUTH_INDEX_MSCHAP
= 3,
90 PHASE_2_AUTH_INDEX_PAP
= 4,
91 PHASE_2_AUTH_INDEX_CHAP
= 5, // EAP-TTLS has up to this auth.
92 PHASE_2_AUTH_INDEX_COUNT
= 6
95 void ShillError(const std::string
& function
,
96 const std::string
& error_name
,
97 scoped_ptr
<base::DictionaryValue
> error_data
) {
98 NET_LOG_ERROR("Shill Error from WifiConfigView: " + error_name
, function
);
105 class SecurityComboboxModel
: public ui::ComboboxModel
{
107 SecurityComboboxModel();
108 virtual ~SecurityComboboxModel();
110 // Overridden from ui::ComboboxModel:
111 virtual int GetItemCount() const OVERRIDE
;
112 virtual base::string16
GetItemAt(int index
) OVERRIDE
;
115 DISALLOW_COPY_AND_ASSIGN(SecurityComboboxModel
);
118 class EAPMethodComboboxModel
: public ui::ComboboxModel
{
120 EAPMethodComboboxModel();
121 virtual ~EAPMethodComboboxModel();
123 // Overridden from ui::ComboboxModel:
124 virtual int GetItemCount() const OVERRIDE
;
125 virtual base::string16
GetItemAt(int index
) OVERRIDE
;
128 DISALLOW_COPY_AND_ASSIGN(EAPMethodComboboxModel
);
131 class Phase2AuthComboboxModel
: public ui::ComboboxModel
{
133 explicit Phase2AuthComboboxModel(views::Combobox
* eap_method_combobox
);
134 virtual ~Phase2AuthComboboxModel();
136 // Overridden from ui::ComboboxModel:
137 virtual int GetItemCount() const OVERRIDE
;
138 virtual base::string16
GetItemAt(int index
) OVERRIDE
;
141 views::Combobox
* eap_method_combobox_
;
143 DISALLOW_COPY_AND_ASSIGN(Phase2AuthComboboxModel
);
146 class ServerCACertComboboxModel
: public ui::ComboboxModel
{
148 ServerCACertComboboxModel();
149 virtual ~ServerCACertComboboxModel();
151 // Overridden from ui::ComboboxModel:
152 virtual int GetItemCount() const OVERRIDE
;
153 virtual base::string16
GetItemAt(int index
) OVERRIDE
;
156 DISALLOW_COPY_AND_ASSIGN(ServerCACertComboboxModel
);
159 class UserCertComboboxModel
: public ui::ComboboxModel
{
161 explicit UserCertComboboxModel(WifiConfigView
* owner
);
162 virtual ~UserCertComboboxModel();
164 // Overridden from ui::ComboboxModel:
165 virtual int GetItemCount() const OVERRIDE
;
166 virtual base::string16
GetItemAt(int index
) OVERRIDE
;
169 WifiConfigView
* owner_
;
171 DISALLOW_COPY_AND_ASSIGN(UserCertComboboxModel
);
174 // SecurityComboboxModel -------------------------------------------------------
176 SecurityComboboxModel::SecurityComboboxModel() {
179 SecurityComboboxModel::~SecurityComboboxModel() {
182 int SecurityComboboxModel::GetItemCount() const {
183 return SECURITY_INDEX_COUNT
;
185 base::string16
SecurityComboboxModel::GetItemAt(int index
) {
186 if (index
== SECURITY_INDEX_NONE
)
187 return l10n_util::GetStringUTF16(
188 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_NONE
);
189 else if (index
== SECURITY_INDEX_WEP
)
190 return l10n_util::GetStringUTF16(
191 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_WEP
);
192 else if (index
== SECURITY_INDEX_PSK
)
193 return l10n_util::GetStringUTF16(
194 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_PSK
);
196 return base::string16();
199 // EAPMethodComboboxModel ------------------------------------------------------
201 EAPMethodComboboxModel::EAPMethodComboboxModel() {
204 EAPMethodComboboxModel::~EAPMethodComboboxModel() {
207 int EAPMethodComboboxModel::GetItemCount() const {
208 return EAP_METHOD_INDEX_COUNT
;
210 base::string16
EAPMethodComboboxModel::GetItemAt(int index
) {
211 if (index
== EAP_METHOD_INDEX_NONE
)
212 return l10n_util::GetStringUTF16(
213 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_NONE
);
214 else if (index
== EAP_METHOD_INDEX_LEAP
)
215 return l10n_util::GetStringUTF16(
216 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_LEAP
);
217 else if (index
== EAP_METHOD_INDEX_PEAP
)
218 return l10n_util::GetStringUTF16(
219 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_PEAP
);
220 else if (index
== EAP_METHOD_INDEX_TLS
)
221 return l10n_util::GetStringUTF16(
222 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_TLS
);
223 else if (index
== EAP_METHOD_INDEX_TTLS
)
224 return l10n_util::GetStringUTF16(
225 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_TTLS
);
227 return base::string16();
230 // Phase2AuthComboboxModel -----------------------------------------------------
232 Phase2AuthComboboxModel::Phase2AuthComboboxModel(
233 views::Combobox
* eap_method_combobox
)
234 : eap_method_combobox_(eap_method_combobox
) {
237 Phase2AuthComboboxModel::~Phase2AuthComboboxModel() {
240 int Phase2AuthComboboxModel::GetItemCount() const {
241 switch (eap_method_combobox_
->selected_index()) {
242 case EAP_METHOD_INDEX_NONE
:
243 case EAP_METHOD_INDEX_TLS
:
244 case EAP_METHOD_INDEX_LEAP
:
245 return PHASE_2_AUTH_INDEX_AUTO
+ 1;
246 case EAP_METHOD_INDEX_PEAP
:
247 return PHASE_2_AUTH_INDEX_MSCHAPV2
+ 1;
248 case EAP_METHOD_INDEX_TTLS
:
249 return PHASE_2_AUTH_INDEX_CHAP
+ 1;
255 base::string16
Phase2AuthComboboxModel::GetItemAt(int index
) {
256 if (index
== PHASE_2_AUTH_INDEX_AUTO
)
257 return l10n_util::GetStringUTF16(
258 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_AUTO
);
259 else if (index
== PHASE_2_AUTH_INDEX_MD5
)
260 return l10n_util::GetStringUTF16(
261 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MD5
);
262 else if (index
== PHASE_2_AUTH_INDEX_MSCHAPV2
)
263 return l10n_util::GetStringUTF16(
264 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MSCHAPV2
);
265 else if (index
== PHASE_2_AUTH_INDEX_MSCHAP
)
266 return l10n_util::GetStringUTF16(
267 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MSCHAP
);
268 else if (index
== PHASE_2_AUTH_INDEX_PAP
)
269 return l10n_util::GetStringUTF16(
270 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_PAP
);
271 else if (index
== PHASE_2_AUTH_INDEX_CHAP
)
272 return l10n_util::GetStringUTF16(
273 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_CHAP
);
275 return base::string16();
278 // ServerCACertComboboxModel ---------------------------------------------------
280 ServerCACertComboboxModel::ServerCACertComboboxModel() {
283 ServerCACertComboboxModel::~ServerCACertComboboxModel() {
286 int ServerCACertComboboxModel::GetItemCount() const {
287 if (CertLibrary::Get()->CertificatesLoading())
288 return 1; // "Loading"
289 // First "Default", then the certs, then "Do not check".
290 return CertLibrary::Get()->NumCertificates(
291 CertLibrary::CERT_TYPE_SERVER_CA
) + 2;
294 base::string16
ServerCACertComboboxModel::GetItemAt(int index
) {
295 if (CertLibrary::Get()->CertificatesLoading())
296 return l10n_util::GetStringUTF16(
297 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_LOADING
);
299 return l10n_util::GetStringUTF16(
300 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA_DEFAULT
);
301 if (index
== GetItemCount() - 1)
302 return l10n_util::GetStringUTF16(
303 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA_DO_NOT_CHECK
);
304 int cert_index
= index
- 1;
305 return CertLibrary::Get()->GetCertDisplayStringAt(
306 CertLibrary::CERT_TYPE_SERVER_CA
, cert_index
);
309 // UserCertComboboxModel -------------------------------------------------------
311 UserCertComboboxModel::UserCertComboboxModel(WifiConfigView
* owner
)
315 UserCertComboboxModel::~UserCertComboboxModel() {
318 int UserCertComboboxModel::GetItemCount() const {
319 if (!owner_
->UserCertActive())
320 return 1; // "None installed" (combobox must have at least 1 entry)
321 if (CertLibrary::Get()->CertificatesLoading())
322 return 1; // "Loading"
324 CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER
);
326 return 1; // "None installed"
330 base::string16
UserCertComboboxModel::GetItemAt(int index
) {
331 if (!owner_
->UserCertActive())
332 return l10n_util::GetStringUTF16(
333 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_USER_CERT_NONE_INSTALLED
);
334 if (CertLibrary::Get()->CertificatesLoading())
335 return l10n_util::GetStringUTF16(
336 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_LOADING
);
337 if (CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER
) == 0)
338 return l10n_util::GetStringUTF16(
339 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_USER_CERT_NONE_INSTALLED
);
340 return CertLibrary::Get()->GetCertDisplayStringAt(
341 CertLibrary::CERT_TYPE_USER
, index
);
344 } // namespace internal
346 WifiConfigView::WifiConfigView(NetworkConfigView
* parent
,
347 const std::string
& service_path
,
349 : ChildNetworkConfigView(parent
, service_path
),
350 ssid_textfield_(NULL
),
351 eap_method_combobox_(NULL
),
352 phase_2_auth_label_(NULL
),
353 phase_2_auth_combobox_(NULL
),
354 user_cert_label_(NULL
),
355 user_cert_combobox_(NULL
),
356 server_ca_cert_label_(NULL
),
357 server_ca_cert_combobox_(NULL
),
358 subject_match_label_(NULL
),
359 subject_match_textfield_(NULL
),
360 identity_label_(NULL
),
361 identity_textfield_(NULL
),
362 identity_anonymous_label_(NULL
),
363 identity_anonymous_textfield_(NULL
),
364 save_credentials_checkbox_(NULL
),
365 share_network_checkbox_(NULL
),
366 shared_network_label_(NULL
),
367 security_combobox_(NULL
),
368 passphrase_label_(NULL
),
369 passphrase_textfield_(NULL
),
370 passphrase_visible_button_(NULL
),
372 weak_ptr_factory_(this) {
374 NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE
);
377 WifiConfigView::~WifiConfigView() {
378 RemoveAllChildViews(true); // Destroy children before models
379 if (NetworkHandler::IsInitialized()) {
380 NetworkHandler::Get()->network_state_handler()->RemoveObserver(
383 CertLibrary::Get()->RemoveObserver(this);
386 base::string16
WifiConfigView::GetTitle() const {
387 const NetworkState
* network
= GetNetworkState();
388 if (network
&& network
->type() == shill::kTypeEthernet
)
389 return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_CONFIGURE_ETHERNET
);
390 return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_JOIN_WIFI_NETWORKS
);
393 views::View
* WifiConfigView::GetInitiallyFocusedView() {
394 // Return a reasonable widget for initial focus,
395 // depending on what we're showing.
397 return ssid_textfield_
;
398 else if (eap_method_combobox_
)
399 return eap_method_combobox_
;
400 else if (passphrase_textfield_
&& passphrase_textfield_
->enabled())
401 return passphrase_textfield_
;
406 bool WifiConfigView::CanLogin() {
407 static const size_t kMinWirelessPasswordLen
= 5;
409 // We either have an existing network or the user entered an SSID.
410 if (service_path_
.empty() && GetSsid().empty())
413 // If the network requires a passphrase, make sure it is the right length.
414 if (passphrase_textfield_
!= NULL
&&
415 passphrase_textfield_
->enabled() &&
416 !passphrase_textfield_
->show_fake() &&
417 passphrase_textfield_
->text().length() < kMinWirelessPasswordLen
)
420 // If we're using EAP, we must have a method.
421 if (eap_method_combobox_
&&
422 eap_method_combobox_
->selected_index() == EAP_METHOD_INDEX_NONE
)
425 // Block login if certs are required but user has none.
426 if (UserCertRequired() && (!HaveUserCerts() || !IsUserCertValid()))
432 bool WifiConfigView::UserCertRequired() const {
433 return UserCertActive();
436 bool WifiConfigView::HaveUserCerts() const {
437 return CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER
) > 0;
440 bool WifiConfigView::IsUserCertValid() const {
441 if (!UserCertActive())
443 int index
= user_cert_combobox_
->selected_index();
446 // Currently only hardware-backed user certificates are valid.
447 if (CertLibrary::Get()->IsHardwareBacked() &&
448 !CertLibrary::Get()->IsCertHardwareBackedAt(
449 CertLibrary::CERT_TYPE_USER
, index
))
454 bool WifiConfigView::Phase2AuthActive() const {
455 if (phase_2_auth_combobox_
)
456 return phase_2_auth_combobox_
->model()->GetItemCount() > 1;
460 bool WifiConfigView::PassphraseActive() const {
461 if (eap_method_combobox_
) {
462 // No password for EAP-TLS.
463 int index
= eap_method_combobox_
->selected_index();
464 return index
!= EAP_METHOD_INDEX_NONE
&& index
!= EAP_METHOD_INDEX_TLS
;
465 } else if (security_combobox_
) {
466 return security_combobox_
->selected_index() != SECURITY_INDEX_NONE
;
471 bool WifiConfigView::UserCertActive() const {
472 // User certs only for EAP-TLS.
473 if (eap_method_combobox_
)
474 return eap_method_combobox_
->selected_index() == EAP_METHOD_INDEX_TLS
;
479 bool WifiConfigView::CaCertActive() const {
480 // No server CA certs for LEAP.
481 if (eap_method_combobox_
) {
482 int index
= eap_method_combobox_
->selected_index();
483 return index
!= EAP_METHOD_INDEX_NONE
&& index
!= EAP_METHOD_INDEX_LEAP
;
488 void WifiConfigView::UpdateDialogButtons() {
489 parent_
->GetDialogClientView()->UpdateDialogButtons();
492 void WifiConfigView::RefreshEapFields() {
493 // If EAP method changes, the phase 2 auth choices may have changed also.
494 phase_2_auth_combobox_
->ModelChanged();
495 phase_2_auth_combobox_
->SetSelectedIndex(0);
496 bool phase_2_auth_enabled
= Phase2AuthActive();
497 phase_2_auth_combobox_
->SetEnabled(phase_2_auth_enabled
&&
498 phase_2_auth_ui_data_
.IsEditable());
499 phase_2_auth_label_
->SetEnabled(phase_2_auth_enabled
);
502 bool passphrase_enabled
= PassphraseActive();
503 passphrase_textfield_
->SetEnabled(passphrase_enabled
&&
504 passphrase_ui_data_
.IsEditable());
505 passphrase_label_
->SetEnabled(passphrase_enabled
);
506 if (!passphrase_enabled
)
507 passphrase_textfield_
->SetText(base::string16());
510 bool certs_loading
= CertLibrary::Get()->CertificatesLoading();
511 bool user_cert_enabled
= UserCertActive();
512 user_cert_label_
->SetEnabled(user_cert_enabled
);
513 bool have_user_certs
= !certs_loading
&& HaveUserCerts();
514 user_cert_combobox_
->SetEnabled(user_cert_enabled
&&
516 user_cert_ui_data_
.IsEditable());
517 user_cert_combobox_
->ModelChanged();
518 user_cert_combobox_
->SetSelectedIndex(0);
521 bool ca_cert_enabled
= CaCertActive();
522 server_ca_cert_label_
->SetEnabled(ca_cert_enabled
);
523 server_ca_cert_combobox_
->SetEnabled(ca_cert_enabled
&&
525 server_ca_cert_ui_data_
.IsEditable());
526 server_ca_cert_combobox_
->ModelChanged();
527 server_ca_cert_combobox_
->SetSelectedIndex(0);
530 bool subject_match_enabled
=
531 ca_cert_enabled
&& eap_method_combobox_
&&
532 eap_method_combobox_
->selected_index() == EAP_METHOD_INDEX_TLS
;
533 subject_match_label_
->SetEnabled(subject_match_enabled
);
534 subject_match_textfield_
->SetEnabled(subject_match_enabled
);
535 if (!subject_match_enabled
)
536 subject_match_textfield_
->SetText(base::string16());
538 // No anonymous identity if no phase 2 auth.
539 bool identity_anonymous_enabled
= phase_2_auth_enabled
;
540 identity_anonymous_textfield_
->SetEnabled(
541 identity_anonymous_enabled
&& identity_anonymous_ui_data_
.IsEditable());
542 identity_anonymous_label_
->SetEnabled(identity_anonymous_enabled
);
543 if (!identity_anonymous_enabled
)
544 identity_anonymous_textfield_
->SetText(base::string16());
546 RefreshShareCheckbox();
549 void WifiConfigView::RefreshShareCheckbox() {
550 if (!share_network_checkbox_
)
553 if (security_combobox_
&&
554 security_combobox_
->selected_index() == SECURITY_INDEX_NONE
) {
555 share_network_checkbox_
->SetEnabled(false);
556 share_network_checkbox_
->SetChecked(true);
557 } else if (eap_method_combobox_
&&
558 (eap_method_combobox_
->selected_index() == EAP_METHOD_INDEX_TLS
||
559 user_cert_combobox_
->selected_index() != 0)) {
560 // Can not share TLS network (requires certificate), or any network where
561 // user certificates are enabled.
562 share_network_checkbox_
->SetEnabled(false);
563 share_network_checkbox_
->SetChecked(false);
566 bool enabled
= false;
567 ChildNetworkConfigView::GetShareStateForLoginState(&value
, &enabled
);
569 share_network_checkbox_
->SetChecked(value
);
570 share_network_checkbox_
->SetEnabled(enabled
);
574 void WifiConfigView::UpdateErrorLabel() {
575 base::string16 error_msg
;
576 if (UserCertRequired() && CertLibrary::Get()->CertificatesLoaded()) {
577 if (!HaveUserCerts()) {
578 if (!LoginState::Get()->IsUserLoggedIn() ||
579 LoginState::Get()->IsGuestUser()) {
580 error_msg
= l10n_util::GetStringUTF16(
581 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_LOGIN_FOR_USER_CERT
);
583 error_msg
= l10n_util::GetStringUTF16(
584 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PLEASE_INSTALL_USER_CERT
);
586 } else if (!IsUserCertValid()) {
587 error_msg
= l10n_util::GetStringUTF16(
588 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_REQUIRE_HARDWARE_BACKED
);
591 if (error_msg
.empty() && !service_path_
.empty()) {
592 const NetworkState
* network
= GetNetworkState();
593 if (network
&& network
->connection_state() == shill::kStateFailure
) {
594 error_msg
= ash::network_connect::ErrorString(
595 network
->last_error(), network
->path());
598 if (!error_msg
.empty()) {
599 error_label_
->SetText(error_msg
);
600 error_label_
->SetVisible(true);
602 error_label_
->SetVisible(false);
606 void WifiConfigView::ContentsChanged(views::Textfield
* sender
,
607 const base::string16
& new_contents
) {
608 UpdateDialogButtons();
611 bool WifiConfigView::HandleKeyEvent(views::Textfield
* sender
,
612 const ui::KeyEvent
& key_event
) {
613 if (sender
== passphrase_textfield_
&&
614 key_event
.key_code() == ui::VKEY_RETURN
) {
615 parent_
->GetDialogClientView()->AcceptWindow();
620 void WifiConfigView::ButtonPressed(views::Button
* sender
,
621 const ui::Event
& event
) {
622 if (sender
== passphrase_visible_button_
&& passphrase_textfield_
) {
623 if (passphrase_textfield_
->GetTextInputType() == ui::TEXT_INPUT_TYPE_TEXT
) {
624 passphrase_textfield_
->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD
);
625 passphrase_visible_button_
->SetToggled(false);
627 passphrase_textfield_
->SetTextInputType(ui::TEXT_INPUT_TYPE_TEXT
);
628 passphrase_visible_button_
->SetToggled(true);
635 void WifiConfigView::OnPerformAction(views::Combobox
* combobox
) {
636 if (combobox
== security_combobox_
) {
637 bool passphrase_enabled
= PassphraseActive();
638 passphrase_label_
->SetEnabled(passphrase_enabled
);
639 passphrase_textfield_
->SetEnabled(passphrase_enabled
&&
640 passphrase_ui_data_
.IsEditable());
641 if (!passphrase_enabled
)
642 passphrase_textfield_
->SetText(base::string16());
643 RefreshShareCheckbox();
644 } else if (combobox
== user_cert_combobox_
) {
645 RefreshShareCheckbox();
646 } else if (combobox
== eap_method_combobox_
) {
649 UpdateDialogButtons();
653 void WifiConfigView::OnCertificatesLoaded(bool initial_load
) {
655 UpdateDialogButtons();
659 bool WifiConfigView::Login() {
660 const NetworkState
* network
= GetNetworkState();
662 // Set configuration properties.
663 base::DictionaryValue properties
;
665 // Default shared state for non-private networks is true.
666 const bool share_default
= !network
|| !network
->IsPrivate();
667 bool share_network
= GetShareNetwork(share_default
);
668 bool only_policy_autoconnect
=
669 onc::PolicyAllowsOnlyPolicyNetworksToAutoconnect(!share_network
);
670 if (only_policy_autoconnect
) {
671 properties
.SetBooleanWithoutPathExpansion(shill::kAutoConnectProperty
,
675 if (service_path_
.empty()) {
676 // TODO(stevenjb): Support modifying existing EAP configurations.
677 // Will probably wait to do this in WebUI instead.
678 properties
.SetStringWithoutPathExpansion(
679 shill::kTypeProperty
, shill::kTypeWifi
);
680 shill_property_util::SetSSID(GetSsid(), &properties
);
681 properties
.SetStringWithoutPathExpansion(
682 shill::kModeProperty
, shill::kModeManaged
);
683 properties
.SetBooleanWithoutPathExpansion(
684 shill::kSaveCredentialsProperty
, GetSaveCredentials());
685 std::string security
= shill::kSecurityNone
;
686 if (!eap_method_combobox_
) {
687 switch (security_combobox_
->selected_index()) {
688 case SECURITY_INDEX_NONE
:
689 security
= shill::kSecurityNone
;
691 case SECURITY_INDEX_WEP
:
692 security
= shill::kSecurityWep
;
694 case SECURITY_INDEX_PSK
:
695 security
= shill::kSecurityPsk
;
698 std::string passphrase
= GetPassphrase();
699 if (!passphrase
.empty()) {
700 properties
.SetStringWithoutPathExpansion(
701 shill::kPassphraseProperty
, GetPassphrase());
704 security
= shill::kSecurity8021x
;
705 SetEapProperties(&properties
);
707 properties
.SetStringWithoutPathExpansion(
708 shill::kSecurityProperty
, security
);
710 // Configure and connect to network.
711 ash::network_connect::CreateConfigurationAndConnect(&properties
,
715 // Shill no longer knows about this network (edge case).
716 // TODO(stevenjb): Add notification for this.
717 NET_LOG_ERROR("Network not found", service_path_
);
718 return true; // Close dialog
720 if (eap_method_combobox_
) {
721 SetEapProperties(&properties
);
722 properties
.SetBooleanWithoutPathExpansion(
723 shill::kSaveCredentialsProperty
, GetSaveCredentials());
725 const std::string passphrase
= GetPassphrase();
726 if (!passphrase
.empty()) {
727 properties
.SetStringWithoutPathExpansion(
728 shill::kPassphraseProperty
, passphrase
);
731 if (network
->type() == shill::kTypeEthernet
) {
732 // When configuring an ethernet service, we actually configure the
733 // EthernetEap service, which exists in the Profile only.
734 // See crbug.com/126870 for more info.
735 properties
.SetStringWithoutPathExpansion(shill::kTypeProperty
,
736 shill::kTypeEthernetEap
);
737 share_network
= false;
739 properties
.SetStringWithoutPathExpansion(
740 shill::kEapPinProperty
, TPMTokenLoader::Get()->tpm_user_pin());
741 ash::network_connect::CreateConfiguration(&properties
, share_network
);
743 ash::network_connect::ConfigureNetworkAndConnect(
744 service_path_
, properties
, share_network
);
747 return true; // dialog will be closed
750 std::string
WifiConfigView::GetSsid() const {
752 if (ssid_textfield_
!= NULL
) {
753 std::string untrimmed
= base::UTF16ToUTF8(ssid_textfield_
->text());
754 base::TrimWhitespaceASCII(untrimmed
, base::TRIM_ALL
, &result
);
759 std::string
WifiConfigView::GetPassphrase() const {
761 if (passphrase_textfield_
!= NULL
)
762 result
= base::UTF16ToUTF8(passphrase_textfield_
->text());
766 bool WifiConfigView::GetSaveCredentials() const {
767 if (!save_credentials_checkbox_
)
768 return true; // share networks by default (e.g. non 8021x).
769 return save_credentials_checkbox_
->checked();
772 bool WifiConfigView::GetShareNetwork(bool share_default
) const {
773 if (!share_network_checkbox_
)
774 return share_default
;
775 return share_network_checkbox_
->checked();
778 std::string
WifiConfigView::GetEapMethod() const {
779 DCHECK(eap_method_combobox_
);
780 switch (eap_method_combobox_
->selected_index()) {
781 case EAP_METHOD_INDEX_PEAP
:
782 return shill::kEapMethodPEAP
;
783 case EAP_METHOD_INDEX_TLS
:
784 return shill::kEapMethodTLS
;
785 case EAP_METHOD_INDEX_TTLS
:
786 return shill::kEapMethodTTLS
;
787 case EAP_METHOD_INDEX_LEAP
:
788 return shill::kEapMethodLEAP
;
789 case EAP_METHOD_INDEX_NONE
:
795 std::string
WifiConfigView::GetEapPhase2Auth() const {
796 DCHECK(phase_2_auth_combobox_
);
797 bool is_peap
= (GetEapMethod() == shill::kEapMethodPEAP
);
798 switch (phase_2_auth_combobox_
->selected_index()) {
799 case PHASE_2_AUTH_INDEX_MD5
:
800 return is_peap
? shill::kEapPhase2AuthPEAPMD5
801 : shill::kEapPhase2AuthTTLSMD5
;
802 case PHASE_2_AUTH_INDEX_MSCHAPV2
:
803 return is_peap
? shill::kEapPhase2AuthPEAPMSCHAPV2
804 : shill::kEapPhase2AuthTTLSMSCHAPV2
;
805 case PHASE_2_AUTH_INDEX_MSCHAP
:
806 return shill::kEapPhase2AuthTTLSMSCHAP
;
807 case PHASE_2_AUTH_INDEX_PAP
:
808 return shill::kEapPhase2AuthTTLSPAP
;
809 case PHASE_2_AUTH_INDEX_CHAP
:
810 return shill::kEapPhase2AuthTTLSCHAP
;
811 case PHASE_2_AUTH_INDEX_AUTO
:
817 std::string
WifiConfigView::GetEapServerCaCertPEM() const {
818 DCHECK(server_ca_cert_combobox_
);
819 int index
= server_ca_cert_combobox_
->selected_index();
821 // First item is "Default".
822 return std::string();
823 } else if (index
== server_ca_cert_combobox_
->model()->GetItemCount() - 1) {
824 // Last item is "Do not check".
825 return std::string();
827 int cert_index
= index
- 1;
828 return CertLibrary::Get()->GetServerCACertPEMAt(cert_index
);
832 bool WifiConfigView::GetEapUseSystemCas() const {
833 DCHECK(server_ca_cert_combobox_
);
834 // Only use system CAs if the first item ("Default") is selected.
835 return server_ca_cert_combobox_
->selected_index() == 0;
838 std::string
WifiConfigView::GetEapSubjectMatch() const {
839 DCHECK(subject_match_textfield_
);
840 return base::UTF16ToUTF8(subject_match_textfield_
->text());
843 std::string
WifiConfigView::GetEapClientCertPkcs11Id() const {
844 DCHECK(user_cert_combobox_
);
845 if (!HaveUserCerts() || !UserCertActive()) {
846 return std::string(); // No certificate selected or not required.
848 // Certificates are listed in the order they appear in the model.
849 int index
= user_cert_combobox_
->selected_index();
850 return CertLibrary::Get()->GetUserCertPkcs11IdAt(index
);
854 std::string
WifiConfigView::GetEapIdentity() const {
855 DCHECK(identity_textfield_
);
856 return base::UTF16ToUTF8(identity_textfield_
->text());
859 std::string
WifiConfigView::GetEapAnonymousIdentity() const {
860 DCHECK(identity_anonymous_textfield_
);
861 return base::UTF16ToUTF8(identity_anonymous_textfield_
->text());
864 void WifiConfigView::SetEapProperties(base::DictionaryValue
* properties
) {
865 properties
->SetStringWithoutPathExpansion(
866 shill::kEapIdentityProperty
, GetEapIdentity());
867 properties
->SetStringWithoutPathExpansion(
868 shill::kEapMethodProperty
, GetEapMethod());
869 properties
->SetStringWithoutPathExpansion(
870 shill::kEapPhase2AuthProperty
, GetEapPhase2Auth());
871 properties
->SetStringWithoutPathExpansion(
872 shill::kEapAnonymousIdentityProperty
, GetEapAnonymousIdentity());
873 properties
->SetStringWithoutPathExpansion(
874 shill::kEapSubjectMatchProperty
, GetEapSubjectMatch());
876 // shill requires both CertID and KeyID for TLS connections, despite
877 // the fact that by convention they are the same ID.
878 properties
->SetStringWithoutPathExpansion(
879 shill::kEapCertIdProperty
, GetEapClientCertPkcs11Id());
880 properties
->SetStringWithoutPathExpansion(
881 shill::kEapKeyIdProperty
, GetEapClientCertPkcs11Id());
883 properties
->SetBooleanWithoutPathExpansion(
884 shill::kEapUseSystemCasProperty
, GetEapUseSystemCas());
885 properties
->SetStringWithoutPathExpansion(
886 shill::kEapPasswordProperty
, GetPassphrase());
888 base::ListValue
* pem_list
= new base::ListValue
;
889 pem_list
->AppendString(GetEapServerCaCertPEM());
890 properties
->SetWithoutPathExpansion(
891 shill::kEapCaCertPemProperty
, pem_list
);
894 void WifiConfigView::Cancel() {
897 void WifiConfigView::Init(bool show_8021x
) {
898 const NetworkState
* network
= GetNetworkState();
900 if (network
->type() == shill::kTypeWifi
) {
901 if (network
->security() == shill::kSecurity8021x
)
903 } else if (network
->type() == shill::kTypeEthernet
) {
906 NOTREACHED() << "Unexpected network type for WifiConfigView: "
907 << network
->type() << " Path: " << service_path_
;
909 ParseEAPUIProperty(&eap_method_ui_data_
, network
, ::onc::eap::kOuter
);
910 ParseEAPUIProperty(&phase_2_auth_ui_data_
, network
, ::onc::eap::kInner
);
912 &user_cert_ui_data_
, network
, ::onc::eap::kClientCertRef
);
914 &server_ca_cert_ui_data_
, network
, ::onc::eap::kServerCARef
);
915 if (server_ca_cert_ui_data_
.IsManaged()) {
917 &server_ca_cert_ui_data_
, network
, ::onc::eap::kUseSystemCAs
);
919 ParseEAPUIProperty(&identity_ui_data_
, network
, ::onc::eap::kIdentity
);
921 &identity_anonymous_ui_data_
, network
, ::onc::eap::kAnonymousIdentity
);
923 &save_credentials_ui_data_
, network
, ::onc::eap::kSaveCredentials
);
925 ParseEAPUIProperty(&passphrase_ui_data_
, network
, ::onc::eap::kPassword
);
927 ParseUIProperty(&passphrase_ui_data_
, network
, ::onc::wifi::kPassphrase
);
930 views::GridLayout
* layout
= views::GridLayout::CreatePanel(this);
931 SetLayoutManager(layout
);
933 const int column_view_set_id
= 0;
934 views::ColumnSet
* column_set
= layout
->AddColumnSet(column_view_set_id
);
935 const int kPasswordVisibleWidth
= 20;
937 column_set
->AddColumn(views::GridLayout::LEADING
, views::GridLayout::FILL
, 1,
938 views::GridLayout::USE_PREF
, 0, 0);
939 column_set
->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing
);
940 // Textfield, combobox.
941 column_set
->AddColumn(views::GridLayout::FILL
, views::GridLayout::FILL
, 1,
942 views::GridLayout::USE_PREF
, 0,
943 ChildNetworkConfigView::kInputFieldMinWidth
);
944 column_set
->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing
);
945 // Password visible button / policy indicator.
946 column_set
->AddColumn(views::GridLayout::CENTER
, views::GridLayout::FILL
, 1,
947 views::GridLayout::USE_PREF
, 0, kPasswordVisibleWidth
);
950 if (!network
|| network
->type() != shill::kTypeEthernet
) {
951 layout
->StartRow(0, column_view_set_id
);
952 layout
->AddView(new views::Label(l10n_util::GetStringUTF16(
953 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_NETWORK_ID
)));
955 ssid_textfield_
= new views::Textfield();
956 ssid_textfield_
->set_controller(this);
957 ssid_textfield_
->SetAccessibleName(l10n_util::GetStringUTF16(
958 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_NETWORK_ID
));
959 layout
->AddView(ssid_textfield_
);
961 views::Label
* label
=
962 new views::Label(base::UTF8ToUTF16(network
->name()));
963 label
->SetHorizontalAlignment(gfx::ALIGN_LEFT
);
964 layout
->AddView(label
);
966 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
970 if (!network
&& !show_8021x
) {
971 layout
->StartRow(0, column_view_set_id
);
972 base::string16 label_text
= l10n_util::GetStringUTF16(
973 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY
);
974 layout
->AddView(new views::Label(label_text
));
975 security_combobox_model_
.reset(new internal::SecurityComboboxModel
);
976 security_combobox_
= new views::Combobox(security_combobox_model_
.get());
977 security_combobox_
->SetAccessibleName(label_text
);
978 security_combobox_
->set_listener(this);
979 layout
->AddView(security_combobox_
);
980 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
983 // Only enumerate certificates in the data model for 802.1X networks.
985 // Observer any changes to the certificate list.
986 CertLibrary::Get()->AddObserver(this);
989 layout
->StartRow(0, column_view_set_id
);
990 base::string16 eap_label_text
= l10n_util::GetStringUTF16(
991 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD
);
992 layout
->AddView(new views::Label(eap_label_text
));
993 eap_method_combobox_model_
.reset(new internal::EAPMethodComboboxModel
);
994 eap_method_combobox_
= new views::Combobox(
995 eap_method_combobox_model_
.get());
996 eap_method_combobox_
->SetAccessibleName(eap_label_text
);
997 eap_method_combobox_
->set_listener(this);
998 eap_method_combobox_
->SetEnabled(eap_method_ui_data_
.IsEditable());
999 layout
->AddView(eap_method_combobox_
);
1000 layout
->AddView(new ControlledSettingIndicatorView(eap_method_ui_data_
));
1001 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1003 // Phase 2 authentication
1004 layout
->StartRow(0, column_view_set_id
);
1005 base::string16 phase_2_label_text
= l10n_util::GetStringUTF16(
1006 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH
);
1007 phase_2_auth_label_
= new views::Label(phase_2_label_text
);
1008 layout
->AddView(phase_2_auth_label_
);
1009 phase_2_auth_combobox_model_
.reset(
1010 new internal::Phase2AuthComboboxModel(eap_method_combobox_
));
1011 phase_2_auth_combobox_
= new views::Combobox(
1012 phase_2_auth_combobox_model_
.get());
1013 phase_2_auth_combobox_
->SetAccessibleName(phase_2_label_text
);
1014 phase_2_auth_label_
->SetEnabled(false);
1015 phase_2_auth_combobox_
->SetEnabled(false);
1016 phase_2_auth_combobox_
->set_listener(this);
1017 layout
->AddView(phase_2_auth_combobox_
);
1018 layout
->AddView(new ControlledSettingIndicatorView(phase_2_auth_ui_data_
));
1019 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1021 // Server CA certificate
1022 layout
->StartRow(0, column_view_set_id
);
1023 base::string16 server_ca_cert_label_text
= l10n_util::GetStringUTF16(
1024 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA
);
1025 server_ca_cert_label_
= new views::Label(server_ca_cert_label_text
);
1026 layout
->AddView(server_ca_cert_label_
);
1027 server_ca_cert_combobox_model_
.reset(
1028 new internal::ServerCACertComboboxModel());
1029 server_ca_cert_combobox_
= new ComboboxWithWidth(
1030 server_ca_cert_combobox_model_
.get(),
1031 ChildNetworkConfigView::kInputFieldMinWidth
);
1032 server_ca_cert_combobox_
->SetAccessibleName(server_ca_cert_label_text
);
1033 server_ca_cert_label_
->SetEnabled(false);
1034 server_ca_cert_combobox_
->SetEnabled(false);
1035 server_ca_cert_combobox_
->set_listener(this);
1036 layout
->AddView(server_ca_cert_combobox_
);
1038 new ControlledSettingIndicatorView(server_ca_cert_ui_data_
));
1039 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1042 layout
->StartRow(0, column_view_set_id
);
1043 base::string16 subject_match_label_text
= l10n_util::GetStringUTF16(
1044 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_SUBJECT_MATCH
);
1045 subject_match_label_
= new views::Label(subject_match_label_text
);
1046 layout
->AddView(subject_match_label_
);
1047 subject_match_textfield_
= new views::Textfield();
1048 subject_match_textfield_
->SetAccessibleName(subject_match_label_text
);
1049 subject_match_textfield_
->set_controller(this);
1050 layout
->AddView(subject_match_textfield_
);
1051 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1054 layout
->StartRow(0, column_view_set_id
);
1055 base::string16 user_cert_label_text
= l10n_util::GetStringUTF16(
1056 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT
);
1057 user_cert_label_
= new views::Label(user_cert_label_text
);
1058 layout
->AddView(user_cert_label_
);
1059 user_cert_combobox_model_
.reset(new internal::UserCertComboboxModel(this));
1060 user_cert_combobox_
= new views::Combobox(user_cert_combobox_model_
.get());
1061 user_cert_combobox_
->SetAccessibleName(user_cert_label_text
);
1062 user_cert_label_
->SetEnabled(false);
1063 user_cert_combobox_
->SetEnabled(false);
1064 user_cert_combobox_
->set_listener(this);
1065 layout
->AddView(user_cert_combobox_
);
1066 layout
->AddView(new ControlledSettingIndicatorView(user_cert_ui_data_
));
1067 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1070 layout
->StartRow(0, column_view_set_id
);
1071 base::string16 identity_label_text
= l10n_util::GetStringUTF16(
1072 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_IDENTITY
);
1073 identity_label_
= new views::Label(identity_label_text
);
1074 layout
->AddView(identity_label_
);
1075 identity_textfield_
= new views::Textfield();
1076 identity_textfield_
->SetAccessibleName(identity_label_text
);
1077 identity_textfield_
->set_controller(this);
1078 identity_textfield_
->SetEnabled(identity_ui_data_
.IsEditable());
1079 layout
->AddView(identity_textfield_
);
1080 layout
->AddView(new ControlledSettingIndicatorView(identity_ui_data_
));
1081 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1085 layout
->StartRow(0, column_view_set_id
);
1086 int label_text_id
= IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE
;
1087 base::string16 passphrase_label_text
=
1088 l10n_util::GetStringUTF16(label_text_id
);
1089 passphrase_label_
= new views::Label(passphrase_label_text
);
1090 layout
->AddView(passphrase_label_
);
1091 passphrase_textfield_
= new PassphraseTextfield();
1092 passphrase_textfield_
->set_controller(this);
1093 // Disable passphrase input initially for other network.
1094 passphrase_label_
->SetEnabled(network
);
1095 passphrase_textfield_
->SetEnabled(network
&&
1096 passphrase_ui_data_
.IsEditable());
1097 passphrase_textfield_
->SetAccessibleName(passphrase_label_text
);
1098 layout
->AddView(passphrase_textfield_
);
1100 if (passphrase_ui_data_
.IsManaged()) {
1101 layout
->AddView(new ControlledSettingIndicatorView(passphrase_ui_data_
));
1103 // Password visible button.
1104 passphrase_visible_button_
= new views::ToggleImageButton(this);
1105 passphrase_visible_button_
->SetFocusable(true);
1106 passphrase_visible_button_
->SetTooltipText(
1107 l10n_util::GetStringUTF16(
1108 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE_SHOW
));
1109 passphrase_visible_button_
->SetToggledTooltipText(
1110 l10n_util::GetStringUTF16(
1111 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE_HIDE
));
1112 passphrase_visible_button_
->SetImage(
1113 views::ImageButton::STATE_NORMAL
,
1114 ResourceBundle::GetSharedInstance().
1115 GetImageSkiaNamed(IDR_NETWORK_SHOW_PASSWORD
));
1116 passphrase_visible_button_
->SetImage(
1117 views::ImageButton::STATE_HOVERED
,
1118 ResourceBundle::GetSharedInstance().
1119 GetImageSkiaNamed(IDR_NETWORK_SHOW_PASSWORD_HOVER
));
1120 passphrase_visible_button_
->SetToggledImage(
1121 views::ImageButton::STATE_NORMAL
,
1122 ResourceBundle::GetSharedInstance().
1123 GetImageSkiaNamed(IDR_NETWORK_HIDE_PASSWORD
));
1124 passphrase_visible_button_
->SetToggledImage(
1125 views::ImageButton::STATE_HOVERED
,
1126 ResourceBundle::GetSharedInstance().
1127 GetImageSkiaNamed(IDR_NETWORK_HIDE_PASSWORD_HOVER
));
1128 passphrase_visible_button_
->SetImageAlignment(
1129 views::ImageButton::ALIGN_CENTER
, views::ImageButton::ALIGN_MIDDLE
);
1130 layout
->AddView(passphrase_visible_button_
);
1133 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1136 // Anonymous identity
1137 layout
->StartRow(0, column_view_set_id
);
1138 identity_anonymous_label_
=
1139 new views::Label(l10n_util::GetStringUTF16(
1140 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_IDENTITY_ANONYMOUS
));
1141 layout
->AddView(identity_anonymous_label_
);
1142 identity_anonymous_textfield_
= new views::Textfield();
1143 identity_anonymous_label_
->SetEnabled(false);
1144 identity_anonymous_textfield_
->SetEnabled(false);
1145 identity_anonymous_textfield_
->set_controller(this);
1146 layout
->AddView(identity_anonymous_textfield_
);
1148 new ControlledSettingIndicatorView(identity_anonymous_ui_data_
));
1149 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1156 layout
->StartRow(0, column_view_set_id
);
1157 save_credentials_checkbox_
= new views::Checkbox(
1158 l10n_util::GetStringUTF16(
1159 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SAVE_CREDENTIALS
));
1160 save_credentials_checkbox_
->SetEnabled(
1161 save_credentials_ui_data_
.IsEditable());
1162 layout
->SkipColumns(1);
1163 layout
->AddView(save_credentials_checkbox_
);
1165 new ControlledSettingIndicatorView(save_credentials_ui_data_
));
1169 if (!network
|| network
->profile_path().empty()) {
1170 layout
->StartRow(0, column_view_set_id
);
1171 share_network_checkbox_
= new views::Checkbox(
1172 l10n_util::GetStringUTF16(
1173 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SHARE_NETWORK
));
1174 layout
->SkipColumns(1);
1175 layout
->AddView(share_network_checkbox_
);
1177 layout
->AddPaddingRow(0, views::kRelatedControlVerticalSpacing
);
1179 // Create an error label.
1180 layout
->StartRow(0, column_view_set_id
);
1181 layout
->SkipColumns(1);
1182 error_label_
= new views::Label();
1183 error_label_
->SetHorizontalAlignment(gfx::ALIGN_LEFT
);
1184 error_label_
->SetEnabledColor(SK_ColorRED
);
1185 layout
->AddView(error_label_
);
1187 // Initialize the field and checkbox values.
1189 if (!network
&& show_8021x
)
1192 RefreshShareCheckbox();
1196 NetworkHandler::Get()->network_configuration_handler()->GetProperties(
1198 base::Bind(&WifiConfigView::InitFromProperties
,
1199 weak_ptr_factory_
.GetWeakPtr(),
1201 base::Bind(&ShillError
, "GetProperties"));
1205 void WifiConfigView::InitFromProperties(
1207 const std::string
& service_path
,
1208 const base::DictionaryValue
& properties
) {
1210 std::string passphrase
;
1211 properties
.GetStringWithoutPathExpansion(
1212 shill::kPassphraseProperty
, &passphrase
);
1213 passphrase_textfield_
->SetText(base::UTF8ToUTF16(passphrase
));
1218 std::string eap_method
;
1219 properties
.GetStringWithoutPathExpansion(
1220 shill::kEapMethodProperty
, &eap_method
);
1221 if (eap_method
== shill::kEapMethodPEAP
)
1222 eap_method_combobox_
->SetSelectedIndex(EAP_METHOD_INDEX_PEAP
);
1223 else if (eap_method
== shill::kEapMethodTTLS
)
1224 eap_method_combobox_
->SetSelectedIndex(EAP_METHOD_INDEX_TTLS
);
1225 else if (eap_method
== shill::kEapMethodTLS
)
1226 eap_method_combobox_
->SetSelectedIndex(EAP_METHOD_INDEX_TLS
);
1227 else if (eap_method
== shill::kEapMethodLEAP
)
1228 eap_method_combobox_
->SetSelectedIndex(EAP_METHOD_INDEX_LEAP
);
1231 // Phase 2 authentication and anonymous identity.
1232 if (Phase2AuthActive()) {
1233 std::string eap_phase_2_auth
;
1234 properties
.GetStringWithoutPathExpansion(
1235 shill::kEapPhase2AuthProperty
, &eap_phase_2_auth
);
1236 if (eap_phase_2_auth
== shill::kEapPhase2AuthTTLSMD5
)
1237 phase_2_auth_combobox_
->SetSelectedIndex(PHASE_2_AUTH_INDEX_MD5
);
1238 else if (eap_phase_2_auth
== shill::kEapPhase2AuthTTLSMSCHAPV2
)
1239 phase_2_auth_combobox_
->SetSelectedIndex(PHASE_2_AUTH_INDEX_MSCHAPV2
);
1240 else if (eap_phase_2_auth
== shill::kEapPhase2AuthTTLSMSCHAP
)
1241 phase_2_auth_combobox_
->SetSelectedIndex(PHASE_2_AUTH_INDEX_MSCHAP
);
1242 else if (eap_phase_2_auth
== shill::kEapPhase2AuthTTLSPAP
)
1243 phase_2_auth_combobox_
->SetSelectedIndex(PHASE_2_AUTH_INDEX_PAP
);
1244 else if (eap_phase_2_auth
== shill::kEapPhase2AuthTTLSCHAP
)
1245 phase_2_auth_combobox_
->SetSelectedIndex(PHASE_2_AUTH_INDEX_CHAP
);
1247 std::string eap_anonymous_identity
;
1248 properties
.GetStringWithoutPathExpansion(
1249 shill::kEapAnonymousIdentityProperty
, &eap_anonymous_identity
);
1250 identity_anonymous_textfield_
->SetText(
1251 base::UTF8ToUTF16(eap_anonymous_identity
));
1255 std::string subject_match
;
1256 properties
.GetStringWithoutPathExpansion(
1257 shill::kEapSubjectMatchProperty
, &subject_match
);
1258 subject_match_textfield_
->SetText(base::UTF8ToUTF16(subject_match
));
1260 // Server CA certificate.
1261 if (CaCertActive()) {
1262 std::string eap_ca_cert_pem
;
1263 const base::ListValue
* pems
= NULL
;
1264 if (properties
.GetListWithoutPathExpansion(
1265 shill::kEapCaCertPemProperty
, &pems
))
1266 pems
->GetString(0, &eap_ca_cert_pem
);
1267 if (eap_ca_cert_pem
.empty()) {
1268 bool eap_use_system_cas
= false;
1269 properties
.GetBooleanWithoutPathExpansion(
1270 shill::kEapUseSystemCasProperty
, &eap_use_system_cas
);
1271 if (eap_use_system_cas
) {
1273 server_ca_cert_combobox_
->SetSelectedIndex(0);
1276 server_ca_cert_combobox_
->SetSelectedIndex(
1277 server_ca_cert_combobox_
->model()->GetItemCount() - 1);
1280 // Select the certificate if available.
1282 CertLibrary::Get()->GetServerCACertIndexByPEM(eap_ca_cert_pem
);
1283 if (cert_index
>= 0) {
1284 // Skip item for "Default".
1285 server_ca_cert_combobox_
->SetSelectedIndex(1 + cert_index
);
1288 server_ca_cert_combobox_
->SetSelectedIndex(0);
1293 // User certificate.
1294 if (UserCertActive()) {
1295 std::string eap_cert_id
;
1296 properties
.GetStringWithoutPathExpansion(
1297 shill::kEapCertIdProperty
, &eap_cert_id
);
1298 if (!eap_cert_id
.empty()) {
1300 CertLibrary::Get()->GetUserCertIndexByPkcs11Id(eap_cert_id
);
1301 if (cert_index
>= 0)
1302 user_cert_combobox_
->SetSelectedIndex(cert_index
);
1306 // Identity is always active.
1307 std::string eap_identity
;
1308 properties
.GetStringWithoutPathExpansion(
1309 shill::kEapIdentityProperty
, &eap_identity
);
1310 identity_textfield_
->SetText(base::UTF8ToUTF16(eap_identity
));
1313 if (PassphraseActive()) {
1314 std::string eap_password
;
1315 properties
.GetStringWithoutPathExpansion(
1316 shill::kEapPasswordProperty
, &eap_password
);
1317 passphrase_textfield_
->SetText(base::UTF8ToUTF16(eap_password
));
1318 // If 'Connectable' is True, show a fake passphrase to indicate that it
1319 // has already been set.
1320 bool connectable
= false;
1321 properties
.GetBooleanWithoutPathExpansion(
1322 shill::kConnectableProperty
, &connectable
);
1323 passphrase_textfield_
->SetShowFake(connectable
);
1327 bool save_credentials
= false;
1328 properties
.GetBooleanWithoutPathExpansion(
1329 shill::kSaveCredentialsProperty
, &save_credentials
);
1330 save_credentials_checkbox_
->SetChecked(save_credentials
);
1332 UpdateDialogButtons();
1333 RefreshShareCheckbox();
1337 void WifiConfigView::InitFocus() {
1338 views::View
* view_to_focus
= GetInitiallyFocusedView();
1340 view_to_focus
->RequestFocus();
1343 bool WifiConfigView::IsConfigureDialog() {
1344 const NetworkState
* network
= GetNetworkState();
1345 return network
&& network
->type() == shill::kTypeEthernet
;
1348 void WifiConfigView::NetworkPropertiesUpdated(const NetworkState
* network
) {
1349 if (network
->path() != service_path_
)
1354 const NetworkState
* WifiConfigView::GetNetworkState() const {
1355 if (service_path_
.empty())
1357 return NetworkHandler::Get()->network_state_handler()->GetNetworkState(
1362 void WifiConfigView::ParseUIProperty(NetworkPropertyUIData
* property_ui_data
,
1363 const NetworkState
* network
,
1364 const std::string
& key
) {
1365 ::onc::ONCSource onc_source
= ::onc::ONC_SOURCE_NONE
;
1366 const base::DictionaryValue
* onc
=
1367 onc::FindPolicyForActiveUser(network
->guid(), &onc_source
);
1368 std::string onc_tag
= network
->type() == shill::kTypeEthernet
1369 ? ::onc::network_config::kWiFi
1370 : ::onc::network_config::kEthernet
;
1371 property_ui_data
->ParseOncProperty(onc_source
, onc
, onc_tag
+ '.' + key
);
1375 void WifiConfigView::ParseEAPUIProperty(NetworkPropertyUIData
* property_ui_data
,
1376 const NetworkState
* network
,
1377 const std::string
& key
) {
1378 std::string onc_tag
= network
->type() == shill::kTypeEthernet
1379 ? ::onc::ethernet::kEAP
1380 : ::onc::wifi::kEAP
;
1381 ParseUIProperty(property_ui_data
, network
, onc_tag
+ '.' + key
);
1384 } // namespace chromeos