vpn_config_view.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/vpn_config_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 85e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/cros_library.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/cros/network_library.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/enrollment_dialog_view.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/net/x509_certificate_model.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_ui_data.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_constants.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/combobox_model.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/combobox/combobox.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Root CA certificates that are built into Chrome use this token name. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kRootCertificateTokenName = "Builtin Object Token"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ProviderTypeToString(chromeos::ProviderType type) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::PROVIDER_TYPE_L2TP_IPSEC_PSK: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_PSK); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_USER_CERT); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::PROVIDER_TYPE_OPEN_VPN: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_OPEN_VPN); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::PROVIDER_TYPE_MAX: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return string16(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translates the provider type to the name of the respective ONC dictionary 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// containing configuration data for the type. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ProviderTypeToONCDictKey(chromeos::ProviderType type) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::PROVIDER_TYPE_L2TP_IPSEC_PSK: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chromeos::onc::vpn::kIPsec; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::PROVIDER_TYPE_OPEN_VPN: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chromeos::onc::vpn::kOpenVPN; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chromeos::PROVIDER_TYPE_MAX: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unhandled provider type " << type; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProviderTypeComboboxModel : public ui::ComboboxModel { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProviderTypeComboboxModel(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ProviderTypeComboboxModel(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ui::ComboboxModel: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetItemCount() const OVERRIDE; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetItemAt(int index) OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProviderTypeComboboxModel); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VpnServerCACertComboboxModel : public ui::ComboboxModel { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VpnServerCACertComboboxModel(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VpnServerCACertComboboxModel(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ui::ComboboxModel: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetItemCount() const OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetItemAt(int index) OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VpnServerCACertComboboxModel); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VpnUserCertComboboxModel : public ui::ComboboxModel { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VpnUserCertComboboxModel(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VpnUserCertComboboxModel(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ui::ComboboxModel: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetItemCount() const OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetItemAt(int index) OVERRIDE; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VpnUserCertComboboxModel); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProviderTypeComboboxModel --------------------------------------------------- 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProviderTypeComboboxModel::ProviderTypeComboboxModel() { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProviderTypeComboboxModel::~ProviderTypeComboboxModel() { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ProviderTypeComboboxModel::GetItemCount() const { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PROVIDER_TYPE_MAX; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ProviderTypeComboboxModel::GetItemAt(int index) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProviderType type = static_cast<ProviderType>(index); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProviderTypeToString(type); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VpnServerCACertComboboxModel ------------------------------------------------ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VpnServerCACertComboboxModel::VpnServerCACertComboboxModel() { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VpnServerCACertComboboxModel::~VpnServerCACertComboboxModel() { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VpnServerCACertComboboxModel::GetItemCount() const { 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->CertificatesLoading()) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; // "Loading" 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Default" + certs. 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->NumCertificates( 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_SERVER_CA) + 1; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 VpnServerCACertComboboxModel::GetItemAt(int index) { 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->CertificatesLoading()) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_LOADING); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == 0) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA_DEFAULT); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_index = index - 1; 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->GetCertDisplayStringAt( 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_SERVER_CA, cert_index); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VpnUserCertComboboxModel ---------------------------------------------------- 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VpnUserCertComboboxModel::VpnUserCertComboboxModel() { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VpnUserCertComboboxModel::~VpnUserCertComboboxModel() { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VpnUserCertComboboxModel::GetItemCount() const { 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->CertificatesLoading()) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; // "Loading" 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_certs = 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_certs == 0) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; // "None installed" 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return num_certs; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 VpnUserCertComboboxModel::GetItemAt(int index) { 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->CertificatesLoading()) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_LOADING); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER) == 0) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_USER_CERT_NONE_INSTALLED); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->GetCertDisplayStringAt( 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_USER, index); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VPNConfigView::VPNConfigView(NetworkConfigView* parent, VirtualNetwork* vpn) 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ChildNetworkConfigView(parent, vpn), 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) title_(0) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(vpn); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VPNConfigView::VPNConfigView(NetworkConfigView* parent) 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : ChildNetworkConfigView(parent), 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) title_(0) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(NULL); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VPNConfigView::~VPNConfigView() { 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::Get()->RemoveObserver(this); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)string16 VPNConfigView::GetTitle() const { 21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK_NE(title_, 0); 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return l10n_util::GetStringUTF16(title_); 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* VPNConfigView::GetInitiallyFocusedView() { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put focus in the first editable field. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_textfield_) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return server_textfield_; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (service_textfield_) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return service_textfield_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (provider_type_combobox_) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return provider_type_combobox_; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (psk_passphrase_textfield_ && psk_passphrase_textfield_->enabled()) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return psk_passphrase_textfield_; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (user_cert_combobox_ && user_cert_combobox_->enabled()) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return user_cert_combobox_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (server_ca_cert_combobox_ && server_ca_cert_combobox_->enabled()) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return server_ca_cert_combobox_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::CanLogin() { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Username is always required. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUsername().empty()) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(stevenjb): min kMinPassphraseLen length? 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service_path_.empty() && 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (GetService().empty() || GetServer().empty())) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Block login if certs are required but user has none. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (UserCertRequired() && (!HaveUserCerts() || !IsUserCertValid())) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::ContentsChanged(views::Textfield* sender, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& new_contents) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == server_textfield_ && !service_text_modified_) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the service name to the server name up to '.', unless it has 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been explicitly set by the user. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 server = server_textfield_->text(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16::size_type n = server.find_first_of(L'.'); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_name_from_server_ = server.substr(0, n); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_textfield_->SetText(service_name_from_server_); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == service_textfield_) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_contents.empty()) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_modified_ = false; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (new_contents != service_name_from_server_) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_modified_ = true; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateCanLogin(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::HandleKeyEvent(views::Textfield* sender, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::KeyEvent& key_event) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((sender == psk_passphrase_textfield_ || 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sender == user_passphrase_textfield_) && 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event.key_code() == ui::VKEY_RETURN) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->GetDialogClientView()->AcceptWindow(); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::ButtonPressed(views::Button* sender, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::OnSelectedIndexChanged(views::Combobox* combobox) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (combobox == provider_type_combobox_) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_ = static_cast<ProviderType>(combobox->selected_index()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateControls(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (combobox == user_cert_combobox_ || 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) combobox == server_ca_cert_combobox_) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateErrorLabel(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateCanLogin(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::OnCertificatesLoaded(bool initial_load) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Refresh(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::Login() { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service_path_.empty()) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkLibrary::VPNConfigData config_data; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (provider_type_) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_L2TP_IPSEC_PSK: 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.psk = GetPSKPassphrase(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.username = GetUsername(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.user_passphrase = GetUserPassphrase(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.group_name = GetGroupName(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: { 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch config_data.server_ca_cert_pem = GetServerCACertPEM(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.client_cert_pkcs11_id = GetUserCertID(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.username = GetUsername(); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.user_passphrase = GetUserPassphrase(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.group_name = GetGroupName(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_OPEN_VPN: 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch config_data.server_ca_cert_pem = GetServerCACertPEM(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.client_cert_pkcs11_id = GetUserCertID(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.username = GetUsername(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.user_passphrase = GetUserPassphrase(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.otp = GetOTP(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_MAX: 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config_data.save_credentials = GetSaveCredentials(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros->ConnectToUnconfiguredVirtualNetwork( 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetService(), GetServer(), provider_type_, config_data); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VirtualNetwork* vpn = cros->FindVirtualNetworkByPath(service_path_); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vpn) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(stevenjb): Add notification for this. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "VPN no longer exists: " << service_path_; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Close dialog. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (provider_type_) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_L2TP_IPSEC_PSK: 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vpn->SetL2TPIPsecPSKCredentials(GetPSKPassphrase(), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUsername(), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUserPassphrase(), 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetGroupName()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vpn->SetL2TPIPsecCertCredentials(GetUserCertID(), 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUsername(), 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUserPassphrase(), 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetGroupName()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_OPEN_VPN: { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vpn->SetOpenVPNCredentials(GetUserCertID(), 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUsername(), 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUserPassphrase(), 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOTP()); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_MAX: 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vpn->SetEnrollmentDelegate( 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateEnrollmentDelegate(GetWidget()->GetNativeWindow(), 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vpn->name(), 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager::GetLastUsedProfile())); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vpn->SetSaveCredentials(GetSaveCredentials()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cros->ConnectToVirtualNetwork(vpn); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Connection failures are responsible for updating the UI, including 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reopening dialogs. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Close dialog. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::Cancel() { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::InitFocus() { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* view_to_focus = GetInitiallyFocusedView(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_to_focus) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_to_focus->RequestFocus(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetService() const { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service_textfield_ != NULL) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(service_textfield_, true); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return service_path_; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetServer() const { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_textfield_ != NULL) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(server_textfield_, true); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return server_hostname_; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetPSKPassphrase() const { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (psk_passphrase_textfield_ && 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_psk_passphrase_ && 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_textfield_->visible()) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPassphraseFromField(psk_passphrase_textfield_); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetUsername() const { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(username_textfield_, true); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetUserPassphrase() const { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPassphraseFromField(user_passphrase_textfield_); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetGroupName() const { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(group_name_textfield_, false); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetOTP() const { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(otp_textfield_, true); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst std::string VPNConfigView::GetServerCACertPEM() const { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = server_ca_cert_combobox_ ? 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->selected_index() : 0; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == 0) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First item is "Default". 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_index = index - 1; 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return CertLibrary::Get()->GetCertPEMAt( 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_SERVER_CA, cert_index); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetUserCertID() const { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HaveUserCerts()) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); // "None installed" 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certificates are listed in the order they appear in the model. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = user_cert_combobox_ ? user_cert_combobox_->selected_index() : 0; 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->GetCertPkcs11IdAt( 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_USER, index); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::GetSaveCredentials() const { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return save_credentials_checkbox_->checked(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::Init(VirtualNetwork* vpn) { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vpn) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProviderType type = vpn->provider_type(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string type_dict_name = ProviderTypeToONCDictKey(type); 456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == PROVIDER_TYPE_L2TP_IPSEC_PSK) { 458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ParseVPNUIProperty(&ca_cert_ui_data_, vpn, type_dict_name, 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onc::ipsec::kServerCARef); 460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ParseVPNUIProperty(&psk_passphrase_ui_data_, vpn, type_dict_name, 461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onc::ipsec::kPSK); 462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ParseVPNUIProperty(&group_name_ui_data_, vpn, type_dict_name, 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onc::ipsec::kGroup); 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { // OpenVPN 465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ParseVPNUIProperty(&ca_cert_ui_data_, vpn, type_dict_name, 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch onc::openvpn::kServerCARef); 467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseVPNUIProperty(&user_cert_ui_data_, vpn, type_dict_name, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onc::vpn::kClientCertRef); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string credentials_dict_name( 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == PROVIDER_TYPE_L2TP_IPSEC_PSK ? 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onc::vpn::kL2TP : type_dict_name); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseVPNUIProperty(&username_ui_data_, vpn, credentials_dict_name, 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onc::vpn::kUsername); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseVPNUIProperty(&user_passphrase_ui_data_, vpn, credentials_dict_name, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onc::vpn::kPassword); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParseVPNUIProperty(&save_credentials_ui_data_, vpn, credentials_dict_name, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onc::vpn::kSaveCredentials); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout* layout = views::GridLayout::CreatePanel(this); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(layout); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Observer any changes to the certificate list. 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::Get()->AddObserver(this); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int column_view_set_id = 0; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ColumnSet* column_set = layout->AddColumnSet(column_view_set_id); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Label. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Textfield, combobox. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildNetworkConfigView::kInputFieldMinWidth); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Policy indicator. 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize members. 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_modified_ = false; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vpn) { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_ = vpn->provider_type(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets enable_* based on the provider type which we use to control 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which controls to make visible. 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateControlsToEnable(); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the default provider type. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_ = PROVIDER_TYPE_L2TP_IPSEC_PSK; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provider Type is user selectable, so enable all controls during init. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_psk_passphrase_ = true; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_user_cert_ = true; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_server_ca_cert_ = true; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_otp_ = true; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_group_name_ = true; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Initialize the title string ID used for the dialog. 52290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) title_ = vpn ? IDS_OPTIONS_SETTINGS_JOIN_VPN : IDS_OPTIONS_SETTINGS_ADD_VPN; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Server label and input. 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only provide Server name when configuring a new VPN. 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vpn) { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new views::Label(l10n_util::GetStringUTF16( 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_SERVER_HOSTNAME))); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_textfield_->SetController(this); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(server_textfield_); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_textfield_ = NULL; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Service label and name or input. 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new views::Label(l10n_util::GetStringUTF16( 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_SERVICE_NAME))); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vpn) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_textfield_->SetController(this); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(service_textfield_); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_ = NULL; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_ = new views::Label(ASCIIToUTF16(vpn->name())); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(service_text_); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_textfield_ = NULL; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provider type label and select. 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new views::Label(l10n_util::GetStringUTF16( 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PROVIDER_TYPE))); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vpn) { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_model_.reset( 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new internal::ProviderTypeComboboxModel); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_ = new views::Combobox( 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_model_.get()); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_->set_listener(this); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(provider_type_combobox_); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_text_label_ = NULL; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_text_label_ = 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new views::Label(ProviderTypeToString(provider_type_)); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(provider_type_text_label_); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_ = NULL; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PSK passphrase label, input and visible button. 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable_psk_passphrase_) { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_label_ = new views::Label(l10n_util::GetStringUTF16( 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PSK_PASSPHRASE)); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(psk_passphrase_label_); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_psk_passphrase = vpn && !vpn->IsPSKPassphraseRequired(); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_textfield_ = new PassphraseTextfield(has_psk_passphrase); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_textfield_->SetController(this); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(psk_passphrase_textfield_); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView( 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ControlledSettingIndicatorView(psk_passphrase_ui_data_)); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_label_ = NULL; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_textfield_ = NULL; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Server CA certificate 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only provide Server CA when configuring a new VPN. 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vpn) { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_label_ = 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new views::Label(l10n_util::GetStringUTF16( 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA)); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(server_ca_cert_label_); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_model_.reset( 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new internal::VpnServerCACertComboboxModel()); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_ = new views::Combobox( 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_model_.get()); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(server_ca_cert_combobox_); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new ControlledSettingIndicatorView(ca_cert_ui_data_)); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_label_ = NULL; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_ = NULL; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User certificate label and input. 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable_user_cert_) { 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_label_ = new views::Label(l10n_util::GetStringUTF16( 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_CERT)); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(user_cert_label_); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_model_.reset( 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new internal::VpnUserCertComboboxModel()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_ = new views::Combobox(user_cert_combobox_model_.get()); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->set_listener(this); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(user_cert_combobox_); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new ControlledSettingIndicatorView(user_cert_ui_data_)); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_label_ = NULL; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_ = NULL; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Username label and input. 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new views::Label(l10n_util::GetStringUTF16( 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USERNAME))); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username_textfield_->SetController(this); 63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) username_textfield_->SetEnabled(username_ui_data_.IsEditable()); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vpn && !vpn->username().empty()) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username_textfield_->SetText(UTF8ToUTF16(vpn->username())); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(username_textfield_); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new ControlledSettingIndicatorView(username_ui_data_)); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User passphrase label, input and visble button. 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new views::Label(l10n_util::GetStringUTF16( 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_PASSPHRASE))); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_user_passphrase = vpn && !vpn->IsUserPassphraseRequired(); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_passphrase_textfield_ = new PassphraseTextfield(has_user_passphrase); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_passphrase_textfield_->SetController(this); 65290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_passphrase_textfield_->SetEnabled(user_passphrase_ui_data_.IsEditable()); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(user_passphrase_textfield_); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new ControlledSettingIndicatorView(user_passphrase_ui_data_)); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OTP label and input. 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable_otp_) { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_label_ = new views::Label(l10n_util::GetStringUTF16( 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_OTP)); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(otp_label_); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_textfield_->SetController(this); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(otp_textfield_); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_label_ = NULL; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_textfield_ = NULL; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Group Name label and input. 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (enable_group_name_) { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_label_ = new views::Label(l10n_util::GetStringUTF16( 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_GROUP_NAME)); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(group_name_label_); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_textfield_ = 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new views::Textfield(views::Textfield::STYLE_DEFAULT); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_textfield_->SetController(this); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vpn && !vpn->group_name().empty()) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_textfield_->SetText(UTF8ToUTF16(vpn->group_name())); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(group_name_textfield_); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(new ControlledSettingIndicatorView(group_name_ui_data_)); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_label_ = NULL; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_textfield_ = NULL; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save credentials 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_credentials_checkbox_ = new views::Checkbox( 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16( 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SAVE_CREDENTIALS)); 69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) save_credentials_checkbox_->SetEnabled( 69790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) save_credentials_ui_data_.IsEditable()); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool save_credentials = vpn ? vpn->save_credentials() : false; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_credentials_checkbox_->SetChecked(save_credentials); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->SkipColumns(1); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(save_credentials_checkbox_); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView( 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ControlledSettingIndicatorView(save_credentials_ui_data_)); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error label. 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, column_view_set_id); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->SkipColumns(1); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_ = new views::Label(); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetEnabledColor(SK_ColorRED); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(error_label_); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set or hide the UI, update comboboxes and error labels. 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Refresh(); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::Refresh() { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateControls(); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set certificate combo boxes. 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VirtualNetwork* vpn = cros->FindVirtualNetworkByPath(service_path_); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_ca_cert_combobox_) { 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->ModelChanged(); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable_server_ca_cert_ && 727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (vpn && !vpn->ca_cert_pem().empty())) { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select the current server CA certificate in the combobox. 729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int cert_index = CertLibrary::Get()->GetCertIndexByPEM( 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CertLibrary::CERT_TYPE_SERVER_CA, vpn->ca_cert_pem()); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cert_index >= 0) { 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip item for "Default" 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->SetSelectedIndex(1 + cert_index); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->SetSelectedIndex(0); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->SetSelectedIndex(0); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_cert_combobox_) { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->ModelChanged(); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enable_user_cert_ && 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (vpn && !vpn->client_cert_id().empty())) { 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int cert_index = CertLibrary::Get()->GetCertIndexByPkcs11Id( 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_USER, vpn->client_cert_id()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cert_index >= 0) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->SetSelectedIndex(cert_index); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->SetSelectedIndex(0); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->SetSelectedIndex(0); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateErrorLabel(); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::UpdateControlsToEnable() { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set which controls are enabled. 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_psk_passphrase_ = false; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_user_cert_ = false; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_server_ca_cert_ = false; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_otp_ = false; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_group_name_ = false; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (provider_type_) { 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_L2TP_IPSEC_PSK: 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_psk_passphrase_ = true; 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_group_name_ = true; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_server_ca_cert_ = true; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_user_cert_ = HaveUserCerts(); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_group_name_ = true; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PROVIDER_TYPE_OPEN_VPN: 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_server_ca_cert_ = true; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_user_cert_ = HaveUserCerts(); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_otp_ = true; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::UpdateControls() { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateControlsToEnable(); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (psk_passphrase_label_) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_label_->SetEnabled(enable_psk_passphrase_); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (psk_passphrase_textfield_) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_textfield_->SetEnabled(enable_psk_passphrase_ && 79590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) psk_passphrase_ui_data_.IsEditable()); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_cert_label_) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_label_->SetEnabled(enable_user_cert_); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_cert_combobox_) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->SetEnabled(enable_user_cert_ && 80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_cert_ui_data_.IsEditable()); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_ca_cert_label_) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_label_->SetEnabled(enable_server_ca_cert_); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_ca_cert_combobox_) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->SetEnabled(enable_server_ca_cert_ && 80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ca_cert_ui_data_.IsEditable()); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (otp_label_) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_label_->SetEnabled(enable_otp_); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (otp_textfield_) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_textfield_->SetEnabled(enable_otp_); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group_name_label_) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_label_->SetEnabled(enable_group_name_); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group_name_textfield_) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_textfield_->SetEnabled(enable_group_name_ && 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) group_name_ui_data_.IsEditable()); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::UpdateErrorLabel() { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error message. 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_msg; 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (UserCertRequired() && CertLibrary::Get()->CertificatesLoaded()) { 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HaveUserCerts()) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = l10n_util::GetStringUTF8( 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PLEASE_INSTALL_USER_CERT); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!IsUserCertValid()) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = l10n_util::GetStringUTF8( 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_REQUIRE_HARDWARE_BACKED); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_msg.empty() && !service_path_.empty()) { 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kuan): differentiate between bad psk and user passphrases. 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VirtualNetwork* vpn = cros->FindVirtualNetworkByPath(service_path_); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vpn && vpn->failed()) { 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vpn->error() == ERROR_BAD_PASSPHRASE) { 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = l10n_util::GetStringUTF8( 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_BAD_PASSPHRASE); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_msg = vpn->GetErrorString(); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!error_msg.empty()) { 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetText(UTF8ToUTF16(error_msg)); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetVisible(true); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetVisible(false); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::UpdateCanLogin() { 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->GetDialogClientView()->UpdateDialogButtons(); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::UserCertRequired() const { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return provider_type_ == PROVIDER_TYPE_L2TP_IPSEC_USER_CERT; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::HaveUserCerts() const { 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER) > 0; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::IsUserCertValid() const { 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!user_cert_combobox_ || !enable_user_cert_) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = user_cert_combobox_->selected_index(); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < 0) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Currently only hardware-backed user certificates are valid. 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->IsHardwareBacked() && 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !CertLibrary::Get()->IsCertHardwareBackedAt( 876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_USER, index)) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetTextFromField(views::Textfield* textfield, 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool trim_whitespace) const { 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!textfield) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string untrimmed = UTF16ToUTF8(textfield->text()); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!trim_whitespace) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return untrimmed; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimWhitespaceASCII(untrimmed, TRIM_ALL, &result); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetPassphraseFromField( 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PassphraseTextfield* textfield) const { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!textfield) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return textfield->GetPassphrase(); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::ParseVPNUIProperty(NetworkPropertyUIData* property_ui_data, 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Network* network, 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& dict_key, 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key) { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary(); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* onc = 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_library->FindOncForNetwork(network->unique_id()); 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG_IF(1, !onc) << "No ONC found for VPN network " << network->unique_id(); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) property_ui_data->ParseOncProperty( 91090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network->ui_data().onc_source(), onc, 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("%s.%s.%s", 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) onc::network_config::kVPN, 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict_key.c_str(), 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key.c_str())); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 918