Index: chrome/browser/chromeos/cros/onc_network_parser.cc |
diff --git a/chrome/browser/chromeos/cros/onc_network_parser.cc b/chrome/browser/chromeos/cros/onc_network_parser.cc |
deleted file mode 100644 |
index d1245a97324757416f771fe08e528239d95a49b1..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/cros/onc_network_parser.cc |
+++ /dev/null |
@@ -1,1515 +0,0 @@ |
-// Copyright (c) 2012 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 <keyhi.h> |
-#include <pk11pub.h> |
- |
-#include "base/base64.h" |
-#include "base/json/json_string_value_serializer.h" |
-#include "base/json/json_writer.h" // for debug output only. |
-#include "base/stringprintf.h" |
-#include "base/values.h" |
-#include "chrome/browser/chromeos/cros/certificate_pattern.h" |
-#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/network_library.h" |
-#include "chrome/browser/chromeos/login/user_manager.h" |
-#include "chrome/browser/chromeos/proxy_config_service_impl.h" |
-#include "chrome/browser/prefs/proxy_config_dictionary.h" |
-#include "chrome/common/net/x509_certificate_model.h" |
-#include "chromeos/network/onc/onc_certificate_importer.h" |
-#include "chromeos/network/onc/onc_constants.h" |
-#include "chromeos/network/onc/onc_signature.h" |
-#include "chromeos/network/onc/onc_validator.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "crypto/encryptor.h" |
-#include "crypto/hmac.h" |
-#include "crypto/scoped_nss_types.h" |
-#include "crypto/symmetric_key.h" |
-#include "grit/generated_resources.h" |
-#include "net/base/crypto_module.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/nss_cert_database.h" |
-#include "net/base/pem_tokenizer.h" |
-#include "net/base/x509_certificate.h" |
-#include "net/proxy/proxy_bypass_rules.h" |
-#include "third_party/cros_system_api/dbus/service_constants.h" |
-#include "ui/base/l10n/l10n_util.h" |
- |
-namespace chromeos { |
- |
-// Local constants. |
-namespace { |
- |
-// The PEM block header used for DER certificates |
-const char kCertificateHeader[] = "CERTIFICATE"; |
-// This is an older PEM marker for DER certificates. |
-const char kX509CertificateHeader[] = "X509 CERTIFICATE"; |
- |
-const base::Value::Type TYPE_BOOLEAN = base::Value::TYPE_BOOLEAN; |
-const base::Value::Type TYPE_DICTIONARY = base::Value::TYPE_DICTIONARY; |
-const base::Value::Type TYPE_INTEGER = base::Value::TYPE_INTEGER; |
-const base::Value::Type TYPE_LIST = base::Value::TYPE_LIST; |
-const base::Value::Type TYPE_STRING = base::Value::TYPE_STRING; |
- |
-// Only used currently to keep NetworkParser superclass happy. |
-EnumMapper<PropertyIndex>::Pair network_configuration_table[] = { |
- { "GUID", PROPERTY_INDEX_GUID } |
-}; |
- |
-OncValueSignature network_configuration_signature[] = { |
- { onc::kGUID, PROPERTY_INDEX_GUID, TYPE_STRING }, |
- { onc::kProxySettings, PROPERTY_INDEX_ONC_PROXY_SETTINGS, TYPE_DICTIONARY }, |
- { onc::kName, PROPERTY_INDEX_NAME, TYPE_STRING }, |
- { onc::kRemove, PROPERTY_INDEX_ONC_REMOVE, TYPE_BOOLEAN }, |
- { onc::kType, PROPERTY_INDEX_TYPE, TYPE_STRING }, |
- { onc::kEthernet, PROPERTY_INDEX_ONC_ETHERNET, TYPE_DICTIONARY }, |
- { onc::kWiFi, PROPERTY_INDEX_ONC_WIFI, TYPE_DICTIONARY }, |
- { onc::kVPN, PROPERTY_INDEX_ONC_VPN, TYPE_DICTIONARY }, |
- { NULL } |
-}; |
- |
-OncValueSignature ethernet_signature[] = { |
- { onc::ethernet::kAuthentication, PROPERTY_INDEX_AUTHENTICATION, |
- TYPE_STRING }, |
- { onc::ethernet::kEAP, PROPERTY_INDEX_EAP, TYPE_DICTIONARY }, |
- { NULL } |
-}; |
- |
-OncValueSignature wifi_signature[] = { |
- { onc::wifi::kAutoConnect, PROPERTY_INDEX_AUTO_CONNECT, TYPE_BOOLEAN }, |
- { onc::wifi::kEAP, PROPERTY_INDEX_EAP, TYPE_DICTIONARY }, |
- { onc::wifi::kHiddenSSID, PROPERTY_INDEX_WIFI_HIDDEN_SSID, TYPE_BOOLEAN }, |
- { onc::wifi::kPassphrase, PROPERTY_INDEX_PASSPHRASE, TYPE_STRING }, |
- { onc::wifi::kSecurity, PROPERTY_INDEX_SECURITY, TYPE_STRING }, |
- { onc::wifi::kSSID, PROPERTY_INDEX_SSID, TYPE_STRING }, |
- { NULL } |
-}; |
- |
-OncValueSignature issuer_subject_pattern_signature[] = { |
- { onc::certificate::kCommonName, |
- PROPERTY_INDEX_ISSUER_SUBJECT_PATTERN_COMMON_NAME, TYPE_STRING }, |
- { onc::certificate::kLocality, |
- PROPERTY_INDEX_ISSUER_SUBJECT_PATTERN_LOCALITY, TYPE_STRING }, |
- { onc::certificate::kOrganization, |
- PROPERTY_INDEX_ISSUER_SUBJECT_PATTERN_ORGANIZATION, TYPE_STRING }, |
- { onc::certificate::kOrganizationalUnit, |
- PROPERTY_INDEX_ISSUER_SUBJECT_PATTERN_ORGANIZATIONAL_UNIT, |
- TYPE_STRING }, |
-}; |
- |
-OncValueSignature certificate_pattern_signature[] = { |
- { onc::certificate::kIssuerCARef, |
- PROPERTY_INDEX_ONC_CERTIFICATE_PATTERN_ISSUER_CA_REF, TYPE_LIST }, |
- { onc::certificate::kIssuer, |
- PROPERTY_INDEX_ONC_CERTIFICATE_PATTERN_ISSUER, TYPE_DICTIONARY }, |
- { onc::certificate::kSubject, |
- PROPERTY_INDEX_ONC_CERTIFICATE_PATTERN_SUBJECT, TYPE_DICTIONARY }, |
- { onc::certificate::kEnrollmentURI, |
- PROPERTY_INDEX_ONC_CERTIFICATE_PATTERN_ENROLLMENT_URI, TYPE_LIST }, |
-}; |
- |
-OncValueSignature eap_signature[] = { |
- { onc::eap::kAnonymousIdentity, PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY, |
- TYPE_STRING }, |
- { onc::eap::kClientCertPattern, PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN, |
- TYPE_DICTIONARY }, |
- { onc::eap::kClientCertRef, PROPERTY_INDEX_ONC_CLIENT_CERT_REF, TYPE_STRING }, |
- { onc::eap::kClientCertType, PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE, |
- TYPE_STRING }, |
- { onc::eap::kIdentity, PROPERTY_INDEX_EAP_IDENTITY, TYPE_STRING }, |
- { onc::eap::kInner, PROPERTY_INDEX_EAP_PHASE_2_AUTH, TYPE_STRING }, |
- { onc::eap::kOuter, PROPERTY_INDEX_EAP_METHOD, TYPE_STRING }, |
- { onc::eap::kPassword, PROPERTY_INDEX_EAP_PASSWORD, TYPE_STRING }, |
- { onc::eap::kServerCARef, PROPERTY_INDEX_EAP_CA_CERT_NSS, TYPE_STRING }, |
- { onc::eap::kUseSystemCAs, PROPERTY_INDEX_EAP_USE_SYSTEM_CAS, TYPE_BOOLEAN }, |
- { onc::eap::kSaveCredentials, PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, |
- { NULL } |
-}; |
- |
-OncValueSignature vpn_signature[] = { |
- { onc::vpn::kHost, PROPERTY_INDEX_PROVIDER_HOST, TYPE_STRING }, |
- { onc::vpn::kIPsec, PROPERTY_INDEX_ONC_IPSEC, TYPE_DICTIONARY }, |
- { onc::vpn::kL2TP, PROPERTY_INDEX_ONC_L2TP, TYPE_DICTIONARY }, |
- { onc::vpn::kOpenVPN, PROPERTY_INDEX_ONC_OPENVPN, TYPE_DICTIONARY }, |
- { onc::vpn::kType, PROPERTY_INDEX_PROVIDER_TYPE, TYPE_STRING }, |
- { NULL } |
-}; |
- |
-OncValueSignature ipsec_signature[] = { |
- { onc::vpn::kAuthenticationType, PROPERTY_INDEX_IPSEC_AUTHENTICATIONTYPE, |
- TYPE_STRING }, |
- { onc::vpn::kGroup, PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME, TYPE_STRING }, |
- { onc::vpn::kIKEVersion, PROPERTY_INDEX_IPSEC_IKEVERSION, TYPE_INTEGER }, |
- { onc::vpn::kClientCertPattern, PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN, |
- TYPE_DICTIONARY }, |
- { onc::vpn::kClientCertRef, PROPERTY_INDEX_ONC_CLIENT_CERT_REF, TYPE_STRING }, |
- { onc::vpn::kClientCertType, PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE, |
- TYPE_STRING }, |
- // Note: EAP and XAUTH not yet supported. |
- { onc::vpn::kPSK, PROPERTY_INDEX_L2TPIPSEC_PSK, TYPE_STRING }, |
- { onc::vpn::kSaveCredentials, PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, |
- { onc::vpn::kServerCARef, PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS, TYPE_STRING }, |
- { NULL } |
-}; |
- |
-OncValueSignature l2tp_signature[] = { |
- { onc::vpn::kPassword, PROPERTY_INDEX_L2TPIPSEC_PASSWORD, TYPE_STRING }, |
- { onc::vpn::kSaveCredentials, PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, |
- { onc::vpn::kUsername, PROPERTY_INDEX_L2TPIPSEC_USER, TYPE_STRING }, |
- { NULL } |
-}; |
- |
-OncValueSignature openvpn_signature[] = { |
- { onc::vpn::kAuth, PROPERTY_INDEX_OPEN_VPN_AUTH, TYPE_STRING }, |
- { onc::vpn::kAuthRetry, PROPERTY_INDEX_OPEN_VPN_AUTHRETRY, TYPE_STRING }, |
- { onc::vpn::kAuthNoCache, PROPERTY_INDEX_OPEN_VPN_AUTHNOCACHE, TYPE_BOOLEAN }, |
- { onc::vpn::kCipher, PROPERTY_INDEX_OPEN_VPN_CIPHER, TYPE_STRING }, |
- { onc::vpn::kClientCertPattern, PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN, |
- TYPE_DICTIONARY }, |
- { onc::vpn::kClientCertRef, PROPERTY_INDEX_ONC_CLIENT_CERT_REF, TYPE_STRING }, |
- { onc::vpn::kClientCertType, PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE, |
- TYPE_STRING }, |
- { onc::vpn::kCompLZO, PROPERTY_INDEX_OPEN_VPN_COMPLZO, TYPE_STRING }, |
- { onc::vpn::kCompNoAdapt, PROPERTY_INDEX_OPEN_VPN_COMPNOADAPT, TYPE_BOOLEAN }, |
- { onc::vpn::kKeyDirection, PROPERTY_INDEX_OPEN_VPN_KEYDIRECTION, |
- TYPE_STRING }, |
- { onc::vpn::kNsCertType, PROPERTY_INDEX_OPEN_VPN_NSCERTTYPE, TYPE_STRING }, |
- { onc::vpn::kPassword, PROPERTY_INDEX_OPEN_VPN_PASSWORD, TYPE_STRING }, |
- { onc::vpn::kPort, PROPERTY_INDEX_OPEN_VPN_PORT, TYPE_INTEGER }, |
- { onc::vpn::kProto, PROPERTY_INDEX_OPEN_VPN_PROTO, TYPE_STRING }, |
- { onc::vpn::kPushPeerInfo, PROPERTY_INDEX_OPEN_VPN_PUSHPEERINFO, |
- TYPE_BOOLEAN }, |
- { onc::vpn::kRemoteCertEKU, PROPERTY_INDEX_OPEN_VPN_REMOTECERTEKU, |
- TYPE_STRING }, |
- { onc::vpn::kRemoteCertKU, PROPERTY_INDEX_OPEN_VPN_REMOTECERTKU, TYPE_LIST }, |
- { onc::vpn::kRemoteCertTLS, PROPERTY_INDEX_OPEN_VPN_REMOTECERTTLS, |
- TYPE_STRING }, |
- { onc::vpn::kRenegSec, PROPERTY_INDEX_OPEN_VPN_RENEGSEC, TYPE_INTEGER }, |
- { onc::vpn::kSaveCredentials, PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, |
- { onc::vpn::kServerCARef, PROPERTY_INDEX_OPEN_VPN_CACERT, TYPE_STRING }, |
- { onc::vpn::kServerCertRef, PROPERTY_INDEX_OPEN_VPN_CERT, TYPE_STRING }, |
- { onc::vpn::kServerPollTimeout, PROPERTY_INDEX_OPEN_VPN_SERVERPOLLTIMEOUT, |
- TYPE_INTEGER }, |
- { onc::vpn::kShaper, PROPERTY_INDEX_OPEN_VPN_SHAPER, TYPE_INTEGER }, |
- { onc::vpn::kStaticChallenge, PROPERTY_INDEX_OPEN_VPN_STATICCHALLENGE, |
- TYPE_STRING }, |
- { onc::vpn::kTLSAuthContents, PROPERTY_INDEX_OPEN_VPN_TLSAUTHCONTENTS, |
- TYPE_STRING }, |
- { onc::vpn::kTLSRemote, PROPERTY_INDEX_OPEN_VPN_TLSREMOTE, TYPE_STRING }, |
- { onc::vpn::kUsername, PROPERTY_INDEX_OPEN_VPN_USER, TYPE_STRING }, |
- { NULL } |
-}; |
- |
-OncValueSignature proxy_settings_signature[] = { |
- { onc::proxy::kType, PROPERTY_INDEX_ONC_PROXY_TYPE, TYPE_STRING }, |
- { onc::proxy::kPAC, PROPERTY_INDEX_ONC_PROXY_PAC, TYPE_STRING }, |
- { onc::proxy::kManual, PROPERTY_INDEX_ONC_PROXY_MANUAL, TYPE_DICTIONARY }, |
- { onc::proxy::kExcludeDomains, PROPERTY_INDEX_ONC_PROXY_EXCLUDE_DOMAINS, |
- TYPE_LIST }, |
- { NULL }, |
-}; |
- |
-OncValueSignature proxy_manual_signature[] = { |
- { onc::proxy::kHttp, PROPERTY_INDEX_ONC_PROXY_HTTP, TYPE_DICTIONARY }, |
- { onc::proxy::kHttps, PROPERTY_INDEX_ONC_PROXY_HTTPS, TYPE_DICTIONARY }, |
- { onc::proxy::kFtp, PROPERTY_INDEX_ONC_PROXY_FTP, TYPE_DICTIONARY }, |
- { onc::proxy::kSocks, PROPERTY_INDEX_ONC_PROXY_SOCKS, TYPE_DICTIONARY }, |
- { NULL }, |
-}; |
- |
-// Serve the singleton mapper instance. |
-const EnumMapper<PropertyIndex>* get_onc_mapper() { |
- CR_DEFINE_STATIC_LOCAL(const EnumMapper<PropertyIndex>, mapper, |
- (network_configuration_table, |
- arraysize(network_configuration_table), |
- PROPERTY_INDEX_UNKNOWN)); |
- return &mapper; |
-} |
- |
-ConnectionType ParseNetworkType(const std::string& type) { |
- static EnumMapper<ConnectionType>::Pair table[] = { |
- { "Ethernet", TYPE_ETHERNET }, |
- { "WiFi", TYPE_WIFI }, |
- { "VPN", TYPE_VPN }, |
- }; |
- CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionType>, parser, |
- (table, arraysize(table), TYPE_UNKNOWN)); |
- return parser.Get(type); |
-} |
- |
-std::string GetStringValue(const base::Value& value) { |
- std::string string_value; |
- value.GetAsString(&string_value); |
- return string_value; |
-} |
- |
-const bool GetBooleanValue(const base::Value& value) { |
- bool bool_value = false; |
- value.GetAsBoolean(&bool_value); |
- return bool_value; |
-} |
- |
-std::string ConvertValueToString(const base::Value& value) { |
- std::string value_json; |
- base::JSONWriter::Write(&value, &value_json); |
- return value_json; |
-} |
- |
-bool GetAsListOfStrings(const base::Value& value, |
- std::vector<std::string>* result) { |
- const base::ListValue* list = NULL; |
- if (!value.GetAsList(&list)) |
- return false; |
- result->clear(); |
- result->reserve(list->GetSize()); |
- for (size_t i = 0; i < list->GetSize(); i++) { |
- std::string item; |
- if (!list->GetString(i, &item)) |
- return false; |
- result->push_back(item); |
- } |
- return true; |
-} |
- |
-} // namespace |
- |
-// -------------------- OncNetworkParser -------------------- |
- |
-OncNetworkParser::OncNetworkParser(const base::ListValue& network_configs, |
- onc::ONCSource onc_source) |
- : NetworkParser(get_onc_mapper()), |
- onc_source_(onc_source), |
- network_configs_(network_configs.DeepCopy()) { |
-} |
- |
-OncNetworkParser::OncNetworkParser() |
- : NetworkParser(get_onc_mapper()), |
- network_configs_(NULL) { |
-} |
- |
-OncNetworkParser::~OncNetworkParser() { |
-} |
- |
-// static |
-const EnumMapper<PropertyIndex>* OncNetworkParser::property_mapper() { |
- return get_onc_mapper(); |
-} |
- |
-int OncNetworkParser::GetNetworkConfigsSize() const { |
- return network_configs_ ? network_configs_->GetSize() : 0; |
-} |
- |
-const base::DictionaryValue* OncNetworkParser::GetNetworkConfig(int n) { |
- CHECK(network_configs_); |
- CHECK(static_cast<size_t>(n) < network_configs_->GetSize()); |
- CHECK_GE(n, 0); |
- base::DictionaryValue* info = NULL; |
- if (!network_configs_->GetDictionary(n, &info)) { |
- parse_error_ = l10n_util::GetStringUTF8( |
- IDS_NETWORK_CONFIG_ERROR_NETWORK_PROP_DICT_MALFORMED); |
- return NULL; |
- } |
- |
- return info; |
-} |
- |
-Network* OncNetworkParser::ParseNetwork(int n, bool* marked_for_removal) { |
- const base::DictionaryValue* info = GetNetworkConfig(n); |
- if (!info) |
- return NULL; |
- |
- if (VLOG_IS_ON(2)) { |
- std::string network_json; |
- base::JSONWriter::WriteWithOptions(static_cast<const base::Value*>(info), |
- base::JSONWriter::OPTIONS_PRETTY_PRINT, |
- &network_json); |
- VLOG(2) << "Parsing network at index " << n << ": " << network_json; |
- } |
- |
- if (marked_for_removal) { |
- if (!info->GetBoolean(onc::kRemove, marked_for_removal)) |
- *marked_for_removal = false; |
- } |
- |
- 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. |
- parse_error_ = l10n_util::GetStringUTF8( |
- IDS_NETWORK_CONFIG_ERROR_NETWORK_TYPE_MISSING); |
- return NULL; |
- } |
- scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); |
- |
- // Initialize ONC source. |
- NetworkUIData ui_data = network->ui_data(); |
- ui_data.set_onc_source(onc_source_); |
- network->set_ui_data(ui_data); |
- |
- // Parse all properties recursively. |
- if (!ParseNestedObject(network.get(), |
- onc::kNetworkConfiguration, |
- static_cast<const base::Value&>(info), |
- network_configuration_signature, |
- ParseNetworkConfigurationValue)) { |
- LOG(WARNING) << "Network " << network->name() << " failed to parse."; |
- if (parse_error_.empty()) |
- parse_error_ = l10n_util::GetStringUTF8( |
- IDS_NETWORK_CONFIG_ERROR_NETWORK_PROP_DICT_MALFORMED); |
- return NULL; |
- } |
- |
- // Update the UI data property in shill. |
- std::string ui_data_json; |
- base::DictionaryValue ui_data_dict; |
- network->ui_data().FillDictionary(&ui_data_dict); |
- base::JSONWriter::Write(&ui_data_dict, &ui_data_json); |
- base::StringValue ui_data_string_value(ui_data_json); |
- network->UpdatePropertyMap(PROPERTY_INDEX_UI_DATA, &ui_data_string_value); |
- |
- if (VLOG_IS_ON(2)) { |
- VLOG(2) << "Created Network '" << network->name() |
- << "' from info. Path:" << service_path |
- << " Type:" << ConnectionTypeToString(type); |
- } |
- |
- return network.release(); |
-} |
- |
-bool OncNetworkParser::ParseNestedObject(Network* network, |
- const std::string& onc_type, |
- const base::Value& value, |
- OncValueSignature* signature, |
- ParserPointer parser) { |
- bool any_errors = false; |
- if (!value.IsType(base::Value::TYPE_DICTIONARY)) { |
- VLOG(1) << network->name() << ": expected object of type " << onc_type; |
- parse_error_ = l10n_util::GetStringUTF8( |
- IDS_NETWORK_CONFIG_ERROR_NETWORK_PROP_DICT_MALFORMED); |
- return false; |
- } |
- VLOG(2) << "Parsing nested object of type " << onc_type; |
- const DictionaryValue* dict = NULL; |
- value.GetAsDictionary(&dict); |
- for (DictionaryValue::key_iterator iter = dict->begin_keys(); |
- iter != dict->end_keys(); ++iter) { |
- const std::string& key = *iter; |
- |
- // Recommended keys are only of interest to the UI code and the UI reads it |
- // directly from the ONC blob. |
- if (key == onc::kRecommended) |
- continue; |
- |
- const base::Value* inner_value = NULL; |
- dict->GetWithoutPathExpansion(key, &inner_value); |
- CHECK(inner_value != NULL); |
- int field_index; |
- for (field_index = 0; signature[field_index].field != NULL; ++field_index) { |
- if (key == signature[field_index].field) |
- break; |
- } |
- if (signature[field_index].field == NULL) { |
- LOG(WARNING) << network->name() << ": unexpected field: " |
- << key << ", in type: " << onc_type; |
- continue; |
- } |
- if (!inner_value->IsType(signature[field_index].type)) { |
- LOG(ERROR) << network->name() << ": field with wrong type: " << key |
- << ", actual type: " << inner_value->GetType() |
- << ", expected type: " << signature[field_index].type; |
- any_errors = true; |
- continue; |
- } |
- PropertyIndex index = signature[field_index].index; |
- // We need to UpdatePropertyMap now since parser might want to |
- // change the mapped value. |
- network->UpdatePropertyMap(index, inner_value); |
- if (!parser(this, index, *inner_value, network)) { |
- LOG(ERROR) << network->name() << ": field in " << onc_type |
- << " not parsed: " << key; |
- any_errors = true; |
- continue; |
- } |
- if (VLOG_IS_ON(2)) { |
- std::string value_json; |
- base::JSONWriter::WriteWithOptions(inner_value, |
- base::JSONWriter::OPTIONS_PRETTY_PRINT, |
- &value_json); |
- VLOG(2) << network->name() << ": Successfully parsed [" << key |
- << "(" << index << ")] = " << value_json; |
- } |
- } |
- if (any_errors) { |
- parse_error_ = l10n_util::GetStringUTF8( |
- IDS_NETWORK_CONFIG_ERROR_NETWORK_PROP_DICT_MALFORMED); |
- } |
- return !any_errors; |
-} |
- |
-// static |
-std::string OncNetworkParser::GetUserExpandedValue( |
- const base::Value& value, |
- onc::ONCSource source) { |
- std::string string_value; |
- if (!value.GetAsString(&string_value)) |
- return string_value; |
- |
- // If running unit test, just return the original value. |
- if (!content::BrowserThread::IsMessageLoopValid(content::BrowserThread::UI)) |
- return string_value; |
- |
- if (source != onc::ONC_SOURCE_USER_POLICY && |
- source != onc::ONC_SOURCE_USER_IMPORT) { |
- return string_value; |
- } |
- |
- if (!UserManager::Get()->IsUserLoggedIn()) |
- return string_value; |
- |
- const User* logged_in_user = UserManager::Get()->GetLoggedInUser(); |
- ReplaceSubstringsAfterOffset(&string_value, 0, |
- onc::substitutes::kLoginIDField, |
- logged_in_user->GetAccountName(false)); |
- ReplaceSubstringsAfterOffset(&string_value, 0, |
- onc::substitutes::kEmailField, |
- logged_in_user->email()); |
- return string_value; |
-} |
- |
-Network* OncNetworkParser::CreateNewNetwork( |
- ConnectionType type, const std::string& service_path) { |
- Network* network = NetworkParser::CreateNewNetwork(type, service_path); |
- if (network) { |
- if (type == TYPE_ETHERNET) |
- network->SetNetworkParser(new OncEthernetNetworkParser()); |
- else 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; |
-} |
- |
-std::string OncNetworkParser::GetGuidFromDictionary( |
- const base::DictionaryValue& info) { |
- std::string guid_string; |
- info.GetString("GUID", &guid_string); |
- return guid_string; |
-} |
- |
-// static |
-bool OncNetworkParser::ParseNetworkConfigurationValue( |
- OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- switch (index) { |
- case PROPERTY_INDEX_ONC_ETHERNET: |
- return parser->ParseNestedObject(network, "Ethernet", value, |
- ethernet_signature, OncEthernetNetworkParser::ParseEthernetValue); |
- case PROPERTY_INDEX_ONC_WIFI: |
- return parser->ParseNestedObject(network, |
- onc::kWiFi, |
- value, |
- wifi_signature, |
- OncWifiNetworkParser::ParseWifiValue); |
- case PROPERTY_INDEX_ONC_VPN: { |
- if (!CheckNetworkType(network, TYPE_VPN, onc::kVPN)) |
- return false; |
- VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
- // Got the "VPN" field. Immediately store the VPN.Type field |
- // value so that we can properly validate fields in the VPN |
- // object based on the type. |
- const DictionaryValue* dict = NULL; |
- CHECK(value.GetAsDictionary(&dict)); |
- std::string provider_type_string; |
- if (!dict->GetString("Type", &provider_type_string)) { |
- VLOG(1) << network->name() << ": VPN.Type is missing"; |
- return false; |
- } |
- ProviderType provider_type = |
- OncVirtualNetworkParser::ParseProviderType(provider_type_string); |
- virtual_network->set_provider_type(provider_type); |
- return parser->ParseNestedObject(network, |
- onc::kVPN, |
- value, |
- vpn_signature, |
- OncVirtualNetworkParser::ParseVPNValue); |
- } |
- case PROPERTY_INDEX_ONC_PROXY_SETTINGS: |
- return ProcessProxySettings(parser, value, network); |
- case PROPERTY_INDEX_ONC_REMOVE: |
- // Removal is handled in ParseNetwork, and so is ignored here. |
- return true; |
- case PROPERTY_INDEX_TYPE: { |
- // Update property with native value for type. |
- std::string str = |
- NativeNetworkParser::network_type_mapper()->GetKey(network->type()); |
- base::StringValue val(str); |
- network->UpdatePropertyMap(PROPERTY_INDEX_TYPE, &val); |
- return true; |
- } |
- case PROPERTY_INDEX_GUID: |
- // Fall back to generic parser. |
- return parser->ParseValue(index, value, network); |
- case PROPERTY_INDEX_NAME: |
- // shill doesn't allow setting name for non-VPN networks. |
- if (network->type() != TYPE_VPN) { |
- network->UpdatePropertyMap(PROPERTY_INDEX_NAME, NULL); |
- return true; |
- } |
- |
- // Fall back to generic parser. |
- return parser->ParseValue(index, value, network); |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// static |
-bool OncNetworkParser::CheckNetworkType(Network* network, |
- ConnectionType expected, |
- const std::string& onc_type) { |
- if (expected != network->type()) { |
- LOG(WARNING) << network->name() << ": " |
- << onc_type << " field unexpected for this type network"; |
- return false; |
- } |
- return true; |
-} |
- |
-// static |
-ClientCertType OncNetworkParser::ParseClientCertType( |
- const std::string& type) { |
- static EnumMapper<ClientCertType>::Pair table[] = { |
- { onc::certificate::kNone, CLIENT_CERT_TYPE_NONE }, |
- { onc::certificate::kRef, CLIENT_CERT_TYPE_REF }, |
- { onc::certificate::kPattern, CLIENT_CERT_TYPE_PATTERN }, |
- }; |
- CR_DEFINE_STATIC_LOCAL(EnumMapper<ClientCertType>, parser, |
- (table, arraysize(table), CLIENT_CERT_TYPE_NONE)); |
- return parser.Get(type); |
-} |
- |
-// static |
-std::string OncNetworkParser::GetPkcs11IdFromCertGuid(const std::string& guid) { |
- // We have to look up the GUID to find the PKCS#11 ID that is needed. |
- net::CertificateList cert_list; |
- onc::CertificateImporter::ListCertsWithNickname(guid, &cert_list); |
- DCHECK_EQ(1ul, cert_list.size()); |
- if (cert_list.size() == 1) |
- return x509_certificate_model::GetPkcs11Id(cert_list[0]->os_cert_handle()); |
- return std::string(); |
-} |
- |
-// static |
-bool OncNetworkParser::ProcessProxySettings(OncNetworkParser* parser, |
- const base::Value& value, |
- Network* network) { |
- VLOG(1) << "Processing ProxySettings: " << ConvertValueToString(value); |
- |
- // Got "ProxySettings" field. Immediately store the ProxySettings.Type |
- // field value so that we can properly validate fields in the ProxySettings |
- // object based on the type. |
- const DictionaryValue* dict = NULL; |
- CHECK(value.GetAsDictionary(&dict)); |
- std::string proxy_type_string; |
- if (!dict->GetString(onc::proxy::kType, &proxy_type_string)) { |
- VLOG(1) << network->name() << ": ProxySettings.Type is missing"; |
- return false; |
- } |
- Network::ProxyOncConfig& config = network->proxy_onc_config(); |
- config.type = ParseProxyType(proxy_type_string); |
- |
- // For Direct and WPAD, all other fields are ignored. |
- // Otherwise, recursively parse the children of ProxySettings dictionary. |
- if (config.type != PROXY_ONC_DIRECT && config.type != PROXY_ONC_WPAD) { |
- if (!parser->ParseNestedObject(network, |
- onc::kProxySettings, |
- value, |
- proxy_settings_signature, |
- OncNetworkParser::ParseProxySettingsValue)) { |
- return false; |
- } |
- } |
- |
- // Create ProxyConfigDictionary based on parsed values. |
- scoped_ptr<DictionaryValue> proxy_dict; |
- switch (config.type) { |
- case PROXY_ONC_DIRECT: { |
- proxy_dict.reset(ProxyConfigDictionary::CreateDirect()); |
- break; |
- } |
- case PROXY_ONC_WPAD: { |
- proxy_dict.reset(ProxyConfigDictionary::CreateAutoDetect()); |
- break; |
- } |
- case PROXY_ONC_PAC: { |
- if (config.pac_url.empty()) { |
- VLOG(1) << "PAC field is required for this ProxySettings.Type"; |
- return false; |
- } |
- GURL url(config.pac_url); |
- if (!url.is_valid()) { |
- VLOG(1) << "PAC field is invalid for this ProxySettings.Type"; |
- return false; |
- } |
- proxy_dict.reset(ProxyConfigDictionary::CreatePacScript(url.spec(), |
- false)); |
- break; |
- } |
- case PROXY_ONC_MANUAL: { |
- if (config.manual_spec.empty()) { |
- VLOG(1) << "Manual field is required for this ProxySettings.Type"; |
- return false; |
- } |
- proxy_dict.reset(ProxyConfigDictionary::CreateFixedServers( |
- config.manual_spec, config.bypass_rules)); |
- break; |
- } |
- default: |
- break; |
- } |
- if (!proxy_dict.get()) |
- return false; |
- |
- // Serialize ProxyConfigDictionary into a string. |
- std::string proxy_dict_str = ConvertValueToString(*proxy_dict.get()); |
- |
- // Add ProxyConfig property to property map so that it will be updated in |
- // shill in NetworkLibraryImplCros::CallConfigureService after all parsing |
- // has completed. |
- base::StringValue val(proxy_dict_str); |
- network->UpdatePropertyMap(PROPERTY_INDEX_PROXY_CONFIG, &val); |
- |
- // If |network| is currently being connected to or it exists in memory, |
- // shill will fire PropertyChanged notification in ConfigureService, |
- // chromeos::ProxyConfigServiceImpl will get OnNetworkChanged notification |
- // and, if necessary, activate |proxy_dict_str| on network stack and reflect |
- // it in UI via "Change proxy settings" button. |
- network->set_proxy_config(proxy_dict_str); |
- VLOG(1) << "Parsed ProxyConfig: " << network->proxy_config(); |
- |
- return true; |
-} |
- |
-// static |
-bool OncNetworkParser::ParseProxySettingsValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- Network::ProxyOncConfig& config = network->proxy_onc_config(); |
- switch (index) { |
- case PROPERTY_INDEX_ONC_PROXY_PAC: { |
- if (config.type == PROXY_ONC_PAC) { |
- // This is a string specifying the url. |
- config.pac_url = GetStringValue(value); |
- return true; |
- } |
- break; |
- } |
- case PROPERTY_INDEX_ONC_PROXY_MANUAL: { |
- if (config.type == PROXY_ONC_MANUAL) { |
- // Recursively parse the children of Manual dictionary. |
- return parser->ParseNestedObject(network, |
- onc::proxy::kManual, |
- value, |
- proxy_manual_signature, |
- ParseProxyManualValue); |
- } |
- break; |
- } |
- case PROPERTY_INDEX_ONC_PROXY_EXCLUDE_DOMAINS: { |
- if (config.type == PROXY_ONC_MANUAL) { |
- // This is a list of rules, parse them into ProxyBypassRules. |
- net::ProxyBypassRules rules; |
- const ListValue* list = NULL; |
- CHECK(value.GetAsList(&list)); |
- for (size_t i = 0; i < list->GetSize(); ++i) { |
- std::string val; |
- if (!list->GetString(i, &val)) |
- return false; |
- rules.AddRuleFromString(val); |
- } |
- config.bypass_rules = rules.ToString(); |
- return true; |
- } |
- break; |
- } |
- default: |
- break; |
- } |
- return true; |
-} |
- |
-// static |
-ProxyOncType OncNetworkParser::ParseProxyType(const std::string& type) { |
- static EnumMapper<ProxyOncType>::Pair table[] = { |
- { onc::proxy::kDirect, PROXY_ONC_DIRECT }, |
- { onc::proxy::kWPAD, PROXY_ONC_WPAD }, |
- { onc::proxy::kPAC, PROXY_ONC_PAC }, |
- { onc::proxy::kManual, PROXY_ONC_MANUAL }, |
- }; |
- |
- CR_DEFINE_STATIC_LOCAL(EnumMapper<ProxyOncType>, parser, |
- (table, arraysize(table), PROXY_ONC_MAX)); |
- |
- return parser.Get(type); |
-} |
- |
-// static |
-bool OncNetworkParser::ParseProxyManualValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- switch (index) { |
- case PROPERTY_INDEX_ONC_PROXY_HTTP: |
- return ParseProxyServer(index, value, "http", network); |
- break; |
- case PROPERTY_INDEX_ONC_PROXY_HTTPS: |
- return ParseProxyServer(index, value, "https", network); |
- break; |
- case PROPERTY_INDEX_ONC_PROXY_FTP: |
- return ParseProxyServer(index, value, "ftp", network); |
- break; |
- case PROPERTY_INDEX_ONC_PROXY_SOCKS: |
- return ParseProxyServer(index, value, "socks", network); |
- break; |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// static |
-bool OncNetworkParser::ParseProxyServer(int property_index, |
- const base::Value& value, |
- const std::string& scheme, |
- Network* network) { |
- // Parse the ProxyLocation dictionary that specifies the proxy server. |
- net::ProxyServer server = ParseProxyLocationValue(property_index, value); |
- if (!server.is_valid()) |
- return false; |
- |
- // Append proxy server info to manual spec string. |
- ProxyConfigServiceImpl::ProxyConfig::EncodeAndAppendProxyServer(scheme, |
- server, &network->proxy_onc_config().manual_spec); |
- return true; |
-} |
- |
-// static |
-net::ProxyServer OncNetworkParser::ParseProxyLocationValue( |
- int property_index, |
- const base::Value& value) { |
- // Extract the values of Host and Port keys in ProxyLocation dictionary. |
- const DictionaryValue* dict = NULL; |
- CHECK(value.GetAsDictionary(&dict)); |
- std::string host; |
- int port = 0; |
- if (!(dict->GetString(onc::proxy::kHost, &host) && |
- dict->GetInteger(onc::proxy::kPort, &port))) { |
- return net::ProxyServer(); |
- } |
- |
- // Determine the scheme for the proxy server. |
- net::ProxyServer::Scheme scheme = net::ProxyServer::SCHEME_HTTP; |
- if (property_index == PROPERTY_INDEX_ONC_PROXY_SOCKS) { |
- scheme = StartsWithASCII(host, "socks5://", false) ? |
- net::ProxyServer::SCHEME_SOCKS5 : net::ProxyServer::SCHEME_SOCKS4; |
- } |
- |
- // Process the Host and Port values into net::HostPortPair, and then |
- // net::ProxyServer for the specific scheme. |
- net::HostPortPair host_port(host, static_cast<uint16>(port)); |
- return net::ProxyServer(scheme, host_port); |
-} |
- |
-// static |
-bool OncNetworkParser::ParseClientCertPattern(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- // Ignore certificate patterns for device policy ONC so that an unmanaged user |
- // won't have a certificate presented for them involuntarily. |
- if (parser->onc_source() == onc::ONC_SOURCE_DEVICE_POLICY) |
- return false; |
- |
- // Only WiFi and VPN have this type. |
- if (network->type() != TYPE_WIFI && |
- network->type() != TYPE_VPN) { |
- LOG(WARNING) << "Tried to parse a ClientCertPattern from something " |
- << "that wasn't a WiFi or VPN network."; |
- return false; |
- } |
- |
- |
- switch (index) { |
- case PROPERTY_INDEX_ONC_CERTIFICATE_PATTERN_ENROLLMENT_URI: { |
- std::vector<std::string> resulting_list; |
- if (!GetAsListOfStrings(value, &resulting_list)) |
- return false; |
- CertificatePattern pattern = network->client_cert_pattern(); |
- pattern.set_enrollment_uri_list(resulting_list); |
- network->set_client_cert_pattern(pattern); |
- return true; |
- } |
- case PROPERTY_INDEX_ONC_CERTIFICATE_PATTERN_ISSUER_CA_REF: { |
- std::vector<std::string> resulting_list; |
- if (!GetAsListOfStrings(value, &resulting_list)) |
- return false; |
- CertificatePattern pattern = network->client_cert_pattern(); |
- pattern.set_issuer_ca_ref_list(resulting_list); |
- network->set_client_cert_pattern(pattern); |
- return true; |
- } |
- case PROPERTY_INDEX_ONC_CERTIFICATE_PATTERN_ISSUER: |
- return parser->ParseNestedObject(network, |
- onc::certificate::kIssuer, |
- value, |
- issuer_subject_pattern_signature, |
- ParseIssuerPattern); |
- case PROPERTY_INDEX_ONC_CERTIFICATE_PATTERN_SUBJECT: |
- return parser->ParseNestedObject(network, |
- onc::certificate::kSubject, |
- value, |
- issuer_subject_pattern_signature, |
- ParseSubjectPattern); |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// static |
-bool OncNetworkParser::ParseIssuerPattern(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- IssuerSubjectPattern pattern; |
- if (ParseIssuerSubjectPattern(&pattern, parser, index, value, network)) { |
- CertificatePattern cert_pattern = network->client_cert_pattern(); |
- cert_pattern.set_issuer(pattern); |
- network->set_client_cert_pattern(cert_pattern); |
- return true; |
- } |
- return false; |
-} |
- |
-// static |
-bool OncNetworkParser::ParseSubjectPattern(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- IssuerSubjectPattern pattern; |
- if (ParseIssuerSubjectPattern(&pattern, parser, index, value, network)) { |
- CertificatePattern cert_pattern = network->client_cert_pattern(); |
- cert_pattern.set_subject(pattern); |
- network->set_client_cert_pattern(cert_pattern); |
- return true; |
- } |
- return false; |
-} |
- |
-// static |
-bool OncNetworkParser::ParseIssuerSubjectPattern(IssuerSubjectPattern* pattern, |
- OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- // Only WiFi and VPN have this type. |
- if (network->type() != TYPE_WIFI && |
- network->type() != TYPE_VPN) { |
- LOG(WARNING) << "Tried to parse an IssuerSubjectPattern from something " |
- << "that wasn't a WiFi or VPN network."; |
- return false; |
- } |
- std::string value_str; |
- if (!value.GetAsString(&value_str)) |
- return false; |
- |
- bool result = false; |
- switch (index) { |
- case PROPERTY_INDEX_ISSUER_SUBJECT_PATTERN_COMMON_NAME: |
- pattern->set_common_name(value_str); |
- result = true; |
- break; |
- case PROPERTY_INDEX_ISSUER_SUBJECT_PATTERN_LOCALITY: |
- pattern->set_locality(value_str); |
- result = true; |
- break; |
- case PROPERTY_INDEX_ISSUER_SUBJECT_PATTERN_ORGANIZATION: |
- pattern->set_organization(value_str); |
- result = true; |
- break; |
- case PROPERTY_INDEX_ISSUER_SUBJECT_PATTERN_ORGANIZATIONAL_UNIT: |
- pattern->set_organizational_unit(value_str); |
- result = true; |
- break; |
- default: |
- break; |
- } |
- return result; |
-} |
- |
-// -------------------- OncEthernetNetworkParser -------------------- |
- |
-OncEthernetNetworkParser::OncEthernetNetworkParser() {} |
-OncEthernetNetworkParser::~OncEthernetNetworkParser() {} |
- |
-bool OncEthernetNetworkParser::ParseEthernetValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- if (!CheckNetworkType(network, TYPE_ETHERNET, "Ethernet")) |
- return false; |
- // EthernetNetwork* ethernet_network = static_cast<EthernetNetwork*>(network); |
- switch (index) { |
- case PROPERTY_INDEX_AUTHENTICATION: |
- // TODO(chocobo): Handle authentication. |
- return true; |
- case PROPERTY_INDEX_EAP: |
- // TODO(chocobo): Implement EAP authentication. |
- return true; |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// -------------------- OncWirelessNetworkParser -------------------- |
- |
-OncWirelessNetworkParser::OncWirelessNetworkParser() {} |
-OncWirelessNetworkParser::~OncWirelessNetworkParser() {} |
- |
-// -------------------- OncWifiNetworkParser -------------------- |
- |
-OncWifiNetworkParser::OncWifiNetworkParser() {} |
-OncWifiNetworkParser::~OncWifiNetworkParser() {} |
- |
-// static |
-bool OncWifiNetworkParser::ParseWifiValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- if (!CheckNetworkType(network, TYPE_WIFI, "WiFi")) |
- return false; |
- WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); |
- switch (index) { |
- case PROPERTY_INDEX_SSID: |
- wifi_network->SetName(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_SECURITY: { |
- ConnectionSecurity security = ParseSecurity(GetStringValue(value)); |
- wifi_network->set_encryption(security); |
- // Also update property with native value for security. |
- base::StringValue val( |
- NativeNetworkParser::network_security_mapper()->GetKey(security)); |
- wifi_network->UpdatePropertyMap(index, &val); |
- return true; |
- } |
- case PROPERTY_INDEX_PASSPHRASE: |
- wifi_network->set_passphrase(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_IDENTITY: |
- wifi_network->set_identity(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_EAP: |
- parser->ParseNestedObject(wifi_network, |
- onc::wifi::kEAP, |
- value, |
- eap_signature, |
- ParseEAPValue); |
- return true; |
- case PROPERTY_INDEX_AUTO_CONNECT: |
- network->set_auto_connect(GetBooleanValue(value)); |
- return true; |
- case PROPERTY_INDEX_WIFI_HIDDEN_SSID: |
- wifi_network->set_hidden_ssid(GetBooleanValue(value)); |
- return true; |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// static |
-bool OncWifiNetworkParser::ParseEAPValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- if (!CheckNetworkType(network, TYPE_WIFI, onc::wifi::kEAP)) |
- return false; |
- WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); |
- switch (index) { |
- case PROPERTY_INDEX_EAP_IDENTITY: { |
- const std::string expanded_identity( |
- GetUserExpandedValue(value, parser->onc_source())); |
- wifi_network->set_eap_identity(expanded_identity); |
- const StringValue expanded_identity_value(expanded_identity); |
- wifi_network->UpdatePropertyMap(index, &expanded_identity_value); |
- return true; |
- } |
- case PROPERTY_INDEX_EAP_METHOD: { |
- EAPMethod eap_method = ParseEAPMethod(GetStringValue(value)); |
- wifi_network->set_eap_method(eap_method); |
- // Also update property with native value for EAP method. |
- base::StringValue val( |
- NativeNetworkParser::network_eap_method_mapper()->GetKey(eap_method)); |
- wifi_network->UpdatePropertyMap(index, &val); |
- return true; |
- } |
- case PROPERTY_INDEX_EAP_PHASE_2_AUTH: { |
- EAPPhase2Auth eap_phase_2_auth = ParseEAPPhase2Auth( |
- GetStringValue(value)); |
- wifi_network->set_eap_phase_2_auth(eap_phase_2_auth); |
- // Also update property with native value for EAP phase 2 auth. |
- base::StringValue val( |
- NativeNetworkParser::network_eap_auth_mapper()->GetKey( |
- eap_phase_2_auth)); |
- wifi_network->UpdatePropertyMap(index, &val); |
- return true; |
- } |
- case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY: { |
- const std::string expanded_identity( |
- GetUserExpandedValue(value, parser->onc_source())); |
- wifi_network->set_eap_anonymous_identity(expanded_identity); |
- const StringValue expanded_identity_value(expanded_identity); |
- wifi_network->UpdatePropertyMap(index, &expanded_identity_value); |
- return true; |
- } |
- case PROPERTY_INDEX_EAP_CERT_ID: |
- wifi_network->set_eap_client_cert_pkcs11_id(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_EAP_CA_CERT_NSS: |
- wifi_network->set_eap_server_ca_cert_nss_nickname(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_EAP_USE_SYSTEM_CAS: |
- wifi_network->set_eap_use_system_cas(GetBooleanValue(value)); |
- return true; |
- case PROPERTY_INDEX_EAP_PASSWORD: |
- wifi_network->set_eap_passphrase(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_REF: { |
- std::string cert_id = GetPkcs11IdFromCertGuid(GetStringValue(value)); |
- if (cert_id.empty()) |
- return false; |
- wifi_network->set_eap_client_cert_pkcs11_id(cert_id); |
- return true; |
- } |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN: |
- return parser->ParseNestedObject( |
- wifi_network, |
- onc::eap::kClientCertPattern, |
- value, |
- certificate_pattern_signature, |
- OncNetworkParser::ParseClientCertPattern); |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE: { |
- ClientCertType type = ParseClientCertType(GetStringValue(value)); |
- wifi_network->set_client_cert_type(type); |
- return true; |
- } |
- case PROPERTY_INDEX_SAVE_CREDENTIALS: |
- wifi_network->set_eap_save_credentials(GetBooleanValue(value)); |
- return true; |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// static |
-ConnectionSecurity OncWifiNetworkParser::ParseSecurity( |
- const std::string& security) { |
- static EnumMapper<ConnectionSecurity>::Pair table[] = { |
- { "None", SECURITY_NONE }, |
- { "WEP-PSK", SECURITY_WEP }, |
- { "WPA-PSK", SECURITY_PSK }, |
- { "WPA-EAP", SECURITY_8021X }, |
- }; |
- CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionSecurity>, parser, |
- (table, arraysize(table), SECURITY_UNKNOWN)); |
- return parser.Get(security); |
-} |
- |
-// static |
-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 }, |
- }; |
- CR_DEFINE_STATIC_LOCAL(EnumMapper<EAPMethod>, parser, |
- (table, arraysize(table), EAP_METHOD_UNKNOWN)); |
- return parser.Get(method); |
-} |
- |
-// static |
-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 }, |
- }; |
- CR_DEFINE_STATIC_LOCAL(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()); |
- return true; |
-} |
- |
-// static |
-bool OncVirtualNetworkParser::ParseVPNValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- if (!CheckNetworkType(network, TYPE_VPN, onc::kVPN)) |
- return false; |
- VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
- switch (index) { |
- case PROPERTY_INDEX_PROVIDER_HOST: { |
- base::StringValue empty_value(""); |
- virtual_network->set_server_hostname(GetStringValue(value)); |
- // Shill requires a domain property which is unused. |
- network->UpdatePropertyMap(PROPERTY_INDEX_VPN_DOMAIN, &empty_value); |
- return true; |
- } |
- case PROPERTY_INDEX_ONC_IPSEC: |
- if (virtual_network->provider_type() != PROVIDER_TYPE_L2TP_IPSEC_PSK && |
- virtual_network->provider_type() != |
- PROVIDER_TYPE_L2TP_IPSEC_USER_CERT) { |
- VLOG(1) << "IPsec field not allowed with this VPN type"; |
- return false; |
- } |
- return parser->ParseNestedObject(network, |
- onc::vpn::kIPsec, |
- value, |
- ipsec_signature, |
- ParseIPsecValue); |
- case PROPERTY_INDEX_ONC_L2TP: |
- if (virtual_network->provider_type() != PROVIDER_TYPE_L2TP_IPSEC_PSK) { |
- VLOG(1) << "L2TP field not allowed with this VPN type"; |
- return false; |
- } |
- return parser->ParseNestedObject(network, |
- onc::vpn::kL2TP, |
- value, |
- l2tp_signature, |
- ParseL2TPValue); |
- case PROPERTY_INDEX_ONC_OPENVPN: { |
- if (virtual_network->provider_type() != PROVIDER_TYPE_OPEN_VPN) { |
- VLOG(1) << "OpenVPN field not allowed with this VPN type"; |
- return false; |
- } |
- // The following are needed by shill to set up the OpenVPN |
- // management channel which every ONC OpenVPN configuration will |
- // use. |
- base::StringValue empty_value(""); |
- network->UpdatePropertyMap(PROPERTY_INDEX_OPEN_VPN_AUTHUSERPASS, |
- &empty_value); |
- network->UpdatePropertyMap(PROPERTY_INDEX_OPEN_VPN_MGMT_ENABLE, |
- &empty_value); |
- return parser->ParseNestedObject(network, |
- onc::vpn::kOpenVPN, |
- value, |
- openvpn_signature, |
- ParseOpenVPNValue); |
- } |
- case PROPERTY_INDEX_PROVIDER_TYPE: { |
- // Update property with native value for provider type. |
- ProviderType provider_type = GetCanonicalProviderType( |
- virtual_network->provider_type()); |
- std::string str = |
- NativeVirtualNetworkParser::provider_type_mapper()->GetKey( |
- provider_type); |
- base::StringValue val(str); |
- network->UpdatePropertyMap(PROPERTY_INDEX_PROVIDER_TYPE, &val); |
- return true; |
- } |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-bool OncVirtualNetworkParser::ParseIPsecValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- if (!CheckNetworkType(network, TYPE_VPN, onc::vpn::kIPsec)) |
- return false; |
- VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
- switch (index) { |
- case PROPERTY_INDEX_IPSEC_AUTHENTICATIONTYPE: |
- virtual_network->set_provider_type( |
- UpdateProviderTypeWithAuthType(virtual_network->provider_type(), |
- GetStringValue(value))); |
- return true; |
- case PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS: |
- virtual_network->set_ca_cert_nss(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_L2TPIPSEC_PSK: |
- virtual_network->set_psk_passphrase(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME: |
- virtual_network->set_group_name(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_SAVE_CREDENTIALS: |
- // Note that the specification allows different settings for |
- // IPsec credentials (PSK) and L2TP credentials (username and |
- // password) but we merge them in our implementation as is required |
- // with the current connection manager. |
- virtual_network->set_save_credentials(GetBooleanValue(value)); |
- return true; |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_REF: { |
- std::string cert_id = GetPkcs11IdFromCertGuid(GetStringValue(value)); |
- if (cert_id.empty()) |
- return false; |
- virtual_network->set_client_cert_id(cert_id); |
- return true; |
- } |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN: { |
- return parser->ParseNestedObject(virtual_network, |
- onc::vpn::kClientCertPattern, |
- value, |
- certificate_pattern_signature, |
- ParseClientCertPattern); |
- } |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE: { |
- ClientCertType type = ParseClientCertType(GetStringValue(value)); |
- virtual_network->set_client_cert_type(type); |
- return true; |
- } |
- case PROPERTY_INDEX_IPSEC_IKEVERSION: { |
- if (!value.IsType(TYPE_STRING)) { |
- // Shill wants all provider properties to be strings. |
- base::StringValue string_value(ConvertValueToString(value)); |
- virtual_network->UpdatePropertyMap(index, &string_value); |
- } |
- return true; |
- } |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// static |
-ProviderType OncVirtualNetworkParser::UpdateProviderTypeWithAuthType( |
- ProviderType provider, |
- const std::string& auth_type) { |
- switch (provider) { |
- case PROVIDER_TYPE_L2TP_IPSEC_PSK: |
- case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: |
- if (auth_type == "Cert") { |
- return PROVIDER_TYPE_L2TP_IPSEC_USER_CERT; |
- } else { |
- if (auth_type != "PSK") { |
- VLOG(1) << "Unexpected authentication type " << auth_type; |
- break; |
- } |
- return PROVIDER_TYPE_L2TP_IPSEC_PSK; |
- } |
- default: |
- VLOG(1) << "Unexpected provider type with authentication type " |
- << auth_type; |
- break; |
- } |
- return provider; |
-} |
- |
-// static |
-ProviderType OncVirtualNetworkParser::GetCanonicalProviderType( |
- ProviderType provider_type) { |
- if (provider_type == PROVIDER_TYPE_L2TP_IPSEC_USER_CERT) |
- return PROVIDER_TYPE_L2TP_IPSEC_PSK; |
- return provider_type; |
-} |
- |
-// static |
-bool OncVirtualNetworkParser::ParseL2TPValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- if (!CheckNetworkType(network, TYPE_VPN, "L2TP")) |
- return false; |
- VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
- switch (index) { |
- case PROPERTY_INDEX_L2TPIPSEC_PASSWORD: |
- virtual_network->set_user_passphrase(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_L2TPIPSEC_USER: { |
- const std::string expanded_user( |
- GetUserExpandedValue(value, parser->onc_source())); |
- virtual_network->set_username(expanded_user); |
- const StringValue expanded_user_value(expanded_user); |
- virtual_network->UpdatePropertyMap(index, &expanded_user_value); |
- return true; |
- } |
- case PROPERTY_INDEX_SAVE_CREDENTIALS: |
- // Note that the specification allows different settings for |
- // IPsec credentials (PSK) and L2TP credentials (username and |
- // password) but we merge them in our implementation as is required |
- // with the current connection manager. |
- virtual_network->set_save_credentials(GetBooleanValue(value)); |
- return true; |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// static |
-bool OncVirtualNetworkParser::ParseOpenVPNValue(OncNetworkParser* parser, |
- PropertyIndex index, |
- const base::Value& value, |
- Network* network) { |
- if (!CheckNetworkType(network, TYPE_VPN, "OpenVPN")) |
- return false; |
- VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
- switch (index) { |
- case PROPERTY_INDEX_OPEN_VPN_PASSWORD: |
- virtual_network->set_user_passphrase(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_OPEN_VPN_USER: { |
- const std::string expanded_user( |
- GetUserExpandedValue(value, parser->onc_source())); |
- virtual_network->set_username(expanded_user); |
- const StringValue expanded_user_value(expanded_user); |
- virtual_network->UpdatePropertyMap(index, &expanded_user_value); |
- return true; |
- } |
- case PROPERTY_INDEX_SAVE_CREDENTIALS: |
- virtual_network->set_save_credentials(GetBooleanValue(value)); |
- return true; |
- case PROPERTY_INDEX_OPEN_VPN_CACERT: |
- virtual_network->set_ca_cert_nss(GetStringValue(value)); |
- return true; |
- case PROPERTY_INDEX_OPEN_VPN_REMOTECERTKU: { |
- // ONC supports a list of these, but we shill supports only one |
- // today. So extract the first. |
- const base::ListValue* value_list = NULL; |
- value.GetAsList(&value_list); |
- const base::Value* first_item = NULL; |
- if (!value_list->Get(0, &first_item) || |
- !first_item->IsType(base::Value::TYPE_STRING)) { |
- VLOG(1) << "RemoteCertKU must be non-empty list of strings"; |
- return false; |
- } |
- virtual_network->UpdatePropertyMap(index, first_item); |
- return true; |
- } |
- case PROPERTY_INDEX_OPEN_VPN_AUTH: |
- case PROPERTY_INDEX_OPEN_VPN_AUTHRETRY: |
- case PROPERTY_INDEX_OPEN_VPN_AUTHNOCACHE: |
- case PROPERTY_INDEX_OPEN_VPN_CERT: |
- case PROPERTY_INDEX_OPEN_VPN_CIPHER: |
- case PROPERTY_INDEX_OPEN_VPN_COMPLZO: |
- case PROPERTY_INDEX_OPEN_VPN_COMPNOADAPT: |
- case PROPERTY_INDEX_OPEN_VPN_KEYDIRECTION: |
- case PROPERTY_INDEX_OPEN_VPN_NSCERTTYPE: |
- case PROPERTY_INDEX_OPEN_VPN_PORT: |
- case PROPERTY_INDEX_OPEN_VPN_PROTO: |
- case PROPERTY_INDEX_OPEN_VPN_PUSHPEERINFO: |
- case PROPERTY_INDEX_OPEN_VPN_REMOTECERTEKU: |
- case PROPERTY_INDEX_OPEN_VPN_REMOTECERTTLS: |
- case PROPERTY_INDEX_OPEN_VPN_RENEGSEC: |
- case PROPERTY_INDEX_OPEN_VPN_SERVERPOLLTIMEOUT: |
- case PROPERTY_INDEX_OPEN_VPN_SHAPER: |
- case PROPERTY_INDEX_OPEN_VPN_STATICCHALLENGE: |
- case PROPERTY_INDEX_OPEN_VPN_TLSAUTHCONTENTS: |
- case PROPERTY_INDEX_OPEN_VPN_TLSREMOTE: { |
- if (!value.IsType(TYPE_STRING)) { |
- // Shill wants all provider properties to be strings. |
- base::StringValue string_value(ConvertValueToString(value)); |
- virtual_network->UpdatePropertyMap(index, &string_value); |
- } |
- return true; |
- } |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_REF: { |
- std::string cert_id = GetPkcs11IdFromCertGuid(GetStringValue(value)); |
- if (cert_id.empty()) |
- return false; |
- virtual_network->set_client_cert_id(cert_id); |
- return true; |
- } |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN: |
- return parser->ParseNestedObject( |
- virtual_network, |
- onc::eap::kClientCertPattern, |
- value, |
- certificate_pattern_signature, |
- OncNetworkParser::ParseClientCertPattern); |
- case PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE: { |
- ClientCertType type = ParseClientCertType(GetStringValue(value)); |
- virtual_network->set_client_cert_type(type); |
- return true; |
- } |
- |
- default: |
- break; |
- } |
- return false; |
-} |
- |
-// static |
-ProviderType OncVirtualNetworkParser::ParseProviderType( |
- const std::string& type) { |
- static EnumMapper<ProviderType>::Pair table[] = { |
- // We initially map to L2TP-IPsec PSK and then fix this up based |
- // on the value of AuthenticationType. |
- { "L2TP-IPsec", PROVIDER_TYPE_L2TP_IPSEC_PSK }, |
- { "OpenVPN", PROVIDER_TYPE_OPEN_VPN }, |
- }; |
- CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser, |
- (table, arraysize(table), PROVIDER_TYPE_MAX)); |
- return parser.Get(type); |
-} |
- |
-} // namespace chromeos |