Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/cros/onc_network_parser.h" | 5 #include "chrome/browser/chromeos/cros/onc_network_parser.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/json/json_value_serializer.h" | 8 #include "base/json/json_value_serializer.h" |
| 9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
| 10 #include "base/values.h" | 10 #include "base/values.h" |
| 11 #include "chrome/browser/chromeos/cros/native_network_constants.h" | 11 #include "chrome/browser/chromeos/cros/native_network_constants.h" |
| 12 #include "chrome/browser/chromeos/cros/native_network_parser.h" | 12 #include "chrome/browser/chromeos/cros/native_network_parser.h" |
| 13 #include "chrome/browser/chromeos/cros/network_library.h" | 13 #include "chrome/browser/chromeos/cros/network_library.h" |
| 14 #include "net/base/cert_database.h" | 14 #include "net/base/cert_database.h" |
| 15 #include "net/base/crypto_module.h" | 15 #include "net/base/crypto_module.h" |
| 16 #include "net/base/net_errors.h" | 16 #include "net/base/net_errors.h" |
| 17 #include "net/base/x509_certificate.h" | 17 #include "net/base/x509_certificate.h" |
| 18 #include "third_party/cros_system_api/dbus/service_constants.h" | 18 #include "third_party/cros_system_api/dbus/service_constants.h" |
| 19 | 19 |
| 20 namespace chromeos { | 20 namespace chromeos { |
| 21 | 21 |
| 22 // Local constants. | 22 // Local constants. |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 EnumMapper<PropertyIndex>::Pair property_index_table[] = { | 25 EnumMapper<PropertyIndex>::Pair network_configuration_table[] = { |
| 26 { "GUID", PROPERTY_INDEX_GUID }, | 26 { "GUID", PROPERTY_INDEX_GUID }, |
| 27 { "Name", PROPERTY_INDEX_NAME }, | 27 { "Name", PROPERTY_INDEX_NAME }, |
| 28 { "Remove", PROPERTY_INDEX_REMOVE }, | 28 { "Remove", PROPERTY_INDEX_ONC_REMOVE }, |
| 29 { "ProxyURL", PROPERTY_INDEX_PROXY_CONFIG }, | 29 { "Type", PROPERTY_INDEX_TYPE }, |
| 30 { "Type", PROPERTY_INDEX_TYPE }, | 30 { "WiFi", PROPERTY_INDEX_ONC_WIFI }, |
| 31 { "SSID", PROPERTY_INDEX_SSID }, | 31 { "VPN", PROPERTY_INDEX_ONC_VPN } |
| 32 { "Passphrase", PROPERTY_INDEX_PASSPHRASE }, | 32 }; |
| 33 { "AutoConnect", PROPERTY_INDEX_AUTO_CONNECT }, | 33 |
| 34 { "HiddenSSID", PROPERTY_INDEX_HIDDEN_SSID }, | 34 const base::Value::Type TYPE_BOOLEAN = base::Value::TYPE_BOOLEAN; |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
why not just:
using base::Value::TYPE_BOOLEAN;
kmixter1
2011/12/01 19:48:41
using doesn't work with things inside of classes.
| |
| 35 { "Security", PROPERTY_INDEX_SECURITY }, | 35 const base::Value::Type TYPE_DICTIONARY = base::Value::TYPE_DICTIONARY; |
| 36 { "EAP", PROPERTY_INDEX_EAP }, | 36 const base::Value::Type TYPE_INTEGER = base::Value::TYPE_INTEGER; |
| 37 { "Outer", PROPERTY_INDEX_EAP_METHOD }, | 37 const base::Value::Type TYPE_LIST = base::Value::TYPE_LIST; |
| 38 { "Inner", PROPERTY_INDEX_EAP_PHASE_2_AUTH }, | 38 const base::Value::Type TYPE_STRING = base::Value::TYPE_STRING; |
| 39 { "UseSystemCAs", PROPERTY_INDEX_EAP_USE_SYSTEM_CAS }, | 39 |
| 40 { "ServerCARef", PROPERTY_INDEX_EAP_CA_CERT }, | 40 OncValueSignature wifi_signature[] = { |
| 41 { "ClientCARef", PROPERTY_INDEX_EAP_CLIENT_CERT }, | 41 { "AutoConnect", PROPERTY_INDEX_AUTO_CONNECT, TYPE_STRING }, |
| 42 { "ClientCertPattern", PROPERTY_INDEX_EAP_CLIENT_CERT_PATTERN }, | 42 { "EAP", PROPERTY_INDEX_EAP, TYPE_DICTIONARY }, |
| 43 { "Identity", PROPERTY_INDEX_EAP_IDENTITY }, | 43 { "HiddenSSID", PROPERTY_INDEX_HIDDEN_SSID, TYPE_BOOLEAN }, |
| 44 { "Password", PROPERTY_INDEX_EAP_PASSWORD }, | 44 { "Passphrase", PROPERTY_INDEX_PASSPHRASE, TYPE_STRING }, |
| 45 { "AnonymousIdentity", PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY }, | 45 { "ProxyURL", PROPERTY_INDEX_PROXY_CONFIG, TYPE_STRING }, |
| 46 { "Security", PROPERTY_INDEX_SECURITY, TYPE_STRING }, | |
| 47 { "SSID", PROPERTY_INDEX_SSID, TYPE_STRING }, | |
| 48 { NULL } | |
| 49 }; | |
| 50 | |
| 51 OncValueSignature eap_signature[] = { | |
| 52 { "AnonymousIdentity", PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY, TYPE_STRING }, | |
| 53 { "ClientCARef", PROPERTY_INDEX_EAP_CLIENT_CERT, TYPE_STRING }, | |
| 54 { "ClientCertPattern", PROPERTY_INDEX_EAP_CLIENT_CERT_PATTERN, TYPE_STRING }, | |
| 55 { "Identity", PROPERTY_INDEX_EAP_IDENTITY, TYPE_STRING }, | |
| 56 { "Inner", PROPERTY_INDEX_EAP_PHASE_2_AUTH, TYPE_STRING }, | |
| 57 { "Outer", PROPERTY_INDEX_EAP_METHOD, TYPE_STRING }, | |
| 58 { "Password", PROPERTY_INDEX_EAP_PASSWORD, TYPE_STRING }, | |
| 59 { "ServerCARef", PROPERTY_INDEX_EAP_CA_CERT, TYPE_STRING }, | |
| 60 { "UseSystemCAs", PROPERTY_INDEX_EAP_USE_SYSTEM_CAS, TYPE_BOOLEAN }, | |
| 61 { NULL } | |
| 62 }; | |
| 63 | |
| 64 OncValueSignature vpn_signature[] = { | |
| 65 { "Host", PROPERTY_INDEX_HOST, TYPE_STRING }, | |
| 66 { "IPsec", PROPERTY_INDEX_ONC_IPSEC, TYPE_DICTIONARY }, | |
| 67 { "L2TP", PROPERTY_INDEX_ONC_L2TP, TYPE_DICTIONARY }, | |
| 68 { "OpenVPN", PROPERTY_INDEX_ONC_OPENVPN, TYPE_DICTIONARY }, | |
| 69 { "Type", PROPERTY_INDEX_PROVIDER_TYPE, TYPE_STRING }, | |
| 70 { NULL } | |
| 71 }; | |
| 72 | |
| 73 OncValueSignature ipsec_signature[] = { | |
| 74 { "AuthenticationType", PROPERTY_INDEX_IPSEC_AUTHENTICATIONTYPE, | |
| 75 TYPE_STRING }, | |
| 76 { "Group", PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME, TYPE_STRING }, | |
| 77 { "IKEVersion", PROPERTY_INDEX_IPSEC_IKEVERSION, TYPE_INTEGER }, | |
| 78 // Note: ClientCertRef, ClientCertPattern, ClientCertType are | |
| 79 // purposefully avoided. | |
| 80 // Note: EAP and XAUTH not yet supported. | |
| 81 { "PSK", PROPERTY_INDEX_L2TPIPSEC_PSK, TYPE_STRING }, | |
| 82 { "SaveCredentials", PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, | |
| 83 { "ServerCARef", PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS, TYPE_STRING }, | |
| 84 { NULL } | |
| 85 }; | |
| 86 | |
| 87 OncValueSignature l2tp_signature[] = { | |
| 88 { "Password", PROPERTY_INDEX_L2TPIPSEC_PASSWORD, TYPE_STRING }, | |
| 89 { "SaveCredentials", PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, | |
| 90 { "Username", PROPERTY_INDEX_L2TPIPSEC_USER, TYPE_STRING }, | |
| 91 { NULL } | |
| 92 }; | |
| 93 | |
| 94 OncValueSignature openvpn_signature[] = { | |
| 95 { "Auth", PROPERTY_INDEX_OPEN_VPN_AUTH, TYPE_STRING }, | |
| 96 { "AuthRetry", PROPERTY_INDEX_OPEN_VPN_AUTHRETRY, TYPE_STRING }, | |
| 97 { "AuthNoCache", PROPERTY_INDEX_OPEN_VPN_AUTHNOCACHE, TYPE_BOOLEAN }, | |
| 98 { "Cipher", PROPERTY_INDEX_OPEN_VPN_CIPHER, TYPE_STRING }, | |
| 99 // Note: ClientCertRef, ClientCertPattern, ClientCertType are | |
| 100 // purposefully avoided. | |
| 101 { "CompLZO", PROPERTY_INDEX_OPEN_VPN_COMPLZO, TYPE_STRING }, | |
| 102 { "CompNoAdapt", PROPERTY_INDEX_OPEN_VPN_COMPNOADAPT, TYPE_BOOLEAN }, | |
| 103 { "KeyDirection", PROPERTY_INDEX_OPEN_VPN_KEYDIRECTION, TYPE_STRING }, | |
| 104 { "NsCertType", PROPERTY_INDEX_OPEN_VPN_NSCERTTYPE, TYPE_STRING }, | |
| 105 { "Password", PROPERTY_INDEX_OPEN_VPN_PASSWORD, TYPE_STRING }, | |
| 106 { "Port", PROPERTY_INDEX_OPEN_VPN_PORT, TYPE_INTEGER }, | |
| 107 { "Proto", PROPERTY_INDEX_OPEN_VPN_PROTO, TYPE_STRING }, | |
| 108 { "PushPeerInfo", PROPERTY_INDEX_OPEN_VPN_PUSHPEERINFO, TYPE_BOOLEAN }, | |
| 109 { "RemoteCertEKU", PROPERTY_INDEX_OPEN_VPN_REMOTECERTEKU, TYPE_STRING }, | |
| 110 // TODO(kmixter): Extract just the first item from this list before | |
| 111 // sending it down. | |
| 112 { "RemoteCertKU", PROPERTY_INDEX_OPEN_VPN_REMOTECERTKU, TYPE_LIST }, | |
| 113 { "RemoteCertTLS", PROPERTY_INDEX_OPEN_VPN_REMOTECERTTLS, TYPE_STRING }, | |
| 114 { "RenegSec", PROPERTY_INDEX_OPEN_VPN_RENEGSEC, TYPE_INTEGER }, | |
| 115 { "SaveCredentials", PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, | |
| 116 { "ServerCARef", PROPERTY_INDEX_OPEN_VPN_CACERT, TYPE_STRING }, | |
| 117 { "ServerCertRef", PROPERTY_INDEX_OPEN_VPN_CERT, TYPE_STRING }, | |
| 118 { "ServerPollTimeout", PROPERTY_INDEX_OPEN_VPN_SERVERPOLLTIMEOUT, | |
| 119 TYPE_INTEGER }, | |
| 120 { "Shaper", PROPERTY_INDEX_OPEN_VPN_SHAPER, TYPE_INTEGER }, | |
| 121 { "StaticChallenge", PROPERTY_INDEX_OPEN_VPN_STATICCHALLENGE, TYPE_STRING }, | |
| 122 { "TLSAuthContents", PROPERTY_INDEX_OPEN_VPN_TLSAUTHCONTENTS, TYPE_STRING }, | |
| 123 { "TLSRemote", PROPERTY_INDEX_OPEN_VPN_TLSREMOTE, TYPE_STRING }, | |
| 124 { "Username", PROPERTY_INDEX_OPEN_VPN_USER, TYPE_STRING }, | |
| 125 { NULL } | |
| 46 }; | 126 }; |
| 47 | 127 |
| 48 // Serve the singleton mapper instance. | 128 // Serve the singleton mapper instance. |
| 49 const EnumMapper<PropertyIndex>* get_onc_mapper() { | 129 const EnumMapper<PropertyIndex>* get_onc_mapper() { |
| 50 CR_DEFINE_STATIC_LOCAL(const EnumMapper<PropertyIndex>, mapper, | 130 CR_DEFINE_STATIC_LOCAL(const EnumMapper<PropertyIndex>, mapper, |
| 51 (property_index_table, | 131 (network_configuration_table, |
| 52 arraysize(property_index_table), | 132 arraysize(network_configuration_table), |
| 53 PROPERTY_INDEX_UNKNOWN)); | 133 PROPERTY_INDEX_UNKNOWN)); |
| 54 return &mapper; | 134 return &mapper; |
| 55 } | 135 } |
| 56 | 136 |
| 57 ConnectionType ParseNetworkType(const std::string& type) { | 137 ConnectionType ParseNetworkType(const std::string& type) { |
| 58 static EnumMapper<ConnectionType>::Pair table[] = { | 138 static EnumMapper<ConnectionType>::Pair table[] = { |
| 59 { "WiFi", TYPE_WIFI }, | 139 { "WiFi", TYPE_WIFI }, |
| 60 { "VPN", TYPE_VPN }, | 140 { "VPN", TYPE_VPN }, |
| 61 }; | 141 }; |
| 62 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionType>, parser, | 142 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionType>, parser, |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 149 return false; | 229 return false; |
| 150 } | 230 } |
| 151 | 231 |
| 152 Network* OncNetworkParser::ParseNetwork(int n) { | 232 Network* OncNetworkParser::ParseNetwork(int n) { |
| 153 if (!network_configs_) | 233 if (!network_configs_) |
| 154 return NULL; | 234 return NULL; |
| 155 DictionaryValue* info = NULL; | 235 DictionaryValue* info = NULL; |
| 156 if (!network_configs_->GetDictionary(n, &info)) | 236 if (!network_configs_->GetDictionary(n, &info)) |
| 157 return NULL; | 237 return NULL; |
| 158 // Parse Open Network Configuration blob into a temporary Network object. | 238 // Parse Open Network Configuration blob into a temporary Network object. |
| 239 // TODO(crosbug.com/23604): Handle removing networks. | |
| 159 return CreateNetworkFromInfo(std::string(), *info); | 240 return CreateNetworkFromInfo(std::string(), *info); |
| 160 } | 241 } |
| 161 | 242 |
| 162 Network* OncNetworkParser::CreateNetworkFromInfo( | 243 Network* OncNetworkParser::CreateNetworkFromInfo( |
| 163 const std::string& service_path, | 244 const std::string& service_path, |
| 164 const DictionaryValue& info) { | 245 const DictionaryValue& info) { |
| 165 ConnectionType type = ParseTypeFromDictionary(info); | 246 ConnectionType type = ParseTypeFromDictionary(info); |
| 166 if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. | 247 if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. |
| 167 return NULL; | 248 return NULL; |
| 168 scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); | 249 scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); |
| 169 // Update property with native value for type. | 250 // Update property with native value for type. |
| 170 std::string str = NativeNetworkParser::network_type_mapper()->GetKey(type); | 251 std::string str = NativeNetworkParser::network_type_mapper()->GetKey(type); |
| 171 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | 252 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); |
| 172 network->UpdatePropertyMap(PROPERTY_INDEX_TYPE, *val.get()); | 253 network->UpdatePropertyMap(PROPERTY_INDEX_TYPE, *val.get()); |
| 173 | 254 |
| 174 // Get the child dictionary with properties for the network. | 255 UpdateNetworkFromInfo(info, network.get()); |
| 175 // And copy all the values from this network type dictionary to parent. | |
| 176 DictionaryValue* dict; | |
| 177 if (!info.GetDictionary(GetTypeFromDictionary(info), &dict)) | |
| 178 return NULL; | |
| 179 | |
| 180 // Add GUID from the parent dictionary. | |
| 181 dict->SetString("GUID", GetGuidFromDictionary(info)); | |
| 182 | |
| 183 UpdateNetworkFromInfo(*dict, network.get()); | |
| 184 VLOG(2) << "Created Network '" << network->name() | 256 VLOG(2) << "Created Network '" << network->name() |
| 185 << "' from info. Path:" << service_path | 257 << "' from info. Path:" << service_path |
| 186 << " Type:" << ConnectionTypeToString(type); | 258 << " Type:" << ConnectionTypeToString(type); |
| 187 return network.release(); | 259 return network.release(); |
| 188 } | 260 } |
| 189 | 261 |
| 190 Network* OncNetworkParser::CreateNewNetwork( | 262 Network* OncNetworkParser::CreateNewNetwork( |
| 191 ConnectionType type, const std::string& service_path) { | 263 ConnectionType type, const std::string& service_path) { |
| 192 Network* network = NetworkParser::CreateNewNetwork(type, service_path); | 264 Network* network = NetworkParser::CreateNewNetwork(type, service_path); |
| 193 if (network) { | 265 if (network) { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 322 module.get(), decoded_pkcs12, string16(), false); | 394 module.get(), decoded_pkcs12, string16(), false); |
| 323 if (result != net::OK) { | 395 if (result != net::OK) { |
| 324 LOG(WARNING) << "ONC File: Unable to import Client certificate at index " | 396 LOG(WARNING) << "ONC File: Unable to import Client certificate at index " |
| 325 << cert_index | 397 << cert_index |
| 326 << " (error " << net::ErrorToString(result) << ")."; | 398 << " (error " << net::ErrorToString(result) << ")."; |
| 327 return false; | 399 return false; |
| 328 } | 400 } |
| 329 return true; | 401 return true; |
| 330 } | 402 } |
| 331 | 403 |
| 404 bool OncNetworkParser::ParseNestedObject(Network* network, | |
| 405 const std::string& onc_type, | |
| 406 const base::Value& value, | |
| 407 OncValueSignature* signature, | |
| 408 ParserPointer parser) { | |
| 409 bool any_errors = false; | |
| 410 if (value.GetType() != Value::TYPE_DICTIONARY) { | |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
Shortcut: value.IsType(base::Value::TYPE_DICTIONAR
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
also, Value is in namespace base nowadays, so you
kmixter1
2011/12/01 19:48:41
Done.
kmixter1
2011/12/01 19:48:41
Added the prefix to be exact but somewhere else it
| |
| 411 VLOG(1) << network->name() << ": expected object of type " << onc_type; | |
| 412 return false; | |
| 413 } | |
| 414 const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); | |
| 415 for (DictionaryValue::key_iterator iter = dict.begin_keys(); | |
| 416 iter != dict.end_keys(); ++iter) { | |
| 417 const std::string& key = *iter; | |
| 418 base::Value* inner_value; | |
| 419 bool res = dict.GetWithoutPathExpansion(key, &inner_value); | |
| 420 if (!res) { | |
| 421 DCHECK(res); | |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
I'd just remove the if and make this a CHECK(). If
Charlie Lee
2011/12/01 18:53:18
Probably don't even need a CHECK(). If it ever fai
kmixter1
2011/12/01 19:48:41
Done.
kmixter1
2011/12/01 19:48:41
Done.
| |
| 422 continue; | |
| 423 } | |
| 424 PropertyIndex index = PROPERTY_INDEX_UNKNOWN; | |
| 425 int field; | |
|
Charlie Lee
2011/12/01 18:53:18
should probably name this something other than fie
kmixter1
2011/12/01 19:48:41
Done.
| |
| 426 for (field = 0; signature[field].field != NULL; ++field) { | |
|
Charlie Lee
2011/12/01 18:53:18
consider using a map instead of an array so it's m
kmixter1
2011/12/01 19:48:41
Yeah, I suspect what we'll want to do is construct
| |
| 427 if (key == signature[field].field) break; | |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
I actually missed that break and were going to com
kmixter1
2011/12/01 19:48:41
Done.
| |
| 428 } | |
| 429 if (signature[field].field != NULL) { | |
| 430 if (inner_value->GetType() != signature[field].type) { | |
| 431 VLOG(1) << network->name() << ": " << onc_type | |
| 432 << " unhandled field: " << key << " Type: " | |
| 433 << inner_value->GetType(); | |
| 434 } else { | |
| 435 if (parser(this, index, *inner_value, network)) { | |
| 436 continue; | |
| 437 } | |
| 438 } | |
| 439 } | |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
I think you can just collapse these nested conditi
kmixter1
2011/12/01 19:48:41
I preferred to give more specific error messages f
| |
| 440 network->UpdatePropertyMap(index, *inner_value); | |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
Do we really want to update the map for unrecogniz
kmixter1
2011/12/01 19:48:41
No, but we do need to update it before we run the
| |
| 441 VLOG(1) << network->name() << ": " << onc_type | |
| 442 << " unhandled field: " << key << " Type: " | |
| 443 << inner_value->GetType(); | |
| 444 any_errors = true; | |
| 445 } | |
| 446 return !any_errors; | |
| 447 } | |
| 448 | |
| 332 // -------------------- OncWirelessNetworkParser -------------------- | 449 // -------------------- OncWirelessNetworkParser -------------------- |
| 333 | 450 |
| 334 OncWirelessNetworkParser::OncWirelessNetworkParser() {} | 451 OncWirelessNetworkParser::OncWirelessNetworkParser() {} |
| 335 OncWirelessNetworkParser::~OncWirelessNetworkParser() {} | 452 OncWirelessNetworkParser::~OncWirelessNetworkParser() {} |
| 336 | 453 |
| 337 bool OncWirelessNetworkParser::ParseValue(PropertyIndex index, | 454 bool OncWirelessNetworkParser::ParseValue(PropertyIndex index, |
| 338 const base::Value& value, | 455 const base::Value& value, |
| 339 Network* network) { | 456 Network* network) { |
| 340 DCHECK_NE(TYPE_ETHERNET, network->type()); | 457 DCHECK_NE(TYPE_ETHERNET, network->type()); |
| 341 DCHECK_NE(TYPE_VPN, network->type()); | 458 DCHECK_NE(TYPE_VPN, network->type()); |
| 342 return OncNetworkParser::ParseValue(index, value, network); | 459 return OncNetworkParser::ParseValue(index, value, network); |
| 343 } | 460 } |
| 344 | 461 |
| 345 // -------------------- OncWifiNetworkParser -------------------- | 462 // -------------------- OncWifiNetworkParser -------------------- |
| 346 | 463 |
| 347 OncWifiNetworkParser::OncWifiNetworkParser() {} | 464 OncWifiNetworkParser::OncWifiNetworkParser() { |
|
Charlie Lee
2011/12/01 18:53:18
nit: probably unnecessary
kmixter1
2011/12/01 19:48:41
Done.
| |
| 465 } | |
| 466 | |
| 348 OncWifiNetworkParser::~OncWifiNetworkParser() {} | 467 OncWifiNetworkParser::~OncWifiNetworkParser() {} |
| 349 | 468 |
| 350 bool OncWifiNetworkParser::ParseValue(PropertyIndex index, | 469 bool OncWifiNetworkParser::ParseValue(PropertyIndex index, |
| 351 const base::Value& value, | 470 const base::Value& value, |
| 352 Network* network) { | 471 Network* network) { |
| 353 DCHECK_EQ(TYPE_WIFI, network->type()); | 472 DCHECK_EQ(TYPE_WIFI, network->type()); |
| 354 WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); | 473 WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); |
| 355 switch (index) { | 474 switch (index) { |
| 356 case PROPERTY_INDEX_SSID: { | 475 case PROPERTY_INDEX_ONC_WIFI: { |
| 357 std::string ssid; | 476 // TODO(kmixter): Purposefully ignore return value? |
| 358 if (!value.GetAsString(&ssid)) | 477 ParseNestedObject(wifi_network, "WiFi", value, |
| 359 break; | 478 wifi_signature, ParseWifiValue); |
| 360 wifi_network->SetName(ssid); | |
| 361 return true; | 479 return true; |
| 362 } | 480 } |
| 481 default: | |
| 482 return OncNetworkParser::ParseValue(index, value, network); | |
| 483 } | |
| 484 } | |
| 485 | |
| 486 bool OncWifiNetworkParser::ParseWifiValue(OncNetworkParser* parser, | |
| 487 PropertyIndex index, | |
| 488 const base::Value& value, | |
| 489 Network* network) { | |
| 490 WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); | |
| 491 std::string string_value; | |
| 492 value.GetAsString(&string_value); | |
| 493 switch (index) { | |
| 494 case PROPERTY_INDEX_SSID: | |
| 495 wifi_network->SetName(string_value); | |
| 496 return true; | |
| 363 case PROPERTY_INDEX_GUID: { | 497 case PROPERTY_INDEX_GUID: { |
| 364 std::string unique_id; | 498 wifi_network->set_unique_id(string_value); |
| 365 if (!value.GetAsString(&unique_id)) | |
| 366 break; | |
| 367 wifi_network->set_unique_id(unique_id); | |
| 368 return true; | 499 return true; |
| 369 } | |
| 370 case PROPERTY_INDEX_SECURITY: { | 500 case PROPERTY_INDEX_SECURITY: { |
| 371 std::string security_string; | 501 ConnectionSecurity security = ParseSecurity(string_value); |
| 372 if (!value.GetAsString(&security_string)) | |
| 373 break; | |
| 374 ConnectionSecurity security = ParseSecurity(security_string); | |
| 375 wifi_network->set_encryption(security); | 502 wifi_network->set_encryption(security); |
| 376 // Also update property with native value for security. | 503 // Also update property with native value for security. |
| 377 std::string str = | 504 std::string str = |
| 378 NativeNetworkParser::network_security_mapper()->GetKey(security); | 505 NativeNetworkParser::network_security_mapper()->GetKey(security); |
| 379 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | 506 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); |
| 380 wifi_network->UpdatePropertyMap(index, *val.get()); | 507 wifi_network->UpdatePropertyMap(index, *val.get()); |
| 381 return true; | 508 return true; |
| 382 } | 509 } |
| 383 case PROPERTY_INDEX_PASSPHRASE: { | 510 case PROPERTY_INDEX_PASSPHRASE: |
| 384 std::string passphrase; | 511 wifi_network->set_passphrase(string_value); |
| 385 if (!value.GetAsString(&passphrase)) | |
| 386 break; | |
| 387 wifi_network->set_passphrase(passphrase); | |
| 388 return true; | 512 return true; |
| 389 } | 513 case PROPERTY_INDEX_IDENTITY: |
| 390 case PROPERTY_INDEX_IDENTITY: { | 514 wifi_network->set_identity(string_value); |
| 391 std::string identity; | |
| 392 if (!value.GetAsString(&identity)) | |
| 393 break; | |
| 394 wifi_network->set_identity(identity); | |
| 395 return true; | 515 return true; |
| 396 } | 516 case PROPERTY_INDEX_EAP: |
| 397 case PROPERTY_INDEX_EAP: { | 517 parser->ParseNestedObject(wifi_network, |
| 398 DCHECK_EQ(value.GetType(), Value::TYPE_DICTIONARY); | 518 "EAP", |
| 399 const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); | 519 value, |
| 400 for (DictionaryValue::key_iterator iter = dict.begin_keys(); | 520 eap_signature, |
| 401 iter != dict.end_keys(); ++iter) { | 521 ParseEAPValue); |
| 402 const std::string& key = *iter; | |
| 403 base::Value* eap_value; | |
| 404 bool res = dict.GetWithoutPathExpansion(key, &eap_value); | |
| 405 DCHECK(res); | |
| 406 if (res) { | |
| 407 PropertyIndex index = mapper().Get(key); | |
| 408 wifi_network->UpdatePropertyMap(index, *eap_value); | |
| 409 if (!ParseEAPValue(index, *eap_value, wifi_network)) | |
| 410 VLOG(1) << network->name() << ": EAP unhandled key: " << key | |
| 411 << " Type: " << eap_value->GetType(); | |
| 412 } | |
| 413 } | |
| 414 return true; | 522 return true; |
| 415 } | 523 |
| 524 case PROPERTY_INDEX_AUTO_CONNECT: | |
| 525 case PROPERTY_INDEX_HIDDEN_SSID: | |
| 526 // Pass these through to connection manager as is. | |
| 527 return true; | |
| 528 | |
| 416 default: | 529 default: |
| 417 return OncWirelessNetworkParser::ParseValue(index, value, network); | 530 break; |
| 418 } | 531 } |
| 419 return false; | 532 return false; |
| 420 } | 533 } |
| 421 | 534 |
| 422 | 535 |
| 423 bool OncWifiNetworkParser::ParseEAPValue(PropertyIndex index, | 536 bool OncWifiNetworkParser::ParseEAPValue(OncNetworkParser*, |
| 537 PropertyIndex index, | |
| 424 const base::Value& value, | 538 const base::Value& value, |
| 425 WifiNetwork* wifi_network) { | 539 Network* network) { |
| 540 WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); | |
| 541 std::string string_value; | |
| 542 bool bool_value = false; | |
| 543 | |
| 544 value.GetAsString(&string_value); | |
| 545 value.GetAsBoolean(&bool_value); | |
| 546 | |
| 426 switch (index) { | 547 switch (index) { |
| 427 case PROPERTY_INDEX_EAP_IDENTITY: { | 548 case PROPERTY_INDEX_EAP_IDENTITY: |
| 428 std::string eap_identity; | 549 wifi_network->set_eap_identity(string_value); |
| 429 if (!value.GetAsString(&eap_identity)) | |
| 430 break; | |
| 431 wifi_network->set_eap_identity(eap_identity); | |
| 432 return true; | 550 return true; |
| 433 } | |
| 434 case PROPERTY_INDEX_EAP_METHOD: { | 551 case PROPERTY_INDEX_EAP_METHOD: { |
| 435 std::string eap_method_str; | 552 EAPMethod eap_method = ParseEAPMethod(string_value); |
| 436 if (!value.GetAsString(&eap_method_str)) | |
| 437 break; | |
| 438 EAPMethod eap_method = ParseEAPMethod(eap_method_str); | |
| 439 wifi_network->set_eap_method(eap_method); | 553 wifi_network->set_eap_method(eap_method); |
| 440 // Also update property with native value for EAP method. | 554 // Also update property with native value for EAP method. |
| 441 std::string str = | 555 std::string str = |
| 442 NativeNetworkParser::network_eap_method_mapper()->GetKey(eap_method); | 556 NativeNetworkParser::network_eap_method_mapper()->GetKey(eap_method); |
| 443 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | 557 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); |
| 444 wifi_network->UpdatePropertyMap(index, *val.get()); | 558 wifi_network->UpdatePropertyMap(index, *val.get()); |
| 445 return true; | 559 return true; |
| 446 } | 560 } |
| 447 case PROPERTY_INDEX_EAP_PHASE_2_AUTH: { | 561 case PROPERTY_INDEX_EAP_PHASE_2_AUTH: { |
| 448 std::string eap_phase_2_auth_str; | 562 EAPPhase2Auth eap_phase_2_auth = ParseEAPPhase2Auth(string_value); |
| 449 if (!value.GetAsString(&eap_phase_2_auth_str)) | |
| 450 break; | |
| 451 EAPPhase2Auth eap_phase_2_auth = ParseEAPPhase2Auth(eap_phase_2_auth_str); | |
| 452 wifi_network->set_eap_phase_2_auth(eap_phase_2_auth); | 563 wifi_network->set_eap_phase_2_auth(eap_phase_2_auth); |
| 453 // Also update property with native value for EAP phase 2 auth. | 564 // Also update property with native value for EAP phase 2 auth. |
| 454 std::string str = NativeNetworkParser::network_eap_auth_mapper()->GetKey( | 565 std::string str = NativeNetworkParser::network_eap_auth_mapper()->GetKey( |
| 455 eap_phase_2_auth); | 566 eap_phase_2_auth); |
| 456 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | 567 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); |
| 457 wifi_network->UpdatePropertyMap(index, *val.get()); | 568 wifi_network->UpdatePropertyMap(index, *val.get()); |
| 458 return true; | 569 return true; |
| 459 } | 570 } |
| 460 case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY: { | 571 case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY: |
| 461 std::string eap_anonymous_identity; | 572 wifi_network->set_eap_anonymous_identity(string_value); |
| 462 if (!value.GetAsString(&eap_anonymous_identity)) | |
| 463 break; | |
| 464 wifi_network->set_eap_anonymous_identity(eap_anonymous_identity); | |
| 465 return true; | 573 return true; |
| 466 } | 574 case PROPERTY_INDEX_EAP_CERT_ID: |
| 467 case PROPERTY_INDEX_EAP_CERT_ID: { | 575 wifi_network->set_eap_client_cert_pkcs11_id(string_value); |
| 468 std::string eap_client_cert_pkcs11_id; | |
| 469 if (!value.GetAsString(&eap_client_cert_pkcs11_id)) | |
| 470 break; | |
| 471 wifi_network->set_eap_client_cert_pkcs11_id(eap_client_cert_pkcs11_id); | |
| 472 return true; | 576 return true; |
| 473 } | 577 case PROPERTY_INDEX_EAP_CA_CERT_NSS: |
| 474 case PROPERTY_INDEX_EAP_CA_CERT_NSS: { | 578 wifi_network->set_eap_server_ca_cert_nss_nickname(string_value); |
| 475 std::string eap_server_ca_cert_nss_nickname; | |
| 476 if (!value.GetAsString(&eap_server_ca_cert_nss_nickname)) | |
| 477 break; | |
| 478 wifi_network->set_eap_server_ca_cert_nss_nickname( | |
| 479 eap_server_ca_cert_nss_nickname); | |
| 480 return true; | 579 return true; |
| 481 } | 580 case PROPERTY_INDEX_EAP_USE_SYSTEM_CAS: |
| 482 case PROPERTY_INDEX_EAP_USE_SYSTEM_CAS: { | 581 wifi_network->set_eap_use_system_cas(bool_value); |
| 483 bool eap_use_system_cas; | |
| 484 if (!value.GetAsBoolean(&eap_use_system_cas)) | |
| 485 break; | |
| 486 wifi_network->set_eap_use_system_cas(eap_use_system_cas); | |
| 487 return true; | 582 return true; |
| 488 } | 583 case PROPERTY_INDEX_EAP_PASSWORD: |
| 489 case PROPERTY_INDEX_EAP_PASSWORD: { | 584 wifi_network->set_eap_passphrase(string_value); |
| 490 std::string eap_passphrase; | |
| 491 if (!value.GetAsString(&eap_passphrase)) | |
| 492 break; | |
| 493 wifi_network->set_eap_passphrase(eap_passphrase); | |
| 494 return true; | 585 return true; |
| 495 } | |
| 496 default: | 586 default: |
| 497 break; | 587 break; |
| 498 } | 588 } |
| 499 return false; | 589 return false; |
| 500 } | 590 } |
| 501 | 591 |
| 502 ConnectionSecurity OncWifiNetworkParser::ParseSecurity( | 592 ConnectionSecurity OncWifiNetworkParser::ParseSecurity( |
| 503 const std::string& security) { | 593 const std::string& security) { |
| 504 static EnumMapper<ConnectionSecurity>::Pair table[] = { | 594 static EnumMapper<ConnectionSecurity>::Pair table[] = { |
| 505 { "None", SECURITY_NONE }, | 595 { "None", SECURITY_NONE }, |
| 506 { "WEP", SECURITY_WEP }, | 596 { "WEP-PSK", SECURITY_WEP }, |
| 507 { "WPA", SECURITY_WPA }, | 597 { "WPA-PSK", SECURITY_WPA }, |
| 508 { "WPA2", SECURITY_8021X }, | 598 { "WPA-EAP", SECURITY_8021X }, |
| 509 }; | 599 }; |
| 510 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionSecurity>, parser, | 600 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionSecurity>, parser, |
| 511 (table, arraysize(table), SECURITY_UNKNOWN)); | 601 (table, arraysize(table), SECURITY_UNKNOWN)); |
| 512 return parser.Get(security); | 602 return parser.Get(security); |
| 513 } | 603 } |
| 514 | 604 |
| 515 EAPMethod OncWifiNetworkParser::ParseEAPMethod(const std::string& method) { | 605 EAPMethod OncWifiNetworkParser::ParseEAPMethod(const std::string& method) { |
| 516 static EnumMapper<EAPMethod>::Pair table[] = { | 606 static EnumMapper<EAPMethod>::Pair table[] = { |
| 517 { "PEAP", EAP_METHOD_PEAP }, | 607 { "PEAP", EAP_METHOD_PEAP }, |
| 518 { "EAP-TLS", EAP_METHOD_TLS }, | 608 { "EAP-TLS", EAP_METHOD_TLS }, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 561 return true; | 651 return true; |
| 562 } | 652 } |
| 563 | 653 |
| 564 bool OncVirtualNetworkParser::ParseValue(PropertyIndex index, | 654 bool OncVirtualNetworkParser::ParseValue(PropertyIndex index, |
| 565 const base::Value& value, | 655 const base::Value& value, |
| 566 Network* network) { | 656 Network* network) { |
| 567 DCHECK_EQ(TYPE_VPN, network->type()); | 657 DCHECK_EQ(TYPE_VPN, network->type()); |
| 568 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); | 658 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
| 569 switch (index) { | 659 switch (index) { |
| 570 case PROPERTY_INDEX_PROVIDER: { | 660 case PROPERTY_INDEX_PROVIDER: { |
| 571 DCHECK_EQ(value.GetType(), Value::TYPE_DICTIONARY); | 661 // Got the "VPN" field. Immediately store the VPN.Type field value |
| 662 // so that we can properly validate nested objects based on the type. | |
| 663 if (value.GetType() != Value::TYPE_DICTIONARY) { | |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
there's value.IsType() for this.
kmixter1
2011/12/01 19:48:41
Done.
| |
| 664 VLOG(1) << network->name() << ": expected object of type VPN"; | |
| 665 return false; | |
| 666 } | |
| 572 const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); | 667 const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
To avoid the cast, you could replace lines 663-667
kmixter1
2011/12/01 19:48:41
Done.
| |
| 573 for (DictionaryValue::key_iterator iter = dict.begin_keys(); | 668 Value *provider_type_value; |
| 574 iter != dict.end_keys(); ++iter) { | 669 dict.GetWithoutPathExpansion("Type", &provider_type_value); |
| 575 const std::string& key = *iter; | 670 if (provider_type_value == NULL) { |
| 576 base::Value* provider_value; | 671 VLOG(1) << network->name() << ": VPN.Type is missing"; |
| 577 bool res = dict.GetWithoutPathExpansion(key, &provider_value); | 672 return false; |
| 578 DCHECK(res); | |
| 579 if (res) { | |
| 580 PropertyIndex index = mapper().Get(key); | |
| 581 if (!ParseProviderValue(index, *provider_value, virtual_network)) | |
| 582 VLOG(1) << network->name() << ": Provider unhandled key: " << key | |
| 583 << " Type: " << provider_value->GetType(); | |
| 584 } | |
| 585 } | 673 } |
| 674 std::string provider_type_string; | |
| 675 if (!provider_type_value->GetAsString(&provider_type_string)) | |
| 676 break; | |
|
Mattias Nissler (ping if slow)
2011/12/01 13:09:10
Lines 668-676 shorter:
std::string provider_type_
kmixter1
2011/12/01 19:48:41
Done.
| |
| 677 virtual_network->set_provider_type( | |
| 678 ParseProviderType(provider_type_string)); | |
| 679 ParseNestedObject(network, "VPN", value, vpn_signature, ParseVPNValue); | |
| 586 return true; | 680 return true; |
| 587 } | 681 } |
| 588 default: | 682 default: |
| 589 return OncNetworkParser::ParseValue(index, value, network); | 683 return OncNetworkParser::ParseValue(index, value, network); |
| 590 break; | 684 break; |
| 591 } | 685 } |
| 592 return false; | 686 return false; |
| 593 } | 687 } |
| 594 | 688 |
| 595 bool OncVirtualNetworkParser::ParseProviderValue(PropertyIndex index, | 689 bool OncVirtualNetworkParser::ParseVPNValue(OncNetworkParser* parser, |
| 596 const base::Value& value, | 690 PropertyIndex index, |
| 597 VirtualNetwork* network) { | 691 const base::Value& value, |
| 692 Network* network) { | |
| 693 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); | |
| 694 std::string string_value; | |
| 695 value.GetAsString(&string_value); | |
| 598 switch (index) { | 696 switch (index) { |
| 599 case PROPERTY_INDEX_HOST: { | 697 case PROPERTY_INDEX_HOST: |
| 600 std::string server_hostname; | 698 virtual_network->set_server_hostname(string_value); |
| 601 if (!value.GetAsString(&server_hostname)) | 699 return true; |
| 602 break; | 700 case PROPERTY_INDEX_ONC_IPSEC: { |
| 603 network->set_server_hostname(server_hostname); | 701 if (virtual_network->provider_type() != PROVIDER_TYPE_L2TP_IPSEC_PSK && |
| 702 virtual_network->provider_type() != | |
| 703 PROVIDER_TYPE_L2TP_IPSEC_USER_CERT) { | |
| 704 VLOG(1) << "IPsec field not allowed with this VPN type"; | |
| 705 return false; | |
| 706 } | |
| 707 parser->ParseNestedObject(network, | |
| 708 "L2TP", | |
| 709 value, | |
| 710 l2tp_signature, | |
| 711 ParseL2TPValue); | |
| 604 return true; | 712 return true; |
| 605 } | 713 } |
| 606 case PROPERTY_INDEX_NAME: { | 714 case PROPERTY_INDEX_ONC_L2TP: { |
| 607 std::string name; | 715 if (virtual_network->provider_type() != PROVIDER_TYPE_L2TP_IPSEC_PSK) { |
| 608 if (!value.GetAsString(&name)) | 716 VLOG(1) << "L2TP field not allowed with this VPN type"; |
| 609 break; | 717 return false; |
| 610 network->set_name(name); | 718 } |
| 719 parser->ParseNestedObject(network, | |
| 720 "IPsec", | |
| 721 value, | |
| 722 ipsec_signature, | |
| 723 ParseIPsecValue); | |
| 611 return true; | 724 return true; |
| 612 } | 725 } |
| 613 case PROPERTY_INDEX_TYPE: { | 726 case PROPERTY_INDEX_ONC_OPENVPN: { |
| 614 std::string provider_type_string; | 727 if (network->provider_type() != PROVIDER_TYPE_L2TP_IPSEC_PSK) { |
| 615 if (!value.GetAsString(&provider_type_string)) | 728 VLOG(1) << "OpenVPN field not allowed with this VPN type"; |
| 616 break; | 729 return false; |
| 617 network->set_provider_type(ParseProviderType(provider_type_string)); | 730 } |
| 731 parser->ParseNestedObject(network, | |
| 732 "OpenVPN", | |
| 733 value, | |
| 734 openvpn_signature, | |
| 735 ParseOpenVPNValue); | |
| 618 return true; | 736 return true; |
| 619 } | 737 } |
| 620 case PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS: { | 738 case PROPERTY_INDEX_PROVIDER_TYPE: { |
| 621 std::string ca_cert_nss; | 739 // This was handled when we found the VPN field. |
| 622 if (!value.GetAsString(&ca_cert_nss)) | |
| 623 break; | |
| 624 network->set_ca_cert_nss(ca_cert_nss); | |
| 625 return true; | |
| 626 } | |
| 627 case PROPERTY_INDEX_L2TPIPSEC_PSK: { | |
| 628 std::string psk_passphrase; | |
| 629 if (!value.GetAsString(&psk_passphrase)) | |
| 630 break; | |
| 631 network->set_psk_passphrase(psk_passphrase); | |
| 632 return true; | |
| 633 } | |
| 634 case PROPERTY_INDEX_L2TPIPSEC_CLIENT_CERT_ID: { | |
| 635 std::string client_cert_id; | |
| 636 if (!value.GetAsString(&client_cert_id)) | |
| 637 break; | |
| 638 network->set_client_cert_id(client_cert_id); | |
| 639 return true; | |
| 640 } | |
| 641 case PROPERTY_INDEX_L2TPIPSEC_USER: { | |
| 642 std::string username; | |
| 643 if (!value.GetAsString(&username)) | |
| 644 break; | |
| 645 network->set_username(username); | |
| 646 return true; | |
| 647 } | |
| 648 case PROPERTY_INDEX_L2TPIPSEC_PASSWORD: { | |
| 649 std::string user_passphrase; | |
| 650 if (!value.GetAsString(&user_passphrase)) | |
| 651 break; | |
| 652 network->set_user_passphrase(user_passphrase); | |
| 653 return true; | |
| 654 } | |
| 655 case PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME: { | |
| 656 std::string group_name; | |
| 657 if (!value.GetAsString(&group_name)) | |
| 658 break; | |
| 659 network->set_group_name(group_name); | |
| 660 return true; | 740 return true; |
| 661 } | 741 } |
| 662 default: | 742 default: |
| 663 break; | 743 break; |
| 664 } | 744 } |
| 665 return false; | 745 return false; |
| 666 } | 746 } |
| 747 | |
| 748 bool OncVirtualNetworkParser::ParseIPsecValue(OncWifiNetworkParser* parser, | |
| 749 PropertyIndex index, | |
| 750 const base::Value& value, | |
| 751 Network* network) { | |
| 752 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); | |
| 753 std::string server_hostname; | |
| 754 bool bool_value = false; | |
| 755 value.GetAsString(&string_value); | |
| 756 value.GetAsBoolean(&bool_value); | |
| 757 | |
| 758 switch (index) { | |
| 759 case PROPERTY_INDEX_IPSEC_AUTHENTICATIONTYPE: | |
| 760 network->set_provider_type(UpdateProviderTypeWithAuth(network->provider(), | |
| 761 string_value)); | |
| 762 return true; | |
| 763 case PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS: | |
| 764 network->set_ca_cert_nss(string_value); | |
| 765 return true; | |
| 766 case PROPERTY_INDEX_L2TPIPSEC_PSK: | |
| 767 network->set_psk_passphrase(string_value); | |
| 768 return true; | |
| 769 case PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME: | |
| 770 network->set_group_name(string_value); | |
| 771 return true; | |
| 772 case PROPERTY_INDEX_SAVE_CREDENTIALS: | |
| 773 // Note that the specification allows different settings for | |
| 774 // IPsec credentials (PSK) and L2TP credentials (username and | |
| 775 // password) but we merge them in our implementation as is required | |
| 776 // with the current connection manager. | |
| 777 network->set_save_credentials(bool_value); | |
| 778 return true; | |
| 779 } | |
| 780 return false; | |
| 781 } | |
| 782 | |
| 783 ProviderType OncVirtualNetworkParser::UpdateProviderTypeWithAuth( | |
| 784 ProviderType provider, | |
| 785 const std::string& auth_type) { | |
| 786 switch (provider) { | |
| 787 case PROVIDER_TYPE_L2TP_IPSEC_PSK: | |
| 788 case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: | |
| 789 if (auth_type == "Cert") { | |
| 790 return PROVIDER_TYPE_L2TP_IPSEC_USER_CERT; | |
| 791 } else { | |
| 792 if (auth_type != "PSK") { | |
| 793 VLOG(1) << "Unexpected authentication type " << auth_type; | |
| 794 break; | |
| 795 } | |
| 796 return PROVIDER_TYPE_L2TP_IPSEC_PSK; | |
| 797 } | |
| 798 default: | |
| 799 VLOG(1) << "Unexpected provider type with authentication type " | |
| 800 << auth_type; | |
| 801 break; | |
| 802 } | |
| 803 return provider; | |
| 804 } | |
| 805 | |
| 806 bool OncVirtualNetworkParser::ParseL2TPValue(OncNetworkParser*, | |
| 807 PropertyIndex index, | |
| 808 const base::Value& value, | |
| 809 Network* network) { | |
| 810 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); | |
| 811 std::string string_value; | |
| 812 bool bool_value = false; | |
| 813 value.GetAsString(&string_value); | |
| 814 value.GetAsBoolean(&bool_value); | |
| 815 switch (index) { | |
| 816 case PROPERTY_INDEX_L2TPIPSEC_PASSWORD: | |
| 817 virtual_network->set_user_passphrase(string_value); | |
| 818 return true; | |
| 819 case PROPERTY_INDEX_L2TPIPSEC_USER: { | |
| 820 virtual_network->set_username(string_value); | |
| 821 return true; | |
| 822 case PROPERTY_INDEX_SAVE_CREDENTIALS: | |
| 823 // Note that the specification allows different settings for | |
| 824 // IPsec credentials (PSK) and L2TP credentials (username and | |
| 825 // password) but we merge them in our implementation as is required | |
| 826 // with the current connection manager. | |
| 827 virtual_network->set_save_credentials(bool_value); | |
| 828 return true; | |
| 829 } | |
| 830 return false; | |
| 831 } | |
| 832 | |
| 833 bool OncVirtualNetworkParser::ParseOpenVPNValue(OncNetworkParser*, | |
| 834 PropertyIndex index, | |
| 835 const base::Value& value, | |
| 836 Network* network) { | |
| 837 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); | |
| 838 std::string string_value; | |
| 839 bool bool_value = false; | |
| 840 value.GetAsString(&string_value); | |
| 841 value.GetAsBoolean(&bool_value); | |
| 842 switch (index) { | |
| 843 case PROPERTY_INDEX_OPEN_VPN_PASSWORD: | |
| 844 virtual_network->set_user_passphrase(string_value); | |
| 845 return true; | |
| 846 case PROPERTY_INDEX_OPEN_VPN_USER: | |
| 847 virtual_network->set_username(string_value); | |
| 848 return true; | |
| 849 case PROPERTY_INDEX_SAVE_CREDENTIALS: | |
| 850 virtual_network->set_save_credentials(bool_value); | |
| 851 return true; | |
| 852 case PROPERTY_INDEX_OPEN_VPN_CACERT: | |
| 853 virtual_network->set_ca_cert_nss(string_value); | |
| 854 return true; | |
| 855 | |
| 856 case PROPERTY_INDEX_OPEN_VPN_AUTH: | |
| 857 case PROPERTY_INDEX_OPEN_VPN_AUTHRETRY: | |
| 858 case PROPERTY_INDEX_OPEN_VPN_AUTHNOCACHE: | |
| 859 case PROPERTY_INDEX_OPEN_VPN_CERT: | |
| 860 case PROPERTY_INDEX_OPEN_VPN_CIPHER: | |
| 861 case PROPERTY_INDEX_OPEN_VPN_COMPLZO: | |
| 862 case PROPERTY_INDEX_OPEN_VPN_COMPNOADAPT: | |
| 863 case PROPERTY_INDEX_OPEN_VPN_KEYDIRECTION: | |
| 864 case PROPERTY_INDEX_OPEN_VPN_NSCERTTYPE: | |
| 865 case PROPERTY_INDEX_OPEN_VPN_PORT: | |
| 866 case PROPERTY_INDEX_OPEN_VPN_PROTO: | |
| 867 case PROPERTY_INDEX_OPEN_VPN_PUSHPEERINFO: | |
| 868 case PROPERTY_INDEX_OPEN_VPN_REMOTECERTEKU: | |
| 869 case PROPERTY_INDEX_OPEN_VPN_REMOTECERTKU: | |
| 870 case PROPERTY_INDEX_OPEN_VPN_REMOTECERTTLS: | |
| 871 case PROPERTY_INDEX_OPEN_VPN_RENEGSEC: | |
| 872 case PROPERTY_INDEX_OPEN_VPN_SERVERPOLLTIMEOUT: | |
| 873 case PROPERTY_INDEX_OPEN_VPN_SHAPER: | |
| 874 case PROPERTY_INDEX_OPEN_VPN_STATICCHALLENGE: | |
| 875 case PROPERTY_INDEX_OPEN_VPN_TLSAUTHCONTENTS: | |
| 876 case PROPERTY_INDEX_OPEN_VPN_TLSREMOTE: | |
| 877 // Pass these through to connection manager as is. | |
| 878 return true; | |
| 879 } | |
| 880 return false; | |
| 881 } | |
| 667 | 882 |
| 668 ProviderType OncVirtualNetworkParser::ParseProviderType( | 883 ProviderType OncVirtualNetworkParser::ParseProviderType( |
| 669 const std::string& type) { | 884 const std::string& type) { |
| 670 static EnumMapper<ProviderType>::Pair table[] = { | 885 static EnumMapper<ProviderType>::Pair table[] = { |
| 671 { flimflam::kProviderL2tpIpsec, PROVIDER_TYPE_L2TP_IPSEC_PSK }, | 886 // We initially map to L2TP-IPsec PSK and then fix this up based |
| 672 { flimflam::kProviderOpenVpn, PROVIDER_TYPE_OPEN_VPN }, | 887 // on the value of AuthenticationType. |
| 888 { "L2TP-IPsec", PROVIDER_TYPE_L2TP_IPSEC_PSK }, | |
| 889 { "OpenVPN", PROVIDER_TYPE_OPEN_VPN }, | |
| 673 }; | 890 }; |
| 674 CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser, | 891 CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser, |
| 675 (table, arraysize(table), PROVIDER_TYPE_MAX)); | 892 (table, arraysize(table), PROVIDER_TYPE_MAX)); |
| 676 return parser.Get(type); | 893 return parser.Get(type); |
| 677 } | 894 } |
| 678 | 895 |
| 679 } // namespace chromeos | 896 } // namespace chromeos |
| OLD | NEW |