summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/options/vpn_config_view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/options/vpn_config_view.cc')
-rw-r--r--chrome/browser/chromeos/options/vpn_config_view.cc783
1 files changed, 459 insertions, 324 deletions
diff --git a/chrome/browser/chromeos/options/vpn_config_view.cc b/chrome/browser/chromeos/options/vpn_config_view.cc
index d8e019b..4aa6682 100644
--- a/chrome/browser/chromeos/options/vpn_config_view.cc
+++ b/chrome/browser/chromeos/options/vpn_config_view.cc
@@ -4,19 +4,25 @@
#include "chrome/browser/chromeos/options/vpn_config_view.h"
+#include "ash/system/chromeos/network/network_connect.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/cros/network_library.h"
#include "chrome/browser/chromeos/enrollment_dialog_view.h"
+#include "chrome/browser/chromeos/options/network_connect.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/common/net/x509_certificate_model.h"
+#include "chromeos/network/network_configuration_handler.h"
+#include "chromeos/network/network_event_log.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/network_state_handler.h"
#include "chromeos/network/network_ui_data.h"
#include "chromeos/network/onc/onc_constants.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
#include "grit/theme_resources.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
#include "ui/base/events/event.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/combobox_model.h"
@@ -35,41 +41,73 @@ namespace {
// Root CA certificates that are built into Chrome use this token name.
const char* const kRootCertificateTokenName = "Builtin Object Token";
-string16 ProviderTypeToString(chromeos::ProviderType type) {
- switch (type) {
- case chromeos::PROVIDER_TYPE_L2TP_IPSEC_PSK:
+enum ProviderTypeIndex {
+ PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK = 0,
+ PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT = 1,
+ PROVIDER_TYPE_INDEX_OPEN_VPN = 2,
+ PROVIDER_TYPE_INDEX_MAX = 3,
+};
+
+string16 ProviderTypeIndexToString(int index) {
+ switch (index) {
+ case PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK:
return l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_PSK);
- case chromeos::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
+ case PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT:
return l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_USER_CERT);
- case chromeos::PROVIDER_TYPE_OPEN_VPN:
+ case PROVIDER_TYPE_INDEX_OPEN_VPN:
return l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_OPEN_VPN);
- case chromeos::PROVIDER_TYPE_MAX:
- break;
}
NOTREACHED();
return string16();
}
+int ProviderTypeToIndex(const std::string& provider_type,
+ const std::string& client_cert_id) {
+ if (provider_type == flimflam::kProviderL2tpIpsec) {
+ if (!client_cert_id.empty())
+ return PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT;
+ else
+ return PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK;
+ } else {
+ DCHECK(provider_type == flimflam::kProviderOpenVpn);
+ return PROVIDER_TYPE_INDEX_OPEN_VPN;
+ }
+}
+
// Translates the provider type to the name of the respective ONC dictionary
// containing configuration data for the type.
-std::string ProviderTypeToONCDictKey(chromeos::ProviderType type) {
- switch (type) {
- case chromeos::PROVIDER_TYPE_L2TP_IPSEC_PSK:
- case chromeos::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
+std::string ProviderTypeIndexToONCDictKey(int provider_type_index) {
+ switch (provider_type_index) {
+ case PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK:
+ case PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT:
return chromeos::onc::vpn::kIPsec;
- case chromeos::PROVIDER_TYPE_OPEN_VPN:
+ case PROVIDER_TYPE_INDEX_OPEN_VPN:
return chromeos::onc::vpn::kOpenVPN;
- case chromeos::PROVIDER_TYPE_MAX:
- break;
}
-
- NOTREACHED() << "Unhandled provider type " << type;
+ NOTREACHED() << "Unhandled provider type index " << provider_type_index;
return std::string();
}
+std::string GetPemFromDictionary(
+ const base::DictionaryValue* provider_properties,
+ const std::string& key) {
+ const base::ListValue* pems = NULL;
+ if (!provider_properties->GetListWithoutPathExpansion(key, &pems))
+ return std::string();
+ std::string pem;
+ pems->GetString(0, &pem);
+ return pem;
+}
+
+void ShillError(const std::string& function,
+ const std::string& error_name,
+ scoped_ptr<base::DictionaryValue> error_data) {
+ NET_LOG_ERROR("Shill Error from VpnConfigView: " + error_name, function);
+}
+
} // namespace
namespace chromeos {
@@ -124,12 +162,11 @@ ProviderTypeComboboxModel::~ProviderTypeComboboxModel() {
}
int ProviderTypeComboboxModel::GetItemCount() const {
- return PROVIDER_TYPE_MAX;
+ return PROVIDER_TYPE_INDEX_MAX;
}
string16 ProviderTypeComboboxModel::GetItemAt(int index) {
- ProviderType type = static_cast<ProviderType>(index);
- return ProviderTypeToString(type);
+ return ProviderTypeIndexToString(index);
}
// VpnServerCACertComboboxModel ------------------------------------------------
@@ -193,16 +230,39 @@ string16 VpnUserCertComboboxModel::GetItemAt(int index) {
} // namespace internal
-VPNConfigView::VPNConfigView(NetworkConfigView* parent, VirtualNetwork* vpn)
- : ChildNetworkConfigView(parent, vpn),
- title_(0) {
- Init(vpn);
-}
-
-VPNConfigView::VPNConfigView(NetworkConfigView* parent)
- : ChildNetworkConfigView(parent),
- title_(0) {
- Init(NULL);
+VPNConfigView::VPNConfigView(NetworkConfigView* parent,
+ const std::string& service_path)
+ : ChildNetworkConfigView(parent, service_path),
+ service_text_modified_(false),
+ enable_psk_passphrase_(false),
+ enable_user_cert_(false),
+ enable_server_ca_cert_(false),
+ enable_otp_(false),
+ enable_group_name_(false),
+ title_(0),
+ layout_(NULL),
+ server_textfield_(NULL),
+ service_text_(NULL),
+ service_textfield_(NULL),
+ provider_type_combobox_(NULL),
+ provider_type_text_label_(NULL),
+ psk_passphrase_label_(NULL),
+ psk_passphrase_textfield_(NULL),
+ user_cert_label_(NULL),
+ user_cert_combobox_(NULL),
+ server_ca_cert_label_(NULL),
+ server_ca_cert_combobox_(NULL),
+ username_textfield_(NULL),
+ user_passphrase_textfield_(NULL),
+ otp_label_(NULL),
+ otp_textfield_(NULL),
+ group_name_label_(NULL),
+ group_name_textfield_(NULL),
+ save_credentials_checkbox_(NULL),
+ error_label_(NULL),
+ provider_type_index_(PROVIDER_TYPE_INDEX_MAX),
+ weak_ptr_factory_(this) {
+ Init();
}
VPNConfigView::~VPNConfigView() {
@@ -243,7 +303,9 @@ bool VPNConfigView::CanLogin() {
return false;
// Block login if certs are required but user has none.
- if (UserCertRequired() && (!HaveUserCerts() || !IsUserCertValid()))
+ bool cert_required =
+ GetProviderTypeIndex() == PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT;
+ if (cert_required && (!HaveUserCerts() || !IsUserCertValid()))
return false;
return true;
@@ -283,15 +345,7 @@ void VPNConfigView::ButtonPressed(views::Button* sender,
}
void VPNConfigView::OnSelectedIndexChanged(views::Combobox* combobox) {
- if (combobox == provider_type_combobox_) {
- provider_type_ = static_cast<ProviderType>(combobox->selected_index());
- UpdateControls();
- } else if (combobox == user_cert_combobox_ ||
- combobox == server_ca_cert_combobox_) {
- // Do nothing.
- } else {
- NOTREACHED();
- }
+ UpdateControls();
UpdateErrorLabel();
UpdateCanLogin();
}
@@ -301,77 +355,35 @@ void VPNConfigView::OnCertificatesLoaded(bool initial_load) {
}
bool VPNConfigView::Login() {
- NetworkLibrary* cros = NetworkLibrary::Get();
if (service_path_.empty()) {
- NetworkLibrary::VPNConfigData config_data;
- switch (provider_type_) {
- case PROVIDER_TYPE_L2TP_IPSEC_PSK:
- config_data.psk = GetPSKPassphrase();
- config_data.username = GetUsername();
- config_data.user_passphrase = GetUserPassphrase();
- config_data.group_name = GetGroupName();
- break;
- case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: {
- config_data.server_ca_cert_pem = GetServerCACertPEM();
- config_data.client_cert_pkcs11_id = GetUserCertID();
- config_data.username = GetUsername();
- config_data.user_passphrase = GetUserPassphrase();
- config_data.group_name = GetGroupName();
- break;
- }
- case PROVIDER_TYPE_OPEN_VPN:
- config_data.server_ca_cert_pem = GetServerCACertPEM();
- config_data.client_cert_pkcs11_id = GetUserCertID();
- config_data.username = GetUsername();
- config_data.user_passphrase = GetUserPassphrase();
- config_data.otp = GetOTP();
- break;
- case PROVIDER_TYPE_MAX:
- break;
- }
- config_data.save_credentials = GetSaveCredentials();
- cros->ConnectToUnconfiguredVirtualNetwork(
- GetService(), GetServer(), provider_type_, config_data);
+ base::DictionaryValue properties;
+ // Identifying properties
+ properties.SetStringWithoutPathExpansion(
+ flimflam::kTypeProperty, flimflam::kTypeVPN);
+ properties.SetStringWithoutPathExpansion(
+ flimflam::kNameProperty, GetService());
+ properties.SetStringWithoutPathExpansion(
+ flimflam::kProviderHostProperty, GetServer());
+ properties.SetStringWithoutPathExpansion(
+ flimflam::kProviderTypeProperty, GetProviderTypeString());
+
+ SetConfigProperties(&properties);
+ ash::network_connect::CreateConfigurationAndConnect(
+ &properties, false /* not shared */);
} else {
- VirtualNetwork* vpn = cros->FindVirtualNetworkByPath(service_path_);
+ const NetworkState* vpn = NetworkHandler::Get()->network_state_handler()->
+ GetNetworkState(service_path_);
if (!vpn) {
+ // Shill no longer knows about this network (edge case).
// TODO(stevenjb): Add notification for this.
- LOG(WARNING) << "VPN no longer exists: " << service_path_;
- return true; // Close dialog.
- }
- switch (provider_type_) {
- case PROVIDER_TYPE_L2TP_IPSEC_PSK:
- vpn->SetL2TPIPsecPSKCredentials(GetPSKPassphrase(),
- GetUsername(),
- GetUserPassphrase(),
- GetGroupName());
- break;
- case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: {
- vpn->SetL2TPIPsecCertCredentials(GetUserCertID(),
- GetUsername(),
- GetUserPassphrase(),
- GetGroupName());
- break;
- }
- case PROVIDER_TYPE_OPEN_VPN: {
- vpn->SetOpenVPNCredentials(GetUserCertID(),
- GetUsername(),
- GetUserPassphrase(),
- GetOTP());
- break;
- }
- case PROVIDER_TYPE_MAX:
- break;
+ NET_LOG_ERROR("Network not found", service_path_);
+ return true; // Close dialog
}
- vpn->SetEnrollmentDelegate(
- CreateEnrollmentDelegate(GetWidget()->GetNativeWindow(),
- vpn->name(),
- ProfileManager::GetLastUsedProfile()));
- vpn->SetSaveCredentials(GetSaveCredentials());
- cros->ConnectToVirtualNetwork(vpn);
+ base::DictionaryValue properties;
+ SetConfigProperties(&properties);
+ ash::network_connect::ConfigureNetworkAndConnect(
+ service_path_, properties, false /* not shared */);
}
- // Connection failures are responsible for updating the UI, including
- // reopening dialogs.
return true; // Close dialog.
}
@@ -393,7 +405,7 @@ const std::string VPNConfigView::GetService() const {
const std::string VPNConfigView::GetServer() const {
if (server_textfield_ != NULL)
return GetTextFromField(server_textfield_, true);
- return server_hostname_;
+ return std::string();
}
const std::string VPNConfigView::GetPSKPassphrase() const {
@@ -448,44 +460,39 @@ bool VPNConfigView::GetSaveCredentials() const {
return save_credentials_checkbox_->checked();
}
-void VPNConfigView::Init(VirtualNetwork* vpn) {
- if (vpn) {
- ProviderType type = vpn->provider_type();
- std::string type_dict_name = ProviderTypeToONCDictKey(type);
-
- if (type == PROVIDER_TYPE_L2TP_IPSEC_PSK) {
- ParseVPNUIProperty(&ca_cert_ui_data_, vpn, type_dict_name,
- onc::ipsec::kServerCARef);
- ParseVPNUIProperty(&psk_passphrase_ui_data_, vpn, type_dict_name,
- onc::ipsec::kPSK);
- ParseVPNUIProperty(&group_name_ui_data_, vpn, type_dict_name,
- onc::ipsec::kGroup);
- } else { // OpenVPN
- ParseVPNUIProperty(&ca_cert_ui_data_, vpn, type_dict_name,
- onc::openvpn::kServerCARef);
- }
- ParseVPNUIProperty(&user_cert_ui_data_, vpn, type_dict_name,
- onc::vpn::kClientCertRef);
-
- const std::string credentials_dict_name(
- type == PROVIDER_TYPE_L2TP_IPSEC_PSK ?
- onc::vpn::kL2TP : type_dict_name);
- ParseVPNUIProperty(&username_ui_data_, vpn, credentials_dict_name,
- onc::vpn::kUsername);
- ParseVPNUIProperty(&user_passphrase_ui_data_, vpn, credentials_dict_name,
- onc::vpn::kPassword);
- ParseVPNUIProperty(&save_credentials_ui_data_, vpn, credentials_dict_name,
- onc::vpn::kSaveCredentials);
+int VPNConfigView::GetProviderTypeIndex() const {
+ if (provider_type_combobox_)
+ return provider_type_combobox_->selected_index();
+ return provider_type_index_;
+}
+
+std::string VPNConfigView::GetProviderTypeString() const {
+ int index = GetProviderTypeIndex();
+ switch (index) {
+ case PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK:
+ case PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT:
+ return flimflam::kProviderL2tpIpsec;
+ case PROVIDER_TYPE_INDEX_OPEN_VPN:
+ return flimflam::kProviderOpenVpn;
}
+ NOTREACHED();
+ return std::string();
+}
- views::GridLayout* layout = views::GridLayout::CreatePanel(this);
- SetLayoutManager(layout);
+void VPNConfigView::Init() {
+ const NetworkState* vpn = NULL;
+ if (!service_path_.empty()) {
+ vpn = NetworkHandler::Get()->network_state_handler()->
+ GetNetworkState(service_path_);
+ DCHECK(vpn && vpn->type() == flimflam::kTypeVPN);
+ }
+ layout_ = views::GridLayout::CreatePanel(this);
+ SetLayoutManager(layout_);
// Observer any changes to the certificate list.
CertLibrary::Get()->AddObserver(this);
- const int column_view_set_id = 0;
- views::ColumnSet* column_set = layout->AddColumnSet(column_view_set_id);
+ views::ColumnSet* column_set = layout_->AddColumnSet(0);
// Label.
column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1,
views::GridLayout::USE_PREF, 0, 0);
@@ -501,232 +508,376 @@ void VPNConfigView::Init(VirtualNetwork* vpn) {
// Initialize members.
service_text_modified_ = false;
- if (vpn) {
- provider_type_ = vpn->provider_type();
- // Sets enable_* based on the provider type which we use to control
- // which controls to make visible.
- UpdateControlsToEnable();
- } else {
- // Set the default provider type.
- provider_type_ = PROVIDER_TYPE_L2TP_IPSEC_PSK;
- // Provider Type is user selectable, so enable all controls during init.
- enable_psk_passphrase_ = true;
- enable_user_cert_ = true;
- enable_server_ca_cert_ = true;
- enable_otp_ = true;
- enable_group_name_ = true;
- }
-
- // Initialize the title string ID used for the dialog.
title_ = vpn ? IDS_OPTIONS_SETTINGS_JOIN_VPN : IDS_OPTIONS_SETTINGS_ADD_VPN;
+ // By default enable all controls.
+ enable_psk_passphrase_ = true;
+ enable_user_cert_ = true;
+ enable_server_ca_cert_ = true;
+ enable_otp_ = true;
+ enable_group_name_ = true;
+
// Server label and input.
// Only provide Server name when configuring a new VPN.
- if (!vpn) {
- layout->StartRow(0, column_view_set_id);
- layout->AddView(new views::Label(l10n_util::GetStringUTF16(
+ if (service_path_.empty()) {
+ layout_->StartRow(0, 0);
+ layout_->AddView(new views::Label(l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_SERVER_HOSTNAME)));
server_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT);
server_textfield_->SetController(this);
- layout->AddView(server_textfield_);
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+ layout_->AddView(server_textfield_);
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
} else {
server_textfield_ = NULL;
}
// Service label and name or input.
- layout->StartRow(0, column_view_set_id);
- layout->AddView(new views::Label(l10n_util::GetStringUTF16(
+ layout_->StartRow(0, 0);
+ layout_->AddView(new views::Label(l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_SERVICE_NAME)));
- if (!vpn) {
+ if (service_path_.empty()) {
service_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT);
service_textfield_->SetController(this);
- layout->AddView(service_textfield_);
+ layout_->AddView(service_textfield_);
service_text_ = NULL;
} else {
- service_text_ = new views::Label(ASCIIToUTF16(vpn->name()));
+ service_text_ = new views::Label();
service_text_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- layout->AddView(service_text_);
+ layout_->AddView(service_text_);
service_textfield_ = NULL;
}
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
// Provider type label and select.
- layout->StartRow(0, column_view_set_id);
- layout->AddView(new views::Label(l10n_util::GetStringUTF16(
+ layout_->StartRow(0, 0);
+ layout_->AddView(new views::Label(l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PROVIDER_TYPE)));
- if (!vpn) {
+ if (service_path_.empty()) {
provider_type_combobox_model_.reset(
new internal::ProviderTypeComboboxModel);
provider_type_combobox_ = new views::Combobox(
provider_type_combobox_model_.get());
provider_type_combobox_->set_listener(this);
- layout->AddView(provider_type_combobox_);
+ layout_->AddView(provider_type_combobox_);
provider_type_text_label_ = NULL;
} else {
- provider_type_text_label_ =
- new views::Label(ProviderTypeToString(provider_type_));
+ provider_type_text_label_ = new views::Label();
provider_type_text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- layout->AddView(provider_type_text_label_);
+ layout_->AddView(provider_type_text_label_);
provider_type_combobox_ = NULL;
}
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
// PSK passphrase label, input and visible button.
- if (enable_psk_passphrase_) {
- layout->StartRow(0, column_view_set_id);
- psk_passphrase_label_ = new views::Label(l10n_util::GetStringUTF16(
- IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PSK_PASSPHRASE));
- layout->AddView(psk_passphrase_label_);
- bool has_psk_passphrase = vpn && !vpn->IsPSKPassphraseRequired();
- psk_passphrase_textfield_ = new PassphraseTextfield(has_psk_passphrase);
- psk_passphrase_textfield_->SetController(this);
- layout->AddView(psk_passphrase_textfield_);
- layout->AddView(
- new ControlledSettingIndicatorView(psk_passphrase_ui_data_));
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
- } else {
- psk_passphrase_label_ = NULL;
- psk_passphrase_textfield_ = NULL;
- }
+ layout_->StartRow(0, 0);
+ psk_passphrase_label_ = new views::Label(l10n_util::GetStringUTF16(
+ IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PSK_PASSPHRASE));
+ layout_->AddView(psk_passphrase_label_);
+ psk_passphrase_textfield_ = new PassphraseTextfield();
+ psk_passphrase_textfield_->SetController(this);
+ layout_->AddView(psk_passphrase_textfield_);
+ layout_->AddView(
+ new ControlledSettingIndicatorView(psk_passphrase_ui_data_));
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
// Server CA certificate
- // Only provide Server CA when configuring a new VPN.
- if (!vpn) {
- layout->StartRow(0, column_view_set_id);
- server_ca_cert_label_ =
- new views::Label(l10n_util::GetStringUTF16(
- IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA));
- layout->AddView(server_ca_cert_label_);
+ if (service_path_.empty()) {
+ layout_->StartRow(0, 0);
+ server_ca_cert_label_ = new views::Label(l10n_util::GetStringUTF16(
+ IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA));
+ layout_->AddView(server_ca_cert_label_);
server_ca_cert_combobox_model_.reset(
new internal::VpnServerCACertComboboxModel());
server_ca_cert_combobox_ = new views::Combobox(
server_ca_cert_combobox_model_.get());
- layout->AddView(server_ca_cert_combobox_);
- layout->AddView(new ControlledSettingIndicatorView(ca_cert_ui_data_));
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+ layout_->AddView(server_ca_cert_combobox_);
+ layout_->AddView(new ControlledSettingIndicatorView(ca_cert_ui_data_));
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
} else {
server_ca_cert_label_ = NULL;
server_ca_cert_combobox_ = NULL;
}
// User certificate label and input.
- if (enable_user_cert_) {
- layout->StartRow(0, column_view_set_id);
- user_cert_label_ = new views::Label(l10n_util::GetStringUTF16(
- IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_CERT));
- layout->AddView(user_cert_label_);
- user_cert_combobox_model_.reset(
- new internal::VpnUserCertComboboxModel());
- user_cert_combobox_ = new views::Combobox(user_cert_combobox_model_.get());
- user_cert_combobox_->set_listener(this);
- layout->AddView(user_cert_combobox_);
- layout->AddView(new ControlledSettingIndicatorView(user_cert_ui_data_));
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
- } else {
- user_cert_label_ = NULL;
- user_cert_combobox_ = NULL;
- }
+ layout_->StartRow(0, 0);
+ user_cert_label_ = new views::Label(l10n_util::GetStringUTF16(
+ IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_CERT));
+ layout_->AddView(user_cert_label_);
+ user_cert_combobox_model_.reset(
+ new internal::VpnUserCertComboboxModel());
+ user_cert_combobox_ = new views::Combobox(user_cert_combobox_model_.get());
+ user_cert_combobox_->set_listener(this);
+ layout_->AddView(user_cert_combobox_);
+ layout_->AddView(new ControlledSettingIndicatorView(user_cert_ui_data_));
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
// Username label and input.
- layout->StartRow(0, column_view_set_id);
- layout->AddView(new views::Label(l10n_util::GetStringUTF16(
+ layout_->StartRow(0, 0);
+ layout_->AddView(new views::Label(l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USERNAME)));
username_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT);
username_textfield_->SetController(this);
username_textfield_->SetEnabled(username_ui_data_.IsEditable());
- if (vpn && !vpn->username().empty())
- username_textfield_->SetText(UTF8ToUTF16(vpn->username()));
- layout->AddView(username_textfield_);
- layout->AddView(new ControlledSettingIndicatorView(username_ui_data_));
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+ layout_->AddView(username_textfield_);
+ layout_->AddView(new ControlledSettingIndicatorView(username_ui_data_));
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
// User passphrase label, input and visble button.
- layout->StartRow(0, column_view_set_id);
- layout->AddView(new views::Label(l10n_util::GetStringUTF16(
+ layout_->StartRow(0, 0);
+ layout_->AddView(new views::Label(l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_PASSPHRASE)));
- bool has_user_passphrase = vpn && !vpn->IsUserPassphraseRequired();
- user_passphrase_textfield_ = new PassphraseTextfield(has_user_passphrase);
+ user_passphrase_textfield_ = new PassphraseTextfield();
user_passphrase_textfield_->SetController(this);
user_passphrase_textfield_->SetEnabled(user_passphrase_ui_data_.IsEditable());
- layout->AddView(user_passphrase_textfield_);
- layout->AddView(new ControlledSettingIndicatorView(user_passphrase_ui_data_));
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
+ layout_->AddView(user_passphrase_textfield_);
+ layout_->AddView(
+ new ControlledSettingIndicatorView(user_passphrase_ui_data_));
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
// OTP label and input.
- if (enable_otp_) {
- layout->StartRow(0, column_view_set_id);
- otp_label_ = new views::Label(l10n_util::GetStringUTF16(
- IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_OTP));
- layout->AddView(otp_label_);
- otp_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT);
- otp_textfield_->SetController(this);
- layout->AddView(otp_textfield_);
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
- } else {
- otp_label_ = NULL;
- otp_textfield_ = NULL;
- }
+ layout_->StartRow(0, 0);
+ otp_label_ = new views::Label(l10n_util::GetStringUTF16(
+ IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_OTP));
+ layout_->AddView(otp_label_);
+ otp_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT);
+ otp_textfield_->SetController(this);
+ layout_->AddView(otp_textfield_);
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
// Group Name label and input.
- if (enable_group_name_) {
- layout->StartRow(0, column_view_set_id);
- group_name_label_ = new views::Label(l10n_util::GetStringUTF16(
- IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_GROUP_NAME));
- layout->AddView(group_name_label_);
- group_name_textfield_ =
- new views::Textfield(views::Textfield::STYLE_DEFAULT);
- group_name_textfield_->SetController(this);
- if (vpn && !vpn->group_name().empty())
- group_name_textfield_->SetText(UTF8ToUTF16(vpn->group_name()));
- layout->AddView(group_name_textfield_);
- layout->AddView(new ControlledSettingIndicatorView(group_name_ui_data_));
- layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
- } else {
- group_name_label_ = NULL;
- group_name_textfield_ = NULL;
- }
+ layout_->StartRow(0, 0);
+ group_name_label_ = new views::Label(l10n_util::GetStringUTF16(
+ IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_GROUP_NAME));
+ layout_->AddView(group_name_label_);
+ group_name_textfield_ =
+ new views::Textfield(views::Textfield::STYLE_DEFAULT);
+ group_name_textfield_->SetController(this);
+ layout_->AddView(group_name_textfield_);
+ layout_->AddView(new ControlledSettingIndicatorView(group_name_ui_data_));
+ layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
// Save credentials
- layout->StartRow(0, column_view_set_id);
+ layout_->StartRow(0, 0);
save_credentials_checkbox_ = new views::Checkbox(
l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SAVE_CREDENTIALS));
save_credentials_checkbox_->SetEnabled(
save_credentials_ui_data_.IsEditable());
- bool save_credentials = vpn ? vpn->save_credentials() : false;
- save_credentials_checkbox_->SetChecked(save_credentials);
- layout->SkipColumns(1);
- layout->AddView(save_credentials_checkbox_);
- layout->AddView(
+ layout_->SkipColumns(1);
+ layout_->AddView(save_credentials_checkbox_);
+ layout_->AddView(
new ControlledSettingIndicatorView(save_credentials_ui_data_));
// Error label.
- layout->StartRow(0, column_view_set_id);
- layout->SkipColumns(1);
+ layout_->StartRow(0, 0);
+ layout_->SkipColumns(1);
error_label_ = new views::Label();
error_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
error_label_->SetEnabledColor(SK_ColorRED);
- layout->AddView(error_label_);
+ layout_->AddView(error_label_);
// Set or hide the UI, update comboboxes and error labels.
Refresh();
+
+ if (vpn) {
+ NetworkHandler::Get()->network_configuration_handler()->GetProperties(
+ service_path_,
+ base::Bind(&VPNConfigView::InitFromProperties,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&VPNConfigView::GetPropertiesError,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
}
-void VPNConfigView::Refresh() {
- NetworkLibrary* cros = NetworkLibrary::Get();
+void VPNConfigView::InitFromProperties(
+ const std::string& service_path,
+ const base::DictionaryValue& service_properties) {
+ const NetworkState* vpn = NetworkHandler::Get()->network_state_handler()->
+ GetNetworkState(service_path);
+ if (!vpn) {
+ NET_LOG_ERROR("Shill Error getting properties VpnConfigView", service_path);
+ return;
+ }
+
+ std::string provider_type, server_hostname, username, group_name;
+ bool psk_passphrase_required = false;
+ const base::DictionaryValue* provider_properties;
+ if (service_properties.GetDictionaryWithoutPathExpansion(
+ flimflam::kProviderProperty, &provider_properties)) {
+ provider_properties->GetStringWithoutPathExpansion(
+ flimflam::kTypeProperty, &provider_type);
+ provider_properties->GetStringWithoutPathExpansion(
+ flimflam::kHostProperty, &server_hostname);
+ }
+ if (provider_type == flimflam::kProviderL2tpIpsec) {
+ provider_properties->GetStringWithoutPathExpansion(
+ flimflam::kL2tpIpsecClientCertIdProperty, &client_cert_id_);
+ ca_cert_pem_ = GetPemFromDictionary(
+ provider_properties, shill::kL2tpIpsecCaCertPemProperty);
+ provider_properties->GetBooleanWithoutPathExpansion(
+ flimflam::kL2tpIpsecPskRequiredProperty, &psk_passphrase_required);
+ provider_properties->GetStringWithoutPathExpansion(
+ flimflam::kL2tpIpsecUserProperty, &username);
+ provider_properties->GetStringWithoutPathExpansion(
+ shill::kL2tpIpsecTunnelGroupProperty, &group_name);
+ } else if (provider_type == flimflam::kProviderOpenVpn) {
+ provider_properties->GetStringWithoutPathExpansion(
+ flimflam::kOpenVPNClientCertIdProperty, &client_cert_id_);
+ ca_cert_pem_ = GetPemFromDictionary(
+ provider_properties, shill::kOpenVPNCaCertPemProperty);
+ provider_properties->GetStringWithoutPathExpansion(
+ flimflam::kOpenVPNUserProperty, &username);
+ }
+ bool save_credentials = false;
+ service_properties.GetBooleanWithoutPathExpansion(
+ flimflam::kSaveCredentialsProperty, &save_credentials);
+
+ provider_type_index_ = ProviderTypeToIndex(provider_type, client_cert_id_);
+
+ if (service_text_)
+ service_text_->SetText(ASCIIToUTF16(vpn->name()));
+ if (provider_type_text_label_)
+ provider_type_text_label_->SetText(
+ ProviderTypeIndexToString(provider_type_index_));
+
+ if (server_textfield_ && !server_hostname.empty())
+ server_textfield_->SetText(UTF8ToUTF16(server_hostname));
+ if (username_textfield_ && !username.empty())
+ username_textfield_->SetText(UTF8ToUTF16(username));
+ if (group_name_textfield_ && !group_name.empty())
+ group_name_textfield_->SetText(UTF8ToUTF16(group_name));
+ if (psk_passphrase_textfield_)
+ psk_passphrase_textfield_->SetShowFake(!psk_passphrase_required);
+ if (save_credentials_checkbox_)
+ save_credentials_checkbox_->SetChecked(save_credentials);
+
+ Refresh();
+}
+
+void VPNConfigView::ParseUIProperties(const NetworkState* vpn) {
+ std::string type_dict_name =
+ ProviderTypeIndexToONCDictKey(provider_type_index_);
+ if (provider_type_index_ == PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK) {
+ ParseVPNUIProperty(vpn, type_dict_name, onc::ipsec::kServerCARef,
+ &ca_cert_ui_data_);
+ ParseVPNUIProperty(vpn, type_dict_name, onc::ipsec::kPSK,
+ &psk_passphrase_ui_data_);
+ ParseVPNUIProperty(vpn, type_dict_name, onc::ipsec::kGroup,
+ &group_name_ui_data_);
+ } else if (provider_type_index_ == PROVIDER_TYPE_INDEX_OPEN_VPN) {
+ ParseVPNUIProperty(vpn, type_dict_name, onc::openvpn::kServerCARef,
+ &ca_cert_ui_data_);
+ }
+ ParseVPNUIProperty(vpn, type_dict_name, onc::vpn::kClientCertRef,
+ &user_cert_ui_data_);
+
+ const std::string credentials_dict_name(
+ provider_type_index_ == PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK ?
+ onc::vpn::kL2TP : type_dict_name);
+ ParseVPNUIProperty(vpn, credentials_dict_name, onc::vpn::kUsername,
+ &username_ui_data_);
+ ParseVPNUIProperty(vpn, credentials_dict_name, onc::vpn::kPassword,
+ &user_passphrase_ui_data_);
+ ParseVPNUIProperty(vpn, credentials_dict_name, onc::vpn::kSaveCredentials,
+ &save_credentials_ui_data_);
+}
+
+void VPNConfigView::GetPropertiesError(
+ const std::string& error_name,
+ scoped_ptr<base::DictionaryValue> error_data) {
+ NET_LOG_ERROR("Shill Error from VpnConfigView: " + error_name, "");
+}
+
+void VPNConfigView::SetConfigProperties(
+ base::DictionaryValue* properties) {
+ int provider_type_index = GetProviderTypeIndex();
+ std::string user_passphrase = GetUserPassphrase();
+ std::string user_name = GetUsername();
+ std::string group_name = GetGroupName();
+ switch (provider_type_index) {
+ case PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK: {
+ std::string psk_passphrase = GetPSKPassphrase();
+ if (!psk_passphrase.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kL2tpIpsecPskProperty, GetPSKPassphrase());
+ }
+ if (!group_name.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ shill::kL2tpIpsecTunnelGroupProperty, group_name);
+ }
+ if (!user_name.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kL2tpIpsecUserProperty, user_name);
+ }
+ if (!user_passphrase.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kL2tpIpsecPasswordProperty, user_passphrase);
+ }
+ break;
+ }
+ case PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT: {
+ std::string ca_cert_pem = GetServerCACertPEM();
+ if (!ca_cert_pem.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ shill::kL2tpIpsecCaCertPemProperty, ca_cert_pem);
+ }
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kL2tpIpsecClientCertIdProperty, GetUserCertID());
+ if (!group_name.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ shill::kL2tpIpsecTunnelGroupProperty, GetGroupName());
+ }
+ if (!user_name.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kL2tpIpsecUserProperty, user_name);
+ }
+ if (!user_passphrase.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kL2tpIpsecPasswordProperty, user_passphrase);
+ }
+ break;
+ }
+ case PROVIDER_TYPE_INDEX_OPEN_VPN: {
+ std::string ca_cert_pem = GetServerCACertPEM();
+ if (!ca_cert_pem.empty()) {
+ base::ListValue* pem_list = new base::ListValue;
+ pem_list->AppendString(GetServerCACertPEM());
+ properties->SetWithoutPathExpansion(
+ shill::kOpenVPNCaCertPemProperty, pem_list);
+ }
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kOpenVPNClientCertIdProperty, GetUserCertID());
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kOpenVPNUserProperty, GetUsername());
+ if (!user_passphrase.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kOpenVPNPasswordProperty, user_passphrase);
+ }
+ std::string otp = GetOTP();
+ if (!otp.empty()) {
+ properties->SetStringWithoutPathExpansion(
+ flimflam::kOpenVPNOTPProperty, otp);
+ }
+ break;
+ }
+ case PROVIDER_TYPE_INDEX_MAX:
+ NOTREACHED();
+ break;
+ }
+ properties->SetBooleanWithoutPathExpansion(
+ flimflam::kSaveCredentialsProperty, GetSaveCredentials());
+}
+void VPNConfigView::Refresh() {
UpdateControls();
// Set certificate combo boxes.
- VirtualNetwork* vpn = cros->FindVirtualNetworkByPath(service_path_);
if (server_ca_cert_combobox_) {
server_ca_cert_combobox_->ModelChanged();
- if (enable_server_ca_cert_ &&
- (vpn && !vpn->ca_cert_pem().empty())) {
+ if (enable_server_ca_cert_ && !ca_cert_pem_.empty()) {
// Select the current server CA certificate in the combobox.
int cert_index = CertLibrary::Get()->GetCertIndexByPEM(
- CertLibrary::CERT_TYPE_SERVER_CA, vpn->ca_cert_pem());
+ CertLibrary::CERT_TYPE_SERVER_CA, ca_cert_pem_);
if (cert_index >= 0) {
// Skip item for "Default"
server_ca_cert_combobox_->SetSelectedIndex(1 + cert_index);
@@ -740,10 +891,9 @@ void VPNConfigView::Refresh() {
if (user_cert_combobox_) {
user_cert_combobox_->ModelChanged();
- if (enable_user_cert_ &&
- (vpn && !vpn->client_cert_id().empty())) {
+ if (enable_user_cert_ && !client_cert_id_.empty()) {
int cert_index = CertLibrary::Get()->GetCertIndexByPkcs11Id(
- CertLibrary::CERT_TYPE_USER, vpn->client_cert_id());
+ CertLibrary::CERT_TYPE_USER, client_cert_id_);
if (cert_index >= 0)
user_cert_combobox_->SetSelectedIndex(cert_index);
else
@@ -757,30 +907,23 @@ void VPNConfigView::Refresh() {
}
void VPNConfigView::UpdateControlsToEnable() {
- // Set which controls are enabled.
enable_psk_passphrase_ = false;
enable_user_cert_ = false;
enable_server_ca_cert_ = false;
enable_otp_ = false;
enable_group_name_ = false;
- switch (provider_type_) {
- case PROVIDER_TYPE_L2TP_IPSEC_PSK:
- enable_psk_passphrase_ = true;
- enable_group_name_ = true;
- break;
- case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
- enable_server_ca_cert_ = true;
- enable_user_cert_ = HaveUserCerts();
- enable_group_name_ = true;
- break;
- case PROVIDER_TYPE_OPEN_VPN:
- enable_server_ca_cert_ = true;
- enable_user_cert_ = HaveUserCerts();
- enable_otp_ = true;
- break;
- default:
- NOTREACHED();
- break;
+ int provider_type_index = GetProviderTypeIndex();
+ if (provider_type_index == PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK) {
+ enable_psk_passphrase_ = true;
+ enable_group_name_ = true;
+ } else if (provider_type_index == PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT) {
+ enable_server_ca_cert_ = true;
+ enable_user_cert_ = HaveUserCerts();
+ enable_group_name_ = true;
+ } else { // PROVIDER_TYPE_INDEX_OPEN_VPN (default)
+ enable_server_ca_cert_ = true;
+ enable_user_cert_ = HaveUserCerts();
+ enable_otp_ = true;
}
}
@@ -818,33 +961,28 @@ void VPNConfigView::UpdateControls() {
}
void VPNConfigView::UpdateErrorLabel() {
- NetworkLibrary* cros = NetworkLibrary::Get();
-
// Error message.
- std::string error_msg;
- if (UserCertRequired() && CertLibrary::Get()->CertificatesLoaded()) {
+ string16 error_msg;
+ bool cert_required =
+ GetProviderTypeIndex() == PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT;
+ if (cert_required && CertLibrary::Get()->CertificatesLoaded()) {
if (!HaveUserCerts()) {
- error_msg = l10n_util::GetStringUTF8(
+ error_msg = l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PLEASE_INSTALL_USER_CERT);
} else if (!IsUserCertValid()) {
- error_msg = l10n_util::GetStringUTF8(
+ error_msg = l10n_util::GetStringUTF16(
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_REQUIRE_HARDWARE_BACKED);
}
}
if (error_msg.empty() && !service_path_.empty()) {
// TODO(kuan): differentiate between bad psk and user passphrases.
- VirtualNetwork* vpn = cros->FindVirtualNetworkByPath(service_path_);
- if (vpn && vpn->failed()) {
- if (vpn->error() == ERROR_BAD_PASSPHRASE) {
- error_msg = l10n_util::GetStringUTF8(
- IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_BAD_PASSPHRASE);
- } else {
- error_msg = vpn->GetErrorString();
- }
- }
+ const NetworkState* vpn = NetworkHandler::Get()->network_state_handler()->
+ GetNetworkState(service_path_);
+ if (vpn && vpn->connection_state() == flimflam::kStateFailure)
+ error_msg = ash::network_connect::ErrorString(vpn->error());
}
if (!error_msg.empty()) {
- error_label_->SetText(UTF8ToUTF16(error_msg));
+ error_label_->SetText(error_msg);
error_label_->SetVisible(true);
} else {
error_label_->SetVisible(false);
@@ -855,10 +993,6 @@ void VPNConfigView::UpdateCanLogin() {
parent_->GetDialogClientView()->UpdateDialogButtons();
}
-bool VPNConfigView::UserCertRequired() const {
- return provider_type_ == PROVIDER_TYPE_L2TP_IPSEC_USER_CERT;
-}
-
bool VPNConfigView::HaveUserCerts() const {
return CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER) > 0;
}
@@ -896,15 +1030,16 @@ const std::string VPNConfigView::GetPassphraseFromField(
return textfield->GetPassphrase();
}
-void VPNConfigView::ParseVPNUIProperty(NetworkPropertyUIData* property_ui_data,
- Network* network,
- const std::string& dict_key,
- const std::string& key) {
+void VPNConfigView::ParseVPNUIProperty(
+ const NetworkState* network,
+ const std::string& dict_key,
+ const std::string& key,
+ NetworkPropertyUIData* property_ui_data) {
onc::ONCSource onc_source = onc::ONC_SOURCE_NONE;
const base::DictionaryValue* onc =
- NetworkConfigView::FindPolicyForActiveUser(network, &onc_source);
+ network_connect::FindPolicyForActiveUser(network, &onc_source);
- VLOG_IF(1, !onc) << "No ONC found for VPN network " << network->unique_id();
+ VLOG_IF(1, !onc) << "No ONC found for VPN network " << network->guid();
property_ui_data->ParseOncProperty(
onc_source,
onc,