| Index: chrome/browser/chromeos/cros/native_network_parser.cc
|
| diff --git a/chrome/browser/chromeos/cros/native_network_parser.cc b/chrome/browser/chromeos/cros/native_network_parser.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d610e278ee0409639a084c4ec92e9b788ba7600f
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/cros/native_network_parser.cc
|
| @@ -0,0 +1,1158 @@
|
| +// 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/native_network_parser.h"
|
| +
|
| +#include "base/stringprintf.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"
|
| +
|
| +namespace chromeos {
|
| +
|
| +// Local constants.
|
| +namespace {
|
| +
|
| +EnumMapper<PropertyIndex>::Pair property_index_table[] = {
|
| + { kActivationStateProperty, PROPERTY_INDEX_ACTIVATION_STATE },
|
| + { kActiveProfileProperty, PROPERTY_INDEX_ACTIVE_PROFILE },
|
| + { kArpGatewayProperty, PROPERTY_INDEX_ARP_GATEWAY },
|
| + { kAutoConnectProperty, PROPERTY_INDEX_AUTO_CONNECT },
|
| + { kAvailableTechnologiesProperty, PROPERTY_INDEX_AVAILABLE_TECHNOLOGIES },
|
| + { kCarrierProperty, PROPERTY_INDEX_CARRIER },
|
| + { kCellularAllowRoamingProperty, PROPERTY_INDEX_CELLULAR_ALLOW_ROAMING },
|
| + { kCellularApnListProperty, PROPERTY_INDEX_CELLULAR_APN_LIST },
|
| + { kCellularApnProperty, PROPERTY_INDEX_CELLULAR_APN },
|
| + { kCellularLastGoodApnProperty, PROPERTY_INDEX_CELLULAR_LAST_GOOD_APN },
|
| + { kCheckPortalListProperty, PROPERTY_INDEX_CHECK_PORTAL_LIST },
|
| + { kConnectableProperty, PROPERTY_INDEX_CONNECTABLE },
|
| + { kConnectedTechnologiesProperty, PROPERTY_INDEX_CONNECTED_TECHNOLOGIES },
|
| + { kDefaultTechnologyProperty, PROPERTY_INDEX_DEFAULT_TECHNOLOGY },
|
| + { kDeviceProperty, PROPERTY_INDEX_DEVICE },
|
| + { kDevicesProperty, PROPERTY_INDEX_DEVICES },
|
| + { kEapAnonymousIdentityProperty, PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY },
|
| + { kEapCaCertIdProperty, PROPERTY_INDEX_EAP_CA_CERT_ID },
|
| + { kEapCaCertNssProperty, PROPERTY_INDEX_EAP_CA_CERT_NSS },
|
| + { kEapCaCertProperty, PROPERTY_INDEX_EAP_CA_CERT },
|
| + { kEapCertIdProperty, PROPERTY_INDEX_EAP_CERT_ID },
|
| + { kEapClientCertNssProperty, PROPERTY_INDEX_EAP_CLIENT_CERT_NSS },
|
| + { kEapClientCertProperty, PROPERTY_INDEX_EAP_CLIENT_CERT },
|
| + { kEapIdentityProperty, PROPERTY_INDEX_EAP_IDENTITY },
|
| + { kEapKeyIdProperty, PROPERTY_INDEX_EAP_KEY_ID },
|
| + { kEapKeyMgmtProperty, PROPERTY_INDEX_EAP_KEY_MGMT },
|
| + { kEapMethodProperty, PROPERTY_INDEX_EAP_METHOD },
|
| + { kEapPasswordProperty, PROPERTY_INDEX_EAP_PASSWORD },
|
| + { kEapPhase2AuthProperty, PROPERTY_INDEX_EAP_PHASE_2_AUTH },
|
| + { kEapPinProperty, PROPERTY_INDEX_EAP_PIN },
|
| + { kEapPrivateKeyPasswordProperty, PROPERTY_INDEX_EAP_PRIVATE_KEY_PASSWORD },
|
| + { kEapPrivateKeyProperty, PROPERTY_INDEX_EAP_PRIVATE_KEY },
|
| + { kEapUseSystemCasProperty, PROPERTY_INDEX_EAP_USE_SYSTEM_CAS },
|
| + { kEnabledTechnologiesProperty, PROPERTY_INDEX_ENABLED_TECHNOLOGIES },
|
| + { kErrorProperty, PROPERTY_INDEX_ERROR },
|
| + { kEsnProperty, PROPERTY_INDEX_ESN },
|
| + { kFavoriteProperty, PROPERTY_INDEX_FAVORITE },
|
| + { kFirmwareRevisionProperty, PROPERTY_INDEX_FIRMWARE_REVISION },
|
| + { kFoundNetworksProperty, PROPERTY_INDEX_FOUND_NETWORKS },
|
| + { kGuidProperty, PROPERTY_INDEX_GUID },
|
| + { kHardwareRevisionProperty, PROPERTY_INDEX_HARDWARE_REVISION },
|
| + { kHomeProviderProperty, PROPERTY_INDEX_HOME_PROVIDER },
|
| + { kHostProperty, PROPERTY_INDEX_HOST },
|
| + { kIdentityProperty, PROPERTY_INDEX_IDENTITY },
|
| + { kImeiProperty, PROPERTY_INDEX_IMEI },
|
| + { kImsiProperty, PROPERTY_INDEX_IMSI },
|
| + { kIsActiveProperty, PROPERTY_INDEX_IS_ACTIVE },
|
| + { kL2tpIpsecCaCertNssProperty, PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS },
|
| + { kL2tpIpsecClientCertIdProperty, PROPERTY_INDEX_L2TPIPSEC_CLIENT_CERT_ID },
|
| + { kL2tpIpsecClientCertSlotProp, PROPERTY_INDEX_L2TPIPSEC_CLIENT_CERT_SLOT },
|
| + { kL2tpIpsecPinProperty, PROPERTY_INDEX_L2TPIPSEC_PIN },
|
| + { kL2tpIpsecPskProperty, PROPERTY_INDEX_L2TPIPSEC_PSK },
|
| + { kL2tpIpsecPasswordProperty, PROPERTY_INDEX_L2TPIPSEC_PASSWORD },
|
| + { kL2tpIpsecUserProperty, PROPERTY_INDEX_L2TPIPSEC_USER },
|
| + { kManufacturerProperty, PROPERTY_INDEX_MANUFACTURER },
|
| + { kMdnProperty, PROPERTY_INDEX_MDN },
|
| + { kMeidProperty, PROPERTY_INDEX_MEID },
|
| + { kMinProperty, PROPERTY_INDEX_MIN },
|
| + { kModeProperty, PROPERTY_INDEX_MODE },
|
| + { kModelIdProperty, PROPERTY_INDEX_MODEL_ID },
|
| + { kNameProperty, PROPERTY_INDEX_NAME },
|
| + { kNetworkTechnologyProperty, PROPERTY_INDEX_NETWORK_TECHNOLOGY },
|
| + { kNetworksProperty, PROPERTY_INDEX_NETWORKS },
|
| + { kOfflineModeProperty, PROPERTY_INDEX_OFFLINE_MODE },
|
| + { kOperatorCodeProperty, PROPERTY_INDEX_OPERATOR_CODE },
|
| + { kOperatorNameProperty, PROPERTY_INDEX_OPERATOR_NAME },
|
| + { kPrlVersionProperty, PROPERTY_INDEX_PRL_VERSION },
|
| + { kPassphraseProperty, PROPERTY_INDEX_PASSPHRASE },
|
| + { kPassphraseRequiredProperty, PROPERTY_INDEX_PASSPHRASE_REQUIRED },
|
| + { kPaymentUrlProperty, PROPERTY_INDEX_PAYMENT_URL },
|
| + { kPortalUrlProperty, PROPERTY_INDEX_PORTAL_URL },
|
| + { kPoweredProperty, PROPERTY_INDEX_POWERED },
|
| + { kPriorityProperty, PROPERTY_INDEX_PRIORITY },
|
| + { kProfileProperty, PROPERTY_INDEX_PROFILE },
|
| + { kProfilesProperty, PROPERTY_INDEX_PROFILES },
|
| + { kProviderProperty, PROPERTY_INDEX_PROVIDER },
|
| + { kProxyConfigProperty, PROPERTY_INDEX_PROXY_CONFIG },
|
| + { kRoamingStateProperty, PROPERTY_INDEX_ROAMING_STATE },
|
| + { kSimLockStatusProperty, PROPERTY_INDEX_SIM_LOCK },
|
| + { kSaveCredentialsProperty, PROPERTY_INDEX_SAVE_CREDENTIALS },
|
| + { kScanningProperty, PROPERTY_INDEX_SCANNING },
|
| + { kSecurityProperty, PROPERTY_INDEX_SECURITY },
|
| + { kSelectedNetworkProperty, PROPERTY_INDEX_SELECTED_NETWORK },
|
| + { kServiceWatchListProperty, PROPERTY_INDEX_SERVICE_WATCH_LIST },
|
| + { kServicesProperty, PROPERTY_INDEX_SERVICES },
|
| + { kServingOperatorProperty, PROPERTY_INDEX_SERVING_OPERATOR },
|
| + { kSignalStrengthProperty, PROPERTY_INDEX_SIGNAL_STRENGTH },
|
| + { kStateProperty, PROPERTY_INDEX_STATE },
|
| + { kSupportNetworkScanProperty, PROPERTY_INDEX_SUPPORT_NETWORK_SCAN },
|
| + { kTechnologyFamilyProperty, PROPERTY_INDEX_TECHNOLOGY_FAMILY },
|
| + { kTypeProperty, PROPERTY_INDEX_TYPE },
|
| + { kUsageUrlProperty, PROPERTY_INDEX_USAGE_URL },
|
| + { kWifiAuthMode, PROPERTY_INDEX_WIFI_AUTH_MODE },
|
| + { kWifiFrequency, PROPERTY_INDEX_WIFI_FREQUENCY },
|
| + { kWifiHexSsid, PROPERTY_INDEX_WIFI_HEX_SSID },
|
| + { kWifiHiddenSsid, PROPERTY_INDEX_WIFI_HIDDEN_SSID },
|
| + { kWifiPhyMode, PROPERTY_INDEX_WIFI_PHY_MODE },
|
| +};
|
| +
|
| +// Serve the singleton mapper instance.
|
| +const EnumMapper<PropertyIndex>* get_native_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[] = {
|
| + { kTypeEthernet, TYPE_ETHERNET },
|
| + { kTypeWifi, TYPE_WIFI },
|
| + { kTypeWimax, TYPE_WIMAX },
|
| + { kTypeBluetooth, TYPE_BLUETOOTH },
|
| + { kTypeCellular, TYPE_CELLULAR },
|
| + { kTypeVpn, TYPE_VPN },
|
| + };
|
| + static EnumMapper<ConnectionType> parser(
|
| + table, arraysize(table), TYPE_UNKNOWN);
|
| + return parser.Get(type);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// -------------------- NativeNetworkDeviceParser --------------------
|
| +
|
| +NativeNetworkDeviceParser::NativeNetworkDeviceParser()
|
| + : NetworkDeviceParser(get_native_mapper()) {
|
| +}
|
| +
|
| +NativeNetworkDeviceParser::~NativeNetworkDeviceParser() {
|
| +}
|
| +
|
| +bool NativeNetworkDeviceParser::ParseValue(
|
| + PropertyIndex index, const Value& value, NetworkDevice* device) {
|
| + switch (index) {
|
| + case PROPERTY_INDEX_TYPE: {
|
| + std::string type_string;
|
| + if (value.GetAsString(&type_string)) {
|
| + device->set_type(ParseType(type_string));
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_NAME: {
|
| + std::string name;
|
| + if (!value.GetAsString(&name))
|
| + return false;
|
| + device->set_name(name);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_GUID: {
|
| + std::string unique_id;
|
| + if (!value.GetAsString(&unique_id))
|
| + return false;
|
| + device->set_unique_id(unique_id);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_CARRIER: {
|
| + std::string carrier;
|
| + if (!value.GetAsString(&carrier))
|
| + return false;
|
| + device->set_carrier(carrier);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_SCANNING: {
|
| + bool scanning;
|
| + if (!value.GetAsBoolean(&scanning))
|
| + return false;
|
| + device->set_scanning(scanning);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_CELLULAR_ALLOW_ROAMING: {
|
| + bool data_roaming_allowed;
|
| + if (!value.GetAsBoolean(&data_roaming_allowed))
|
| + return false;
|
| + device->set_data_roaming_allowed(data_roaming_allowed);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_CELLULAR_APN_LIST:
|
| + if (value.IsType(Value::TYPE_LIST)) {
|
| + CellularApnList provider_apn_list;
|
| + if (!ParseApnList(static_cast<const ListValue&>(value),
|
| + &provider_apn_list))
|
| + return false;
|
| + device->set_provider_apn_list(provider_apn_list);
|
| + return true;
|
| + }
|
| + break;
|
| + case PROPERTY_INDEX_NETWORKS:
|
| + if (value.IsType(Value::TYPE_LIST)) {
|
| + // Ignored.
|
| + return true;
|
| + }
|
| + break;
|
| + case PROPERTY_INDEX_FOUND_NETWORKS:
|
| + if (value.IsType(Value::TYPE_LIST)) {
|
| + CellularNetworkList found_cellular_networks;
|
| + if (!ParseFoundNetworksFromList(
|
| + static_cast<const ListValue&>(value),
|
| + &found_cellular_networks))
|
| + return false;
|
| + device->set_found_cellular_networks(found_cellular_networks);
|
| + return true;
|
| + }
|
| + break;
|
| + case PROPERTY_INDEX_HOME_PROVIDER: {
|
| + if (value.IsType(Value::TYPE_DICTIONARY)) {
|
| + const DictionaryValue& dict =
|
| + static_cast<const DictionaryValue&>(value);
|
| + std::string home_provider_code;
|
| + std::string home_provider_country;
|
| + std::string home_provider_name;
|
| + dict.GetStringWithoutPathExpansion(kOperatorCodeKey,
|
| + &home_provider_code);
|
| + dict.GetStringWithoutPathExpansion(kOperatorCountryKey,
|
| + &home_provider_country);
|
| + dict.GetStringWithoutPathExpansion(kOperatorNameKey,
|
| + &home_provider_name);
|
| + device->set_home_provider_code(home_provider_code);
|
| + device->set_home_provider_country(home_provider_country);
|
| + device->set_home_provider_name(home_provider_name);
|
| + if (!device->home_provider_name().empty() &&
|
| + !device->home_provider_country().empty()) {
|
| + device->set_home_provider_id(base::StringPrintf(
|
| + kCarrierIdFormat,
|
| + device->home_provider_name().c_str(),
|
| + device->home_provider_country().c_str()));
|
| + } else {
|
| + device->set_home_provider_id(home_provider_code);
|
| + LOG(WARNING) << "Carrier ID not defined, using code instead: "
|
| + << device->home_provider_id();
|
| + }
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_MEID:
|
| + case PROPERTY_INDEX_IMEI:
|
| + case PROPERTY_INDEX_IMSI:
|
| + case PROPERTY_INDEX_ESN:
|
| + case PROPERTY_INDEX_MDN:
|
| + case PROPERTY_INDEX_MIN:
|
| + case PROPERTY_INDEX_MODEL_ID:
|
| + case PROPERTY_INDEX_MANUFACTURER:
|
| + case PROPERTY_INDEX_FIRMWARE_REVISION:
|
| + case PROPERTY_INDEX_HARDWARE_REVISION:
|
| + case PROPERTY_INDEX_SELECTED_NETWORK: {
|
| + std::string item;
|
| + if (!value.GetAsString(&item))
|
| + return false;
|
| + switch (index) {
|
| + case PROPERTY_INDEX_MEID:
|
| + device->set_meid(item);
|
| + break;
|
| + case PROPERTY_INDEX_IMEI:
|
| + device->set_imei(item);
|
| + break;
|
| + case PROPERTY_INDEX_IMSI:
|
| + device->set_imsi(item);
|
| + break;
|
| + case PROPERTY_INDEX_ESN:
|
| + device->set_esn(item);
|
| + break;
|
| + case PROPERTY_INDEX_MDN:
|
| + device->set_mdn(item);
|
| + break;
|
| + case PROPERTY_INDEX_MIN:
|
| + device->set_min(item);
|
| + break;
|
| + case PROPERTY_INDEX_MODEL_ID:
|
| + device->set_model_id(item);
|
| + break;
|
| + case PROPERTY_INDEX_MANUFACTURER:
|
| + device->set_manufacturer(item);
|
| + break;
|
| + case PROPERTY_INDEX_FIRMWARE_REVISION:
|
| + device->set_firmware_revision(item);
|
| + break;
|
| + case PROPERTY_INDEX_HARDWARE_REVISION:
|
| + device->set_hardware_revision(item);
|
| + break;
|
| + case PROPERTY_INDEX_SELECTED_NETWORK:
|
| + device->set_selected_cellular_network(item);
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_SIM_LOCK:
|
| + if (value.IsType(Value::TYPE_DICTIONARY)) {
|
| + SimLockState sim_lock_state;
|
| + int sim_retries_left;
|
| + if (!ParseSimLockStateFromDictionary(
|
| + static_cast<const DictionaryValue&>(value),
|
| + &sim_lock_state,
|
| + &sim_retries_left))
|
| + return false;
|
| + device->set_sim_lock_state(sim_lock_state);
|
| + device->set_sim_retries_left(sim_retries_left);
|
| + // Initialize PinRequired value only once.
|
| + // See SimPinRequire enum comments.
|
| + if (device->sim_pin_required() == SIM_PIN_REQUIRE_UNKNOWN) {
|
| + if (device->sim_lock_state() == SIM_UNLOCKED) {
|
| + device->set_sim_pin_required(SIM_PIN_NOT_REQUIRED);
|
| + } else if (device->sim_lock_state() == SIM_LOCKED_PIN ||
|
| + device->sim_lock_state() == SIM_LOCKED_PUK) {
|
| + device->set_sim_pin_required(SIM_PIN_REQUIRED);
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| + break;
|
| + case PROPERTY_INDEX_POWERED:
|
| + // we don't care about the value, just the fact that it changed
|
| + return true;
|
| + case PROPERTY_INDEX_PRL_VERSION: {
|
| + int prl_version;
|
| + if (!value.GetAsInteger(&prl_version))
|
| + return false;
|
| + device->set_prl_version(prl_version);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_SUPPORT_NETWORK_SCAN: {
|
| + bool support_network_scan;
|
| + if (!value.GetAsBoolean(&support_network_scan))
|
| + return false;
|
| + device->set_support_network_scan(support_network_scan);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_TECHNOLOGY_FAMILY: {
|
| + std::string technology_family_string;
|
| + if (value.GetAsString(&technology_family_string)) {
|
| + device->set_technology_family(
|
| + ParseTechnologyFamily(technology_family_string));
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + default:
|
| + break;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +ConnectionType NativeNetworkDeviceParser::ParseType(const std::string& type) {
|
| + return ParseNetworkType(type);
|
| +}
|
| +
|
| +bool NativeNetworkDeviceParser::ParseApnList(const ListValue& list,
|
| + CellularApnList* apn_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)) {
|
| + apn_list->resize(apn_list->size() + 1);
|
| + const DictionaryValue* dict = static_cast<const DictionaryValue*>(*it);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kApnProperty, &apn_list->back().apn);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kApnNetworkIdProperty, &apn_list->back().network_id);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kApnUsernameProperty, &apn_list->back().username);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kApnPasswordProperty, &apn_list->back().password);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kApnNameProperty, &apn_list->back().name);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kApnLocalizedNameProperty, &apn_list->back().localized_name);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kApnLanguageProperty, &apn_list->back().language);
|
| + } else {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool NativeNetworkDeviceParser::ParseFoundNetworksFromList(
|
| + const ListValue& list,
|
| + CellularNetworkList* found_networks) {
|
| + 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)) {
|
| + found_networks->resize(found_networks->size() + 1);
|
| + const DictionaryValue* dict = static_cast<const DictionaryValue*>(*it);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kStatusProperty, &found_networks->back().status);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kNetworkIdProperty, &found_networks->back().network_id);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kShortNameProperty, &found_networks->back().short_name);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kLongNameProperty, &found_networks->back().long_name);
|
| + dict->GetStringWithoutPathExpansion(
|
| + kTechnologyProperty, &found_networks->back().technology);
|
| + } else {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +SimLockState NativeNetworkDeviceParser::ParseSimLockState(
|
| + const std::string& state) {
|
| + static EnumMapper<SimLockState>::Pair table[] = {
|
| + { "", SIM_UNLOCKED },
|
| + { kSimLockPin, SIM_LOCKED_PIN },
|
| + { kSimLockPuk, SIM_LOCKED_PUK },
|
| + };
|
| + static EnumMapper<SimLockState> parser(
|
| + table, arraysize(table), SIM_UNKNOWN);
|
| + SimLockState parsed_state = parser.Get(state);
|
| + DCHECK(parsed_state != SIM_UNKNOWN) << "Unknown SIMLock state encountered";
|
| + return parsed_state;
|
| +}
|
| +
|
| +bool NativeNetworkDeviceParser::ParseSimLockStateFromDictionary(
|
| + const DictionaryValue& info, SimLockState* out_state, int* out_retries) {
|
| + std::string state_string;
|
| + if (!info.GetString(kSimLockTypeProperty, &state_string) ||
|
| + !info.GetInteger(kSimLockRetriesLeftProperty, out_retries)) {
|
| + LOG(ERROR) << "Error parsing SIMLock state";
|
| + return false;
|
| + }
|
| + *out_state = ParseSimLockState(state_string);
|
| + return true;
|
| +}
|
| +
|
| +TechnologyFamily NativeNetworkDeviceParser::ParseTechnologyFamily(
|
| + const std::string& technology_family) {
|
| + static EnumMapper<TechnologyFamily>::Pair table[] = {
|
| + { kTechnologyFamilyCdma, TECHNOLOGY_FAMILY_CDMA },
|
| + { kTechnologyFamilyGsm, TECHNOLOGY_FAMILY_GSM },
|
| + };
|
| + static EnumMapper<TechnologyFamily> parser(
|
| + table, arraysize(table), TECHNOLOGY_FAMILY_UNKNOWN);
|
| + return parser.Get(technology_family);
|
| +}
|
| +
|
| +// -------------------- NativeNetworkParser --------------------
|
| +
|
| +NativeNetworkParser::NativeNetworkParser()
|
| + : NetworkParser(get_native_mapper()) {
|
| +}
|
| +
|
| +NativeNetworkParser::~NativeNetworkParser() {
|
| +}
|
| +
|
| +// static
|
| +const EnumMapper<PropertyIndex>* NativeNetworkParser::property_mapper() {
|
| + return get_native_mapper();
|
| +
|
| +}
|
| +
|
| +const ConnectionType NativeNetworkParser::ParseConnectionType(
|
| + const std::string& connection_type) {
|
| + return ParseNetworkType(connection_type);
|
| +}
|
| +
|
| +bool NativeNetworkParser::ParseValue(PropertyIndex index,
|
| + const 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))
|
| + return false;
|
| + 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;
|
| + if (!value.GetAsString(&profile_path))
|
| + return false;
|
| + 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->set_mode(ParseMode(mode_string));
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_ERROR: {
|
| + std::string error_string;
|
| + if (value.GetAsString(&error_string)) {
|
| + network->set_error(ParseError(error_string));
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_CONNECTABLE: {
|
| + bool connectable;
|
| + if (!value.GetAsBoolean(&connectable))
|
| + return false;
|
| + network->set_connectable(connectable);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_IS_ACTIVE: {
|
| + bool is_active;
|
| + if (!value.GetAsBoolean(&is_active))
|
| + return false;
|
| + network->set_is_active(is_active);
|
| + return true;
|
| + }
|
| + 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))
|
| + return false;
|
| + network->set_save_credentials(save_credentials);
|
| + return true;
|
| + }
|
| + default:
|
| + break;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +ConnectionType NativeNetworkParser::ParseType(const std::string& type) {
|
| + return ParseNetworkType(type);
|
| +}
|
| +
|
| +ConnectionType NativeNetworkParser::ParseTypeFromDictionary(
|
| + const DictionaryValue& info) {
|
| + std::string type_string;
|
| + info.GetString(kTypeProperty, &type_string);
|
| + return ParseType(type_string);
|
| +}
|
| +
|
| +ConnectionMode NativeNetworkParser::ParseMode(const std::string& mode) {
|
| + static EnumMapper<ConnectionMode>::Pair table[] = {
|
| + { kModeManaged, MODE_MANAGED },
|
| + { kModeAdhoc, MODE_ADHOC },
|
| + };
|
| + static EnumMapper<ConnectionMode> parser(
|
| + table, arraysize(table), MODE_UNKNOWN);
|
| + return parser.Get(mode);
|
| +}
|
| +
|
| +ConnectionState NativeNetworkParser::ParseState(const std::string& state) {
|
| + static EnumMapper<ConnectionState>::Pair table[] = {
|
| + { kStateIdle, STATE_IDLE },
|
| + { kStateCarrier, STATE_CARRIER },
|
| + { kStateAssociation, STATE_ASSOCIATION },
|
| + { kStateConfiguration, STATE_CONFIGURATION },
|
| + { kStateReady, STATE_READY },
|
| + { kStateDisconnect, STATE_DISCONNECT },
|
| + { kStateFailure, STATE_FAILURE },
|
| + { kStateActivationFailure, STATE_ACTIVATION_FAILURE },
|
| + { kStatePortal, STATE_PORTAL },
|
| + { kStateOnline, STATE_ONLINE },
|
| + };
|
| + static EnumMapper<ConnectionState> parser(
|
| + table, arraysize(table), STATE_UNKNOWN);
|
| + return parser.Get(state);
|
| +}
|
| +
|
| +ConnectionError NativeNetworkParser::ParseError(const std::string& error) {
|
| + static EnumMapper<ConnectionError>::Pair table[] = {
|
| + { kErrorOutOfRange, ERROR_OUT_OF_RANGE },
|
| + { kErrorPinMissing, ERROR_PIN_MISSING },
|
| + { kErrorDhcpFailed, ERROR_DHCP_FAILED },
|
| + { kErrorConnectFailed, ERROR_CONNECT_FAILED },
|
| + { kErrorBadPassphrase, ERROR_BAD_PASSPHRASE },
|
| + { kErrorBadWepKey, ERROR_BAD_WEPKEY },
|
| + { kErrorActivationFailed, ERROR_ACTIVATION_FAILED },
|
| + { kErrorNeedEvdo, ERROR_NEED_EVDO },
|
| + { kErrorNeedHomeNetwork, ERROR_NEED_HOME_NETWORK },
|
| + { kErrorOtaspFailed, ERROR_OTASP_FAILED },
|
| + { kErrorAaaFailed, ERROR_AAA_FAILED },
|
| + { kErrorInternal, ERROR_INTERNAL },
|
| + { kErrorDnsLookupFailed, ERROR_DNS_LOOKUP_FAILED },
|
| + { kErrorHttpGetFailed, ERROR_HTTP_GET_FAILED },
|
| + };
|
| + static EnumMapper<ConnectionError> parser(
|
| + table, arraysize(table), ERROR_NO_ERROR);
|
| + return parser.Get(error);
|
| +}
|
| +
|
| +// -------------------- NativeEthernetNetworkParser --------------------
|
| +
|
| +NativeEthernetNetworkParser::NativeEthernetNetworkParser() {}
|
| +NativeEthernetNetworkParser::~NativeEthernetNetworkParser() {}
|
| +
|
| +// -------------------- NativeWirelessNetworkParser --------------------
|
| +
|
| +NativeWirelessNetworkParser::NativeWirelessNetworkParser() {}
|
| +NativeWirelessNetworkParser::~NativeWirelessNetworkParser() {}
|
| +
|
| +bool NativeWirelessNetworkParser::ParseValue(PropertyIndex index,
|
| + const Value& value,
|
| + Network* network) {
|
| + DCHECK_NE(TYPE_ETHERNET, network->type());
|
| + DCHECK_NE(TYPE_VPN, network->type());
|
| + WirelessNetwork* wireless_network = static_cast<WirelessNetwork*>(network);
|
| + switch (index) {
|
| + case PROPERTY_INDEX_SIGNAL_STRENGTH: {
|
| + int strength;
|
| + if (!value.GetAsInteger(&strength))
|
| + return false;
|
| + wireless_network->set_strength(strength);
|
| + return true;
|
| + }
|
| + default:
|
| + return NativeNetworkParser::ParseValue(index, value, network);
|
| + break;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +// -------------------- NativeCellularNetworkParser --------------------
|
| +
|
| +NativeCellularNetworkParser::NativeCellularNetworkParser() {}
|
| +NativeCellularNetworkParser::~NativeCellularNetworkParser() {}
|
| +
|
| +bool NativeCellularNetworkParser::ParseValue(PropertyIndex index,
|
| + const Value& value,
|
| + Network* network) {
|
| + DCHECK_EQ(TYPE_CELLULAR, network->type());
|
| + CellularNetwork* cellular_network = static_cast<CellularNetwork*>(network);
|
| + switch (index) {
|
| + case PROPERTY_INDEX_ACTIVATION_STATE: {
|
| + std::string activation_state_string;
|
| + if (value.GetAsString(&activation_state_string)) {
|
| + ActivationState prev_state = cellular_network->activation_state();
|
| + cellular_network->set_activation_state(
|
| + ParseActivationState(activation_state_string));
|
| + if (cellular_network->activation_state() != prev_state)
|
| + cellular_network->RefreshDataPlansIfNeeded();
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_CELLULAR_APN: {
|
| + if (value.IsType(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)) {
|
| + cellular_network->set_last_good_apn(
|
| + static_cast<const DictionaryValue&>(value));
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_NETWORK_TECHNOLOGY: {
|
| + std::string network_technology_string;
|
| + if (value.GetAsString(&network_technology_string)) {
|
| + cellular_network->set_network_technology(
|
| + ParseNetworkTechnology(network_technology_string));
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_ROAMING_STATE: {
|
| + std::string roaming_state_string;
|
| + if (value.GetAsString(&roaming_state_string)) {
|
| + cellular_network->set_roaming_state(
|
| + ParseRoamingState(roaming_state_string));
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_OPERATOR_NAME: {
|
| + std::string value_str;
|
| + if (!value.GetAsString(&value_str))
|
| + break;
|
| + cellular_network->set_operator_name(value_str);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_OPERATOR_CODE: {
|
| + std::string value_str;
|
| + if (!value.GetAsString(&value_str))
|
| + break;
|
| + cellular_network->set_operator_code(value_str);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_SERVING_OPERATOR: {
|
| + if (value.IsType(Value::TYPE_DICTIONARY)) {
|
| + const DictionaryValue& dict =
|
| + static_cast<const DictionaryValue&>(value);
|
| + std::string value_str;
|
| + dict.GetStringWithoutPathExpansion(kOperatorNameKey, &value_str);
|
| + cellular_network->set_operator_name(value_str);
|
| + value_str.clear();
|
| + dict.GetStringWithoutPathExpansion(kOperatorCodeKey, &value_str);
|
| + cellular_network->set_operator_code(value_str);
|
| + value_str.clear();
|
| + dict.GetStringWithoutPathExpansion(kOperatorCountryKey, &value_str);
|
| + cellular_network->set_operator_country(value_str);
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_PAYMENT_URL: {
|
| + std::string value_str;
|
| + if (!value.GetAsString(&value_str))
|
| + break;
|
| + cellular_network->set_payment_url(value_str);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_USAGE_URL: {
|
| + std::string value_str;
|
| + if (!value.GetAsString(&value_str))
|
| + break;
|
| + cellular_network->set_usage_url(value_str);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_STATE: {
|
| + // Save previous state before calling WirelessNetwork::ParseValue.
|
| + ConnectionState prev_state = cellular_network->state();
|
| + if (NativeWirelessNetworkParser::ParseValue(index, value, network)) {
|
| + if (cellular_network->state() != prev_state)
|
| + cellular_network->RefreshDataPlansIfNeeded();
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + default:
|
| + return NativeWirelessNetworkParser::ParseValue(index, value, network);
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +ActivationState NativeCellularNetworkParser::ParseActivationState(
|
| + const std::string& state) {
|
| + static EnumMapper<ActivationState>::Pair table[] = {
|
| + { kActivationStateActivated, ACTIVATION_STATE_ACTIVATED },
|
| + { kActivationStateActivating, ACTIVATION_STATE_ACTIVATING },
|
| + { kActivationStateNotActivated, ACTIVATION_STATE_NOT_ACTIVATED },
|
| + { kActivationStatePartiallyActivated, ACTIVATION_STATE_PARTIALLY_ACTIVATED},
|
| + { kActivationStateUnknown, ACTIVATION_STATE_UNKNOWN},
|
| + };
|
| + static EnumMapper<ActivationState> parser(
|
| + table, arraysize(table), ACTIVATION_STATE_UNKNOWN);
|
| + return parser.Get(state);
|
| +}
|
| +
|
| +NetworkTechnology NativeCellularNetworkParser::ParseNetworkTechnology(
|
| + const std::string& technology) {
|
| + static EnumMapper<NetworkTechnology>::Pair table[] = {
|
| + { kNetworkTechnology1Xrtt, NETWORK_TECHNOLOGY_1XRTT },
|
| + { kNetworkTechnologyEvdo, NETWORK_TECHNOLOGY_EVDO },
|
| + { kNetworkTechnologyGprs, NETWORK_TECHNOLOGY_GPRS },
|
| + { kNetworkTechnologyEdge, NETWORK_TECHNOLOGY_EDGE },
|
| + { kNetworkTechnologyUmts, NETWORK_TECHNOLOGY_UMTS },
|
| + { kNetworkTechnologyHspa, NETWORK_TECHNOLOGY_HSPA },
|
| + { kNetworkTechnologyHspaPlus, NETWORK_TECHNOLOGY_HSPA_PLUS },
|
| + { kNetworkTechnologyLte, NETWORK_TECHNOLOGY_LTE },
|
| + { kNetworkTechnologyLteAdvanced, NETWORK_TECHNOLOGY_LTE_ADVANCED },
|
| + { kNetworkTechnologyGsm, NETWORK_TECHNOLOGY_GSM },
|
| + };
|
| + static EnumMapper<NetworkTechnology> parser(
|
| + table, arraysize(table), NETWORK_TECHNOLOGY_UNKNOWN);
|
| + return parser.Get(technology);
|
| +}
|
| +
|
| +NetworkRoamingState NativeCellularNetworkParser::ParseRoamingState(
|
| + const std::string& roaming_state) {
|
| + static EnumMapper<NetworkRoamingState>::Pair table[] = {
|
| + { kRoamingStateHome, ROAMING_STATE_HOME },
|
| + { kRoamingStateRoaming, ROAMING_STATE_ROAMING },
|
| + { kRoamingStateUnknown, ROAMING_STATE_UNKNOWN },
|
| + };
|
| + static EnumMapper<NetworkRoamingState> parser(
|
| + table, arraysize(table), ROAMING_STATE_UNKNOWN);
|
| + return parser.Get(roaming_state);
|
| +}
|
| +
|
| +// -------------------- NativeWifiNetworkParser --------------------
|
| +
|
| +NativeWifiNetworkParser::NativeWifiNetworkParser() {}
|
| +NativeWifiNetworkParser::~NativeWifiNetworkParser() {}
|
| +
|
| +bool NativeWifiNetworkParser::ParseValue(PropertyIndex index,
|
| + const Value& value,
|
| + Network* network) {
|
| + DCHECK_EQ(TYPE_WIFI, network->type());
|
| + WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network);
|
| + switch (index) {
|
| + case PROPERTY_INDEX_WIFI_HEX_SSID: {
|
| + std::string ssid_hex;
|
| + if (!value.GetAsString(&ssid_hex))
|
| + return false;
|
| +
|
| + wifi_network->SetHexSsid(ssid_hex);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_WIFI_AUTH_MODE:
|
| + case PROPERTY_INDEX_WIFI_PHY_MODE:
|
| + case PROPERTY_INDEX_WIFI_HIDDEN_SSID:
|
| + case PROPERTY_INDEX_WIFI_FREQUENCY:
|
| + // These properties are currently not used in the UI.
|
| + return true;
|
| + case PROPERTY_INDEX_NAME: {
|
| + // Does not change network name when it was already set by WiFi.HexSSID.
|
| + if (!wifi_network->name().empty())
|
| + return true;
|
| + else
|
| + return NativeWirelessNetworkParser::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;
|
| + // Only store the passphrase if we are the owner.
|
| + // TODO(stevenjb): Remove this when chromium-os:12948 is resolved.
|
| + if (chromeos::UserManager::Get()->current_user_is_owner())
|
| + wifi_network->set_passphrase(passphrase);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_PASSPHRASE_REQUIRED: {
|
| + bool passphrase_required;
|
| + value.GetAsBoolean(&passphrase_required);
|
| + if (!value.GetAsBoolean(&passphrase_required))
|
| + break;
|
| + wifi_network->set_passphrase_required(passphrase_required);
|
| + 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_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;
|
| + }
|
| + case PROPERTY_INDEX_EAP_CLIENT_CERT:
|
| + case PROPERTY_INDEX_EAP_CLIENT_CERT_NSS:
|
| + case PROPERTY_INDEX_EAP_PRIVATE_KEY:
|
| + case PROPERTY_INDEX_EAP_PRIVATE_KEY_PASSWORD:
|
| + case PROPERTY_INDEX_EAP_KEY_ID:
|
| + case PROPERTY_INDEX_EAP_CA_CERT:
|
| + case PROPERTY_INDEX_EAP_CA_CERT_ID:
|
| + case PROPERTY_INDEX_EAP_PIN:
|
| + case PROPERTY_INDEX_EAP_KEY_MGMT:
|
| + // These properties are currently not used in the UI.
|
| + return true;
|
| + default:
|
| + return NativeWirelessNetworkParser::ParseValue(index, value, network);
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +ConnectionSecurity NativeWifiNetworkParser::ParseSecurity(
|
| + const std::string& security) {
|
| + static EnumMapper<ConnectionSecurity>::Pair table[] = {
|
| + { kSecurityNone, SECURITY_NONE },
|
| + { kSecurityWep, SECURITY_WEP },
|
| + { kSecurityWpa, SECURITY_WPA },
|
| + { kSecurityRsn, SECURITY_RSN },
|
| + { kSecurityPsk, SECURITY_PSK },
|
| + { kSecurity8021x, SECURITY_8021X },
|
| + };
|
| + static EnumMapper<ConnectionSecurity> parser(
|
| + table, arraysize(table), SECURITY_UNKNOWN);
|
| + return parser.Get(security);
|
| +}
|
| +
|
| +EAPMethod NativeWifiNetworkParser::ParseEAPMethod(const std::string& method) {
|
| + static EnumMapper<EAPMethod>::Pair table[] = {
|
| + { kEapMethodPeap, EAP_METHOD_PEAP },
|
| + { kEapMethodTls, EAP_METHOD_TLS },
|
| + { kEapMethodTtls, EAP_METHOD_TTLS },
|
| + { kEapMethodLeap, EAP_METHOD_LEAP },
|
| + };
|
| + static EnumMapper<EAPMethod> parser(
|
| + table, arraysize(table), EAP_METHOD_UNKNOWN);
|
| + return parser.Get(method);
|
| +}
|
| +
|
| +EAPPhase2Auth NativeWifiNetworkParser::ParseEAPPhase2Auth(
|
| + const std::string& auth) {
|
| + static EnumMapper<EAPPhase2Auth>::Pair table[] = {
|
| + { kEapPhase2AuthPeapMd5, EAP_PHASE_2_AUTH_MD5 },
|
| + { kEapPhase2AuthPeapMschap2, EAP_PHASE_2_AUTH_MSCHAPV2 },
|
| + { kEapPhase2AuthTtlsMd5, EAP_PHASE_2_AUTH_MD5 },
|
| + { kEapPhase2AuthTtlsMschapV2, EAP_PHASE_2_AUTH_MSCHAPV2 },
|
| + { kEapPhase2AuthTtlsMschap, EAP_PHASE_2_AUTH_MSCHAP },
|
| + { kEapPhase2AuthTtlsPap, EAP_PHASE_2_AUTH_PAP },
|
| + { kEapPhase2AuthTtlsChap, EAP_PHASE_2_AUTH_CHAP },
|
| + };
|
| + static EnumMapper<EAPPhase2Auth> parser(
|
| + table, arraysize(table), EAP_PHASE_2_AUTH_AUTO);
|
| + return parser.Get(auth);
|
| +}
|
| +
|
| +// -------------------- NativeVirtualNetworkParser --------------------
|
| +
|
| +
|
| +NativeVirtualNetworkParser::NativeVirtualNetworkParser() {}
|
| +NativeVirtualNetworkParser::~NativeVirtualNetworkParser() {}
|
| +
|
| +bool NativeVirtualNetworkParser::UpdateNetworkFromInfo(
|
| + const DictionaryValue& info,
|
| + Network* network) {
|
| + DCHECK_EQ(TYPE_VPN, network->type());
|
| + VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network);
|
| + if (!NativeNetworkParser::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 NativeVirtualNetworkParser::ParseValue(PropertyIndex index,
|
| + const 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;
|
| + 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 NativeNetworkParser::ParseValue(index, value, network);
|
| + break;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +bool NativeVirtualNetworkParser::ParseProviderValue(PropertyIndex index,
|
| + const 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;
|
| + }
|
| + default:
|
| + break;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +ProviderType NativeVirtualNetworkParser::ParseProviderType(
|
| + const std::string& type) {
|
| + static EnumMapper<ProviderType>::Pair table[] = {
|
| + { kProviderL2tpIpsec, PROVIDER_TYPE_L2TP_IPSEC_PSK },
|
| + { kProviderOpenVpn, PROVIDER_TYPE_OPEN_VPN },
|
| + };
|
| + static EnumMapper<ProviderType> parser(
|
| + table, arraysize(table), PROVIDER_TYPE_MAX);
|
| + return parser.Get(type);
|
| +}
|
| +
|
| +} // namespace chromeos
|
|
|