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