summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchocobo@chromium.org <chocobo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-07 01:00:47 +0000
committerchocobo@chromium.org <chocobo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-07 01:00:47 +0000
commit595bd0c88b0a93040ffbdf31daa5bba84c352acf (patch)
treebc5d14e4219f18460b77d1d2102ff3415cb1eefb
parent3a89d5d45b37859fee693cbde2f4db8a4b1c80c4 (diff)
downloadchromium_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.h5
-rw-r--r--chrome/browser/chromeos/cros/native_network_parser.cc92
-rw-r--r--chrome/browser/chromeos/cros/native_network_parser.h21
-rw-r--r--chrome/browser/chromeos/cros/network_library.cc108
-rw-r--r--chrome/browser/chromeos/cros/network_library.h54
-rw-r--r--chrome/browser/chromeos/cros/network_parser.cc171
-rw-r--r--chrome/browser/chromeos/cros/network_parser.h26
-rw-r--r--chrome/browser/chromeos/cros/onc_network_parser.cc490
-rw-r--r--chrome/browser/chromeos/cros/onc_network_parser.h118
-rw-r--r--chrome/browser/chromeos/cros/onc_network_parser_unittest.cc115
-rw-r--r--chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc4
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
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',