Home | History | Annotate | Download | only in options
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CHROMEOS_OPTIONS_VPN_CONFIG_VIEW_H_
      6 #define CHROME_BROWSER_CHROMEOS_OPTIONS_VPN_CONFIG_VIEW_H_
      7 
      8 #include <string>
      9 
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/strings/string16.h"
     12 #include "chrome/browser/chromeos/options/cert_library.h"
     13 #include "chrome/browser/chromeos/options/network_config_view.h"
     14 #include "chrome/browser/chromeos/options/network_property_ui_data.h"
     15 #include "chrome/browser/chromeos/options/passphrase_textfield.h"
     16 #include "chromeos/network/client_cert_util.h"
     17 #include "ui/views/controls/button/button.h"
     18 #include "ui/views/controls/combobox/combobox_listener.h"
     19 #include "ui/views/controls/textfield/textfield_controller.h"
     20 #include "ui/views/view.h"
     21 
     22 namespace base {
     23 class DictionaryValue;
     24 }
     25 
     26 namespace views {
     27 class Checkbox;
     28 class GridLayout;
     29 class Label;
     30 }
     31 
     32 namespace chromeos {
     33 
     34 class NetworkState;
     35 
     36 namespace internal {
     37 class ProviderTypeComboboxModel;
     38 class VpnServerCACertComboboxModel;
     39 class VpnUserCertComboboxModel;
     40 }
     41 
     42 // A dialog box to allow configuration of VPN connection.
     43 class VPNConfigView : public ChildNetworkConfigView,
     44                       public views::TextfieldController,
     45                       public views::ButtonListener,
     46                       public views::ComboboxListener,
     47                       public CertLibrary::Observer {
     48  public:
     49   VPNConfigView(NetworkConfigView* parent, const std::string& service_path);
     50   virtual ~VPNConfigView();
     51 
     52   // views::TextfieldController:
     53   virtual void ContentsChanged(views::Textfield* sender,
     54                                const base::string16& new_contents) OVERRIDE;
     55   virtual bool HandleKeyEvent(views::Textfield* sender,
     56                               const ui::KeyEvent& key_event) OVERRIDE;
     57 
     58   // views::ButtonListener:
     59   virtual void ButtonPressed(views::Button* sender,
     60                              const ui::Event& event) OVERRIDE;
     61 
     62   // views::ComboboxListener:
     63   virtual void OnPerformAction(views::Combobox* combobox) OVERRIDE;
     64 
     65   // CertLibrary::Observer:
     66   virtual void OnCertificatesLoaded(bool initial_load) OVERRIDE;
     67 
     68   // ChildNetworkConfigView:
     69   virtual base::string16 GetTitle() const OVERRIDE;
     70   virtual views::View* GetInitiallyFocusedView() OVERRIDE;
     71   virtual bool CanLogin() OVERRIDE;
     72   virtual bool Login() OVERRIDE;
     73   virtual void Cancel() OVERRIDE;
     74   virtual void InitFocus() OVERRIDE;
     75 
     76  private:
     77   // Initializes data members and create UI controls.
     78   void Init();
     79 
     80   // Callback to initialize fields from uncached network properties.
     81   void InitFromProperties(const std::string& service_path,
     82                           const base::DictionaryValue& dictionary);
     83   void ParseUIProperties(const NetworkState* vpn);
     84   void GetPropertiesError(const std::string& error_name,
     85                           scoped_ptr<base::DictionaryValue> error_data);
     86 
     87   // Fill in |properties| with the properties for the selected client (user)
     88   // certificate or empty properties if no client cert is required.
     89   void SetUserCertProperties(chromeos::client_cert::ConfigType client_cert_type,
     90                              base::DictionaryValue* properties) const;
     91 
     92   // Helper function to set configurable properties.
     93   void SetConfigProperties(base::DictionaryValue* properties);
     94 
     95   // Set and update all control values.
     96   void Refresh();
     97 
     98   // Update various controls.
     99   void UpdateControlsToEnable();
    100   void UpdateControls();
    101   void UpdateErrorLabel();
    102 
    103   // Update state of the Login button.
    104   void UpdateCanLogin();
    105 
    106   // Returns true if there is at least one user certificate installed.
    107   bool HaveUserCerts() const;
    108 
    109   // Returns true if there is a selected user certificate and it is valid.
    110   bool IsUserCertValid() const;
    111 
    112   // Get text from input field.
    113   const std::string GetTextFromField(views::Textfield* textfield,
    114                                      bool trim_whitespace) const;
    115 
    116   // Get passphrase from input field.
    117   const std::string GetPassphraseFromField(
    118       PassphraseTextfield* textfield) const;
    119 
    120   // Convenience methods to get text from input field or cached VirtualNetwork.
    121   const std::string GetService() const;
    122   const std::string GetServer() const;
    123   const std::string GetPSKPassphrase() const;
    124   const std::string GetUsername() const;
    125   const std::string GetUserPassphrase() const;
    126   const std::string GetOTP() const;
    127   const std::string GetGroupName() const;
    128   const std::string GetServerCACertPEM() const;
    129   bool GetSaveCredentials() const;
    130   int GetProviderTypeIndex() const;
    131   std::string GetProviderTypeString() const;
    132 
    133   // Parses a VPN UI |property| from the given |network|. |key| is the property
    134   // name within the type-specific VPN subdictionary named |dict_key|.
    135   void ParseVPNUIProperty(const NetworkState* network,
    136                           const std::string& dict_key,
    137                           const std::string& key,
    138                           NetworkPropertyUIData* property_ui_data);
    139 
    140   base::string16 service_name_from_server_;
    141   bool service_text_modified_;
    142 
    143   // Initialized in Init():
    144 
    145   bool enable_psk_passphrase_;
    146   bool enable_user_cert_;
    147   bool enable_server_ca_cert_;
    148   bool enable_otp_;
    149   bool enable_group_name_;
    150 
    151   NetworkPropertyUIData ca_cert_ui_data_;
    152   NetworkPropertyUIData psk_passphrase_ui_data_;
    153   NetworkPropertyUIData user_cert_ui_data_;
    154   NetworkPropertyUIData username_ui_data_;
    155   NetworkPropertyUIData user_passphrase_ui_data_;
    156   NetworkPropertyUIData group_name_ui_data_;
    157   NetworkPropertyUIData save_credentials_ui_data_;
    158 
    159   int title_;
    160 
    161   views::GridLayout* layout_;
    162   views::Textfield* server_textfield_;
    163   views::Label* service_text_;
    164   views::Textfield* service_textfield_;
    165   scoped_ptr<internal::ProviderTypeComboboxModel> provider_type_combobox_model_;
    166   views::Combobox* provider_type_combobox_;
    167   views::Label* provider_type_text_label_;
    168   views::Label* psk_passphrase_label_;
    169   PassphraseTextfield* psk_passphrase_textfield_;
    170   views::Label* user_cert_label_;
    171   scoped_ptr<internal::VpnUserCertComboboxModel> user_cert_combobox_model_;
    172   views::Combobox* user_cert_combobox_;
    173   views::Label* server_ca_cert_label_;
    174   scoped_ptr<internal::VpnServerCACertComboboxModel>
    175       server_ca_cert_combobox_model_;
    176   views::Combobox* server_ca_cert_combobox_;
    177   views::Textfield* username_textfield_;
    178   PassphraseTextfield* user_passphrase_textfield_;
    179   views::Label* otp_label_;
    180   views::Textfield* otp_textfield_;
    181   views::Label* group_name_label_;
    182   views::Textfield* group_name_textfield_;
    183   views::Checkbox* save_credentials_checkbox_;
    184   views::Label* error_label_;
    185 
    186   // Cached VPN properties, only set when configuring an existing network.
    187   int provider_type_index_;
    188   std::string ca_cert_pem_;
    189   std::string client_cert_id_;
    190 
    191   base::WeakPtrFactory<VPNConfigView> weak_ptr_factory_;
    192 
    193   DISALLOW_COPY_AND_ASSIGN(VPNConfigView);
    194 };
    195 
    196 }  // namespace chromeos
    197 
    198 #endif  // CHROME_BROWSER_CHROMEOS_OPTIONS_VPN_CONFIG_VIEW_H_
    199