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/network_configuration_handler.h"
18 #include "chromeos/network/network_event_log.h"
19 #include "chromeos/network/network_handler.h"
20 #include "chromeos/network/network_state.h"
21 #include "chromeos/network/network_state_handler.h"
22 #include "chromeos/network/network_ui_data.h"
23 #include "chromeos/network/shill_property_util.h"
24 #include "components/onc/onc_constants.h"
25 #include "grit/chromium_strings.h"
26 #include "grit/generated_resources.h"
27 #include "grit/locale_settings.h"
28 #include "grit/theme_resources.h"
29 #include "third_party/cros_system_api/dbus/service_constants.h"
30 #include "ui/base/l10n/l10n_util.h"
31 #include "ui/base/resource/resource_bundle.h"
32 #include "ui/events/event.h"
33 #include "ui/views/controls/button/checkbox.h"
34 #include "ui/views/controls/button/image_button.h"
35 #include "ui/views/controls/combobox/combobox.h"
36 #include "ui/views/controls/label.h"
37 #include "ui/views/controls/textfield/textfield.h"
38 #include "ui/views/layout/grid_layout.h"
39 #include "ui/views/layout/layout_constants.h"
40 #include "ui/views/widget/widget.h"
41 #include "ui/views/window/dialog_client_view.h"
47 // Combobox that supports a preferred width. Used by Server CA combobox
48 // because the strings inside it are too wide.
49 class ComboboxWithWidth : public views::Combobox {
51 ComboboxWithWidth(ui::ComboboxModel* model, int width)
55 virtual ~ComboboxWithWidth() {}
56 virtual gfx::Size GetPreferredSize() OVERRIDE {
57 gfx::Size size = Combobox::GetPreferredSize();
58 size.set_width(width_);
63 DISALLOW_COPY_AND_ASSIGN(ComboboxWithWidth);
66 enum SecurityComboboxIndex {
67 SECURITY_INDEX_NONE = 0,
68 SECURITY_INDEX_WEP = 1,
69 SECURITY_INDEX_PSK = 2,
70 SECURITY_INDEX_COUNT = 3
73 // Methods in alphabetical order.
74 enum EAPMethodComboboxIndex {
75 EAP_METHOD_INDEX_NONE = 0,
76 EAP_METHOD_INDEX_LEAP = 1,
77 EAP_METHOD_INDEX_PEAP = 2,
78 EAP_METHOD_INDEX_TLS = 3,
79 EAP_METHOD_INDEX_TTLS = 4,
80 EAP_METHOD_INDEX_COUNT = 5
83 enum Phase2AuthComboboxIndex {
84 PHASE_2_AUTH_INDEX_AUTO = 0, // LEAP, EAP-TLS have only this auth.
85 PHASE_2_AUTH_INDEX_MD5 = 1,
86 PHASE_2_AUTH_INDEX_MSCHAPV2 = 2, // PEAP has up to this auth.
87 PHASE_2_AUTH_INDEX_MSCHAP = 3,
88 PHASE_2_AUTH_INDEX_PAP = 4,
89 PHASE_2_AUTH_INDEX_CHAP = 5, // EAP-TTLS has up to this auth.
90 PHASE_2_AUTH_INDEX_COUNT = 6
93 void ShillError(const std::string& function,
94 const std::string& error_name,
95 scoped_ptr<base::DictionaryValue> error_data) {
96 NET_LOG_ERROR("Shill Error from WifiConfigView: " + error_name, function);
103 class SecurityComboboxModel : public ui::ComboboxModel {
105 SecurityComboboxModel();
106 virtual ~SecurityComboboxModel();
108 // Overridden from ui::ComboboxModel:
109 virtual int GetItemCount() const OVERRIDE;
110 virtual base::string16 GetItemAt(int index) OVERRIDE;
113 DISALLOW_COPY_AND_ASSIGN(SecurityComboboxModel);
116 class EAPMethodComboboxModel : public ui::ComboboxModel {
118 EAPMethodComboboxModel();
119 virtual ~EAPMethodComboboxModel();
121 // Overridden from ui::ComboboxModel:
122 virtual int GetItemCount() const OVERRIDE;
123 virtual base::string16 GetItemAt(int index) OVERRIDE;
126 DISALLOW_COPY_AND_ASSIGN(EAPMethodComboboxModel);
129 class Phase2AuthComboboxModel : public ui::ComboboxModel {
131 explicit Phase2AuthComboboxModel(views::Combobox* eap_method_combobox);
132 virtual ~Phase2AuthComboboxModel();
134 // Overridden from ui::ComboboxModel:
135 virtual int GetItemCount() const OVERRIDE;
136 virtual base::string16 GetItemAt(int index) OVERRIDE;
139 views::Combobox* eap_method_combobox_;
141 DISALLOW_COPY_AND_ASSIGN(Phase2AuthComboboxModel);
144 class ServerCACertComboboxModel : public ui::ComboboxModel {
146 ServerCACertComboboxModel();
147 virtual ~ServerCACertComboboxModel();
149 // Overridden from ui::ComboboxModel:
150 virtual int GetItemCount() const OVERRIDE;
151 virtual base::string16 GetItemAt(int index) OVERRIDE;
154 DISALLOW_COPY_AND_ASSIGN(ServerCACertComboboxModel);
157 class UserCertComboboxModel : public ui::ComboboxModel {
159 explicit UserCertComboboxModel(WifiConfigView* owner);
160 virtual ~UserCertComboboxModel();
162 // Overridden from ui::ComboboxModel:
163 virtual int GetItemCount() const OVERRIDE;
164 virtual base::string16 GetItemAt(int index) OVERRIDE;
167 WifiConfigView* owner_;
169 DISALLOW_COPY_AND_ASSIGN(UserCertComboboxModel);
172 // SecurityComboboxModel -------------------------------------------------------
174 SecurityComboboxModel::SecurityComboboxModel() {
177 SecurityComboboxModel::~SecurityComboboxModel() {
180 int SecurityComboboxModel::GetItemCount() const {
181 return SECURITY_INDEX_COUNT;
183 base::string16 SecurityComboboxModel::GetItemAt(int index) {
184 if (index == SECURITY_INDEX_NONE)
185 return l10n_util::GetStringUTF16(
186 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_NONE);
187 else if (index == SECURITY_INDEX_WEP)
188 return l10n_util::GetStringUTF16(
189 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_WEP);
190 else if (index == SECURITY_INDEX_PSK)
191 return l10n_util::GetStringUTF16(
192 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_PSK);
194 return base::string16();
197 // EAPMethodComboboxModel ------------------------------------------------------
199 EAPMethodComboboxModel::EAPMethodComboboxModel() {
202 EAPMethodComboboxModel::~EAPMethodComboboxModel() {
205 int EAPMethodComboboxModel::GetItemCount() const {
206 return EAP_METHOD_INDEX_COUNT;
208 base::string16 EAPMethodComboboxModel::GetItemAt(int index) {
209 if (index == EAP_METHOD_INDEX_NONE)
210 return l10n_util::GetStringUTF16(
211 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_NONE);
212 else if (index == EAP_METHOD_INDEX_LEAP)
213 return l10n_util::GetStringUTF16(
214 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_LEAP);
215 else if (index == EAP_METHOD_INDEX_PEAP)
216 return l10n_util::GetStringUTF16(
217 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_PEAP);
218 else if (index == EAP_METHOD_INDEX_TLS)
219 return l10n_util::GetStringUTF16(
220 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_TLS);
221 else if (index == EAP_METHOD_INDEX_TTLS)
222 return l10n_util::GetStringUTF16(
223 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_TTLS);
225 return base::string16();
228 // Phase2AuthComboboxModel -----------------------------------------------------
230 Phase2AuthComboboxModel::Phase2AuthComboboxModel(
231 views::Combobox* eap_method_combobox)
232 : eap_method_combobox_(eap_method_combobox) {
235 Phase2AuthComboboxModel::~Phase2AuthComboboxModel() {
238 int Phase2AuthComboboxModel::GetItemCount() const {
239 switch (eap_method_combobox_->selected_index()) {
240 case EAP_METHOD_INDEX_NONE:
241 case EAP_METHOD_INDEX_TLS:
242 case EAP_METHOD_INDEX_LEAP:
243 return PHASE_2_AUTH_INDEX_AUTO + 1;
244 case EAP_METHOD_INDEX_PEAP:
245 return PHASE_2_AUTH_INDEX_MSCHAPV2 + 1;
246 case EAP_METHOD_INDEX_TTLS:
247 return PHASE_2_AUTH_INDEX_CHAP + 1;
253 base::string16 Phase2AuthComboboxModel::GetItemAt(int index) {
254 if (index == PHASE_2_AUTH_INDEX_AUTO)
255 return l10n_util::GetStringUTF16(
256 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_AUTO);
257 else if (index == PHASE_2_AUTH_INDEX_MD5)
258 return l10n_util::GetStringUTF16(
259 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MD5);
260 else if (index == PHASE_2_AUTH_INDEX_MSCHAPV2)
261 return l10n_util::GetStringUTF16(
262 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MSCHAPV2);
263 else if (index == PHASE_2_AUTH_INDEX_MSCHAP)
264 return l10n_util::GetStringUTF16(
265 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MSCHAP);
266 else if (index == PHASE_2_AUTH_INDEX_PAP)
267 return l10n_util::GetStringUTF16(
268 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_PAP);
269 else if (index == PHASE_2_AUTH_INDEX_CHAP)
270 return l10n_util::GetStringUTF16(
271 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_CHAP);
273 return base::string16();
276 // ServerCACertComboboxModel ---------------------------------------------------
278 ServerCACertComboboxModel::ServerCACertComboboxModel() {
281 ServerCACertComboboxModel::~ServerCACertComboboxModel() {
284 int ServerCACertComboboxModel::GetItemCount() const {
285 if (CertLibrary::Get()->CertificatesLoading())
286 return 1; // "Loading"
287 // First "Default", then the certs, then "Do not check".
288 return CertLibrary::Get()->NumCertificates(
289 CertLibrary::CERT_TYPE_SERVER_CA) + 2;
292 base::string16 ServerCACertComboboxModel::GetItemAt(int index) {
293 if (CertLibrary::Get()->CertificatesLoading())
294 return l10n_util::GetStringUTF16(
295 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_LOADING);
297 return l10n_util::GetStringUTF16(
298 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA_DEFAULT);
299 if (index == GetItemCount() - 1)
300 return l10n_util::GetStringUTF16(
301 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA_DO_NOT_CHECK);
302 int cert_index = index - 1;
303 return CertLibrary::Get()->GetCertDisplayStringAt(
304 CertLibrary::CERT_TYPE_SERVER_CA, cert_index);
307 // UserCertComboboxModel -------------------------------------------------------
309 UserCertComboboxModel::UserCertComboboxModel(WifiConfigView* owner)
313 UserCertComboboxModel::~UserCertComboboxModel() {
316 int UserCertComboboxModel::GetItemCount() const {
317 if (!owner_->UserCertActive())
319 if (CertLibrary::Get()->CertificatesLoading())
320 return 1; // "Loading"
322 CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER);
324 return 1; // "None installed"
328 base::string16 UserCertComboboxModel::GetItemAt(int index) {
329 if (!owner_->UserCertActive())
330 return base::string16();
331 if (CertLibrary::Get()->CertificatesLoading())
332 return l10n_util::GetStringUTF16(
333 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_LOADING);
334 if (CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER) == 0)
335 return l10n_util::GetStringUTF16(
336 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_USER_CERT_NONE_INSTALLED);
337 return CertLibrary::Get()->GetCertDisplayStringAt(
338 CertLibrary::CERT_TYPE_USER, index);
341 } // namespace internal
343 WifiConfigView::WifiConfigView(NetworkConfigView* parent,
344 const std::string& service_path,
346 : ChildNetworkConfigView(parent, service_path),
347 ssid_textfield_(NULL),
348 eap_method_combobox_(NULL),
349 phase_2_auth_label_(NULL),
350 phase_2_auth_combobox_(NULL),
351 user_cert_label_(NULL),
352 user_cert_combobox_(NULL),
353 server_ca_cert_label_(NULL),
354 server_ca_cert_combobox_(NULL),
355 subject_match_label_(NULL),
356 subject_match_textfield_(NULL),
357 identity_label_(NULL),
358 identity_textfield_(NULL),
359 identity_anonymous_label_(NULL),
360 identity_anonymous_textfield_(NULL),
361 save_credentials_checkbox_(NULL),
362 share_network_checkbox_(NULL),
363 shared_network_label_(NULL),
364 security_combobox_(NULL),
365 passphrase_label_(NULL),
366 passphrase_textfield_(NULL),
367 passphrase_visible_button_(NULL),
369 weak_ptr_factory_(this) {
371 NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
374 WifiConfigView::~WifiConfigView() {
375 RemoveAllChildViews(true); // Destroy children before models
376 if (NetworkHandler::IsInitialized()) {
377 NetworkHandler::Get()->network_state_handler()->RemoveObserver(
380 CertLibrary::Get()->RemoveObserver(this);
383 base::string16 WifiConfigView::GetTitle() const {
384 return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_JOIN_WIFI_NETWORKS);
387 views::View* WifiConfigView::GetInitiallyFocusedView() {
388 // Return a reasonable widget for initial focus,
389 // depending on what we're showing.
391 return ssid_textfield_;
392 else if (eap_method_combobox_)
393 return eap_method_combobox_;
394 else if (passphrase_textfield_ && passphrase_textfield_->enabled())
395 return passphrase_textfield_;
400 bool WifiConfigView::CanLogin() {
401 static const size_t kMinWirelessPasswordLen = 5;
403 // We either have an existing wifi network or the user entered an SSID.
404 if (service_path_.empty() && GetSsid().empty())
407 // If the network requires a passphrase, make sure it is the right length.
408 if (passphrase_textfield_ != NULL &&
409 passphrase_textfield_->enabled() &&
410 !passphrase_textfield_->show_fake() &&
411 passphrase_textfield_->text().length() < kMinWirelessPasswordLen)
414 // If we're using EAP, we must have a method.
415 if (eap_method_combobox_ &&
416 eap_method_combobox_->selected_index() == EAP_METHOD_INDEX_NONE)
419 // Block login if certs are required but user has none.
420 if (UserCertRequired() && (!HaveUserCerts() || !IsUserCertValid()))
426 bool WifiConfigView::UserCertRequired() const {
427 return UserCertActive();
430 bool WifiConfigView::HaveUserCerts() const {
431 return CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER) > 0;
434 bool WifiConfigView::IsUserCertValid() const {
435 if (!UserCertActive())
437 int index = user_cert_combobox_->selected_index();
440 // Currently only hardware-backed user certificates are valid.
441 if (CertLibrary::Get()->IsHardwareBacked() &&
442 !CertLibrary::Get()->IsCertHardwareBackedAt(
443 CertLibrary::CERT_TYPE_USER, index))
448 bool WifiConfigView::Phase2AuthActive() const {
449 if (phase_2_auth_combobox_)
450 return phase_2_auth_combobox_->model()->GetItemCount() > 1;
454 bool WifiConfigView::PassphraseActive() const {
455 if (eap_method_combobox_) {
456 // No password for EAP-TLS.
457 int index = eap_method_combobox_->selected_index();
458 return index != EAP_METHOD_INDEX_NONE && index != EAP_METHOD_INDEX_TLS;
459 } else if (security_combobox_) {
460 return security_combobox_->selected_index() != SECURITY_INDEX_NONE;
465 bool WifiConfigView::UserCertActive() const {
466 // User certs only for EAP-TLS.
467 if (eap_method_combobox_)
468 return eap_method_combobox_->selected_index() == EAP_METHOD_INDEX_TLS;
473 bool WifiConfigView::CaCertActive() const {
474 // No server CA certs for LEAP.
475 if (eap_method_combobox_) {
476 int index = eap_method_combobox_->selected_index();
477 return index != EAP_METHOD_INDEX_NONE && index != EAP_METHOD_INDEX_LEAP;
482 void WifiConfigView::UpdateDialogButtons() {
483 parent_->GetDialogClientView()->UpdateDialogButtons();
486 void WifiConfigView::RefreshEapFields() {
487 // If EAP method changes, the phase 2 auth choices may have changed also.
488 phase_2_auth_combobox_->ModelChanged();
489 phase_2_auth_combobox_->SetSelectedIndex(0);
490 bool phase_2_auth_enabled = Phase2AuthActive();
491 phase_2_auth_combobox_->SetEnabled(phase_2_auth_enabled &&
492 phase_2_auth_ui_data_.IsEditable());
493 phase_2_auth_label_->SetEnabled(phase_2_auth_enabled);
496 bool passphrase_enabled = PassphraseActive();
497 passphrase_textfield_->SetEnabled(passphrase_enabled &&
498 passphrase_ui_data_.IsEditable());
499 passphrase_label_->SetEnabled(passphrase_enabled);
500 if (!passphrase_enabled)
501 passphrase_textfield_->SetText(base::string16());
504 bool certs_loading = CertLibrary::Get()->CertificatesLoading();
505 bool user_cert_enabled = UserCertActive();
506 user_cert_label_->SetEnabled(user_cert_enabled);
507 bool have_user_certs = !certs_loading && HaveUserCerts();
508 user_cert_combobox_->SetEnabled(user_cert_enabled &&
510 user_cert_ui_data_.IsEditable());
511 user_cert_combobox_->ModelChanged();
512 user_cert_combobox_->SetSelectedIndex(0);
515 bool ca_cert_enabled = CaCertActive();
516 server_ca_cert_label_->SetEnabled(ca_cert_enabled);
517 server_ca_cert_combobox_->SetEnabled(ca_cert_enabled &&
519 server_ca_cert_ui_data_.IsEditable());
520 server_ca_cert_combobox_->ModelChanged();
521 server_ca_cert_combobox_->SetSelectedIndex(0);
524 bool subject_match_enabled =
525 ca_cert_enabled && eap_method_combobox_ &&
526 eap_method_combobox_->selected_index() == EAP_METHOD_INDEX_TLS;
527 subject_match_label_->SetEnabled(subject_match_enabled);
528 subject_match_textfield_->SetEnabled(subject_match_enabled);
529 if (!subject_match_enabled)
530 subject_match_textfield_->SetText(base::string16());
532 // No anonymous identity if no phase 2 auth.
533 bool identity_anonymous_enabled = phase_2_auth_enabled;
534 identity_anonymous_textfield_->SetEnabled(
535 identity_anonymous_enabled && identity_anonymous_ui_data_.IsEditable());
536 identity_anonymous_label_->SetEnabled(identity_anonymous_enabled);
537 if (!identity_anonymous_enabled)
538 identity_anonymous_textfield_->SetText(base::string16());
540 RefreshShareCheckbox();
543 void WifiConfigView::RefreshShareCheckbox() {
544 if (!share_network_checkbox_)
547 if (security_combobox_ &&
548 security_combobox_->selected_index() == SECURITY_INDEX_NONE) {
549 share_network_checkbox_->SetEnabled(false);
550 share_network_checkbox_->SetChecked(true);
551 } else if (eap_method_combobox_ &&
552 (eap_method_combobox_->selected_index() == EAP_METHOD_INDEX_TLS ||
553 user_cert_combobox_->selected_index() != 0)) {
554 // Can not share TLS network (requires certificate), or any network where
555 // user certificates are enabled.
556 share_network_checkbox_->SetEnabled(false);
557 share_network_checkbox_->SetChecked(false);
558 } else if (!LoginState::Get()->IsUserAuthenticated()) {
559 // If not logged in as an authenticated user, networks must be shared.
560 share_network_checkbox_->SetEnabled(false);
561 share_network_checkbox_->SetChecked(true);
563 share_network_checkbox_->SetEnabled(true);
564 share_network_checkbox_->SetChecked(false); // Default to unshared.
568 void WifiConfigView::UpdateErrorLabel() {
569 base::string16 error_msg;
570 if (UserCertRequired() && CertLibrary::Get()->CertificatesLoaded()) {
571 if (!HaveUserCerts()) {
572 if (!LoginState::Get()->IsUserAuthenticated()) {
573 error_msg = l10n_util::GetStringUTF16(
574 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_LOGIN_FOR_USER_CERT);
576 error_msg = l10n_util::GetStringUTF16(
577 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PLEASE_INSTALL_USER_CERT);
579 } else if (!IsUserCertValid()) {
580 error_msg = l10n_util::GetStringUTF16(
581 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_REQUIRE_HARDWARE_BACKED);
584 if (error_msg.empty() && !service_path_.empty()) {
585 const NetworkState* wifi = NetworkHandler::Get()->network_state_handler()->
586 GetNetworkState(service_path_);
587 if (wifi && wifi->connection_state() == shill::kStateFailure)
588 error_msg = ash::network_connect::ErrorString(
589 wifi->error(), wifi->path());
591 if (!error_msg.empty()) {
592 error_label_->SetText(error_msg);
593 error_label_->SetVisible(true);
595 error_label_->SetVisible(false);
599 void WifiConfigView::ContentsChanged(views::Textfield* sender,
600 const base::string16& new_contents) {
601 UpdateDialogButtons();
604 bool WifiConfigView::HandleKeyEvent(views::Textfield* sender,
605 const ui::KeyEvent& key_event) {
606 if (sender == passphrase_textfield_ &&
607 key_event.key_code() == ui::VKEY_RETURN) {
608 parent_->GetDialogClientView()->AcceptWindow();
613 void WifiConfigView::ButtonPressed(views::Button* sender,
614 const ui::Event& event) {
615 if (sender == passphrase_visible_button_ && passphrase_textfield_) {
616 if (passphrase_textfield_->GetTextInputType() == ui::TEXT_INPUT_TYPE_TEXT) {
617 passphrase_textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
618 passphrase_visible_button_->SetToggled(false);
620 passphrase_textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_TEXT);
621 passphrase_visible_button_->SetToggled(true);
628 void WifiConfigView::OnPerformAction(views::Combobox* combobox) {
629 if (combobox == security_combobox_) {
630 bool passphrase_enabled = PassphraseActive();
631 passphrase_label_->SetEnabled(passphrase_enabled);
632 passphrase_textfield_->SetEnabled(passphrase_enabled &&
633 passphrase_ui_data_.IsEditable());
634 if (!passphrase_enabled)
635 passphrase_textfield_->SetText(base::string16());
636 RefreshShareCheckbox();
637 } else if (combobox == user_cert_combobox_) {
638 RefreshShareCheckbox();
639 } else if (combobox == eap_method_combobox_) {
642 UpdateDialogButtons();
646 void WifiConfigView::OnCertificatesLoaded(bool initial_load) {
648 UpdateDialogButtons();
652 bool WifiConfigView::Login() {
653 const NetworkState* wifi = !service_path_.empty() ?
654 NetworkHandler::Get()->network_state_handler()->
655 GetNetworkState(service_path_) :
658 // Set configuration properties.
659 base::DictionaryValue properties;
661 // Default shared state for non-private networks is true.
662 const bool share_default = !wifi || !wifi->IsPrivate();
663 bool share_network = GetShareNetwork(share_default);
664 bool only_policy_autoconnect =
665 onc::PolicyAllowsOnlyPolicyNetworksToAutoconnect(!share_network);
666 if (only_policy_autoconnect) {
667 properties.SetBooleanWithoutPathExpansion(shill::kAutoConnectProperty,
671 if (service_path_.empty()) {
672 properties.SetStringWithoutPathExpansion(
673 shill::kTypeProperty, shill::kTypeWifi);
674 shill_property_util::SetSSID(GetSsid(), &properties);
675 properties.SetStringWithoutPathExpansion(
676 shill::kModeProperty, shill::kModeManaged);
677 properties.SetBooleanWithoutPathExpansion(
678 shill::kSaveCredentialsProperty, GetSaveCredentials());
679 std::string security = shill::kSecurityNone;
680 if (!eap_method_combobox_) {
681 // Hidden ordinary Wi-Fi connection.
682 switch (security_combobox_->selected_index()) {
683 case SECURITY_INDEX_NONE:
684 security = shill::kSecurityNone;
686 case SECURITY_INDEX_WEP:
687 security = shill::kSecurityWep;
689 case SECURITY_INDEX_PSK:
690 security = shill::kSecurityPsk;
693 std::string passphrase = GetPassphrase();
694 if (!passphrase.empty()) {
695 properties.SetStringWithoutPathExpansion(
696 shill::kPassphraseProperty, GetPassphrase());
699 // Hidden 802.1X EAP Wi-Fi connection.
700 security = shill::kSecurity8021x;
701 SetEapProperties(&properties);
703 properties.SetStringWithoutPathExpansion(
704 shill::kSecurityProperty, security);
706 // Configure and connect to network.
707 ash::network_connect::CreateConfigurationAndConnect(&properties,
711 // Shill no longer knows about this wifi network (edge case).
712 // TODO(stevenjb): Add notification for this.
713 NET_LOG_ERROR("Network not found", service_path_);
714 return true; // Close dialog
716 if (eap_method_combobox_) {
717 // Visible 802.1X EAP Wi-Fi connection.
718 SetEapProperties(&properties);
719 properties.SetBooleanWithoutPathExpansion(
720 shill::kSaveCredentialsProperty, GetSaveCredentials());
722 // Visible ordinary Wi-Fi connection.
723 const std::string passphrase = GetPassphrase();
724 if (!passphrase.empty()) {
725 properties.SetStringWithoutPathExpansion(
726 shill::kPassphraseProperty, passphrase);
729 ash::network_connect::ConfigureNetworkAndConnect(
730 service_path_, properties, share_network);
732 return true; // dialog will be closed
735 std::string WifiConfigView::GetSsid() const {
737 if (ssid_textfield_ != NULL) {
738 std::string untrimmed = base::UTF16ToUTF8(ssid_textfield_->text());
739 TrimWhitespaceASCII(untrimmed, TRIM_ALL, &result);
744 std::string WifiConfigView::GetPassphrase() const {
746 if (passphrase_textfield_ != NULL)
747 result = base::UTF16ToUTF8(passphrase_textfield_->text());
751 bool WifiConfigView::GetSaveCredentials() const {
752 if (!save_credentials_checkbox_)
753 return true; // share networks by default (e.g. non 8021x).
754 return save_credentials_checkbox_->checked();
757 bool WifiConfigView::GetShareNetwork(bool share_default) const {
758 if (!share_network_checkbox_)
759 return share_default;
760 return share_network_checkbox_->checked();
763 std::string WifiConfigView::GetEapMethod() const {
764 DCHECK(eap_method_combobox_);
765 switch (eap_method_combobox_->selected_index()) {
766 case EAP_METHOD_INDEX_PEAP:
767 return shill::kEapMethodPEAP;
768 case EAP_METHOD_INDEX_TLS:
769 return shill::kEapMethodTLS;
770 case EAP_METHOD_INDEX_TTLS:
771 return shill::kEapMethodTTLS;
772 case EAP_METHOD_INDEX_LEAP:
773 return shill::kEapMethodLEAP;
774 case EAP_METHOD_INDEX_NONE:
780 std::string WifiConfigView::GetEapPhase2Auth() const {
781 DCHECK(phase_2_auth_combobox_);
782 bool is_peap = (GetEapMethod() == shill::kEapMethodPEAP);
783 switch (phase_2_auth_combobox_->selected_index()) {
784 case PHASE_2_AUTH_INDEX_MD5:
785 return is_peap ? shill::kEapPhase2AuthPEAPMD5
786 : shill::kEapPhase2AuthTTLSMD5;
787 case PHASE_2_AUTH_INDEX_MSCHAPV2:
788 return is_peap ? shill::kEapPhase2AuthPEAPMSCHAPV2
789 : shill::kEapPhase2AuthTTLSMSCHAPV2;
790 case PHASE_2_AUTH_INDEX_MSCHAP:
791 return shill::kEapPhase2AuthTTLSMSCHAP;
792 case PHASE_2_AUTH_INDEX_PAP:
793 return shill::kEapPhase2AuthTTLSPAP;
794 case PHASE_2_AUTH_INDEX_CHAP:
795 return shill::kEapPhase2AuthTTLSCHAP;
796 case PHASE_2_AUTH_INDEX_AUTO:
802 std::string WifiConfigView::GetEapServerCaCertPEM() const {
803 DCHECK(server_ca_cert_combobox_);
804 int index = server_ca_cert_combobox_->selected_index();
806 // First item is "Default".
807 return std::string();
808 } else if (index == server_ca_cert_combobox_->model()->GetItemCount() - 1) {
809 // Last item is "Do not check".
810 return std::string();
812 int cert_index = index - 1;
813 return CertLibrary::Get()->GetCertPEMAt(
814 CertLibrary::CERT_TYPE_SERVER_CA, cert_index);
818 bool WifiConfigView::GetEapUseSystemCas() const {
819 DCHECK(server_ca_cert_combobox_);
820 // Only use system CAs if the first item ("Default") is selected.
821 return server_ca_cert_combobox_->selected_index() == 0;
824 std::string WifiConfigView::GetEapSubjectMatch() const {
825 DCHECK(subject_match_textfield_);
826 return base::UTF16ToUTF8(subject_match_textfield_->text());
829 std::string WifiConfigView::GetEapClientCertPkcs11Id() const {
830 DCHECK(user_cert_combobox_);
831 if (!HaveUserCerts() || !UserCertActive()) {
832 return std::string(); // No certificate selected or not required.
834 // Certificates are listed in the order they appear in the model.
835 int index = user_cert_combobox_->selected_index();
836 return CertLibrary::Get()->GetCertPkcs11IdAt(
837 CertLibrary::CERT_TYPE_USER, index);
841 std::string WifiConfigView::GetEapIdentity() const {
842 DCHECK(identity_textfield_);
843 return base::UTF16ToUTF8(identity_textfield_->text());
846 std::string WifiConfigView::GetEapAnonymousIdentity() const {
847 DCHECK(identity_anonymous_textfield_);
848 return base::UTF16ToUTF8(identity_anonymous_textfield_->text());
851 void WifiConfigView::SetEapProperties(base::DictionaryValue* properties) {
852 properties->SetStringWithoutPathExpansion(
853 shill::kEapIdentityProperty, GetEapIdentity());
854 properties->SetStringWithoutPathExpansion(
855 shill::kEapMethodProperty, GetEapMethod());
856 properties->SetStringWithoutPathExpansion(
857 shill::kEapPhase2AuthProperty, GetEapPhase2Auth());
858 properties->SetStringWithoutPathExpansion(
859 shill::kEapAnonymousIdentityProperty, GetEapAnonymousIdentity());
860 properties->SetStringWithoutPathExpansion(
861 shill::kEapSubjectMatchProperty, GetEapSubjectMatch());
863 // shill requires both CertID and KeyID for TLS connections, despite
864 // the fact that by convention they are the same ID.
865 properties->SetStringWithoutPathExpansion(
866 shill::kEapCertIdProperty, GetEapClientCertPkcs11Id());
867 properties->SetStringWithoutPathExpansion(
868 shill::kEapKeyIdProperty, GetEapClientCertPkcs11Id());
870 properties->SetBooleanWithoutPathExpansion(
871 shill::kEapUseSystemCasProperty, GetEapUseSystemCas());
872 properties->SetStringWithoutPathExpansion(
873 shill::kEapPasswordProperty, GetPassphrase());
875 base::ListValue* pem_list = new base::ListValue;
876 pem_list->AppendString(GetEapServerCaCertPEM());
877 properties->SetWithoutPathExpansion(
878 shill::kEapCaCertPemProperty, pem_list);
881 void WifiConfigView::Cancel() {
884 // This will initialize the view depending on if we have a wifi network or not.
885 // And if we are doing simple password encryption or the more complicated
886 // 802.1x encryption.
887 // If we are creating the "Join other network..." dialog, we will allow user
888 // to enter the data. And if they select the 802.1x encryption, we will show
889 // the 802.1x fields.
890 void WifiConfigView::Init(bool show_8021x) {
891 const NetworkState* wifi = NetworkHandler::Get()->network_state_handler()->
892 GetNetworkState(service_path_);
894 DCHECK(wifi->type() == shill::kTypeWifi);
895 if (wifi->security() == shill::kSecurity8021x)
897 ParseWiFiEAPUIProperty(&eap_method_ui_data_, wifi, ::onc::eap::kOuter);
898 ParseWiFiEAPUIProperty(&phase_2_auth_ui_data_, wifi, ::onc::eap::kInner);
899 ParseWiFiEAPUIProperty(&user_cert_ui_data_, wifi,
900 ::onc::eap::kClientCertRef);
901 ParseWiFiEAPUIProperty(&server_ca_cert_ui_data_, wifi,
902 ::onc::eap::kServerCARef);
903 if (server_ca_cert_ui_data_.IsManaged()) {
904 ParseWiFiEAPUIProperty(&server_ca_cert_ui_data_, wifi,
905 ::onc::eap::kUseSystemCAs);
907 ParseWiFiEAPUIProperty(&identity_ui_data_, wifi, ::onc::eap::kIdentity);
908 ParseWiFiEAPUIProperty(&identity_anonymous_ui_data_, wifi,
909 ::onc::eap::kAnonymousIdentity);
910 ParseWiFiEAPUIProperty(&save_credentials_ui_data_, wifi,
911 ::onc::eap::kSaveCredentials);
913 ParseWiFiEAPUIProperty(&passphrase_ui_data_, wifi, ::onc::eap::kPassword);
915 ParseWiFiUIProperty(&passphrase_ui_data_, wifi, ::onc::wifi::kPassphrase);
918 views::GridLayout* layout = views::GridLayout::CreatePanel(this);
919 SetLayoutManager(layout);
921 const int column_view_set_id = 0;
922 views::ColumnSet* column_set = layout->AddColumnSet(column_view_set_id);
923 const int kPasswordVisibleWidth = 20;
925 column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1,
926 views::GridLayout::USE_PREF, 0, 0);
927 column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing);
928 // Textfield, combobox.
929 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
930 views::GridLayout::USE_PREF, 0,
931 ChildNetworkConfigView::kInputFieldMinWidth);
932 column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing);
933 // Password visible button / policy indicator.
934 column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::FILL, 1,
935 views::GridLayout::USE_PREF, 0, kPasswordVisibleWidth);
938 layout->StartRow(0, column_view_set_id);
939 layout->AddView(new views::Label(l10n_util::GetStringUTF16(
940 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_NETWORK_ID)));
942 ssid_textfield_ = new views::Textfield();
943 ssid_textfield_->set_controller(this);
944 ssid_textfield_->SetAccessibleName(l10n_util::GetStringUTF16(
945 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_NETWORK_ID));
946 layout->AddView(ssid_textfield_);
948 views::Label* label = new views::Label(base::UTF8ToUTF16(wifi->name()));
949 label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
950 layout->AddView(label);
952 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
955 if (!wifi && !show_8021x) {
956 layout->StartRow(0, column_view_set_id);
957 base::string16 label_text = l10n_util::GetStringUTF16(
958 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY);
959 layout->AddView(new views::Label(label_text));
960 security_combobox_model_.reset(new internal::SecurityComboboxModel);
961 security_combobox_ = new views::Combobox(security_combobox_model_.get());
962 security_combobox_->SetAccessibleName(label_text);
963 security_combobox_->set_listener(this);
964 layout->AddView(security_combobox_);
965 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
968 // Only enumerate certificates in the data model for 802.1X networks.
970 // Observer any changes to the certificate list.
971 CertLibrary::Get()->AddObserver(this);
974 layout->StartRow(0, column_view_set_id);
975 base::string16 eap_label_text = l10n_util::GetStringUTF16(
976 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD);
977 layout->AddView(new views::Label(eap_label_text));
978 eap_method_combobox_model_.reset(new internal::EAPMethodComboboxModel);
979 eap_method_combobox_ = new views::Combobox(
980 eap_method_combobox_model_.get());
981 eap_method_combobox_->SetAccessibleName(eap_label_text);
982 eap_method_combobox_->set_listener(this);
983 eap_method_combobox_->SetEnabled(eap_method_ui_data_.IsEditable());
984 layout->AddView(eap_method_combobox_);
985 layout->AddView(new ControlledSettingIndicatorView(eap_method_ui_data_));
986 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
988 // Phase 2 authentication
989 layout->StartRow(0, column_view_set_id);
990 base::string16 phase_2_label_text = l10n_util::GetStringUTF16(
991 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH);
992 phase_2_auth_label_ = new views::Label(phase_2_label_text);
993 layout->AddView(phase_2_auth_label_);
994 phase_2_auth_combobox_model_.reset(
995 new internal::Phase2AuthComboboxModel(eap_method_combobox_));
996 phase_2_auth_combobox_ = new views::Combobox(
997 phase_2_auth_combobox_model_.get());
998 phase_2_auth_combobox_->SetAccessibleName(phase_2_label_text);
999 phase_2_auth_label_->SetEnabled(false);
1000 phase_2_auth_combobox_->SetEnabled(false);
1001 phase_2_auth_combobox_->set_listener(this);
1002 layout->AddView(phase_2_auth_combobox_);
1003 layout->AddView(new ControlledSettingIndicatorView(phase_2_auth_ui_data_));
1004 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1006 // Server CA certificate
1007 layout->StartRow(0, column_view_set_id);
1008 base::string16 server_ca_cert_label_text = l10n_util::GetStringUTF16(
1009 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA);
1010 server_ca_cert_label_ = new views::Label(server_ca_cert_label_text);
1011 layout->AddView(server_ca_cert_label_);
1012 server_ca_cert_combobox_model_.reset(
1013 new internal::ServerCACertComboboxModel());
1014 server_ca_cert_combobox_ = new ComboboxWithWidth(
1015 server_ca_cert_combobox_model_.get(),
1016 ChildNetworkConfigView::kInputFieldMinWidth);
1017 server_ca_cert_combobox_->SetAccessibleName(server_ca_cert_label_text);
1018 server_ca_cert_label_->SetEnabled(false);
1019 server_ca_cert_combobox_->SetEnabled(false);
1020 server_ca_cert_combobox_->set_listener(this);
1021 layout->AddView(server_ca_cert_combobox_);
1023 new ControlledSettingIndicatorView(server_ca_cert_ui_data_));
1024 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1027 layout->StartRow(0, column_view_set_id);
1028 base::string16 subject_match_label_text = l10n_util::GetStringUTF16(
1029 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_SUBJECT_MATCH);
1030 subject_match_label_ = new views::Label(subject_match_label_text);
1031 layout->AddView(subject_match_label_);
1032 subject_match_textfield_ = new views::Textfield();
1033 subject_match_textfield_->SetAccessibleName(subject_match_label_text);
1034 subject_match_textfield_->set_controller(this);
1035 layout->AddView(subject_match_textfield_);
1036 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1039 layout->StartRow(0, column_view_set_id);
1040 base::string16 user_cert_label_text = l10n_util::GetStringUTF16(
1041 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT);
1042 user_cert_label_ = new views::Label(user_cert_label_text);
1043 layout->AddView(user_cert_label_);
1044 user_cert_combobox_model_.reset(new internal::UserCertComboboxModel(this));
1045 user_cert_combobox_ = new views::Combobox(user_cert_combobox_model_.get());
1046 user_cert_combobox_->SetAccessibleName(user_cert_label_text);
1047 user_cert_label_->SetEnabled(false);
1048 user_cert_combobox_->SetEnabled(false);
1049 user_cert_combobox_->set_listener(this);
1050 layout->AddView(user_cert_combobox_);
1051 layout->AddView(new ControlledSettingIndicatorView(user_cert_ui_data_));
1052 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1055 layout->StartRow(0, column_view_set_id);
1056 base::string16 identity_label_text = l10n_util::GetStringUTF16(
1057 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_IDENTITY);
1058 identity_label_ = new views::Label(identity_label_text);
1059 layout->AddView(identity_label_);
1060 identity_textfield_ = new views::Textfield();
1061 identity_textfield_->SetAccessibleName(identity_label_text);
1062 identity_textfield_->set_controller(this);
1063 identity_textfield_->SetEnabled(identity_ui_data_.IsEditable());
1064 layout->AddView(identity_textfield_);
1065 layout->AddView(new ControlledSettingIndicatorView(identity_ui_data_));
1066 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1070 layout->StartRow(0, column_view_set_id);
1071 int label_text_id = IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE;
1072 base::string16 passphrase_label_text =
1073 l10n_util::GetStringUTF16(label_text_id);
1074 passphrase_label_ = new views::Label(passphrase_label_text);
1075 layout->AddView(passphrase_label_);
1076 passphrase_textfield_ = new PassphraseTextfield();
1077 passphrase_textfield_->set_controller(this);
1078 // Disable passphrase input initially for other network.
1079 passphrase_label_->SetEnabled(wifi);
1080 passphrase_textfield_->SetEnabled(wifi && passphrase_ui_data_.IsEditable());
1081 passphrase_textfield_->SetAccessibleName(passphrase_label_text);
1082 layout->AddView(passphrase_textfield_);
1084 if (passphrase_ui_data_.IsManaged()) {
1085 layout->AddView(new ControlledSettingIndicatorView(passphrase_ui_data_));
1087 // Password visible button.
1088 passphrase_visible_button_ = new views::ToggleImageButton(this);
1089 passphrase_visible_button_->SetFocusable(true);
1090 passphrase_visible_button_->SetTooltipText(
1091 l10n_util::GetStringUTF16(
1092 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE_SHOW));
1093 passphrase_visible_button_->SetToggledTooltipText(
1094 l10n_util::GetStringUTF16(
1095 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE_HIDE));
1096 passphrase_visible_button_->SetImage(
1097 views::ImageButton::STATE_NORMAL,
1098 ResourceBundle::GetSharedInstance().
1099 GetImageSkiaNamed(IDR_NETWORK_SHOW_PASSWORD));
1100 passphrase_visible_button_->SetImage(
1101 views::ImageButton::STATE_HOVERED,
1102 ResourceBundle::GetSharedInstance().
1103 GetImageSkiaNamed(IDR_NETWORK_SHOW_PASSWORD_HOVER));
1104 passphrase_visible_button_->SetToggledImage(
1105 views::ImageButton::STATE_NORMAL,
1106 ResourceBundle::GetSharedInstance().
1107 GetImageSkiaNamed(IDR_NETWORK_HIDE_PASSWORD));
1108 passphrase_visible_button_->SetToggledImage(
1109 views::ImageButton::STATE_HOVERED,
1110 ResourceBundle::GetSharedInstance().
1111 GetImageSkiaNamed(IDR_NETWORK_HIDE_PASSWORD_HOVER));
1112 passphrase_visible_button_->SetImageAlignment(
1113 views::ImageButton::ALIGN_CENTER, views::ImageButton::ALIGN_MIDDLE);
1114 layout->AddView(passphrase_visible_button_);
1117 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1120 // Anonymous identity
1121 layout->StartRow(0, column_view_set_id);
1122 identity_anonymous_label_ =
1123 new views::Label(l10n_util::GetStringUTF16(
1124 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_IDENTITY_ANONYMOUS));
1125 layout->AddView(identity_anonymous_label_);
1126 identity_anonymous_textfield_ = new views::Textfield();
1127 identity_anonymous_label_->SetEnabled(false);
1128 identity_anonymous_textfield_->SetEnabled(false);
1129 identity_anonymous_textfield_->set_controller(this);
1130 layout->AddView(identity_anonymous_textfield_);
1132 new ControlledSettingIndicatorView(identity_anonymous_ui_data_));
1133 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1140 layout->StartRow(0, column_view_set_id);
1141 save_credentials_checkbox_ = new views::Checkbox(
1142 l10n_util::GetStringUTF16(
1143 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SAVE_CREDENTIALS));
1144 save_credentials_checkbox_->SetEnabled(
1145 save_credentials_ui_data_.IsEditable());
1146 layout->SkipColumns(1);
1147 layout->AddView(save_credentials_checkbox_);
1149 new ControlledSettingIndicatorView(save_credentials_ui_data_));
1153 if (!wifi || wifi->profile_path().empty()) {
1154 layout->StartRow(0, column_view_set_id);
1155 share_network_checkbox_ = new views::Checkbox(
1156 l10n_util::GetStringUTF16(
1157 IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SHARE_NETWORK));
1158 layout->SkipColumns(1);
1159 layout->AddView(share_network_checkbox_);
1161 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
1163 // Create an error label.
1164 layout->StartRow(0, column_view_set_id);
1165 layout->SkipColumns(1);
1166 error_label_ = new views::Label();
1167 error_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1168 error_label_->SetEnabledColor(SK_ColorRED);
1169 layout->AddView(error_label_);
1171 // Initialize the field and checkbox values.
1173 if (!wifi && show_8021x)
1176 RefreshShareCheckbox();
1180 NetworkHandler::Get()->network_configuration_handler()->GetProperties(
1182 base::Bind(&WifiConfigView::InitFromProperties,
1183 weak_ptr_factory_.GetWeakPtr(), show_8021x),
1184 base::Bind(&ShillError, "GetProperties"));
1188 void WifiConfigView::InitFromProperties(
1190 const std::string& service_path,
1191 const base::DictionaryValue& properties) {
1193 std::string passphrase;
1194 properties.GetStringWithoutPathExpansion(
1195 shill::kPassphraseProperty, &passphrase);
1196 passphrase_textfield_->SetText(base::UTF8ToUTF16(passphrase));
1201 std::string eap_method;
1202 properties.GetStringWithoutPathExpansion(
1203 shill::kEapMethodProperty, &eap_method);
1204 if (eap_method == shill::kEapMethodPEAP)
1205 eap_method_combobox_->SetSelectedIndex(EAP_METHOD_INDEX_PEAP);
1206 else if (eap_method == shill::kEapMethodTTLS)
1207 eap_method_combobox_->SetSelectedIndex(EAP_METHOD_INDEX_TTLS);
1208 else if (eap_method == shill::kEapMethodTLS)
1209 eap_method_combobox_->SetSelectedIndex(EAP_METHOD_INDEX_TLS);
1210 else if (eap_method == shill::kEapMethodLEAP)
1211 eap_method_combobox_->SetSelectedIndex(EAP_METHOD_INDEX_LEAP);
1214 // Phase 2 authentication and anonymous identity.
1215 if (Phase2AuthActive()) {
1216 std::string eap_phase_2_auth;
1217 properties.GetStringWithoutPathExpansion(
1218 shill::kEapPhase2AuthProperty, &eap_phase_2_auth);
1219 if (eap_phase_2_auth == shill::kEapPhase2AuthTTLSMD5)
1220 phase_2_auth_combobox_->SetSelectedIndex(PHASE_2_AUTH_INDEX_MD5);
1221 else if (eap_phase_2_auth == shill::kEapPhase2AuthTTLSMSCHAPV2)
1222 phase_2_auth_combobox_->SetSelectedIndex(PHASE_2_AUTH_INDEX_MSCHAPV2);
1223 else if (eap_phase_2_auth == shill::kEapPhase2AuthTTLSMSCHAP)
1224 phase_2_auth_combobox_->SetSelectedIndex(PHASE_2_AUTH_INDEX_MSCHAP);
1225 else if (eap_phase_2_auth == shill::kEapPhase2AuthTTLSPAP)
1226 phase_2_auth_combobox_->SetSelectedIndex(PHASE_2_AUTH_INDEX_PAP);
1227 else if (eap_phase_2_auth == shill::kEapPhase2AuthTTLSCHAP)
1228 phase_2_auth_combobox_->SetSelectedIndex(PHASE_2_AUTH_INDEX_CHAP);
1230 std::string eap_anonymous_identity;
1231 properties.GetStringWithoutPathExpansion(
1232 shill::kEapAnonymousIdentityProperty, &eap_anonymous_identity);
1233 identity_anonymous_textfield_->SetText(
1234 base::UTF8ToUTF16(eap_anonymous_identity));
1238 std::string subject_match;
1239 properties.GetStringWithoutPathExpansion(
1240 shill::kEapSubjectMatchProperty, &subject_match);
1241 subject_match_textfield_->SetText(base::UTF8ToUTF16(subject_match));
1243 // Server CA certificate.
1244 if (CaCertActive()) {
1245 std::string eap_ca_cert_pem;
1246 const base::ListValue* pems = NULL;
1247 if (properties.GetListWithoutPathExpansion(
1248 shill::kEapCaCertPemProperty, &pems))
1249 pems->GetString(0, &eap_ca_cert_pem);
1250 if (eap_ca_cert_pem.empty()) {
1251 bool eap_use_system_cas = false;
1252 properties.GetBooleanWithoutPathExpansion(
1253 shill::kEapUseSystemCasProperty, &eap_use_system_cas);
1254 if (eap_use_system_cas) {
1256 server_ca_cert_combobox_->SetSelectedIndex(0);
1259 server_ca_cert_combobox_->SetSelectedIndex(
1260 server_ca_cert_combobox_->model()->GetItemCount() - 1);
1263 // Select the certificate if available.
1264 int cert_index = CertLibrary::Get()->GetCertIndexByPEM(
1265 CertLibrary::CERT_TYPE_SERVER_CA, eap_ca_cert_pem);
1266 if (cert_index >= 0) {
1267 // Skip item for "Default".
1268 server_ca_cert_combobox_->SetSelectedIndex(1 + cert_index);
1271 server_ca_cert_combobox_->SetSelectedIndex(0);
1276 // User certificate.
1277 if (UserCertActive()) {
1278 std::string eap_cert_id;
1279 properties.GetStringWithoutPathExpansion(
1280 shill::kEapCertIdProperty, &eap_cert_id);
1281 if (!eap_cert_id.empty()) {
1282 int cert_index = CertLibrary::Get()->GetCertIndexByPkcs11Id(
1283 CertLibrary::CERT_TYPE_USER, eap_cert_id);
1284 if (cert_index >= 0)
1285 user_cert_combobox_->SetSelectedIndex(cert_index);
1289 // Identity is always active.
1290 std::string eap_identity;
1291 properties.GetStringWithoutPathExpansion(
1292 shill::kEapIdentityProperty, &eap_identity);
1293 identity_textfield_->SetText(base::UTF8ToUTF16(eap_identity));
1296 if (PassphraseActive()) {
1297 std::string eap_password;
1298 properties.GetStringWithoutPathExpansion(
1299 shill::kEapPasswordProperty, &eap_password);
1300 passphrase_textfield_->SetText(base::UTF8ToUTF16(eap_password));
1301 // If 'Connectable' is True, show a fake passphrase to indicate that it
1302 // has already been set.
1303 bool connectable = false;
1304 properties.GetBooleanWithoutPathExpansion(
1305 shill::kConnectableProperty, &connectable);
1306 passphrase_textfield_->SetShowFake(connectable);
1310 bool save_credentials = false;
1311 properties.GetBooleanWithoutPathExpansion(
1312 shill::kSaveCredentialsProperty, &save_credentials);
1313 save_credentials_checkbox_->SetChecked(save_credentials);
1315 UpdateDialogButtons();
1316 RefreshShareCheckbox();
1320 void WifiConfigView::InitFocus() {
1321 views::View* view_to_focus = GetInitiallyFocusedView();
1323 view_to_focus->RequestFocus();
1326 void WifiConfigView::NetworkPropertiesUpdated(const NetworkState* network) {
1327 if (network->path() != service_path_)
1333 void WifiConfigView::ParseWiFiUIProperty(
1334 NetworkPropertyUIData* property_ui_data,
1335 const NetworkState* network,
1336 const std::string& key) {
1337 ::onc::ONCSource onc_source = ::onc::ONC_SOURCE_NONE;
1338 const base::DictionaryValue* onc =
1339 onc::FindPolicyForActiveUser(network->guid(), &onc_source);
1341 property_ui_data->ParseOncProperty(
1344 base::StringPrintf("%s.%s", ::onc::network_config::kWiFi, key.c_str()));
1348 void WifiConfigView::ParseWiFiEAPUIProperty(
1349 NetworkPropertyUIData* property_ui_data,
1350 const NetworkState* network,
1351 const std::string& key) {
1352 ParseWiFiUIProperty(
1353 property_ui_data, network,
1354 base::StringPrintf("%s.%s", ::onc::wifi::kEAP, key.c_str()));
1357 } // namespace chromeos