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