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) 74311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "ash/system/chromeos/network/network_connect.h" 85e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/enrollment_dialog_view.h" 124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/chromeos/options/network_connect.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/net/x509_certificate_model.h" 154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chromeos/network/network_configuration_handler.h" 164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chromeos/network/network_event_log.h" 174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chromeos/network/network_state.h" 184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chromeos/network/network_state_handler.h" 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_ui_data.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/onc/onc_constants.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "third_party/cros_system_api/dbus/service_constants.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/combobox_model.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/checkbox.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/combobox/combobox.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/dialog_client_view.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Root CA certificates that are built into Chrome use this token name. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kRootCertificateTokenName = "Builtin Object Token"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochenum ProviderTypeIndex { 454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK = 0, 464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT = 1, 474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch PROVIDER_TYPE_INDEX_OPEN_VPN = 2, 484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch PROVIDER_TYPE_INDEX_MAX = 3, 494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}; 504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochstring16 ProviderTypeIndexToString(int index) { 524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch switch (index) { 534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_PSK); 564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT: 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_USER_CERT); 594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_OPEN_VPN: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_OPEN_VPN); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return string16(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochint ProviderTypeToIndex(const std::string& provider_type, 684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& client_cert_id) { 694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (provider_type == flimflam::kProviderL2tpIpsec) { 704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!client_cert_id.empty()) 714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT; 724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch else 734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK; 744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } else { 754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch DCHECK(provider_type == flimflam::kProviderOpenVpn); 764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return PROVIDER_TYPE_INDEX_OPEN_VPN; 774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translates the provider type to the name of the respective ONC dictionary 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// containing configuration data for the type. 824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochstd::string ProviderTypeIndexToONCDictKey(int provider_type_index) { 834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch switch (provider_type_index) { 844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK: 854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chromeos::onc::vpn::kIPsec; 874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_OPEN_VPN: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return chromeos::onc::vpn::kOpenVPN; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NOTREACHED() << "Unhandled provider type index " << provider_type_index; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochstd::string GetPemFromDictionary( 954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const base::DictionaryValue* provider_properties, 964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& key) { 974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const base::ListValue* pems = NULL; 984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!provider_properties->GetListWithoutPathExpansion(key, &pems)) 994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return std::string(); 1004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string pem; 1014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch pems->GetString(0, &pem); 1024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return pem; 1034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 1044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid ShillError(const std::string& function, 1064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& error_name, 1074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_ptr<base::DictionaryValue> error_data) { 1084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NET_LOG_ERROR("Shill Error from VpnConfigView: " + error_name, function); 1094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 1104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProviderTypeComboboxModel : public ui::ComboboxModel { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProviderTypeComboboxModel(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ProviderTypeComboboxModel(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ui::ComboboxModel: 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetItemCount() const OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetItemAt(int index) OVERRIDE; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProviderTypeComboboxModel); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VpnServerCACertComboboxModel : public ui::ComboboxModel { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VpnServerCACertComboboxModel(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VpnServerCACertComboboxModel(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ui::ComboboxModel: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetItemCount() const OVERRIDE; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetItemAt(int index) OVERRIDE; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VpnServerCACertComboboxModel); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VpnUserCertComboboxModel : public ui::ComboboxModel { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VpnUserCertComboboxModel(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VpnUserCertComboboxModel(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ui::ComboboxModel: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetItemCount() const OVERRIDE; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual string16 GetItemAt(int index) OVERRIDE; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VpnUserCertComboboxModel); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProviderTypeComboboxModel --------------------------------------------------- 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProviderTypeComboboxModel::ProviderTypeComboboxModel() { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProviderTypeComboboxModel::~ProviderTypeComboboxModel() { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ProviderTypeComboboxModel::GetItemCount() const { 1654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return PROVIDER_TYPE_INDEX_MAX; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ProviderTypeComboboxModel::GetItemAt(int index) { 1694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return ProviderTypeIndexToString(index); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VpnServerCACertComboboxModel ------------------------------------------------ 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VpnServerCACertComboboxModel::VpnServerCACertComboboxModel() { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VpnServerCACertComboboxModel::~VpnServerCACertComboboxModel() { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VpnServerCACertComboboxModel::GetItemCount() const { 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->CertificatesLoading()) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; // "Loading" 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Default" + certs. 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->NumCertificates( 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_SERVER_CA) + 1; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 VpnServerCACertComboboxModel::GetItemAt(int index) { 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->CertificatesLoading()) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_LOADING); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == 0) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA_DEFAULT); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_index = index - 1; 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->GetCertDisplayStringAt( 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_SERVER_CA, cert_index); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VpnUserCertComboboxModel ---------------------------------------------------- 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VpnUserCertComboboxModel::VpnUserCertComboboxModel() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VpnUserCertComboboxModel::~VpnUserCertComboboxModel() { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VpnUserCertComboboxModel::GetItemCount() const { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->CertificatesLoading()) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; // "Loading" 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int num_certs = 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_certs == 0) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; // "None installed" 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return num_certs; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 VpnUserCertComboboxModel::GetItemAt(int index) { 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->CertificatesLoading()) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_LOADING); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER) == 0) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16( 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_USER_CERT_NONE_INSTALLED); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->GetCertDisplayStringAt( 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_USER, index); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochVPNConfigView::VPNConfigView(NetworkConfigView* parent, 2344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& service_path) 2354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch : ChildNetworkConfigView(parent, service_path), 2364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch service_text_modified_(false), 2374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_psk_passphrase_(false), 2384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_user_cert_(false), 2394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_server_ca_cert_(false), 2404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_otp_(false), 2414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_group_name_(false), 2424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch title_(0), 2434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_(NULL), 2444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch server_textfield_(NULL), 2454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch service_text_(NULL), 2464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch service_textfield_(NULL), 2474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_type_combobox_(NULL), 2484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_type_text_label_(NULL), 2494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch psk_passphrase_label_(NULL), 2504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch psk_passphrase_textfield_(NULL), 2514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch user_cert_label_(NULL), 2524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch user_cert_combobox_(NULL), 2534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch server_ca_cert_label_(NULL), 2544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch server_ca_cert_combobox_(NULL), 2554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch username_textfield_(NULL), 2564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch user_passphrase_textfield_(NULL), 2574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch otp_label_(NULL), 2584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch otp_textfield_(NULL), 2594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch group_name_label_(NULL), 2604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch group_name_textfield_(NULL), 2614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch save_credentials_checkbox_(NULL), 2624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch error_label_(NULL), 2634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_type_index_(PROVIDER_TYPE_INDEX_MAX), 2644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch weak_ptr_factory_(this) { 2654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch Init(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VPNConfigView::~VPNConfigView() { 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::Get()->RemoveObserver(this); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)string16 VPNConfigView::GetTitle() const { 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK_NE(title_, 0); 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return l10n_util::GetStringUTF16(title_); 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* VPNConfigView::GetInitiallyFocusedView() { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put focus in the first editable field. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_textfield_) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return server_textfield_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (service_textfield_) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return service_textfield_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (provider_type_combobox_) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return provider_type_combobox_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (psk_passphrase_textfield_ && psk_passphrase_textfield_->enabled()) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return psk_passphrase_textfield_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (user_cert_combobox_ && user_cert_combobox_->enabled()) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return user_cert_combobox_; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (server_ca_cert_combobox_ && server_ca_cert_combobox_->enabled()) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return server_ca_cert_combobox_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::CanLogin() { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Username is always required. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetUsername().empty()) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(stevenjb): min kMinPassphraseLen length? 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service_path_.empty() && 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (GetService().empty() || GetServer().empty())) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Block login if certs are required but user has none. 3064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool cert_required = 3074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch GetProviderTypeIndex() == PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT; 3084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (cert_required && (!HaveUserCerts() || !IsUserCertValid())) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::ContentsChanged(views::Textfield* sender, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& new_contents) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == server_textfield_ && !service_text_modified_) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the service name to the server name up to '.', unless it has 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been explicitly set by the user. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 server = server_textfield_->text(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16::size_type n = server.find_first_of(L'.'); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_name_from_server_ = server.substr(0, n); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_textfield_->SetText(service_name_from_server_); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == service_textfield_) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_contents.empty()) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_modified_ = false; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (new_contents != service_name_from_server_) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_modified_ = true; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateCanLogin(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::HandleKeyEvent(views::Textfield* sender, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::KeyEvent& key_event) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((sender == psk_passphrase_textfield_ || 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sender == user_passphrase_textfield_) && 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event.key_code() == ui::VKEY_RETURN) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->GetDialogClientView()->AcceptWindow(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::ButtonPressed(views::Button* sender, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::OnSelectedIndexChanged(views::Combobox* combobox) { 3484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch UpdateControls(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateErrorLabel(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateCanLogin(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::OnCertificatesLoaded(bool initial_load) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Refresh(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::Login() { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service_path_.empty()) { 3594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::DictionaryValue properties; 3604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Identifying properties 3614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties.SetStringWithoutPathExpansion( 3624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kTypeProperty, flimflam::kTypeVPN); 3634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties.SetStringWithoutPathExpansion( 3644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kNameProperty, GetService()); 3654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties.SetStringWithoutPathExpansion( 3664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kProviderHostProperty, GetServer()); 3674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties.SetStringWithoutPathExpansion( 3684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kProviderTypeProperty, GetProviderTypeString()); 3694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 3704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch SetConfigProperties(&properties); 3714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ash::network_connect::CreateConfigurationAndConnect( 3724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &properties, false /* not shared */); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const NetworkState* vpn = NetworkHandler::Get()->network_state_handler()-> 3754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch GetNetworkState(service_path_); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vpn) { 3774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Shill no longer knows about this network (edge case). 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(stevenjb): Add notification for this. 3794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NET_LOG_ERROR("Network not found", service_path_); 3804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return true; // Close dialog 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::DictionaryValue properties; 3834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch SetConfigProperties(&properties); 3844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ash::network_connect::ConfigureNetworkAndConnect( 3854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch service_path_, properties, false /* not shared */); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; // Close dialog. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::Cancel() { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::InitFocus() { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* view_to_focus = GetInitiallyFocusedView(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_to_focus) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_to_focus->RequestFocus(); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetService() const { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (service_textfield_ != NULL) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(service_textfield_, true); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return service_path_; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetServer() const { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_textfield_ != NULL) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(server_textfield_, true); 4084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return std::string(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetPSKPassphrase() const { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (psk_passphrase_textfield_ && 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_psk_passphrase_ && 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_textfield_->visible()) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPassphraseFromField(psk_passphrase_textfield_); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetUsername() const { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(username_textfield_, true); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetUserPassphrase() const { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPassphraseFromField(user_passphrase_textfield_); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetGroupName() const { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(group_name_textfield_, false); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetOTP() const { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTextFromField(otp_textfield_, true); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst std::string VPNConfigView::GetServerCACertPEM() const { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = server_ca_cert_combobox_ ? 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->selected_index() : 0; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index == 0) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First item is "Default". 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cert_index = index - 1; 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return CertLibrary::Get()->GetCertPEMAt( 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_SERVER_CA, cert_index); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetUserCertID() const { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HaveUserCerts()) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); // "None installed" 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Certificates are listed in the order they appear in the model. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = user_cert_combobox_ ? user_cert_combobox_->selected_index() : 0; 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->GetCertPkcs11IdAt( 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_USER, index); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::GetSaveCredentials() const { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return save_credentials_checkbox_->checked(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochint VPNConfigView::GetProviderTypeIndex() const { 4644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (provider_type_combobox_) 4654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return provider_type_combobox_->selected_index(); 4664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return provider_type_index_; 4674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 4684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 4694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochstd::string VPNConfigView::GetProviderTypeString() const { 4704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch int index = GetProviderTypeIndex(); 4714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch switch (index) { 4724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK: 4734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT: 4744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return flimflam::kProviderL2tpIpsec; 4754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_OPEN_VPN: 4764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return flimflam::kProviderOpenVpn; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NOTREACHED(); 4794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return std::string(); 4804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid VPNConfigView::Init() { 4834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const NetworkState* vpn = NULL; 4844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!service_path_.empty()) { 4854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch vpn = NetworkHandler::Get()->network_state_handler()-> 4864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch GetNetworkState(service_path_); 4874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch DCHECK(vpn && vpn->type() == flimflam::kTypeVPN); 4884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 4894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_ = views::GridLayout::CreatePanel(this); 4904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch SetLayoutManager(layout_); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Observer any changes to the certificate list. 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::Get()->AddObserver(this); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch views::ColumnSet* column_set = layout_->AddColumnSet(0); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Label. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Textfield, combobox. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildNetworkConfigView::kInputFieldMinWidth); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Policy indicator. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, 0, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::USE_PREF, 0, 0); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize members. 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_modified_ = false; 51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) title_ = vpn ? IDS_OPTIONS_SETTINGS_JOIN_VPN : IDS_OPTIONS_SETTINGS_ADD_VPN; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // By default enable all controls. 5144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_psk_passphrase_ = true; 5154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_user_cert_ = true; 5164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_server_ca_cert_ = true; 5174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_otp_ = true; 5184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_group_name_ = true; 5194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Server label and input. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only provide Server name when configuring a new VPN. 5224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (service_path_.empty()) { 5234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 5244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new views::Label(l10n_util::GetStringUTF16( 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_SERVER_HOSTNAME))); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_textfield_->SetController(this); 5284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(server_textfield_); 5294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_textfield_ = NULL; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Service label and name or input. 5354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 5364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new views::Label(l10n_util::GetStringUTF16( 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_SERVICE_NAME))); 5384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (service_path_.empty()) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_textfield_->SetController(this); 5414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(service_textfield_); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_ = NULL; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch service_text_ = new views::Label(); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_text_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 5464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(service_text_); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_textfield_ = NULL; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provider type label and select. 5524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 5534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new views::Label(l10n_util::GetStringUTF16( 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PROVIDER_TYPE))); 5554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (service_path_.empty()) { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_model_.reset( 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new internal::ProviderTypeComboboxModel); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_ = new views::Combobox( 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_model_.get()); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_->set_listener(this); 5614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(provider_type_combobox_); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_text_label_ = NULL; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_type_text_label_ = new views::Label(); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 5664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(provider_type_text_label_); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider_type_combobox_ = NULL; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PSK passphrase label, input and visible button. 5724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 5734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch psk_passphrase_label_ = new views::Label(l10n_util::GetStringUTF16( 5744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PSK_PASSPHRASE)); 5754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(psk_passphrase_label_); 5764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch psk_passphrase_textfield_ = new PassphraseTextfield(); 5774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch psk_passphrase_textfield_->SetController(this); 5784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(psk_passphrase_textfield_); 5794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView( 5804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch new ControlledSettingIndicatorView(psk_passphrase_ui_data_)); 5814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Server CA certificate 5844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (service_path_.empty()) { 5854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 5864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch server_ca_cert_label_ = new views::Label(l10n_util::GetStringUTF16( 5874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_CERT_SERVER_CA)); 5884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(server_ca_cert_label_); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_model_.reset( 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new internal::VpnServerCACertComboboxModel()); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_ = new views::Combobox( 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_model_.get()); 5934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(server_ca_cert_combobox_); 5944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new ControlledSettingIndicatorView(ca_cert_ui_data_)); 5954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_label_ = NULL; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_ = NULL; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User certificate label and input. 6024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 6034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch user_cert_label_ = new views::Label(l10n_util::GetStringUTF16( 6044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_CERT)); 6054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(user_cert_label_); 6064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch user_cert_combobox_model_.reset( 6074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch new internal::VpnUserCertComboboxModel()); 6084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch user_cert_combobox_ = new views::Combobox(user_cert_combobox_model_.get()); 6094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch user_cert_combobox_->set_listener(this); 6104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(user_cert_combobox_); 6114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new ControlledSettingIndicatorView(user_cert_ui_data_)); 6124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Username label and input. 6154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 6164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new views::Label(l10n_util::GetStringUTF16( 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USERNAME))); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) username_textfield_->SetController(this); 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) username_textfield_->SetEnabled(username_ui_data_.IsEditable()); 6214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(username_textfield_); 6224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new ControlledSettingIndicatorView(username_ui_data_)); 6234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User passphrase label, input and visble button. 6264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 6274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new views::Label(l10n_util::GetStringUTF16( 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_PASSPHRASE))); 6294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch user_passphrase_textfield_ = new PassphraseTextfield(); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_passphrase_textfield_->SetController(this); 63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_passphrase_textfield_->SetEnabled(user_passphrase_ui_data_.IsEditable()); 6324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(user_passphrase_textfield_); 6334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView( 6344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch new ControlledSettingIndicatorView(user_passphrase_ui_data_)); 6354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OTP label and input. 6384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 6394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch otp_label_ = new views::Label(l10n_util::GetStringUTF16( 6404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_OTP)); 6414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(otp_label_); 6424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch otp_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); 6434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch otp_textfield_->SetController(this); 6444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(otp_textfield_); 6454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Group Name label and input. 6484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 6494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch group_name_label_ = new views::Label(l10n_util::GetStringUTF16( 6504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_GROUP_NAME)); 6514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(group_name_label_); 6524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch group_name_textfield_ = 6534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch new views::Textfield(views::Textfield::STYLE_DEFAULT); 6544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch group_name_textfield_->SetController(this); 6554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(group_name_textfield_); 6564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(new ControlledSettingIndicatorView(group_name_ui_data_)); 6574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save credentials 6604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_credentials_checkbox_ = new views::Checkbox( 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16( 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SAVE_CREDENTIALS)); 66490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) save_credentials_checkbox_->SetEnabled( 66590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) save_credentials_ui_data_.IsEditable()); 6664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->SkipColumns(1); 6674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(save_credentials_checkbox_); 6684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView( 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ControlledSettingIndicatorView(save_credentials_ui_data_)); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error label. 6724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->StartRow(0, 0); 6734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->SkipColumns(1); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_ = new views::Label(); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetEnabledColor(SK_ColorRED); 6774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch layout_->AddView(error_label_); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set or hide the UI, update comboboxes and error labels. 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Refresh(); 6814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 6824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (vpn) { 6834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NetworkHandler::Get()->network_configuration_handler()->GetProperties( 6844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch service_path_, 6854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Bind(&VPNConfigView::InitFromProperties, 6864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch weak_ptr_factory_.GetWeakPtr()), 6874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Bind(&VPNConfigView::GetPropertiesError, 6884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch weak_ptr_factory_.GetWeakPtr())); 6894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid VPNConfigView::InitFromProperties( 6934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& service_path, 6944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const base::DictionaryValue& service_properties) { 6954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const NetworkState* vpn = NetworkHandler::Get()->network_state_handler()-> 6964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch GetNetworkState(service_path); 6974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!vpn) { 6984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NET_LOG_ERROR("Shill Error getting properties VpnConfigView", service_path); 6994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return; 7004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 7014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string provider_type, server_hostname, username, group_name; 7034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool psk_passphrase_required = false; 7044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const base::DictionaryValue* provider_properties; 7054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (service_properties.GetDictionaryWithoutPathExpansion( 7064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kProviderProperty, &provider_properties)) { 7074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties->GetStringWithoutPathExpansion( 7084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kTypeProperty, &provider_type); 7094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties->GetStringWithoutPathExpansion( 7104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kHostProperty, &server_hostname); 7114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 7124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (provider_type == flimflam::kProviderL2tpIpsec) { 7134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties->GetStringWithoutPathExpansion( 7144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecClientCertIdProperty, &client_cert_id_); 7154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ca_cert_pem_ = GetPemFromDictionary( 7164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties, shill::kL2tpIpsecCaCertPemProperty); 7174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties->GetBooleanWithoutPathExpansion( 7184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecPskRequiredProperty, &psk_passphrase_required); 7194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties->GetStringWithoutPathExpansion( 7204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecUserProperty, &username); 7214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties->GetStringWithoutPathExpansion( 7224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shill::kL2tpIpsecTunnelGroupProperty, &group_name); 7234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } else if (provider_type == flimflam::kProviderOpenVpn) { 7244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties->GetStringWithoutPathExpansion( 7254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kOpenVPNClientCertIdProperty, &client_cert_id_); 7264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ca_cert_pem_ = GetPemFromDictionary( 7274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties, shill::kOpenVPNCaCertPemProperty); 7284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_properties->GetStringWithoutPathExpansion( 7294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kOpenVPNUserProperty, &username); 7304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 7314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool save_credentials = false; 7324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch service_properties.GetBooleanWithoutPathExpansion( 7334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kSaveCredentialsProperty, &save_credentials); 7344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_type_index_ = ProviderTypeToIndex(provider_type, client_cert_id_); 7364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (service_text_) 7384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch service_text_->SetText(ASCIIToUTF16(vpn->name())); 7394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (provider_type_text_label_) 7404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_type_text_label_->SetText( 7414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ProviderTypeIndexToString(provider_type_index_)); 7424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (server_textfield_ && !server_hostname.empty()) 7444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch server_textfield_->SetText(UTF8ToUTF16(server_hostname)); 7454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (username_textfield_ && !username.empty()) 7464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch username_textfield_->SetText(UTF8ToUTF16(username)); 7474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (group_name_textfield_ && !group_name.empty()) 7484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch group_name_textfield_->SetText(UTF8ToUTF16(group_name)); 7494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (psk_passphrase_textfield_) 7504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch psk_passphrase_textfield_->SetShowFake(!psk_passphrase_required); 7514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (save_credentials_checkbox_) 7524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch save_credentials_checkbox_->SetChecked(save_credentials); 7534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch Refresh(); 7554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 7564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid VPNConfigView::ParseUIProperties(const NetworkState* vpn) { 7584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string type_dict_name = 7594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ProviderTypeIndexToONCDictKey(provider_type_index_); 7604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (provider_type_index_ == PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK) { 7614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ParseVPNUIProperty(vpn, type_dict_name, onc::ipsec::kServerCARef, 7624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &ca_cert_ui_data_); 7634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ParseVPNUIProperty(vpn, type_dict_name, onc::ipsec::kPSK, 7644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &psk_passphrase_ui_data_); 7654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ParseVPNUIProperty(vpn, type_dict_name, onc::ipsec::kGroup, 7664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &group_name_ui_data_); 7674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } else if (provider_type_index_ == PROVIDER_TYPE_INDEX_OPEN_VPN) { 7684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ParseVPNUIProperty(vpn, type_dict_name, onc::openvpn::kServerCARef, 7694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &ca_cert_ui_data_); 7704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 7714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ParseVPNUIProperty(vpn, type_dict_name, onc::vpn::kClientCertRef, 7724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &user_cert_ui_data_); 7734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string credentials_dict_name( 7754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch provider_type_index_ == PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK ? 7764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch onc::vpn::kL2TP : type_dict_name); 7774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ParseVPNUIProperty(vpn, credentials_dict_name, onc::vpn::kUsername, 7784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &username_ui_data_); 7794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ParseVPNUIProperty(vpn, credentials_dict_name, onc::vpn::kPassword, 7804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &user_passphrase_ui_data_); 7814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ParseVPNUIProperty(vpn, credentials_dict_name, onc::vpn::kSaveCredentials, 7824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch &save_credentials_ui_data_); 7834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 7844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid VPNConfigView::GetPropertiesError( 7864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& error_name, 7874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_ptr<base::DictionaryValue> error_data) { 7884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NET_LOG_ERROR("Shill Error from VpnConfigView: " + error_name, ""); 7894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 7904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 7914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid VPNConfigView::SetConfigProperties( 7924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::DictionaryValue* properties) { 7934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch int provider_type_index = GetProviderTypeIndex(); 7944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string user_passphrase = GetUserPassphrase(); 7954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string user_name = GetUsername(); 7964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string group_name = GetGroupName(); 7974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch switch (provider_type_index) { 7984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK: { 7994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string psk_passphrase = GetPSKPassphrase(); 8004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!psk_passphrase.empty()) { 8014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecPskProperty, GetPSKPassphrase()); 8034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!group_name.empty()) { 8054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shill::kL2tpIpsecTunnelGroupProperty, group_name); 8074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!user_name.empty()) { 8094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecUserProperty, user_name); 8114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!user_passphrase.empty()) { 8134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecPasswordProperty, user_passphrase); 8154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch break; 8174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT: { 8194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string ca_cert_pem = GetServerCACertPEM(); 8204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!ca_cert_pem.empty()) { 8214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shill::kL2tpIpsecCaCertPemProperty, ca_cert_pem); 8234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecClientCertIdProperty, GetUserCertID()); 8264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!group_name.empty()) { 8274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shill::kL2tpIpsecTunnelGroupProperty, GetGroupName()); 8294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!user_name.empty()) { 8314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecUserProperty, user_name); 8334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!user_passphrase.empty()) { 8354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kL2tpIpsecPasswordProperty, user_passphrase); 8374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch break; 8394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_OPEN_VPN: { 8414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string ca_cert_pem = GetServerCACertPEM(); 8424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!ca_cert_pem.empty()) { 8434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::ListValue* pem_list = new base::ListValue; 8444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch pem_list->AppendString(GetServerCACertPEM()); 8454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetWithoutPathExpansion( 8464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch shill::kOpenVPNCaCertPemProperty, pem_list); 8474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kOpenVPNClientCertIdProperty, GetUserCertID()); 8504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kOpenVPNUserProperty, GetUsername()); 8524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!user_passphrase.empty()) { 8534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kOpenVPNPasswordProperty, user_passphrase); 8554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::string otp = GetOTP(); 8574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!otp.empty()) { 8584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetStringWithoutPathExpansion( 8594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kOpenVPNOTPProperty, otp); 8604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch break; 8624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case PROVIDER_TYPE_INDEX_MAX: 8644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NOTREACHED(); 8654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch break; 8664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } 8674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch properties->SetBooleanWithoutPathExpansion( 8684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch flimflam::kSaveCredentialsProperty, GetSaveCredentials()); 8694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch} 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid VPNConfigView::Refresh() { 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateControls(); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set certificate combo boxes. 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_ca_cert_combobox_) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->ModelChanged(); 8774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (enable_server_ca_cert_ && !ca_cert_pem_.empty()) { 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select the current server CA certificate in the combobox. 879eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int cert_index = CertLibrary::Get()->GetCertIndexByPEM( 8804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch CertLibrary::CERT_TYPE_SERVER_CA, ca_cert_pem_); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cert_index >= 0) { 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip item for "Default" 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->SetSelectedIndex(1 + cert_index); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->SetSelectedIndex(0); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->SetSelectedIndex(0); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_cert_combobox_) { 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->ModelChanged(); 8944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (enable_user_cert_ && !client_cert_id_.empty()) { 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int cert_index = CertLibrary::Get()->GetCertIndexByPkcs11Id( 8964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch CertLibrary::CERT_TYPE_USER, client_cert_id_); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cert_index >= 0) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->SetSelectedIndex(cert_index); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->SetSelectedIndex(0); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->SetSelectedIndex(0); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateErrorLabel(); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::UpdateControlsToEnable() { 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_psk_passphrase_ = false; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_user_cert_ = false; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_server_ca_cert_ = false; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_otp_ = false; 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enable_group_name_ = false; 9154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch int provider_type_index = GetProviderTypeIndex(); 9164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (provider_type_index == PROVIDER_TYPE_INDEX_L2TP_IPSEC_PSK) { 9174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_psk_passphrase_ = true; 9184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_group_name_ = true; 9194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } else if (provider_type_index == PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT) { 9204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_server_ca_cert_ = true; 9214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_user_cert_ = HaveUserCerts(); 9224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_group_name_ = true; 9234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch } else { // PROVIDER_TYPE_INDEX_OPEN_VPN (default) 9244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_server_ca_cert_ = true; 9254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_user_cert_ = HaveUserCerts(); 9264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch enable_otp_ = true; 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::UpdateControls() { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateControlsToEnable(); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (psk_passphrase_label_) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_label_->SetEnabled(enable_psk_passphrase_); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (psk_passphrase_textfield_) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) psk_passphrase_textfield_->SetEnabled(enable_psk_passphrase_ && 93790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) psk_passphrase_ui_data_.IsEditable()); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_cert_label_) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_label_->SetEnabled(enable_user_cert_); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_cert_combobox_) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_cert_combobox_->SetEnabled(enable_user_cert_ && 94390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_cert_ui_data_.IsEditable()); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_ca_cert_label_) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_label_->SetEnabled(enable_server_ca_cert_); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_ca_cert_combobox_) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_->SetEnabled(enable_server_ca_cert_ && 94990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ca_cert_ui_data_.IsEditable()); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (otp_label_) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_label_->SetEnabled(enable_otp_); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (otp_textfield_) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) otp_textfield_->SetEnabled(enable_otp_); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group_name_label_) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_label_->SetEnabled(enable_group_name_); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (group_name_textfield_) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name_textfield_->SetEnabled(enable_group_name_ && 96090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) group_name_ui_data_.IsEditable()); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::UpdateErrorLabel() { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error message. 9654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch string16 error_msg; 9664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch bool cert_required = 9674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch GetProviderTypeIndex() == PROVIDER_TYPE_INDEX_L2TP_IPSEC_USER_CERT; 9684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (cert_required && CertLibrary::Get()->CertificatesLoaded()) { 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!HaveUserCerts()) { 9704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch error_msg = l10n_util::GetStringUTF16( 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PLEASE_INSTALL_USER_CERT); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!IsUserCertValid()) { 9734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch error_msg = l10n_util::GetStringUTF16( 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_REQUIRE_HARDWARE_BACKED); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_msg.empty() && !service_path_.empty()) { 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kuan): differentiate between bad psk and user passphrases. 9794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const NetworkState* vpn = NetworkHandler::Get()->network_state_handler()-> 9804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch GetNetworkState(service_path_); 9814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (vpn && vpn->connection_state() == flimflam::kStateFailure) 9824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch error_msg = ash::network_connect::ErrorString(vpn->error()); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!error_msg.empty()) { 9854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch error_label_->SetText(error_msg); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetVisible(true); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_label_->SetVisible(false); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VPNConfigView::UpdateCanLogin() { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_->GetDialogClientView()->UpdateDialogButtons(); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::HaveUserCerts() const { 997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CertLibrary::Get()->NumCertificates(CertLibrary::CERT_TYPE_USER) > 0; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool VPNConfigView::IsUserCertValid() const { 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!user_cert_combobox_ || !enable_user_cert_) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = user_cert_combobox_->selected_index(); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < 0) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Currently only hardware-backed user certificates are valid. 1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CertLibrary::Get()->IsHardwareBacked() && 1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !CertLibrary::Get()->IsCertHardwareBackedAt( 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CertLibrary::CERT_TYPE_USER, index)) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetTextFromField(views::Textfield* textfield, 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool trim_whitespace) const { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!textfield) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string untrimmed = UTF16ToUTF8(textfield->text()); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!trim_whitespace) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return untrimmed; 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrimWhitespaceASCII(untrimmed, TRIM_ALL, &result); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string VPNConfigView::GetPassphraseFromField( 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PassphraseTextfield* textfield) const { 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!textfield) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return textfield->GetPassphrase(); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid VPNConfigView::ParseVPNUIProperty( 10344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const NetworkState* network, 10354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& dict_key, 10364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const std::string& key, 10374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch NetworkPropertyUIData* property_ui_data) { 1038ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch onc::ONCSource onc_source = onc::ONC_SOURCE_NONE; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* onc = 10404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch network_connect::FindPolicyForActiveUser(network, &onc_source); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch VLOG_IF(1, !onc) << "No ONC found for VPN network " << network->guid(); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) property_ui_data->ParseOncProperty( 1044ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch onc_source, 1045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch onc, 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("%s.%s.%s", 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) onc::network_config::kVPN, 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict_key.c_str(), 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key.c_str())); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1053