| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/chromeos/options/wifi_config_view.h" |
| |
| #include "base/command_line.h" // TODO(jamescook): Remove. |
| #include "base/string_util.h" |
| #include "base/utf_string_conversions.h" |
| #include "chrome/browser/chromeos/cros/cros_library.h" |
| #include "chrome/browser/chromeos/login/user_manager.h" |
| #include "chrome/browser/chromeos/options/wifi_config_model.h" |
| #include "chrome/common/chrome_switches.h" // TODO(jamescook): Remove. |
| #include "grit/chromium_strings.h" |
| #include "grit/generated_resources.h" |
| #include "grit/locale_settings.h" |
| #include "grit/theme_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "views/controls/button/checkbox.h" |
| #include "views/controls/button/image_button.h" |
| #include "views/controls/button/native_button.h" |
| #include "views/controls/label.h" |
| #include "views/controls/textfield/textfield.h" |
| #include "views/layout/grid_layout.h" |
| #include "views/layout/layout_constants.h" |
| #include "views/window/window.h" |
| |
| namespace chromeos { |
| |
| namespace { |
| |
| enum SecurityComboboxIndex { |
| SECURITY_INDEX_NONE = 0, |
| SECURITY_INDEX_WEP = 1, |
| SECURITY_INDEX_WPA = 2, |
| SECURITY_INDEX_RSN = 3, |
| SECURITY_INDEX_COUNT = 4 |
| }; |
| |
| class SecurityComboboxModel : public ui::ComboboxModel { |
| public: |
| SecurityComboboxModel() {} |
| virtual ~SecurityComboboxModel() {} |
| virtual int GetItemCount() { |
| return SECURITY_INDEX_COUNT; |
| } |
| virtual string16 GetItemAt(int index) { |
| if (index == SECURITY_INDEX_NONE) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_NONE); |
| else if (index == SECURITY_INDEX_WEP) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_WEP); |
| else if (index == SECURITY_INDEX_WPA) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_WPA); |
| else if (index == SECURITY_INDEX_RSN) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY_RSN); |
| NOTREACHED(); |
| return string16(); |
| } |
| private: |
| DISALLOW_COPY_AND_ASSIGN(SecurityComboboxModel); |
| }; |
| |
| // TODO(jamescook): For M12 we only expose PEAP and EAP-TTLS. Later, when |
| // when we support all methods by default, order this list to be alphabetical. |
| enum EAPMethodComboboxIndex { |
| EAP_METHOD_INDEX_NONE = 0, |
| EAP_METHOD_INDEX_PEAP = 1, |
| EAP_METHOD_INDEX_TTLS = 2, // By default we support up to here. |
| EAP_METHOD_INDEX_TLS = 3, |
| EAP_METHOD_INDEX_LEAP = 4, // Flag "--enable-all-eap" allows up to here. |
| EAP_METHOD_INDEX_COUNT = 5 |
| }; |
| |
| class EAPMethodComboboxModel : public ui::ComboboxModel { |
| public: |
| EAPMethodComboboxModel() {} |
| virtual ~EAPMethodComboboxModel() {} |
| virtual int GetItemCount() { |
| // TODO(jamescook): For M12 we only expose PEAP and EAP-TTLS by default. |
| // Remove this switch when all methods are supported. |
| if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kEnableExperimentalEap)) |
| return EAP_METHOD_INDEX_TTLS + 1; |
| return EAP_METHOD_INDEX_COUNT; |
| } |
| virtual string16 GetItemAt(int index) { |
| if (index == EAP_METHOD_INDEX_NONE) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_NONE); |
| else if (index == EAP_METHOD_INDEX_PEAP) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_PEAP); |
| else if (index == EAP_METHOD_INDEX_TLS) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_TLS); |
| else if (index == EAP_METHOD_INDEX_TTLS) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_TTLS); |
| else if (index == EAP_METHOD_INDEX_LEAP) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD_LEAP); |
| NOTREACHED(); |
| return string16(); |
| } |
| private: |
| DISALLOW_COPY_AND_ASSIGN(EAPMethodComboboxModel); |
| }; |
| |
| enum Phase2AuthComboboxIndex { |
| PHASE_2_AUTH_INDEX_AUTO = 0, // LEAP, EAP-TLS have only this auth. |
| PHASE_2_AUTH_INDEX_MD5 = 1, |
| PHASE_2_AUTH_INDEX_MSCHAPV2 = 2, // PEAP has up to this auth. |
| PHASE_2_AUTH_INDEX_MSCHAP = 3, |
| PHASE_2_AUTH_INDEX_PAP = 4, |
| PHASE_2_AUTH_INDEX_CHAP = 5, // EAP-TTLS has up to this auth. |
| PHASE_2_AUTH_INDEX_COUNT = 6 |
| }; |
| |
| class Phase2AuthComboboxModel : public ui::ComboboxModel { |
| public: |
| explicit Phase2AuthComboboxModel(views::Combobox* eap_method_combobox) |
| : eap_method_combobox_(eap_method_combobox) {} |
| virtual ~Phase2AuthComboboxModel() {} |
| virtual int GetItemCount() { |
| switch (eap_method_combobox_->selected_item()) { |
| case EAP_METHOD_INDEX_NONE: |
| case EAP_METHOD_INDEX_TLS: |
| case EAP_METHOD_INDEX_LEAP: |
| return PHASE_2_AUTH_INDEX_AUTO + 1; |
| case EAP_METHOD_INDEX_PEAP: |
| return PHASE_2_AUTH_INDEX_MSCHAPV2 + 1; |
| case EAP_METHOD_INDEX_TTLS: |
| return PHASE_2_AUTH_INDEX_CHAP + 1; |
| } |
| NOTREACHED(); |
| return 0; |
| } |
| virtual string16 GetItemAt(int index) { |
| if (index == PHASE_2_AUTH_INDEX_AUTO) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_AUTO); |
| else if (index == PHASE_2_AUTH_INDEX_MD5) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MD5); |
| else if (index == PHASE_2_AUTH_INDEX_MSCHAPV2) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MSCHAPV2); |
| else if (index == PHASE_2_AUTH_INDEX_MSCHAP) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_MSCHAP); |
| else if (index == PHASE_2_AUTH_INDEX_PAP) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_PAP); |
| else if (index == PHASE_2_AUTH_INDEX_CHAP) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH_CHAP); |
| NOTREACHED(); |
| return string16(); |
| } |
| private: |
| views::Combobox* eap_method_combobox_; |
| DISALLOW_COPY_AND_ASSIGN(Phase2AuthComboboxModel); |
| }; |
| |
| // Combobox that supports a preferred width. Used by Server CA combobox |
| // because the strings inside it are too wide. |
| class ComboboxWithWidth : public views::Combobox { |
| public: |
| ComboboxWithWidth(ui::ComboboxModel* model, int width) |
| : Combobox(model), |
| width_(width) { |
| } |
| virtual ~ComboboxWithWidth() {} |
| virtual gfx::Size GetPreferredSize() OVERRIDE { |
| gfx::Size size = Combobox::GetPreferredSize(); |
| size.set_width(width_); |
| return size; |
| } |
| private: |
| int width_; |
| DISALLOW_COPY_AND_ASSIGN(ComboboxWithWidth); |
| }; |
| |
| class ServerCACertComboboxModel : public ui::ComboboxModel { |
| public: |
| explicit ServerCACertComboboxModel(WifiConfigModel* wifi_config_model) |
| : wifi_config_model_(wifi_config_model) { |
| } |
| virtual ~ServerCACertComboboxModel() {} |
| virtual int GetItemCount() { |
| // First "Default", then the certs, then "Do not check". |
| return wifi_config_model_->GetServerCaCertCount() + 2; |
| } |
| virtual string16 GetItemAt(int combo_index) { |
| if (combo_index == 0) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA_DEFAULT); |
| if (combo_index == GetItemCount() - 1) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA_DO_NOT_CHECK); |
| int cert_index = combo_index - 1; |
| return wifi_config_model_->GetServerCaCertName(cert_index); |
| } |
| private: |
| WifiConfigModel* wifi_config_model_; |
| DISALLOW_COPY_AND_ASSIGN(ServerCACertComboboxModel); |
| }; |
| |
| class ClientCertComboboxModel : public ui::ComboboxModel { |
| public: |
| explicit ClientCertComboboxModel(WifiConfigModel* wifi_config_model) |
| : wifi_config_model_(wifi_config_model) { |
| } |
| virtual ~ClientCertComboboxModel() {} |
| virtual int GetItemCount() { |
| // One initial item "None", then the certs. |
| return 1 + wifi_config_model_->GetUserCertCount(); |
| } |
| virtual string16 GetItemAt(int combo_index) { |
| if (combo_index == 0) |
| return l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_NONE); |
| int cert_index = combo_index - 1; |
| return wifi_config_model_->GetUserCertName(cert_index); |
| } |
| private: |
| WifiConfigModel* wifi_config_model_; |
| DISALLOW_COPY_AND_ASSIGN(ClientCertComboboxModel); |
| }; |
| |
| } // namespace |
| |
| WifiConfigView::WifiConfigView(NetworkConfigView* parent, WifiNetwork* wifi) |
| : ChildNetworkConfigView(parent, wifi), |
| wifi_config_model_(new WifiConfigModel()), |
| is_8021x_(false), |
| ssid_textfield_(NULL), |
| eap_method_combobox_(NULL), |
| phase_2_auth_label_(NULL), |
| phase_2_auth_combobox_(NULL), |
| client_cert_label_(NULL), |
| client_cert_combobox_(NULL), |
| server_ca_cert_label_(NULL), |
| server_ca_cert_combobox_(NULL), |
| identity_label_(NULL), |
| identity_textfield_(NULL), |
| identity_anonymous_label_(NULL), |
| identity_anonymous_textfield_(NULL), |
| save_credentials_checkbox_(NULL), |
| security_combobox_(NULL), |
| passphrase_label_(NULL), |
| passphrase_textfield_(NULL), |
| passphrase_visible_button_(NULL), |
| error_label_(NULL) { |
| Init(wifi); |
| } |
| |
| WifiConfigView::WifiConfigView(NetworkConfigView* parent) |
| : ChildNetworkConfigView(parent), |
| wifi_config_model_(new WifiConfigModel()), |
| is_8021x_(false), |
| ssid_textfield_(NULL), |
| eap_method_combobox_(NULL), |
| phase_2_auth_label_(NULL), |
| phase_2_auth_combobox_(NULL), |
| client_cert_label_(NULL), |
| client_cert_combobox_(NULL), |
| server_ca_cert_label_(NULL), |
| server_ca_cert_combobox_(NULL), |
| identity_label_(NULL), |
| identity_textfield_(NULL), |
| identity_anonymous_label_(NULL), |
| identity_anonymous_textfield_(NULL), |
| save_credentials_checkbox_(NULL), |
| security_combobox_(NULL), |
| passphrase_label_(NULL), |
| passphrase_textfield_(NULL), |
| passphrase_visible_button_(NULL), |
| error_label_(NULL) { |
| Init(NULL); |
| } |
| |
| WifiConfigView::~WifiConfigView() { |
| } |
| |
| string16 WifiConfigView::GetTitle() { |
| return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_JOIN_WIFI_NETWORKS); |
| } |
| |
| bool WifiConfigView::CanLogin() { |
| static const size_t kMinWirelessPasswordLen = 5; |
| |
| if (service_path_.empty()) { |
| // Enforce ssid is non empty. |
| if (GetSSID().empty()) |
| return false; |
| |
| // If security is not none, also enforce passphrase is non empty. |
| if (security_combobox_->selected_item() != SECURITY_INDEX_NONE && |
| passphrase_textfield_->text().length() < kMinWirelessPasswordLen) |
| return false; |
| } else { |
| if (is_8021x_) { |
| // Make sure the EAP method is set |
| if (eap_method_combobox_->selected_item() == EAP_METHOD_INDEX_NONE) |
| return false; |
| } else { |
| // if the network requires a passphrase, make sure it is the right length. |
| if (passphrase_textfield_ != NULL && |
| passphrase_textfield_->text().length() < kMinWirelessPasswordLen) |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| void WifiConfigView::UpdateDialogButtons() { |
| parent_->GetDialogClientView()->UpdateDialogButtons(); |
| } |
| |
| void WifiConfigView::RefreshEAPFields() { |
| int selected = eap_method_combobox_->selected_item(); |
| |
| // If EAP method changes, the phase 2 auth choices may have changed also. |
| phase_2_auth_combobox_->ModelChanged(); |
| phase_2_auth_combobox_->SetSelectedItem(0); |
| phase_2_auth_combobox_->SetEnabled( |
| phase_2_auth_combobox_->model()->GetItemCount() > 1); |
| phase_2_auth_label_->SetEnabled(phase_2_auth_combobox_->IsEnabled()); |
| |
| // No password for EAP-TLS |
| passphrase_textfield_->SetEnabled(selected != EAP_METHOD_INDEX_NONE && |
| selected != EAP_METHOD_INDEX_TLS); |
| passphrase_label_->SetEnabled(passphrase_textfield_->IsEnabled()); |
| if (!passphrase_textfield_->IsEnabled()) |
| passphrase_textfield_->SetText(string16()); |
| |
| // Client certs only for EAP-TLS |
| if (client_cert_combobox_) { |
| client_cert_combobox_->SetEnabled(selected == EAP_METHOD_INDEX_TLS); |
| client_cert_label_->SetEnabled(client_cert_combobox_->IsEnabled()); |
| } |
| |
| // No server CA certs for LEAP |
| server_ca_cert_combobox_->SetEnabled(selected != EAP_METHOD_INDEX_NONE && |
| selected != EAP_METHOD_INDEX_LEAP); |
| server_ca_cert_label_->SetEnabled(server_ca_cert_combobox_->IsEnabled()); |
| |
| // No anonymous identity if no phase 2 auth. |
| identity_anonymous_textfield_->SetEnabled( |
| phase_2_auth_combobox_->IsEnabled()); |
| identity_anonymous_label_->SetEnabled( |
| identity_anonymous_textfield_->IsEnabled()); |
| if (!identity_anonymous_textfield_->IsEnabled()) |
| identity_anonymous_textfield_->SetText(string16()); |
| } |
| |
| void WifiConfigView::UpdateErrorLabel() { |
| std::string error_msg; |
| if (!service_path_.empty()) { |
| NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); |
| const WifiNetwork* wifi = cros->FindWifiNetworkByPath(service_path_); |
| if (wifi && wifi->failed()) { |
| bool passphrase_empty = wifi->GetPassphrase().empty(); |
| switch (wifi->error()) { |
| case ERROR_BAD_PASSPHRASE: |
| if (!passphrase_empty) { |
| error_msg = l10n_util::GetStringUTF8( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_BAD_PASSPHRASE); |
| } |
| break; |
| case ERROR_BAD_WEPKEY: |
| if (!passphrase_empty) { |
| error_msg = l10n_util::GetStringUTF8( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_BAD_WEPKEY); |
| } |
| break; |
| default: |
| error_msg = wifi->GetErrorString(); |
| break; |
| } |
| } |
| } |
| if (!error_msg.empty()) { |
| error_label_->SetText(UTF8ToWide(error_msg)); |
| error_label_->SetVisible(true); |
| } else { |
| error_label_->SetVisible(false); |
| } |
| } |
| |
| void WifiConfigView::ContentsChanged(views::Textfield* sender, |
| const string16& new_contents) { |
| UpdateDialogButtons(); |
| } |
| |
| bool WifiConfigView::HandleKeyEvent(views::Textfield* sender, |
| const views::KeyEvent& key_event) { |
| if (sender == passphrase_textfield_ && |
| key_event.key_code() == ui::VKEY_RETURN) { |
| parent_->GetDialogClientView()->AcceptWindow(); |
| } |
| return false; |
| } |
| |
| void WifiConfigView::ButtonPressed(views::Button* sender, |
| const views::Event& event) { |
| if (sender == passphrase_visible_button_) { |
| if (passphrase_textfield_) |
| passphrase_textfield_->SetPassword(!passphrase_textfield_->IsPassword()); |
| } else { |
| NOTREACHED(); |
| } |
| } |
| |
| void WifiConfigView::ItemChanged(views::Combobox* combo_box, |
| int prev_index, int new_index) { |
| if (new_index == prev_index) |
| return; |
| if (combo_box == security_combobox_) { |
| // If changed to no security, then disable combobox and clear it. |
| // Otherwise, enable it. Also, update can login. |
| if (new_index == SECURITY_INDEX_NONE) { |
| passphrase_label_->SetEnabled(false); |
| passphrase_textfield_->SetEnabled(false); |
| passphrase_textfield_->SetText(string16()); |
| } else { |
| passphrase_label_->SetEnabled(true); |
| passphrase_textfield_->SetEnabled(true); |
| } |
| } else if (combo_box == eap_method_combobox_) { |
| RefreshEAPFields(); |
| } |
| UpdateDialogButtons(); |
| } |
| |
| bool WifiConfigView::Login() { |
| NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); |
| if (service_path_.empty()) { |
| ConnectionSecurity sec = SECURITY_UNKNOWN; |
| switch (security_combobox_->selected_item()) { |
| case SECURITY_INDEX_NONE: |
| sec = SECURITY_NONE; |
| break; |
| case SECURITY_INDEX_WEP: |
| sec = SECURITY_WEP; |
| break; |
| case SECURITY_INDEX_WPA: |
| sec = SECURITY_WPA; |
| break; |
| case SECURITY_INDEX_RSN: |
| sec = SECURITY_RSN; |
| break; |
| } |
| cros->ConnectToWifiNetwork( |
| sec, GetSSID(), GetPassphrase(), std::string(), std::string()); |
| } else { |
| WifiNetwork* wifi = cros->FindWifiNetworkByPath(service_path_); |
| if (!wifi) { |
| // Flimflam no longer knows about this wifi network (edge case). |
| // TODO(stevenjb): Add a notification (chromium-os13225). |
| LOG(WARNING) << "Wifi network: " << service_path_ << " no longer exists."; |
| return true; |
| } |
| if (is_8021x_) { |
| // EAP method |
| EAPMethod method = EAP_METHOD_UNKNOWN; |
| switch (eap_method_combobox_->selected_item()) { |
| case EAP_METHOD_INDEX_PEAP: |
| method = EAP_METHOD_PEAP; |
| break; |
| case EAP_METHOD_INDEX_TLS: |
| method = EAP_METHOD_TLS; |
| break; |
| case EAP_METHOD_INDEX_TTLS: |
| method = EAP_METHOD_TTLS; |
| break; |
| case EAP_METHOD_INDEX_LEAP: |
| method = EAP_METHOD_LEAP; |
| break; |
| } |
| DCHECK(method != EAP_METHOD_UNKNOWN); |
| wifi->SetEAPMethod(method); |
| |
| // Phase 2 authentication |
| if (phase_2_auth_combobox_->IsEnabled()) { |
| EAPPhase2Auth auth = EAP_PHASE_2_AUTH_AUTO; |
| switch (phase_2_auth_combobox_->selected_item()) { |
| case PHASE_2_AUTH_INDEX_MD5: |
| auth = EAP_PHASE_2_AUTH_MD5; |
| break; |
| case PHASE_2_AUTH_INDEX_MSCHAPV2: |
| auth = EAP_PHASE_2_AUTH_MSCHAPV2; |
| break; |
| case PHASE_2_AUTH_INDEX_MSCHAP: |
| auth = EAP_PHASE_2_AUTH_MSCHAP; |
| break; |
| case PHASE_2_AUTH_INDEX_PAP: |
| auth = EAP_PHASE_2_AUTH_PAP; |
| break; |
| case PHASE_2_AUTH_INDEX_CHAP: |
| auth = EAP_PHASE_2_AUTH_CHAP; |
| break; |
| } |
| wifi->SetEAPPhase2Auth(auth); |
| } |
| |
| // Server CA certificate |
| if (server_ca_cert_combobox_->IsEnabled()) { |
| int selected = server_ca_cert_combobox_->selected_item(); |
| if (selected == 0) { |
| // First item is "Default". |
| wifi->SetEAPServerCaCertNssNickname(std::string()); |
| wifi->SetEAPUseSystemCAs(true); |
| } else if (selected == |
| server_ca_cert_combobox_->model()->GetItemCount() - 1) { |
| // Last item is "Do not check". |
| wifi->SetEAPServerCaCertNssNickname(std::string()); |
| wifi->SetEAPUseSystemCAs(false); |
| } else { |
| int cert_index = selected - 1; |
| std::string nss_nickname = |
| wifi_config_model_->GetServerCaCertNssNickname(cert_index); |
| wifi->SetEAPServerCaCertNssNickname(nss_nickname); |
| } |
| } |
| |
| // Client certificate |
| if (client_cert_combobox_ && client_cert_combobox_->IsEnabled()) { |
| int selected = client_cert_combobox_->selected_item(); |
| if (selected == 0) { |
| // First item is "None". |
| wifi->SetEAPClientCertPkcs11Id(std::string()); |
| } else { |
| // Send cert ID to flimflam. |
| int cert_index = selected - 1; |
| std::string cert_pkcs11_id = |
| wifi_config_model_->GetUserCertPkcs11Id(cert_index); |
| wifi->SetEAPClientCertPkcs11Id(cert_pkcs11_id); |
| } |
| } |
| |
| // Identity |
| if (identity_textfield_->IsEnabled()) { |
| wifi->SetEAPIdentity(UTF16ToUTF8(identity_textfield_->text())); |
| } |
| |
| // Anonymous identity |
| if (identity_anonymous_textfield_->IsEnabled()) { |
| wifi->SetEAPAnonymousIdentity( |
| UTF16ToUTF8(identity_anonymous_textfield_->text())); |
| } |
| |
| // Passphrase |
| if (passphrase_textfield_->IsEnabled()) { |
| wifi->SetEAPPassphrase(UTF16ToUTF8(passphrase_textfield_->text())); |
| } |
| |
| // Save credentials |
| wifi->SetSaveCredentials(save_credentials_checkbox_->checked()); |
| } else { |
| const std::string passphrase = GetPassphrase(); |
| if (passphrase != wifi->passphrase()) |
| wifi->SetPassphrase(passphrase); |
| } |
| |
| cros->ConnectToWifiNetwork(wifi); |
| // Connection failures are responsible for updating the UI, including |
| // reopening dialogs. |
| } |
| return true; // dialog will be closed |
| } |
| |
| void WifiConfigView::Cancel() { |
| } |
| |
| std::string WifiConfigView::GetSSID() const { |
| std::string result; |
| if (ssid_textfield_ != NULL) { |
| std::string untrimmed = UTF16ToUTF8(ssid_textfield_->text()); |
| TrimWhitespaceASCII(untrimmed, TRIM_ALL, &result); |
| } |
| return result; |
| } |
| |
| std::string WifiConfigView::GetPassphrase() const { |
| std::string result; |
| if (passphrase_textfield_ != NULL) |
| result = UTF16ToUTF8(passphrase_textfield_->text()); |
| return result; |
| } |
| |
| // This will initialize the view depending on if we have a wifi network or not. |
| // And if we are doing simple password encyption or the more complicated |
| // 802.1x encryption. |
| // If we are creating the "Join other network..." dialog, we will allow user |
| // to enter the data. And if they select the 802.1x encryption, we will show |
| // the 802.1x fields. |
| void WifiConfigView::Init(WifiNetwork* wifi) { |
| views::GridLayout* layout = views::GridLayout::CreatePanel(this); |
| SetLayoutManager(layout); |
| |
| int column_view_set_id = 0; |
| views::ColumnSet* column_set = layout->AddColumnSet(column_view_set_id); |
| // Label |
| column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1, |
| views::GridLayout::USE_PREF, 0, 0); |
| // Textfield |
| column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, |
| views::GridLayout::USE_PREF, 0, |
| ChildNetworkConfigView::kPassphraseWidth); |
| // Password visible button |
| column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::FILL, 1, |
| views::GridLayout::USE_PREF, 0, 0); |
| |
| // SSID input |
| layout->StartRow(0, column_view_set_id); |
| layout->AddView(new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_NETWORK_ID)))); |
| if (!wifi) { |
| ssid_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); |
| ssid_textfield_->SetController(this); |
| ssid_textfield_->SetAccessibleName(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_NETWORK_ID)); |
| layout->AddView(ssid_textfield_); |
| } else { |
| views::Label* label = new views::Label(UTF8ToWide(wifi->name())); |
| label->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| layout->AddView(label); |
| } |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| |
| // Security select |
| if (!wifi) { |
| layout->StartRow(0, column_view_set_id); |
| layout->AddView(new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SECURITY)))); |
| security_combobox_ = new views::Combobox(new SecurityComboboxModel()); |
| security_combobox_->set_listener(this); |
| layout->AddView(security_combobox_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| } |
| |
| is_8021x_ = wifi && wifi->encrypted() && |
| wifi->encryption() == SECURITY_8021X; |
| if (is_8021x_) { |
| // Only enumerate certificates in the data model for 802.1X networks. |
| wifi_config_model_->UpdateCertificates(); |
| |
| // EAP method |
| layout->StartRow(0, column_view_set_id); |
| layout->AddView(new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_EAP_METHOD)))); |
| eap_method_combobox_ = new views::Combobox(new EAPMethodComboboxModel()); |
| eap_method_combobox_->set_listener(this); |
| layout->AddView(eap_method_combobox_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| |
| // Phase 2 authentication |
| layout->StartRow(0, column_view_set_id); |
| phase_2_auth_label_ = |
| new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PHASE_2_AUTH))); |
| layout->AddView(phase_2_auth_label_); |
| phase_2_auth_combobox_ = new views::Combobox( |
| new Phase2AuthComboboxModel(eap_method_combobox_)); |
| phase_2_auth_label_->SetEnabled(false); |
| phase_2_auth_combobox_->SetEnabled(false); |
| phase_2_auth_combobox_->set_listener(this); |
| layout->AddView(phase_2_auth_combobox_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| |
| // Server CA certificate |
| layout->StartRow(0, column_view_set_id); |
| server_ca_cert_label_ = |
| new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA))); |
| layout->AddView(server_ca_cert_label_); |
| server_ca_cert_combobox_ = new ComboboxWithWidth( |
| new ServerCACertComboboxModel(wifi_config_model_.get()), |
| ChildNetworkConfigView::kPassphraseWidth); |
| server_ca_cert_label_->SetEnabled(false); |
| server_ca_cert_combobox_->SetEnabled(false); |
| server_ca_cert_combobox_->set_listener(this); |
| layout->AddView(server_ca_cert_combobox_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| |
| // TODO(jamescook): Add back client certificate combobox when we support |
| // EAP-TLS by default. |
| if (CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kEnableExperimentalEap)) { |
| // Client certificate |
| layout->StartRow(0, column_view_set_id); |
| client_cert_label_ = new views::Label( |
| UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT))); |
| layout->AddView(client_cert_label_); |
| client_cert_combobox_ = new views::Combobox( |
| new ClientCertComboboxModel(wifi_config_model_.get())); |
| client_cert_label_->SetEnabled(false); |
| client_cert_combobox_->SetEnabled(false); |
| client_cert_combobox_->set_listener(this); |
| layout->AddView(client_cert_combobox_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| } |
| |
| // Identity |
| layout->StartRow(0, column_view_set_id); |
| identity_label_ = new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_IDENTITY))); |
| layout->AddView(identity_label_); |
| identity_textfield_ = new views::Textfield( |
| views::Textfield::STYLE_DEFAULT); |
| identity_textfield_->SetController(this); |
| if (!wifi->identity().empty()) |
| identity_textfield_->SetText(UTF8ToUTF16(wifi->identity())); |
| layout->AddView(identity_textfield_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| } |
| |
| // Passphrase input |
| layout->StartRow(0, column_view_set_id); |
| int label_text_id = IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PASSPHRASE; |
| passphrase_label_ = new views::Label( |
| UTF16ToWide(l10n_util::GetStringUTF16(label_text_id))); |
| layout->AddView(passphrase_label_); |
| passphrase_textfield_ = new views::Textfield( |
| views::Textfield::STYLE_PASSWORD); |
| passphrase_textfield_->SetController(this); |
| if (wifi && !wifi->GetPassphrase().empty()) |
| passphrase_textfield_->SetText(UTF8ToUTF16(wifi->GetPassphrase())); |
| // Disable passphrase input initially for other network. |
| if (!wifi) { |
| passphrase_label_->SetEnabled(false); |
| passphrase_textfield_->SetEnabled(false); |
| } |
| passphrase_textfield_->SetAccessibleName(l10n_util::GetStringUTF16( |
| label_text_id)); |
| layout->AddView(passphrase_textfield_); |
| // Password visible button. |
| passphrase_visible_button_ = new views::ImageButton(this); |
| passphrase_visible_button_->SetImage( |
| views::ImageButton::BS_NORMAL, |
| ResourceBundle::GetSharedInstance(). |
| GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE)); |
| passphrase_visible_button_->SetImageAlignment( |
| views::ImageButton::ALIGN_CENTER, views::ImageButton::ALIGN_MIDDLE); |
| layout->AddView(passphrase_visible_button_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| |
| if (is_8021x_) { |
| // Anonymous identity |
| layout->StartRow(0, column_view_set_id); |
| identity_anonymous_label_ = |
| new views::Label(UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_IDENTITY_ANONYMOUS))); |
| layout->AddView(identity_anonymous_label_); |
| identity_anonymous_textfield_ = new views::Textfield( |
| views::Textfield::STYLE_DEFAULT); |
| identity_anonymous_label_->SetEnabled(false); |
| identity_anonymous_textfield_->SetEnabled(false); |
| identity_anonymous_textfield_->SetController(this); |
| layout->AddView(identity_anonymous_textfield_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| |
| // Save credentials |
| layout->StartRow(0, column_view_set_id); |
| save_credentials_checkbox_ = new views::Checkbox( |
| UTF16ToWide(l10n_util::GetStringUTF16( |
| IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SAVE_CREDENTIALS))); |
| layout->SkipColumns(1); |
| layout->AddView(save_credentials_checkbox_); |
| layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| } |
| |
| // After creating the fields, we set the values. Fields need to be created |
| // first because RefreshEAPFields() will enable/disable them as appropriate. |
| if (is_8021x_) { |
| // EAP Method |
| switch (wifi->eap_method()) { |
| case EAP_METHOD_PEAP: |
| eap_method_combobox_->SetSelectedItem(EAP_METHOD_INDEX_PEAP); |
| break; |
| case EAP_METHOD_TTLS: |
| eap_method_combobox_->SetSelectedItem(EAP_METHOD_INDEX_TTLS); |
| break; |
| case EAP_METHOD_TLS: |
| if (CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kEnableExperimentalEap)) |
| eap_method_combobox_->SetSelectedItem(EAP_METHOD_INDEX_TLS); |
| else // Clean up from previous run with the switch set. |
| eap_method_combobox_->SetSelectedItem(EAP_METHOD_INDEX_NONE); |
| break; |
| case EAP_METHOD_LEAP: |
| if (CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kEnableExperimentalEap)) |
| eap_method_combobox_->SetSelectedItem(EAP_METHOD_INDEX_LEAP); |
| else // Clean up from previous run with the switch set. |
| eap_method_combobox_->SetSelectedItem(EAP_METHOD_INDEX_NONE); |
| break; |
| default: |
| break; |
| } |
| RefreshEAPFields(); |
| |
| // Phase 2 authentication |
| if (phase_2_auth_combobox_->IsEnabled()) { |
| switch (wifi->eap_phase_2_auth()) { |
| case EAP_PHASE_2_AUTH_MD5: |
| phase_2_auth_combobox_->SetSelectedItem(PHASE_2_AUTH_INDEX_MD5); |
| break; |
| case EAP_PHASE_2_AUTH_MSCHAPV2: |
| phase_2_auth_combobox_->SetSelectedItem(PHASE_2_AUTH_INDEX_MSCHAPV2); |
| break; |
| case EAP_PHASE_2_AUTH_MSCHAP: |
| phase_2_auth_combobox_->SetSelectedItem(PHASE_2_AUTH_INDEX_MSCHAP); |
| break; |
| case EAP_PHASE_2_AUTH_PAP: |
| phase_2_auth_combobox_->SetSelectedItem(PHASE_2_AUTH_INDEX_PAP); |
| break; |
| case EAP_PHASE_2_AUTH_CHAP: |
| phase_2_auth_combobox_->SetSelectedItem(PHASE_2_AUTH_INDEX_CHAP); |
| break; |
| default: |
| break; |
| } |
| } |
| |
| // Server CA certificate |
| if (server_ca_cert_combobox_->IsEnabled()) { |
| const std::string& nss_nickname = wifi->eap_server_ca_cert_nss_nickname(); |
| if (nss_nickname.empty()) { |
| if (wifi->eap_use_system_cas()) { |
| // "Default" |
| server_ca_cert_combobox_->SetSelectedItem(0); |
| } else { |
| // "Do not check" |
| server_ca_cert_combobox_->SetSelectedItem( |
| server_ca_cert_combobox_->model()->GetItemCount() - 1); |
| } |
| } else { |
| // select the certificate if available |
| int cert_index = wifi_config_model_->GetServerCaCertIndex(nss_nickname); |
| if (cert_index >= 0) { |
| // Skip item for "Default" |
| server_ca_cert_combobox_->SetSelectedItem(1 + cert_index); |
| } |
| } |
| } |
| |
| // Client certificate |
| if (client_cert_combobox_ && client_cert_combobox_->IsEnabled()) { |
| const std::string& pkcs11_id = wifi->eap_client_cert_pkcs11_id(); |
| if (pkcs11_id.empty()) { |
| // First item is "None". |
| client_cert_combobox_->SetSelectedItem(0); |
| } else { |
| int cert_index = wifi_config_model_->GetUserCertIndex(pkcs11_id); |
| if (cert_index >= 0) { |
| // Skip item for "None" |
| client_cert_combobox_->SetSelectedItem(1 + cert_index); |
| } |
| } |
| } |
| |
| // Identity |
| if (identity_textfield_->IsEnabled()) |
| identity_textfield_->SetText(UTF8ToUTF16(wifi->eap_identity())); |
| |
| // Anonymous identity |
| if (identity_anonymous_textfield_->IsEnabled()) |
| identity_anonymous_textfield_->SetText( |
| UTF8ToUTF16(wifi->eap_anonymous_identity())); |
| |
| // Passphrase |
| if (passphrase_textfield_->IsEnabled()) |
| passphrase_textfield_->SetText(UTF8ToUTF16(wifi->eap_passphrase())); |
| |
| // Save credentials |
| bool save_credentials = (wifi ? wifi->save_credentials() : false); |
| save_credentials_checkbox_->SetChecked(save_credentials); |
| } |
| |
| // Create an error label. |
| layout->StartRow(0, column_view_set_id); |
| layout->SkipColumns(1); |
| error_label_ = new views::Label(); |
| error_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| error_label_->SetColor(SK_ColorRED); |
| layout->AddView(error_label_); |
| |
| // Set or hide the error text. |
| UpdateErrorLabel(); |
| } |
| |
| void WifiConfigView::InitFocus() { |
| // Set focus to a reasonable widget, depending on what we're showing. |
| if (ssid_textfield_) |
| ssid_textfield_->RequestFocus(); |
| else if (eap_method_combobox_) |
| eap_method_combobox_->RequestFocus(); |
| else if (passphrase_textfield_ && passphrase_textfield_->IsEnabled()) |
| passphrase_textfield_->RequestFocus(); |
| } |
| |
| } // namespace chromeos |