diff options
author | chocobo@chromium.org <chocobo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-07 01:00:47 +0000 |
---|---|---|
committer | chocobo@chromium.org <chocobo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-07 01:00:47 +0000 |
commit | 595bd0c88b0a93040ffbdf31daa5bba84c352acf (patch) | |
tree | bc5d14e4219f18460b77d1d2102ff3415cb1eefb | |
parent | 3a89d5d45b37859fee693cbde2f4db8a4b1c80c4 (diff) | |
download | chromium_src-595bd0c88b0a93040ffbdf31daa5bba84c352acf.zip chromium_src-595bd0c88b0a93040ffbdf31daa5bba84c352acf.tar.gz chromium_src-595bd0c88b0a93040ffbdf31daa5bba84c352acf.tar.bz2 |
First pass at ONC parsing work. Parse ONC blob and create Network objects.
BUG=chromium-os:15457,chromium-os:19399
TEST=ONCNetworkParserTest
Review URL: http://codereview.chromium.org/8051005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104413 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/cros/mock_network_library.h | 5 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/native_network_parser.cc | 92 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/native_network_parser.h | 21 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/network_library.cc | 108 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/network_library.h | 54 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/network_parser.cc | 171 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/network_parser.h | 26 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/onc_network_parser.cc | 490 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/onc_network_parser.h | 118 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/onc_network_parser_unittest.cc | 115 | ||||
-rw-r--r-- | chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc | 4 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 |
13 files changed, 980 insertions, 227 deletions
diff --git a/chrome/browser/chromeos/cros/mock_network_library.h b/chrome/browser/chromeos/cros/mock_network_library.h index 731dfb3..0a54ec3 100644 --- a/chrome/browser/chromeos/cros/mock_network_library.h +++ b/chrome/browser/chromeos/cros/mock_network_library.h @@ -73,13 +73,15 @@ class MockNetworkLibrary : public NetworkLibrary { MOCK_CONST_METHOD0(FindWifiDevice, const NetworkDevice*(void)); MOCK_CONST_METHOD0(FindEthernetDevice, const NetworkDevice*(void)); MOCK_CONST_METHOD1(FindNetworkByPath, Network*(const std::string&)); + MOCK_CONST_METHOD1(FindNetworkByUniqueId, Network*(const std::string&)); MOCK_CONST_METHOD1(FindWifiNetworkByPath, WifiNetwork*(const std::string&)); MOCK_CONST_METHOD1(FindCellularNetworkByPath, CellularNetwork*(const std::string&)); MOCK_CONST_METHOD1(FindVirtualNetworkByPath, VirtualNetwork*(const std::string&)); - MOCK_CONST_METHOD1(FindNetworkFromRemembered,Network*(const Network*)); MOCK_CONST_METHOD1(FindRememberedNetworkByPath, Network*(const std::string&)); + MOCK_CONST_METHOD1(FindRememberedNetworkByUniqueId, + Network*(const std::string&)); MOCK_CONST_METHOD1(GetDataPlans, CellularDataPlanVector*(const std::string&)); MOCK_CONST_METHOD1(GetSignificantDataPlan, @@ -149,6 +151,7 @@ class MockNetworkLibrary : public NetworkLibrary { HardwareAddressFormat)); MOCK_METHOD1(SetIPConfig, void(const NetworkIPConfig&)); MOCK_METHOD0(SwitchToPreferredNetwork, void(void)); + MOCK_METHOD1(LoadOncNetworks, bool(const std::string&)); MOCK_METHOD2(SetActiveNetwork, bool(ConnectionType, const std::string&)); }; diff --git a/chrome/browser/chromeos/cros/native_network_parser.cc b/chrome/browser/chromeos/cros/native_network_parser.cc index 8dcbc61..a6972ea 100644 --- a/chrome/browser/chromeos/cros/native_network_parser.cc +++ b/chrome/browser/chromeos/cros/native_network_parser.cc @@ -4,6 +4,8 @@ #include "chrome/browser/chromeos/cros/native_network_parser.h" +#include <string> + #include "base/stringprintf.h" #include "base/values.h" #include "chrome/browser/chromeos/cros/native_network_constants.h" @@ -162,8 +164,16 @@ NativeNetworkDeviceParser::NativeNetworkDeviceParser() NativeNetworkDeviceParser::~NativeNetworkDeviceParser() { } +NetworkDevice* NativeNetworkDeviceParser::CreateNewNetworkDevice( + const std::string& device_path) { + NetworkDevice* device = + NetworkDeviceParser::CreateNewNetworkDevice(device_path); + device->SetNetworkDeviceParser(new NativeNetworkDeviceParser()); + return device; +} + bool NativeNetworkDeviceParser::ParseValue( - PropertyIndex index, const Value& value, NetworkDevice* device) { + PropertyIndex index, const base::Value& value, NetworkDevice* device) { switch (index) { case PROPERTY_INDEX_TYPE: { std::string type_string; @@ -209,7 +219,7 @@ bool NativeNetworkDeviceParser::ParseValue( return true; } case PROPERTY_INDEX_CELLULAR_APN_LIST: - if (value.IsType(Value::TYPE_LIST)) { + if (value.IsType(base::Value::TYPE_LIST)) { CellularApnList provider_apn_list; if (!ParseApnList(static_cast<const ListValue&>(value), &provider_apn_list)) @@ -219,13 +229,13 @@ bool NativeNetworkDeviceParser::ParseValue( } break; case PROPERTY_INDEX_NETWORKS: - if (value.IsType(Value::TYPE_LIST)) { + if (value.IsType(base::Value::TYPE_LIST)) { // Ignored. return true; } break; case PROPERTY_INDEX_FOUND_NETWORKS: - if (value.IsType(Value::TYPE_LIST)) { + if (value.IsType(base::Value::TYPE_LIST)) { CellularNetworkList found_cellular_networks; if (!ParseFoundNetworksFromList( static_cast<const ListValue&>(value), @@ -236,7 +246,7 @@ bool NativeNetworkDeviceParser::ParseValue( } break; case PROPERTY_INDEX_HOME_PROVIDER: { - if (value.IsType(Value::TYPE_DICTIONARY)) { + if (value.IsType(base::Value::TYPE_DICTIONARY)) { const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); std::string home_provider_code; @@ -320,7 +330,7 @@ bool NativeNetworkDeviceParser::ParseValue( return true; } case PROPERTY_INDEX_SIM_LOCK: - if (value.IsType(Value::TYPE_DICTIONARY)) { + if (value.IsType(base::Value::TYPE_DICTIONARY)) { SimLockState sim_lock_state; int sim_retries_left; bool sim_lock_enabled; @@ -380,7 +390,7 @@ bool NativeNetworkDeviceParser::ParseApnList(const ListValue& list, apn_list->clear(); apn_list->reserve(list.GetSize()); for (ListValue::const_iterator it = list.begin(); it != list.end(); ++it) { - if ((*it)->IsType(Value::TYPE_DICTIONARY)) { + if ((*it)->IsType(base::Value::TYPE_DICTIONARY)) { apn_list->resize(apn_list->size() + 1); const DictionaryValue* dict = static_cast<const DictionaryValue*>(*it); dict->GetStringWithoutPathExpansion( @@ -411,7 +421,7 @@ bool NativeNetworkDeviceParser::ParseFoundNetworksFromList( found_networks->clear(); found_networks->reserve(list.GetSize()); for (ListValue::const_iterator it = list.begin(); it != list.end(); ++it) { - if ((*it)->IsType(Value::TYPE_DICTIONARY)) { + if ((*it)->IsType(base::Value::TYPE_DICTIONARY)) { found_networks->resize(found_networks->size() + 1); const DictionaryValue* dict = static_cast<const DictionaryValue*>(*it); dict->GetStringWithoutPathExpansion( @@ -484,7 +494,6 @@ NativeNetworkParser::~NativeNetworkParser() { // static const EnumMapper<PropertyIndex>* NativeNetworkParser::property_mapper() { return get_native_mapper(); - } const ConnectionType NativeNetworkParser::ParseConnectionType( @@ -492,8 +501,24 @@ const ConnectionType NativeNetworkParser::ParseConnectionType( return ParseNetworkType(connection_type); } +Network* NativeNetworkParser::CreateNewNetwork( + ConnectionType type, const std::string& service_path) { + Network* network = NetworkParser::CreateNewNetwork(type, service_path); + if (network) { + if (type == TYPE_ETHERNET) + network->SetNetworkParser(new NativeEthernetNetworkParser()); + else if (type == TYPE_WIFI) + network->SetNetworkParser(new NativeWifiNetworkParser()); + else if (type == TYPE_CELLULAR) + network->SetNetworkParser(new NativeCellularNetworkParser()); + else if (type == TYPE_VPN) + network->SetNetworkParser(new NativeVirtualNetworkParser()); + } + return network; +} + bool NativeNetworkParser::ParseValue(PropertyIndex index, - const Value& value, + const base::Value& value, Network* network) { switch (index) { case PROPERTY_INDEX_TYPE: { @@ -514,20 +539,6 @@ bool NativeNetworkParser::ParseValue(PropertyIndex index, network->set_device_path(device_path); return true; } - case PROPERTY_INDEX_NAME: { - std::string name; - if (!value.GetAsString(&name)) - return false; - network->SetName(name); - return true; - } - case PROPERTY_INDEX_GUID: { - std::string unique_id; - if (!value.GetAsString(&unique_id)) - return false; - network->set_unique_id(unique_id); - return true; - } case PROPERTY_INDEX_PROFILE: { // Note: currently this is only provided for non remembered networks. std::string profile_path; @@ -577,13 +588,6 @@ bool NativeNetworkParser::ParseValue(PropertyIndex index, case PROPERTY_INDEX_FAVORITE: // This property is ignored. return true; - case PROPERTY_INDEX_AUTO_CONNECT: { - bool auto_connect; - if (!value.GetAsBoolean(&auto_connect)) - return false; - network->set_auto_connect(auto_connect); - return true; - } case PROPERTY_INDEX_SAVE_CREDENTIALS: { bool save_credentials; if (!value.GetAsBoolean(&save_credentials)) @@ -591,14 +595,8 @@ bool NativeNetworkParser::ParseValue(PropertyIndex index, network->set_save_credentials(save_credentials); return true; } - case PROPERTY_INDEX_PROXY_CONFIG: { - std::string proxy_config; - if (!value.GetAsString(&proxy_config)) - return false; - network->set_proxy_config(proxy_config); - return true; - } default: + return NetworkParser::ParseValue(index, value, network); break; } return false; @@ -679,7 +677,7 @@ NativeWirelessNetworkParser::NativeWirelessNetworkParser() {} NativeWirelessNetworkParser::~NativeWirelessNetworkParser() {} bool NativeWirelessNetworkParser::ParseValue(PropertyIndex index, - const Value& value, + const base::Value& value, Network* network) { DCHECK_NE(TYPE_ETHERNET, network->type()); DCHECK_NE(TYPE_VPN, network->type()); @@ -705,7 +703,7 @@ NativeCellularNetworkParser::NativeCellularNetworkParser() {} NativeCellularNetworkParser::~NativeCellularNetworkParser() {} bool NativeCellularNetworkParser::ParseValue(PropertyIndex index, - const Value& value, + const base::Value& value, Network* network) { DCHECK_EQ(TYPE_CELLULAR, network->type()); CellularNetwork* cellular_network = static_cast<CellularNetwork*>(network); @@ -723,14 +721,14 @@ bool NativeCellularNetworkParser::ParseValue(PropertyIndex index, break; } case PROPERTY_INDEX_CELLULAR_APN: { - if (value.IsType(Value::TYPE_DICTIONARY)) { + if (value.IsType(base::Value::TYPE_DICTIONARY)) { cellular_network->set_apn(static_cast<const DictionaryValue&>(value)); return true; } break; } case PROPERTY_INDEX_CELLULAR_LAST_GOOD_APN: { - if (value.IsType(Value::TYPE_DICTIONARY)) { + if (value.IsType(base::Value::TYPE_DICTIONARY)) { cellular_network->set_last_good_apn( static_cast<const DictionaryValue&>(value)); return true; @@ -770,7 +768,7 @@ bool NativeCellularNetworkParser::ParseValue(PropertyIndex index, return true; } case PROPERTY_INDEX_SERVING_OPERATOR: { - if (value.IsType(Value::TYPE_DICTIONARY)) { + if (value.IsType(base::Value::TYPE_DICTIONARY)) { const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); std::string value_str; @@ -872,7 +870,7 @@ NativeWifiNetworkParser::NativeWifiNetworkParser() {} NativeWifiNetworkParser::~NativeWifiNetworkParser() {} bool NativeWifiNetworkParser::ParseValue(PropertyIndex index, - const Value& value, + const base::Value& value, Network* network) { DCHECK_EQ(TYPE_WIFI, network->type()); WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); @@ -1079,7 +1077,7 @@ bool NativeVirtualNetworkParser::UpdateNetworkFromInfo( } bool NativeVirtualNetworkParser::ParseValue(PropertyIndex index, - const Value& value, + const base::Value& value, Network* network) { DCHECK_EQ(TYPE_VPN, network->type()); VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); @@ -1090,7 +1088,7 @@ bool NativeVirtualNetworkParser::ParseValue(PropertyIndex index, for (DictionaryValue::key_iterator iter = dict.begin_keys(); iter != dict.end_keys(); ++iter) { const std::string& key = *iter; - Value* provider_value; + base::Value* provider_value; bool res = dict.GetWithoutPathExpansion(key, &provider_value); DCHECK(res); if (res) { @@ -1110,7 +1108,7 @@ bool NativeVirtualNetworkParser::ParseValue(PropertyIndex index, } bool NativeVirtualNetworkParser::ParseProviderValue(PropertyIndex index, - const Value& value, + const base::Value& value, VirtualNetwork* network) { switch (index) { case PROPERTY_INDEX_HOST: { diff --git a/chrome/browser/chromeos/cros/native_network_parser.h b/chrome/browser/chromeos/cros/native_network_parser.h index 1e899ed..b42892e 100644 --- a/chrome/browser/chromeos/cros/native_network_parser.h +++ b/chrome/browser/chromeos/cros/native_network_parser.h @@ -6,6 +6,8 @@ #define CHROME_BROWSER_CHROMEOS_CROS_NATIVE_NETWORK_PARSER_H_ #pragma once +#include <string> + #include "chrome/browser/chromeos/cros/network_parser.h" #include "base/compiler_specific.h" // for OVERRIDE @@ -24,10 +26,13 @@ class NativeNetworkDeviceParser : public NetworkDeviceParser { public: NativeNetworkDeviceParser(); virtual ~NativeNetworkDeviceParser(); + + protected: + virtual NetworkDevice* CreateNewNetworkDevice( + const std::string& device_path) OVERRIDE; virtual bool ParseValue(PropertyIndex index, const base::Value& value, NetworkDevice* device) OVERRIDE; - protected: virtual ConnectionType ParseType(const std::string& type) OVERRIDE; // Parsing helper routines specific to native network devices. @@ -58,15 +63,19 @@ class NativeNetworkParser : public NetworkParser { static const EnumMapper<PropertyIndex>* property_mapper(); static const ConnectionType ParseConnectionType(const std::string& type); protected: + virtual Network* CreateNewNetwork(ConnectionType type, + const std::string& service_path) OVERRIDE; virtual bool ParseValue(PropertyIndex index, const base::Value& value, Network* network) OVERRIDE; virtual ConnectionType ParseType(const std::string& type) OVERRIDE; virtual ConnectionType ParseTypeFromDictionary( const base::DictionaryValue& info) OVERRIDE; - virtual ConnectionMode ParseMode(const std::string& mode) OVERRIDE; - virtual ConnectionState ParseState(const std::string& state) OVERRIDE; - virtual ConnectionError ParseError(const std::string& error) OVERRIDE; + + ConnectionMode ParseMode(const std::string& mode); + ConnectionState ParseState(const std::string& state); + ConnectionError ParseError(const std::string& error); + private: DISALLOW_COPY_AND_ASSIGN(NativeNetworkParser); }; @@ -137,8 +146,8 @@ class NativeVirtualNetworkParser : public NativeNetworkParser { Network* network) OVERRIDE; protected: bool ParseProviderValue(PropertyIndex index, - const base::Value& value, - VirtualNetwork* network); + const base::Value& value, + VirtualNetwork* network); ProviderType ParseProviderType(const std::string& type); private: DISALLOW_COPY_AND_ASSIGN(NativeVirtualNetworkParser); diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc index 9e3af1d..4ac542d 100644 --- a/chrome/browser/chromeos/cros/network_library.cc +++ b/chrome/browser/chromeos/cros/network_library.cc @@ -4,12 +4,15 @@ #include "chrome/browser/chromeos/cros/network_library.h" -#include <algorithm> #include <dbus/dbus-glib.h> #include <dbus/dbus-gtype-specialized.h> #include <glib-object.h> + +#include <algorithm> +#include <list> #include <map> #include <set> +#include <utility> #include "base/bind.h" #include "base/i18n/icu_encoding_detection.h" @@ -27,6 +30,7 @@ #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/cros/native_network_constants.h" #include "chrome/browser/chromeos/cros/native_network_parser.h" +#include "chrome/browser/chromeos/cros/onc_network_parser.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/network_login_observer.h" #include "chrome/browser/chromeos/user_cros_settings_provider.h" @@ -58,9 +62,11 @@ // CellularNetwork // active_cellular_: Cellular version of wifi_. // cellular_networks_: Cellular version of wifi_. -// network_unique_id_map_: map<unique_id, Network*> for visible networks. +// network_unique_id_map_: map<unique_id, Network*> for all visible networks. // remembered_network_map_: a canonical map<path, Network*> for all networks // remembered in the active Profile ("favorites"). +// remembered_network_unique_id_map_: map<unique_id, Network*> for all +// remembered networks. // remembered_wifi_networks_: ordered vector of WifiNetwork* entries in // remembered_network_map_, in descending order of preference. // remembered_virtual_networks_: ordered vector of VirtualNetwork* entries in @@ -335,13 +341,17 @@ NetworkDevice::NetworkDevice(const std::string& device_path) NetworkDevice::~NetworkDevice() {} +void NetworkDevice::SetNetworkDeviceParser(NetworkDeviceParser* parser) { + device_parser_.reset(parser); +} + void NetworkDevice::ParseInfo(const DictionaryValue& info) { if (device_parser_.get()) device_parser_->UpdateDeviceFromInfo(info, this); } bool NetworkDevice::UpdateStatus(const std::string& key, - const Value& value, + const base::Value& value, PropertyIndex* index) { if (device_parser_.get()) return device_parser_->UpdateStatus(key, value, this, index); @@ -352,8 +362,7 @@ bool NetworkDevice::UpdateStatus(const std::string& key, // Network Network::Network(const std::string& service_path, - ConnectionType type, - NativeNetworkParser* parser) + ConnectionType type) : state_(STATE_UNKNOWN), error_(ERROR_NO_ERROR), connectable_(true), @@ -367,12 +376,15 @@ Network::Network(const std::string& service_path, notify_failure_(false), profile_type_(PROFILE_NONE), service_path_(service_path), - type_(type), - network_parser_(parser) { + type_(type) { } Network::~Network() {} +void Network::SetNetworkParser(NetworkParser* parser) { + network_parser_.reset(parser); +} + void Network::SetState(ConnectionState new_state) { if (new_state == state_) return; @@ -617,14 +629,14 @@ bool Network::UpdateStatus(const std::string& key, // EthernetNetwork EthernetNetwork::EthernetNetwork(const std::string& service_path) - : Network(service_path, TYPE_ETHERNET, new NativeEthernetNetworkParser) { + : Network(service_path, TYPE_ETHERNET) { } //////////////////////////////////////////////////////////////////////////////// // VirtualNetwork VirtualNetwork::VirtualNetwork(const std::string& service_path) - : Network(service_path, TYPE_VPN, new NativeVirtualNetworkParser), + : Network(service_path, TYPE_VPN), provider_type_(PROVIDER_TYPE_L2TP_IPSEC_PSK) { } @@ -1017,8 +1029,7 @@ void CellularApn::Set(const DictionaryValue& dict) { // CellularNetwork CellularNetwork::CellularNetwork(const std::string& service_path) - : WirelessNetwork(service_path, TYPE_CELLULAR, - new NativeCellularNetworkParser), + : WirelessNetwork(service_path, TYPE_CELLULAR), activation_state_(ACTIVATION_STATE_UNKNOWN), network_technology_(NETWORK_TECHNOLOGY_UNKNOWN), roaming_state_(ROAMING_STATE_UNKNOWN), @@ -1156,7 +1167,7 @@ std::string CellularNetwork::GetRoamingStateString() const { // WifiNetwork WifiNetwork::WifiNetwork(const std::string& service_path) - : WirelessNetwork(service_path, TYPE_WIFI, new NativeWifiNetworkParser), + : WirelessNetwork(service_path, TYPE_WIFI), encryption_(SECURITY_NONE), passphrase_required_(false), eap_method_(EAP_METHOD_UNKNOWN), @@ -1576,6 +1587,8 @@ class NetworkLibraryImplBase : public NetworkLibrary { virtual const NetworkDevice* FindEthernetDevice() const OVERRIDE; virtual const NetworkDevice* FindWifiDevice() const OVERRIDE; virtual Network* FindNetworkByPath(const std::string& path) const OVERRIDE; + virtual Network* FindNetworkByUniqueId( + const std::string& unique_id) const OVERRIDE; WirelessNetwork* FindWirelessNetworkByPath(const std::string& path) const; virtual WifiNetwork* FindWifiNetworkByPath( const std::string& path) const OVERRIDE; @@ -1583,11 +1596,11 @@ class NetworkLibraryImplBase : public NetworkLibrary { const std::string& path) const OVERRIDE; virtual VirtualNetwork* FindVirtualNetworkByPath( const std::string& path) const OVERRIDE; - virtual Network* FindNetworkFromRemembered( - const Network* remembered) const OVERRIDE; Network* FindRememberedFromNetwork(const Network* network) const; virtual Network* FindRememberedNetworkByPath( const std::string& path) const OVERRIDE; + virtual Network* FindRememberedNetworkByUniqueId( + const std::string& unique_id) const OVERRIDE; virtual const CellularDataPlanVector* GetDataPlans( const std::string& path) const OVERRIDE; @@ -1644,6 +1657,7 @@ class NetworkLibraryImplBase : public NetworkLibrary { // virtual GetIPConfigs implemented in derived classes. // virtual SetIPConfig implemented in derived classes. virtual void SwitchToPreferredNetwork() OVERRIDE; + virtual bool LoadOncNetworks(const std::string& onc_blob) OVERRIDE; virtual bool SetActiveNetwork(ConnectionType type, const std::string& service_path) OVERRIDE; @@ -1784,15 +1798,18 @@ class NetworkLibraryImplBase : public NetworkLibrary { // List of profiles. NetworkProfileList profile_list_; - // A service path based map of all Networks. + // A service path based map of all visible Networks. NetworkMap network_map_; - // A unique_id_ based map of Networks. + // A unique_id based map of all visible Networks. NetworkMap network_unique_id_map_; // A service path based map of all remembered Networks. NetworkMap remembered_network_map_; + // A unique_id based map of all remembered Networks. + NetworkMap remembered_network_unique_id_map_; + // A list of services that we are awaiting updates for. PriorityMap network_update_requests_; @@ -2176,6 +2193,14 @@ Network* NetworkLibraryImplBase::FindNetworkByPath( return NULL; } +Network* NetworkLibraryImplBase::FindNetworkByUniqueId( + const std::string& unique_id) const { + NetworkMap::const_iterator found = network_unique_id_map_.find(unique_id); + if (found != network_unique_id_map_.end()) + return found->second; + return NULL; +} + WirelessNetwork* NetworkLibraryImplBase::FindWirelessNetworkByPath( const std::string& path) const { Network* network = FindNetworkByPath(path); @@ -2209,15 +2234,6 @@ VirtualNetwork* NetworkLibraryImplBase::FindVirtualNetworkByPath( return NULL; } -Network* NetworkLibraryImplBase::FindNetworkFromRemembered( - const Network* remembered) const { - NetworkMap::const_iterator found = - network_unique_id_map_.find(remembered->unique_id()); - if (found != network_unique_id_map_.end()) - return found->second; - return NULL; -} - Network* NetworkLibraryImplBase::FindRememberedFromNetwork( const Network* network) const { for (NetworkMap::const_iterator iter = remembered_network_map_.begin(); @@ -2236,6 +2252,15 @@ Network* NetworkLibraryImplBase::FindRememberedNetworkByPath( return NULL; } +Network* NetworkLibraryImplBase::FindRememberedNetworkByUniqueId( + const std::string& unique_id) const { + NetworkMap::const_iterator found = + remembered_network_unique_id_map_.find(unique_id); + if (found != remembered_network_unique_id_map_.end()) + return found->second; + return NULL; +} + //////////////////////////////////////////////////////////////////////////// // Data Plans. @@ -2715,6 +2740,22 @@ void NetworkLibraryImplBase::SwitchToPreferredNetwork() { } } +bool NetworkLibraryImplBase::LoadOncNetworks(const std::string& onc_blob) { + OncNetworkParser parser(onc_blob); + + for (int i = 0; i < parser.GetNetworkConfigsSize(); i++) { + // Parse Open Network Configuration blob into a temporary Network object. + Network* network = parser.ParseNetwork(i); + if (!network) { + DLOG(WARNING) << "Cannot parse networks in ONC file"; + return false; + } + + // TODO(chocobo): Pass parsed network values to flimflam update network. + } + return true; +} + //////////////////////////////////////////////////////////////////////////// // Testing functions. @@ -2890,7 +2931,7 @@ void NetworkLibraryImplBase::DeleteRememberedNetwork( // Update any associated network service before removing from profile // so that flimflam doesn't recreate the service (e.g. when we disconenct it). - Network* network = FindNetworkFromRemembered(remembered_network); + Network* network = FindNetworkByUniqueId(remembered_network->unique_id()); if (network) { // Clear the stored credentials for any forgotten networks. network->EraseCredentials(); @@ -2957,6 +2998,7 @@ void NetworkLibraryImplBase::ClearNetworks() { void NetworkLibraryImplBase::ClearRememberedNetworks() { remembered_network_map_.clear(); + remembered_network_unique_id_map_.clear(); remembered_wifi_networks_.clear(); remembered_virtual_networks_.clear(); } @@ -4291,7 +4333,8 @@ Network* NetworkLibraryImplCros::ParseNetwork( // Erase entry from network_unique_id_map_ in case unique id changes. if (!network->unique_id().empty()) network_unique_id_map_.erase(network->unique_id()); - network->network_parser()->UpdateNetworkFromInfo(info, network); + if (network->network_parser()) + network->network_parser()->UpdateNetworkFromInfo(info, network); } if (!network->unique_id().empty()) @@ -4455,7 +4498,11 @@ Network* NetworkLibraryImplCros::ParseRememberedNetwork( NetworkMap::iterator found = remembered_network_map_.find(service_path); if (found != remembered_network_map_.end()) { remembered = found->second; - remembered->network_parser()->UpdateNetworkFromInfo(info, remembered); + // Erase entry from network_unique_id_map_ in case unique id changes. + if (!remembered->unique_id().empty()) + remembered_network_unique_id_map_.erase(remembered->unique_id()); + if (remembered->network_parser()) + remembered->network_parser()->UpdateNetworkFromInfo(info, remembered); } else { NativeNetworkParser parser; remembered = parser.CreateNetworkFromInfo(service_path, info); @@ -4469,6 +4516,9 @@ Network* NetworkLibraryImplCros::ParseRememberedNetwork( } } + if (!remembered->unique_id().empty()) + remembered_network_unique_id_map_[remembered->unique_id()] = remembered; + SetProfileTypeFromPath(remembered); VLOG(1) << "ParseRememberedNetwork: " << remembered->name() @@ -4479,7 +4529,7 @@ Network* NetworkLibraryImplCros::ParseRememberedNetwork( if (remembered->type() == TYPE_VPN) { // VPNs are only stored in profiles. If we don't have a network for it, // request one. - if (!FindNetworkFromRemembered(remembered)) { + if (!FindNetworkByUniqueId(remembered->unique_id())) { VirtualNetwork* vpn = static_cast<VirtualNetwork*>(remembered); std::string provider_type = ProviderTypeToString(vpn->provider_type()); VLOG(1) << "Requesting VPN: " << vpn->name() diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h index 2eff312f..47c09c8 100644 --- a/chrome/browser/chromeos/cros/network_library.h +++ b/chrome/browser/chromeos/cros/network_library.h @@ -25,8 +25,8 @@ class Value; namespace chromeos { -class NativeNetworkParser; -class NativeNetworkDeviceParser; +class NetworkParser; +class NetworkDeviceParser; // This is the list of all implementation classes that are allowed // access to the internals of the network library classes. @@ -55,6 +55,7 @@ enum PropertyIndex { PROPERTY_INDEX_DEFAULT_TECHNOLOGY, PROPERTY_INDEX_DEVICE, PROPERTY_INDEX_DEVICES, + PROPERTY_INDEX_EAP, PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY, PROPERTY_INDEX_EAP_CA_CERT, PROPERTY_INDEX_EAP_CA_CERT_ID, @@ -62,6 +63,7 @@ enum PropertyIndex { PROPERTY_INDEX_EAP_CERT_ID, PROPERTY_INDEX_EAP_CLIENT_CERT, PROPERTY_INDEX_EAP_CLIENT_CERT_NSS, + PROPERTY_INDEX_EAP_CLIENT_CERT_PATTERN, PROPERTY_INDEX_EAP_IDENTITY, PROPERTY_INDEX_EAP_KEY_ID, PROPERTY_INDEX_EAP_KEY_MGMT, @@ -80,6 +82,7 @@ enum PropertyIndex { PROPERTY_INDEX_FOUND_NETWORKS, PROPERTY_INDEX_GUID, PROPERTY_INDEX_HARDWARE_REVISION, + PROPERTY_INDEX_HIDDEN_SSID, PROPERTY_INDEX_HOME_PROVIDER, PROPERTY_INDEX_HOST, PROPERTY_INDEX_IDENTITY, @@ -117,6 +120,7 @@ enum PropertyIndex { PROPERTY_INDEX_PROFILES, PROPERTY_INDEX_PROVIDER, PROPERTY_INDEX_PROXY_CONFIG, + PROPERTY_INDEX_REMOVE, PROPERTY_INDEX_ROAMING_STATE, PROPERTY_INDEX_SAVE_CREDENTIALS, PROPERTY_INDEX_SCANNING, @@ -367,6 +371,9 @@ class NetworkDevice { explicit NetworkDevice(const std::string& device_path); ~NetworkDevice(); + NetworkDeviceParser* device_parser() { return device_parser_.get(); } + void SetNetworkDeviceParser(NetworkDeviceParser* parser); + // Device info. const std::string& device_path() const { return device_path_; } const std::string& name() const { return name_; } @@ -416,9 +423,7 @@ class NetworkDevice { // if not needed. bool UpdateStatus(const std::string& key, const base::Value& value, - PropertyIndex *index); - - NativeNetworkDeviceParser* device_parser() { return device_parser_.get(); } + PropertyIndex* index); protected: void set_unique_id(const std::string& unique_id) { unique_id_ = unique_id; } @@ -542,7 +547,7 @@ class NetworkDevice { // This is the parser we use to parse messages from the native // network layer. - scoped_ptr<NativeNetworkDeviceParser> device_parser_; + scoped_ptr<NetworkDeviceParser> device_parser_; DISALLOW_COPY_AND_ASSIGN(NetworkDevice); }; @@ -657,8 +662,10 @@ class Network { protected: Network(const std::string& service_path, - ConnectionType type, - NativeNetworkParser* parser); + ConnectionType type); + + NetworkParser* network_parser() { return network_parser_.get(); } + void SetNetworkParser(NetworkParser* parser); // Set the state and update flags if necessary. void SetState(ConnectionState state); @@ -685,8 +692,6 @@ class Network { const std::string& str, std::string* dest); - NativeNetworkParser* network_parser() { return network_parser_.get(); } - void set_unique_id(const std::string& unique_id) { unique_id_ = unique_id; } private: @@ -698,6 +703,8 @@ class Network { friend class NetworkParser; friend class NativeNetworkParser; friend class NativeVirtualNetworkParser; + friend class OncNetworkParser; + friend class OncVirtualNetworkParser; // This allows the implementation classes access to privates. NETWORK_LIBRARY_IMPL_FRIENDS; @@ -775,7 +782,7 @@ class Network { // This is the parser we use to parse messages from the native // network layer. - scoped_ptr<NativeNetworkParser> network_parser_; + scoped_ptr<NetworkParser> network_parser_; DISALLOW_COPY_AND_ASSIGN(Network); }; @@ -834,13 +841,15 @@ class VirtualNetwork : public Network { const std::string& otp); private: - // This allows NativeNetworkParser and its subclasses access to + // This allows NetworkParser and its subclasses access to // device privates so that they can be reconstituted during parsing. // The parsers only access things through the private set_ functions // so that this class can evolve without having to change all the // parsers. friend class NativeNetworkParser; friend class NativeVirtualNetworkParser; + friend class OncNetworkParser; + friend class OncVirtualNetworkParser; // This allows the implementation classes access to privates. NETWORK_LIBRARY_IMPL_FRIENDS; @@ -910,15 +919,16 @@ class WirelessNetwork : public Network { protected: WirelessNetwork(const std::string& service_path, - ConnectionType type, - NativeNetworkParser* parser) - : Network(service_path, type, parser), strength_(0) {} + ConnectionType type) + : Network(service_path, type), strength_(0) {} + private: // This allows NativeWirelessNetworkParser access to device privates // so that they can be reconstituted during parsing. The parsers // only access things through the private set_ functions so that // this class can evolve without having to change all the parsers. friend class NativeWirelessNetworkParser; + friend class OncWirelessNetworkParser; // This allows the implementation classes access to privates. NETWORK_LIBRARY_IMPL_FRIENDS; @@ -1017,6 +1027,7 @@ class CellularNetwork : public WirelessNetwork { // only access things through the private set_ functions so that // this class can evolve without having to change all the parsers. friend class NativeCellularNetworkParser; + friend class OncCellularNetworkParser; // This allows the implementation classes access to privates. NETWORK_LIBRARY_IMPL_FRIENDS; @@ -1143,6 +1154,7 @@ class WifiNetwork : public WirelessNetwork { // access things through the private set_ functions so that this // class can evolve without having to change all the parsers. friend class NativeWifiNetworkParser; + friend class OncWifiNetworkParser; // This allows the implementation classes access to privates. NETWORK_LIBRARY_IMPL_FRIENDS; @@ -1508,20 +1520,19 @@ class NetworkLibrary { // As long as this is done in sequence on the UI thread it will be safe; // the network list only gets updated on the UI thread. virtual Network* FindNetworkByPath(const std::string& path) const = 0; + virtual Network* FindNetworkByUniqueId( + const std::string& unique_id) const = 0; virtual WifiNetwork* FindWifiNetworkByPath(const std::string& path) const = 0; virtual CellularNetwork* FindCellularNetworkByPath( const std::string& path) const = 0; virtual VirtualNetwork* FindVirtualNetworkByPath( const std::string& path) const = 0; - // Returns the visible network corresponding to the remembered network, - // or NULL if the remembered network is not visible. - virtual Network* FindNetworkFromRemembered( - const Network* remembered) const = 0; - // Return a pointer to the remembered network, if it exists, or NULL. virtual Network* FindRememberedNetworkByPath( const std::string& path) const = 0; + virtual Network* FindRememberedNetworkByUniqueId( + const std::string& unique_id) const = 0; // Retrieves the data plans associated with |path|, NULL if there are no // associated plans. @@ -1692,6 +1703,9 @@ class NetworkLibrary { // changes. virtual void SwitchToPreferredNetwork() = 0; + // Load networks from an Open Network Configuration blob. + virtual bool LoadOncNetworks(const std::string& onc_blob) = 0; + // This sets the active network for the network type. Note: priority order // is unchanged (i.e. if a wifi network is set to active, but an ethernet // network is still active, active_network() will still return the ethernet diff --git a/chrome/browser/chromeos/cros/network_parser.cc b/chrome/browser/chromeos/cros/network_parser.cc index fa9d7c0..cd2f250 100644 --- a/chrome/browser/chromeos/cros/network_parser.cc +++ b/chrome/browser/chromeos/cros/network_parser.cc @@ -4,7 +4,7 @@ #include "chrome/browser/chromeos/cros/network_parser.h" -#include "base/json/json_writer.h" // for debug output only. +#include "base/json/json_writer.h" // for debug output only. #include "base/stringprintf.h" #include "base/values.h" // Needed only for debug output (ConnectionTypeToString). @@ -12,36 +12,6 @@ namespace chromeos { -namespace { -Network* CreateNewNetwork( - ConnectionType type, const std::string& service_path) { - switch (type) { - case TYPE_ETHERNET: { - EthernetNetwork* ethernet = new EthernetNetwork(service_path); - return ethernet; - } - case TYPE_WIFI: { - WifiNetwork* wifi = new WifiNetwork(service_path); - return wifi; - } - case TYPE_CELLULAR: { - CellularNetwork* cellular = new CellularNetwork(service_path); - return cellular; - } - case TYPE_VPN: { - VirtualNetwork* vpn = new VirtualNetwork(service_path); - return vpn; - } - default: { - // If we try and create a service for which we have an unknown - // type, then that's a bug, and we will crash. - LOG(FATAL) << "Unknown service type: " << type; - return NULL; - } - } -} -} // namespace - NetworkDeviceParser::NetworkDeviceParser( const EnumMapper<PropertyIndex>* mapper) : mapper_(mapper) { CHECK(mapper); @@ -53,7 +23,7 @@ NetworkDeviceParser::~NetworkDeviceParser() { NetworkDevice* NetworkDeviceParser::CreateDeviceFromInfo( const std::string& device_path, const DictionaryValue& info) { - scoped_ptr<NetworkDevice> device(new NetworkDevice(device_path)); + scoped_ptr<NetworkDevice> device(CreateNewNetworkDevice(device_path)); if (!UpdateDeviceFromInfo(info, device.get())) { NOTREACHED() << "Unable to create new device"; return NULL; @@ -67,7 +37,7 @@ bool NetworkDeviceParser::UpdateDeviceFromInfo(const DictionaryValue& info, for (DictionaryValue::key_iterator iter = info.begin_keys(); iter != info.end_keys(); ++iter) { const std::string& key = *iter; - Value* value; + base::Value* value; bool result = info.GetWithoutPathExpansion(key, &value); DCHECK(result); if (result) @@ -83,7 +53,7 @@ bool NetworkDeviceParser::UpdateDeviceFromInfo(const DictionaryValue& info, } bool NetworkDeviceParser::UpdateStatus(const std::string& key, - const Value& value, + const base::Value& value, NetworkDevice* device, PropertyIndex* index) { PropertyIndex found_index = mapper().Get(key); @@ -102,6 +72,11 @@ bool NetworkDeviceParser::UpdateStatus(const std::string& key, return true; } +NetworkDevice* NetworkDeviceParser::CreateNewNetworkDevice( + const std::string&device_path) { + return new NetworkDevice(device_path); +} + //----------- Network Parser ----------------- NetworkParser::NetworkParser(const EnumMapper<PropertyIndex>* mapper) @@ -116,9 +91,10 @@ Network* NetworkParser::CreateNetworkFromInfo( const std::string& service_path, const DictionaryValue& info) { ConnectionType type = ParseTypeFromDictionary(info); + if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. + return NULL; scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); - if (network.get()) - UpdateNetworkFromInfo(info, network.get()); + UpdateNetworkFromInfo(info, network.get()); VLOG(2) << "Created Network '" << network->name() << "' from info. Path:" << service_path << " Type:" << ConnectionTypeToString(type); @@ -131,10 +107,10 @@ bool NetworkParser::UpdateNetworkFromInfo(const DictionaryValue& info, for (DictionaryValue::key_iterator iter = info.begin_keys(); iter != info.end_keys(); ++iter) { const std::string& key = *iter; - Value* value; + base::Value* value; bool res = info.GetWithoutPathExpansion(key, &value); DCHECK(res); - if (res) + if (res) // Use network's parser to update status network->UpdateStatus(key, *value, NULL); } if (network->unique_id().empty()) @@ -146,7 +122,7 @@ bool NetworkParser::UpdateNetworkFromInfo(const DictionaryValue& info, } bool NetworkParser::UpdateStatus(const std::string& key, - const Value& value, + const base::Value& value, Network* network, PropertyIndex* index) { PropertyIndex found_index = mapper().Get(key); @@ -167,101 +143,64 @@ bool NetworkParser::UpdateStatus(const std::string& key, return true; } +Network* NetworkParser::CreateNewNetwork( + ConnectionType type, const std::string& service_path) { + switch (type) { + case TYPE_ETHERNET: { + EthernetNetwork* ethernet = new EthernetNetwork(service_path); + return ethernet; + } + case TYPE_WIFI: { + WifiNetwork* wifi = new WifiNetwork(service_path); + return wifi; + } + case TYPE_CELLULAR: { + CellularNetwork* cellular = new CellularNetwork(service_path); + return cellular; + } + case TYPE_VPN: { + VirtualNetwork* vpn = new VirtualNetwork(service_path); + return vpn; + } + default: { + // If we try and create a service for which we have an unknown + // type, then that's a bug, and we will crash. + LOG(FATAL) << "Unknown service type: " << type; + return NULL; + } + } +} + bool NetworkParser::ParseValue(PropertyIndex index, - const Value& value, + const base::Value& value, Network* network) { switch (index) { - case PROPERTY_INDEX_TYPE: { - std::string type_string; - if (value.GetAsString(&type_string)) { - ConnectionType type = ParseType(type_string); - LOG_IF(ERROR, type != network->type()) - << "Network with mismatched type: " << network->service_path() - << " " << type << " != " << network->type(); - return true; - } - break; - } - case PROPERTY_INDEX_DEVICE: { - std::string device_path; - if (!value.GetAsString(&device_path)) - break; - network->set_device_path(device_path); - return true; - } case PROPERTY_INDEX_NAME: { std::string name; - if (value.GetAsString(&name)) { - network->SetName(name); - return true; - } - break; + if (!value.GetAsString(&name)) + return false; + network->SetName(name); + return true; } case PROPERTY_INDEX_GUID: { std::string unique_id; if (!value.GetAsString(&unique_id)) - break; + return false; network->set_unique_id(unique_id); return true; } - case PROPERTY_INDEX_PROFILE: { - // Note: currently this is only provided for non remembered networks. - std::string profile_path; - if (!value.GetAsString(&profile_path)) - break; - network->set_profile_path(profile_path); - return true; - } - case PROPERTY_INDEX_STATE: { - std::string state_string; - if (value.GetAsString(&state_string)) { - network->SetState(ParseState(state_string)); - return true; - } - break; - } - case PROPERTY_INDEX_MODE: { - std::string mode_string; - if (value.GetAsString(&mode_string)) { - network->mode_ = ParseMode(mode_string); - return true; - } - break; - } - case PROPERTY_INDEX_ERROR: { - std::string error_string; - if (value.GetAsString(&error_string)) { - network->error_ = ParseError(error_string); - return true; - } - break; - } - case PROPERTY_INDEX_CONNECTABLE: { - bool connectable; - if (!value.GetAsBoolean(&connectable)) - break; - network->set_connectable(connectable); - return true; - } - case PROPERTY_INDEX_IS_ACTIVE: { - bool is_active; - if (!value.GetAsBoolean(&is_active)) - break; - network->set_is_active(is_active); - return true; - } case PROPERTY_INDEX_AUTO_CONNECT: { bool auto_connect; if (!value.GetAsBoolean(&auto_connect)) - break; + return false; network->set_auto_connect(auto_connect); return true; } - case PROPERTY_INDEX_SAVE_CREDENTIALS: { - bool save_credentials; - if (!value.GetAsBoolean(&save_credentials)) - break; - network->set_save_credentials(save_credentials); + case PROPERTY_INDEX_PROXY_CONFIG: { + std::string proxy_config; + if (!value.GetAsString(&proxy_config)) + return false; + network->set_proxy_config(proxy_config); return true; } default: diff --git a/chrome/browser/chromeos/cros/network_parser.h b/chrome/browser/chromeos/cros/network_parser.h index 748a587..510e96a 100644 --- a/chrome/browser/chromeos/cros/network_parser.h +++ b/chrome/browser/chromeos/cros/network_parser.h @@ -78,6 +78,8 @@ class EnumMapper { // policy or setup file import depending on the EnumMapper supplied. class NetworkDeviceParser { public: + virtual ~NetworkDeviceParser(); + virtual NetworkDevice* CreateDeviceFromInfo( const std::string& device_path, const base::DictionaryValue& info); @@ -87,10 +89,15 @@ class NetworkDeviceParser { const base::Value& value, NetworkDevice* device, PropertyIndex* index); + protected: // The NetworkDeviceParser does not take ownership of the |mapper|. explicit NetworkDeviceParser(const EnumMapper<PropertyIndex>* mapper); - virtual ~NetworkDeviceParser(); + + // Creates new NetworkDevice based on device_path. + // Subclasses should override this method and set the correct parser for this + // network device if appropriate. + virtual NetworkDevice* CreateNewNetworkDevice(const std::string& device_path); virtual bool ParseValue(PropertyIndex index, const base::Value& value, @@ -112,6 +119,8 @@ class NetworkDeviceParser { // customize its methods to parse other forms of input dictionaries. class NetworkParser { public: + virtual ~NetworkParser(); + // Called when a new network is encountered. Returns NULL upon failure. virtual Network* CreateNetworkFromInfo(const std::string& service_path, const base::DictionaryValue& info); @@ -129,20 +138,25 @@ class NetworkParser { const base::Value& value, Network* network, PropertyIndex* index); + protected: // The NetworkParser does not take ownership of the |mapper|. explicit NetworkParser(const EnumMapper<PropertyIndex>* mapper); - virtual ~NetworkParser(); + // Creates new Network based on type and service_path. + // Subclasses should override this method and set the correct parser for this + // network if appropriate. + virtual Network* CreateNewNetwork(ConnectionType type, + const std::string& service_path); + + // Parses the value and sets the appropriate field on Network. virtual bool ParseValue(PropertyIndex index, const base::Value& value, - Network* network) = 0; + Network* network); + virtual ConnectionType ParseType(const std::string& type) = 0; virtual ConnectionType ParseTypeFromDictionary( const base::DictionaryValue& info) = 0; - virtual ConnectionMode ParseMode(const std::string& mode) = 0; - virtual ConnectionState ParseState(const std::string& state) = 0; - virtual ConnectionError ParseError(const std::string& error) = 0; const EnumMapper<PropertyIndex>& mapper() const { return *mapper_; diff --git a/chrome/browser/chromeos/cros/onc_network_parser.cc b/chrome/browser/chromeos/cros/onc_network_parser.cc new file mode 100644 index 0000000..12dff3d --- /dev/null +++ b/chrome/browser/chromeos/cros/onc_network_parser.cc @@ -0,0 +1,490 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/cros/onc_network_parser.h" + +#include "base/stringprintf.h" +#include "base/values.h" +#include "chrome/browser/chromeos/cros/native_network_constants.h" +#include "chrome/browser/chromeos/cros/network_library.h" +#include "chrome/browser/chromeos/login/user_manager.h" +#include "content/common/json_value_serializer.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +namespace chromeos { + +// Local constants. +namespace { + +EnumMapper<PropertyIndex>::Pair property_index_table[] = { + { "GUID", PROPERTY_INDEX_GUID }, + { "Name", PROPERTY_INDEX_NAME }, + { "Remove", PROPERTY_INDEX_REMOVE }, + { "ProxyURL", PROPERTY_INDEX_PROXY_CONFIG }, + { "Type", PROPERTY_INDEX_TYPE }, + { "SSID", PROPERTY_INDEX_NAME }, + { "Passphrase", PROPERTY_INDEX_PASSPHRASE }, + { "AutoConnect", PROPERTY_INDEX_AUTO_CONNECT }, + { "HiddenSSID", PROPERTY_INDEX_HIDDEN_SSID }, + { "Security", PROPERTY_INDEX_SECURITY }, + { "EAP", PROPERTY_INDEX_EAP }, + { "Outer", PROPERTY_INDEX_EAP_METHOD }, + { "Inner", PROPERTY_INDEX_EAP_PHASE_2_AUTH }, + { "UseSystemCAs", PROPERTY_INDEX_EAP_USE_SYSTEM_CAS }, + { "ServerCARef", PROPERTY_INDEX_EAP_CA_CERT }, + { "ClientCARef", PROPERTY_INDEX_EAP_CLIENT_CERT }, + { "ClientCertPattern", PROPERTY_INDEX_EAP_CLIENT_CERT_PATTERN }, + { "Identity", PROPERTY_INDEX_EAP_IDENTITY }, + { "Password", PROPERTY_INDEX_EAP_PASSWORD }, + { "AnonymousIdentity", PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY }, +}; + +// Serve the singleton mapper instance. +const EnumMapper<PropertyIndex>* get_onc_mapper() { + static const EnumMapper<PropertyIndex> mapper(property_index_table, + arraysize(property_index_table), + PROPERTY_INDEX_UNKNOWN); + return &mapper; +} + +ConnectionType ParseNetworkType(const std::string& type) { + static EnumMapper<ConnectionType>::Pair table[] = { + { "WiFi", TYPE_WIFI }, + { "VPN", TYPE_VPN }, + }; + static EnumMapper<ConnectionType> parser( + table, arraysize(table), TYPE_UNKNOWN); + return parser.Get(type); +} + +} // namespace + +// -------------------- OncNetworkParser -------------------- + +OncNetworkParser::OncNetworkParser(const std::string& onc_blob) + : NetworkParser(get_onc_mapper()), + network_configs_(NULL), + certificates_(NULL) { + JSONStringValueSerializer deserializer(onc_blob); + deserializer.set_allow_trailing_comma(true); + std::string error_msg; + scoped_ptr<base::Value> root(deserializer.Deserialize(NULL, &error_msg)); + + if (!root.get() || root->GetType() != base::Value::TYPE_DICTIONARY) { + LOG(WARNING) << "OncNetworkParser received bad ONC file: " << error_msg; + } else { + root_dict_.reset(static_cast<DictionaryValue*>(root.release())); + if (!root_dict_->GetList("NetworkConfigurations", &network_configs_)) { + LOG(WARNING) << "ONC file missing NetworkConfigurations"; + } + // Certificates is optional + root_dict_->GetList("Certificates", &certificates_); + } +} + +OncNetworkParser::OncNetworkParser() : NetworkParser(get_onc_mapper()) { +} + +OncNetworkParser::~OncNetworkParser() { +} + +// static +const EnumMapper<PropertyIndex>* OncNetworkParser::property_mapper() { + return get_onc_mapper(); +} + +int OncNetworkParser::GetNetworkConfigsSize() const { + return network_configs_ ? network_configs_->GetSize() : 0; +} + +int OncNetworkParser::GetCertificatesSize() const { + return certificates_ ? certificates_->GetSize() : 0; +} + +Network* OncNetworkParser::ParseNetwork(int n) { + // TODO(chocobo): Change this to parse network into a dictionary. + if (!network_configs_) + return NULL; + DictionaryValue* info = NULL; + if (!network_configs_->GetDictionary(n, &info)) + return NULL; + // Parse Open Network Configuration blob into a temporary Network object. + return CreateNetworkFromInfo(std::string(), *info); +} + +Network* OncNetworkParser::CreateNetworkFromInfo( + const std::string& service_path, + const DictionaryValue& info) { + ConnectionType type = ParseTypeFromDictionary(info); + if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. + return NULL; + scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); + + // Get the child dictionary with properties for the network. + // And copy all the values from this network type dictionary to parent. + DictionaryValue* dict; + if (!info.GetDictionary(GetTypeFromDictionary(info), &dict)) + return NULL; + + UpdateNetworkFromInfo(*dict, network.get()); + VLOG(2) << "Created Network '" << network->name() + << "' from info. Path:" << service_path + << " Type:" << ConnectionTypeToString(type); + return network.release(); +} + +Network* OncNetworkParser::CreateNewNetwork( + ConnectionType type, const std::string& service_path) { + Network* network = NetworkParser::CreateNewNetwork(type, service_path); + if (network) { + if (type == TYPE_WIFI) + network->SetNetworkParser(new OncWifiNetworkParser()); + else if (type == TYPE_VPN) + network->SetNetworkParser(new OncVirtualNetworkParser()); + } + return network; +} + +ConnectionType OncNetworkParser::ParseType(const std::string& type) { + return ParseNetworkType(type); +} + +ConnectionType OncNetworkParser::ParseTypeFromDictionary( + const DictionaryValue& info) { + return ParseType(GetTypeFromDictionary(info)); +} + +std::string OncNetworkParser::GetTypeFromDictionary( + const base::DictionaryValue& info) { + std::string type_string; + info.GetString("Type", &type_string); + return type_string; +} + + +// -------------------- OncWirelessNetworkParser -------------------- + +OncWirelessNetworkParser::OncWirelessNetworkParser() {} +OncWirelessNetworkParser::~OncWirelessNetworkParser() {} + +bool OncWirelessNetworkParser::ParseValue(PropertyIndex index, + const base::Value& value, + Network* network) { + DCHECK_NE(TYPE_ETHERNET, network->type()); + DCHECK_NE(TYPE_VPN, network->type()); + return OncNetworkParser::ParseValue(index, value, network); +} + +// -------------------- OncWifiNetworkParser -------------------- + +OncWifiNetworkParser::OncWifiNetworkParser() {} +OncWifiNetworkParser::~OncWifiNetworkParser() {} + +bool OncWifiNetworkParser::ParseValue(PropertyIndex index, + const base::Value& value, + Network* network) { + DCHECK_EQ(TYPE_WIFI, network->type()); + WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); + switch (index) { + case PROPERTY_INDEX_NAME: { + return OncWirelessNetworkParser::ParseValue(index, value, network); + } + case PROPERTY_INDEX_GUID: { + std::string unique_id; + if (!value.GetAsString(&unique_id)) + break; + wifi_network->set_unique_id(unique_id); + return true; + } + case PROPERTY_INDEX_SECURITY: { + std::string security_string; + if (!value.GetAsString(&security_string)) + break; + wifi_network->set_encryption(ParseSecurity(security_string)); + return true; + } + case PROPERTY_INDEX_PASSPHRASE: { + std::string passphrase; + if (!value.GetAsString(&passphrase)) + break; + wifi_network->set_passphrase(passphrase); + return true; + } + case PROPERTY_INDEX_IDENTITY: { + std::string identity; + if (!value.GetAsString(&identity)) + break; + wifi_network->set_identity(identity); + return true; + } + case PROPERTY_INDEX_EAP: { + DCHECK_EQ(value.GetType(), Value::TYPE_DICTIONARY); + const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); + for (DictionaryValue::key_iterator iter = dict.begin_keys(); + iter != dict.end_keys(); ++iter) { + const std::string& key = *iter; + base::Value* eap_value; + bool res = dict.GetWithoutPathExpansion(key, &eap_value); + DCHECK(res); + if (res) { + PropertyIndex index = mapper().Get(key); + if (!ParseEAPValue(index, *eap_value, wifi_network)) + VLOG(1) << network->name() << ": EAP unhandled key: " << key + << " Type: " << eap_value->GetType(); + } + } + return true; + } + default: + return OncWirelessNetworkParser::ParseValue(index, value, network); + } + return false; +} + + +bool OncWifiNetworkParser::ParseEAPValue(PropertyIndex index, + const base::Value& value, + WifiNetwork* wifi_network) { + switch (index) { + case PROPERTY_INDEX_EAP_IDENTITY: { + std::string eap_identity; + if (!value.GetAsString(&eap_identity)) + break; + wifi_network->set_eap_identity(eap_identity); + return true; + } + case PROPERTY_INDEX_EAP_METHOD: { + std::string eap_method; + if (!value.GetAsString(&eap_method)) + break; + wifi_network->set_eap_method(ParseEAPMethod(eap_method)); + return true; + } + case PROPERTY_INDEX_EAP_PHASE_2_AUTH: { + std::string eap_phase_2_auth; + if (!value.GetAsString(&eap_phase_2_auth)) + break; + wifi_network->set_eap_phase_2_auth(ParseEAPPhase2Auth(eap_phase_2_auth)); + return true; + } + case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY: { + std::string eap_anonymous_identity; + if (!value.GetAsString(&eap_anonymous_identity)) + break; + wifi_network->set_eap_anonymous_identity(eap_anonymous_identity); + return true; + } + case PROPERTY_INDEX_EAP_CERT_ID: { + std::string eap_client_cert_pkcs11_id; + if (!value.GetAsString(&eap_client_cert_pkcs11_id)) + break; + wifi_network->set_eap_client_cert_pkcs11_id(eap_client_cert_pkcs11_id); + return true; + } + case PROPERTY_INDEX_EAP_CA_CERT_NSS: { + std::string eap_server_ca_cert_nss_nickname; + if (!value.GetAsString(&eap_server_ca_cert_nss_nickname)) + break; + wifi_network->set_eap_server_ca_cert_nss_nickname( + eap_server_ca_cert_nss_nickname); + return true; + } + case PROPERTY_INDEX_EAP_USE_SYSTEM_CAS: { + bool eap_use_system_cas; + if (!value.GetAsBoolean(&eap_use_system_cas)) + break; + wifi_network->set_eap_use_system_cas(eap_use_system_cas); + return true; + } + case PROPERTY_INDEX_EAP_PASSWORD: { + std::string eap_passphrase; + if (!value.GetAsString(&eap_passphrase)) + break; + wifi_network->set_eap_passphrase(eap_passphrase); + return true; + } + default: + break; + } + return false; +} + +ConnectionSecurity OncWifiNetworkParser::ParseSecurity( + const std::string& security) { + static EnumMapper<ConnectionSecurity>::Pair table[] = { + { "None", SECURITY_NONE }, + { "WEP", SECURITY_WEP }, + { "WPA", SECURITY_WPA }, + { "WPA2", SECURITY_8021X }, + }; + static EnumMapper<ConnectionSecurity> parser( + table, arraysize(table), SECURITY_UNKNOWN); + return parser.Get(security); +} + +EAPMethod OncWifiNetworkParser::ParseEAPMethod(const std::string& method) { + static EnumMapper<EAPMethod>::Pair table[] = { + { "PEAP", EAP_METHOD_PEAP }, + { "EAP-TLS", EAP_METHOD_TLS }, + { "EAP-TTLS", EAP_METHOD_TTLS }, + { "LEAP", EAP_METHOD_LEAP }, + }; + static EnumMapper<EAPMethod> parser( + table, arraysize(table), EAP_METHOD_UNKNOWN); + return parser.Get(method); +} + +EAPPhase2Auth OncWifiNetworkParser::ParseEAPPhase2Auth( + const std::string& auth) { + static EnumMapper<EAPPhase2Auth>::Pair table[] = { + { "MD5", EAP_PHASE_2_AUTH_MD5 }, + { "MSCHAPV2", EAP_PHASE_2_AUTH_MSCHAPV2 }, + { "MSCHAP", EAP_PHASE_2_AUTH_MSCHAP }, + { "PAP", EAP_PHASE_2_AUTH_PAP }, + }; + static EnumMapper<EAPPhase2Auth> parser( + table, arraysize(table), EAP_PHASE_2_AUTH_AUTO); + return parser.Get(auth); +} + +// -------------------- OncVirtualNetworkParser -------------------- + + +OncVirtualNetworkParser::OncVirtualNetworkParser() {} +OncVirtualNetworkParser::~OncVirtualNetworkParser() {} + +bool OncVirtualNetworkParser::UpdateNetworkFromInfo( + const DictionaryValue& info, + Network* network) { + DCHECK_EQ(TYPE_VPN, network->type()); + VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); + if (!OncNetworkParser::UpdateNetworkFromInfo(info, network)) + return false; + VLOG(1) << "Updating VPN '" << virtual_network->name() + << "': Server: " << virtual_network->server_hostname() + << " Type: " + << ProviderTypeToString(virtual_network->provider_type()); + if (virtual_network->provider_type() == PROVIDER_TYPE_L2TP_IPSEC_PSK) { + if (!virtual_network->client_cert_id().empty()) + virtual_network->set_provider_type(PROVIDER_TYPE_L2TP_IPSEC_USER_CERT); + } + return true; +} + +bool OncVirtualNetworkParser::ParseValue(PropertyIndex index, + const base::Value& value, + Network* network) { + DCHECK_EQ(TYPE_VPN, network->type()); + VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); + switch (index) { + case PROPERTY_INDEX_PROVIDER: { + DCHECK_EQ(value.GetType(), Value::TYPE_DICTIONARY); + const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); + for (DictionaryValue::key_iterator iter = dict.begin_keys(); + iter != dict.end_keys(); ++iter) { + const std::string& key = *iter; + base::Value* provider_value; + bool res = dict.GetWithoutPathExpansion(key, &provider_value); + DCHECK(res); + if (res) { + PropertyIndex index = mapper().Get(key); + if (!ParseProviderValue(index, *provider_value, virtual_network)) + VLOG(1) << network->name() << ": Provider unhandled key: " << key + << " Type: " << provider_value->GetType(); + } + } + return true; + } + default: + return OncNetworkParser::ParseValue(index, value, network); + break; + } + return false; +} + +bool OncVirtualNetworkParser::ParseProviderValue(PropertyIndex index, + const base::Value& value, + VirtualNetwork* network) { + switch (index) { + case PROPERTY_INDEX_HOST: { + std::string server_hostname; + if (!value.GetAsString(&server_hostname)) + break; + network->set_server_hostname(server_hostname); + return true; + } + case PROPERTY_INDEX_NAME: { + std::string name; + if (!value.GetAsString(&name)) + break; + network->set_name(name); + return true; + } + case PROPERTY_INDEX_TYPE: { + std::string provider_type_string; + if (!value.GetAsString(&provider_type_string)) + break; + network->set_provider_type(ParseProviderType(provider_type_string)); + return true; + } + case PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS: { + std::string ca_cert_nss; + if (!value.GetAsString(&ca_cert_nss)) + break; + network->set_ca_cert_nss(ca_cert_nss); + return true; + } + case PROPERTY_INDEX_L2TPIPSEC_PSK: { + std::string psk_passphrase; + if (!value.GetAsString(&psk_passphrase)) + break; + network->set_psk_passphrase(psk_passphrase); + return true; + } + case PROPERTY_INDEX_L2TPIPSEC_CLIENT_CERT_ID: { + std::string client_cert_id; + if (!value.GetAsString(&client_cert_id)) + break; + network->set_client_cert_id(client_cert_id); + return true; + } + case PROPERTY_INDEX_L2TPIPSEC_USER: { + std::string username; + if (!value.GetAsString(&username)) + break; + network->set_username(username); + return true; + } + case PROPERTY_INDEX_L2TPIPSEC_PASSWORD: { + std::string user_passphrase; + if (!value.GetAsString(&user_passphrase)) + break; + network->set_user_passphrase(user_passphrase); + return true; + } + case PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME: { + std::string group_name; + if (!value.GetAsString(&group_name)) + break; + network->set_group_name(group_name); + return true; + } + default: + break; + } + return false; +} + +ProviderType OncVirtualNetworkParser::ParseProviderType( + const std::string& type) { + static EnumMapper<ProviderType>::Pair table[] = { + { flimflam::kProviderL2tpIpsec, PROVIDER_TYPE_L2TP_IPSEC_PSK }, + { flimflam::kProviderOpenVpn, PROVIDER_TYPE_OPEN_VPN }, + }; + static EnumMapper<ProviderType> parser( + table, arraysize(table), PROVIDER_TYPE_MAX); + return parser.Get(type); +} + +} // namespace chromeos diff --git a/chrome/browser/chromeos/cros/onc_network_parser.h b/chrome/browser/chromeos/cros/onc_network_parser.h new file mode 100644 index 0000000..cb624f3 --- /dev/null +++ b/chrome/browser/chromeos/cros/onc_network_parser.h @@ -0,0 +1,118 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_CROS_ONC_NETWORK_PARSER_H_ +#define CHROME_BROWSER_CHROMEOS_CROS_ONC_NETWORK_PARSER_H_ +#pragma once + +#include <string> + +#include "base/compiler_specific.h" // for OVERRIDE +#include "base/memory/scoped_ptr.h" +#include "chrome/browser/chromeos/cros/network_parser.h" + +namespace base { +class DictionaryValue; +class ListValue; +class Value; +} + +namespace chromeos { + +// This is the network parser that parses the data from an Open Network +// Configuration (ONC) file. ONC files are in JSON format that describes +// networks. We will use this parser to parse the ONC JSON blob. +// +// For ONC file format, see: http://dev.chromium.org/chromium-os/ +// chromiumos-design-docs/open-network-configuration +class OncNetworkParser : public NetworkParser { + public: + explicit OncNetworkParser(const std::string& onc_blob); + virtual ~OncNetworkParser(); + static const EnumMapper<PropertyIndex>* property_mapper(); + + // Returns the number of networks in the "NetworkConfigs" list. + int GetNetworkConfigsSize() const; + + // Returns the number of certificates in the "Certificates" list. + int GetCertificatesSize() const; + + // Call to create the network by parsing network config in the nth position. + // (0-based). Returns NULL if there's a parse error or if n is out of range. + Network* ParseNetwork(int n); + + virtual Network* CreateNetworkFromInfo(const std::string& service_path, + const base::DictionaryValue& info) OVERRIDE; + + protected: + OncNetworkParser(); + + virtual Network* CreateNewNetwork(ConnectionType type, + const std::string& service_path) OVERRIDE; + virtual ConnectionType ParseType(const std::string& type) OVERRIDE; + virtual ConnectionType ParseTypeFromDictionary( + const base::DictionaryValue& info) OVERRIDE; + + // Returns the type string from the dictionary of network values. + std::string GetTypeFromDictionary(const base::DictionaryValue& info); + + private: + scoped_ptr<base::DictionaryValue> root_dict_; + base::ListValue* network_configs_; + base::ListValue* certificates_; + + DISALLOW_COPY_AND_ASSIGN(OncNetworkParser); +}; + +// Base for wireless networks. +class OncWirelessNetworkParser : public OncNetworkParser { + public: + OncWirelessNetworkParser(); + virtual ~OncWirelessNetworkParser(); + virtual bool ParseValue(PropertyIndex index, + const base::Value& value, + Network* network) OVERRIDE; + private: + DISALLOW_COPY_AND_ASSIGN(OncWirelessNetworkParser); +}; + +class OncWifiNetworkParser : public OncWirelessNetworkParser { + public: + OncWifiNetworkParser(); + virtual ~OncWifiNetworkParser(); + virtual bool ParseValue(PropertyIndex index, + const base::Value& value, + Network* network) OVERRIDE; + protected: + bool ParseEAPValue(PropertyIndex index, + const base::Value& value, + WifiNetwork* wifi_network); + ConnectionSecurity ParseSecurity(const std::string& security); + EAPMethod ParseEAPMethod(const std::string& method); + EAPPhase2Auth ParseEAPPhase2Auth(const std::string& auth); + private: + DISALLOW_COPY_AND_ASSIGN(OncWifiNetworkParser); +}; + +class OncVirtualNetworkParser : public OncNetworkParser { + public: + OncVirtualNetworkParser(); + virtual ~OncVirtualNetworkParser(); + virtual bool ParseValue(PropertyIndex index, + const base::Value& value, + Network* network) OVERRIDE; + virtual bool UpdateNetworkFromInfo( + const base::DictionaryValue& info, Network* network) OVERRIDE; + protected: + bool ParseProviderValue(PropertyIndex index, + const base::Value& value, + VirtualNetwork* network); + ProviderType ParseProviderType(const std::string& type); + private: + DISALLOW_COPY_AND_ASSIGN(OncVirtualNetworkParser); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_CROS_ONC_NETWORK_PARSER_H_ diff --git a/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc b/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc new file mode 100644 index 0000000..3e2a313 --- /dev/null +++ b/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc @@ -0,0 +1,115 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/cros/onc_network_parser.h" + +#include "base/values.h" +#include "chrome/browser/chromeos/cros/network_library.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { + +TEST(OncNetworkParserTest, TestCreateNetworkWifi1) { + std::string test_blob( + "{" + " \"NetworkConfigurations\": [{" + " \"GUID\": \"{485d6076-dd44-6b6d-69787465725f5045}\"," + " \"Type\": \"WiFi\"," + " \"WiFi\": {" + " \"Security\": \"WEP\"," + " \"SSID\": \"ssid\"," + " \"Passphrase\": \"pass\"," + " }" + " }]" + "}"); + OncNetworkParser parser(test_blob); + + EXPECT_EQ(1, parser.GetNetworkConfigsSize()); + EXPECT_EQ(0, parser.GetCertificatesSize()); + EXPECT_FALSE(parser.ParseNetwork(1)); + Network* network = parser.ParseNetwork(0); + ASSERT_TRUE(network); + + EXPECT_EQ(network->type(), chromeos::TYPE_WIFI); + WifiNetwork* wifi = static_cast<WifiNetwork*>(network); + EXPECT_EQ(wifi->encryption(), chromeos::SECURITY_WEP); + EXPECT_EQ(wifi->name(), "ssid"); + EXPECT_EQ(wifi->auto_connect(), false); + EXPECT_EQ(wifi->passphrase(), "pass"); +} + +TEST(OncNetworkParserTest, TestCreateNetworkWifiEAP1) { + std::string test_blob( + "{" + " \"NetworkConfigurations\": [{" + " \"GUID\": \"{485d6076-dd44-6b6d-69787465725f5045}\"," + " \"Type\": \"WiFi\"," + " \"WiFi\": {" + " \"Security\": \"WPA2\"," + " \"SSID\": \"ssid\"," + " \"AutoConnect\": true," + " \"EAP\": {" + " \"Outer\": \"PEAP\"," + " \"UseSystemCAs\": false," + " }" + " }" + " }]" + "}"); + OncNetworkParser parser(test_blob); + + EXPECT_EQ(1, parser.GetNetworkConfigsSize()); + EXPECT_EQ(0, parser.GetCertificatesSize()); + EXPECT_FALSE(parser.ParseNetwork(1)); + Network* network = parser.ParseNetwork(0); + ASSERT_TRUE(network); + + EXPECT_EQ(network->type(), chromeos::TYPE_WIFI); + WifiNetwork* wifi = static_cast<WifiNetwork*>(network); + EXPECT_EQ(wifi->encryption(), chromeos::SECURITY_8021X); + EXPECT_EQ(wifi->name(), "ssid"); + EXPECT_EQ(wifi->auto_connect(), true); + EXPECT_EQ(wifi->eap_method(), EAP_METHOD_PEAP); + EXPECT_EQ(wifi->eap_use_system_cas(), false); +} + +TEST(OncNetworkParserTest, TestCreateNetworkWifiEAP2) { + std::string test_blob( + "{" + " \"NetworkConfigurations\": [{" + " \"GUID\": \"{485d6076-dd44-6b6d-69787465725f5045}\"," + " \"Type\": \"WiFi\"," + " \"WiFi\": {" + " \"Security\": \"WPA2\"," + " \"SSID\": \"ssid\"," + " \"AutoConnect\": false," + " \"EAP\": {" + " \"Outer\": \"LEAP\"," + " \"Identity\": \"user\"," + " \"Password\": \"pass\"," + " \"AnonymousIdentity\": \"anon\"," + " }" + " }" + " }]" + "}"); + OncNetworkParser parser(test_blob); + + EXPECT_EQ(1, parser.GetNetworkConfigsSize()); + EXPECT_EQ(0, parser.GetCertificatesSize()); + EXPECT_FALSE(parser.ParseNetwork(1)); + Network* network = parser.ParseNetwork(0); + ASSERT_TRUE(network); + + EXPECT_EQ(network->type(), chromeos::TYPE_WIFI); + WifiNetwork* wifi = static_cast<WifiNetwork*>(network); + EXPECT_EQ(wifi->encryption(), chromeos::SECURITY_8021X); + EXPECT_EQ(wifi->name(), "ssid"); + EXPECT_EQ(wifi->auto_connect(), false); + EXPECT_EQ(wifi->eap_method(), EAP_METHOD_LEAP); + EXPECT_EQ(wifi->eap_use_system_cas(), true); + EXPECT_EQ(wifi->eap_identity(), "user"); + EXPECT_EQ(wifi->eap_passphrase(), "pass"); + EXPECT_EQ(wifi->eap_anonymous_identity(), "anon"); +} + +} // namespace chromeos diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc index 5020546..d7a4201 100644 --- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc +++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc @@ -1267,7 +1267,7 @@ ListValue* InternetOptionsHandler::GetRememberedList() { rit != cros_->remembered_wifi_networks().end(); ++rit) { chromeos::WifiNetwork* remembered = *rit; chromeos::WifiNetwork* wifi = static_cast<chromeos::WifiNetwork*>( - cros_->FindNetworkFromRemembered(remembered)); + cros_->FindNetworkByUniqueId(remembered->unique_id())); // Set in_active_profile. bool shared = @@ -1293,7 +1293,7 @@ ListValue* InternetOptionsHandler::GetRememberedList() { rit != cros_->remembered_virtual_networks().end(); ++rit) { chromeos::VirtualNetwork* remembered = *rit; chromeos::VirtualNetwork* vpn = static_cast<chromeos::VirtualNetwork*>( - cros_->FindNetworkFromRemembered(remembered)); + cros_->FindNetworkByUniqueId(remembered->unique_id())); // Set in_active_profile. bool shared = diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 4ae6290..546fd88 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -392,6 +392,8 @@ 'browser/chromeos/cros/network_library.h', 'browser/chromeos/cros/network_parser.cc', 'browser/chromeos/cros/network_parser.h', + 'browser/chromeos/cros/onc_network_parser.cc', + 'browser/chromeos/cros/onc_network_parser.h', 'browser/chromeos/cros/power_library.cc', 'browser/chromeos/cros/power_library.h', 'browser/chromeos/cros/screen_lock_library.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 3fa2833..89c3181 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1182,6 +1182,7 @@ 'browser/chromeos/cros/network_library.cc', 'browser/chromeos/cros/network_library.h', 'browser/chromeos/cros/network_library_unittest.cc', + 'browser/chromeos/cros/onc_network_parser_unittest.cc', 'browser/chromeos/customization_document_unittest.cc', 'browser/chromeos/dbus/cros_dbus_service_unittest.cc', 'browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc', |