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/json/json_writer.h" // for debug output only. | |
9 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
10 #include "base/values.h" | 11 #include "base/values.h" |
11 #include "chrome/browser/chromeos/cros/native_network_constants.h" | 12 #include "chrome/browser/chromeos/cros/native_network_constants.h" |
12 #include "chrome/browser/chromeos/cros/native_network_parser.h" | 13 #include "chrome/browser/chromeos/cros/native_network_parser.h" |
13 #include "chrome/browser/chromeos/cros/network_library.h" | 14 #include "chrome/browser/chromeos/cros/network_library.h" |
14 #include "net/base/cert_database.h" | 15 #include "net/base/cert_database.h" |
15 #include "net/base/crypto_module.h" | 16 #include "net/base/crypto_module.h" |
16 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
17 #include "net/base/x509_certificate.h" | 18 #include "net/base/x509_certificate.h" |
18 #include "third_party/cros_system_api/dbus/service_constants.h" | 19 #include "third_party/cros_system_api/dbus/service_constants.h" |
19 | 20 |
20 namespace chromeos { | 21 namespace chromeos { |
21 | 22 |
22 // Local constants. | 23 // Local constants. |
23 namespace { | 24 namespace { |
24 | 25 |
25 EnumMapper<PropertyIndex>::Pair property_index_table[] = { | 26 const base::Value::Type TYPE_BOOLEAN = base::Value::TYPE_BOOLEAN; |
26 { "GUID", PROPERTY_INDEX_GUID }, | 27 const base::Value::Type TYPE_DICTIONARY = base::Value::TYPE_DICTIONARY; |
27 { "Name", PROPERTY_INDEX_NAME }, | 28 const base::Value::Type TYPE_INTEGER = base::Value::TYPE_INTEGER; |
28 { "Remove", PROPERTY_INDEX_REMOVE }, | 29 const base::Value::Type TYPE_LIST = base::Value::TYPE_LIST; |
29 { "ProxyURL", PROPERTY_INDEX_PROXY_CONFIG }, | 30 const base::Value::Type TYPE_STRING = base::Value::TYPE_STRING; |
30 { "Type", PROPERTY_INDEX_TYPE }, | 31 |
31 { "SSID", PROPERTY_INDEX_SSID }, | 32 // Only used currently to keep NetworkParser superclass happy. |
32 { "Passphrase", PROPERTY_INDEX_PASSPHRASE }, | 33 EnumMapper<PropertyIndex>::Pair network_configuration_table[] = { |
33 { "AutoConnect", PROPERTY_INDEX_AUTO_CONNECT }, | 34 { "GUID", PROPERTY_INDEX_GUID } |
34 { "HiddenSSID", PROPERTY_INDEX_HIDDEN_SSID }, | 35 }; |
35 { "Security", PROPERTY_INDEX_SECURITY }, | 36 |
36 { "EAP", PROPERTY_INDEX_EAP }, | 37 OncValueSignature network_configuration_signature[] = { |
37 { "Outer", PROPERTY_INDEX_EAP_METHOD }, | 38 // TODO(crosbug.com/23673): Support Ethernet settings. |
38 { "Inner", PROPERTY_INDEX_EAP_PHASE_2_AUTH }, | 39 { "GUID", PROPERTY_INDEX_GUID, TYPE_STRING }, |
39 { "UseSystemCAs", PROPERTY_INDEX_EAP_USE_SYSTEM_CAS }, | 40 { "Name", PROPERTY_INDEX_NAME, TYPE_STRING }, |
40 { "ServerCARef", PROPERTY_INDEX_EAP_CA_CERT }, | 41 // TODO(crosbug.com/23674): Support ProxySettings. |
41 { "ClientCARef", PROPERTY_INDEX_EAP_CLIENT_CERT }, | 42 // TODO(crosbug.com/23604): Handle removing networks. |
42 { "ClientCertPattern", PROPERTY_INDEX_EAP_CLIENT_CERT_PATTERN }, | 43 { "Remove", PROPERTY_INDEX_ONC_REMOVE, TYPE_BOOLEAN }, |
43 { "Identity", PROPERTY_INDEX_EAP_IDENTITY }, | 44 { "Type", PROPERTY_INDEX_TYPE, TYPE_STRING }, |
44 { "Password", PROPERTY_INDEX_EAP_PASSWORD }, | 45 { "WiFi", PROPERTY_INDEX_ONC_WIFI, TYPE_DICTIONARY }, |
45 { "AnonymousIdentity", PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY }, | 46 { "VPN", PROPERTY_INDEX_ONC_VPN, TYPE_DICTIONARY } |
47 }; | |
48 | |
49 OncValueSignature wifi_signature[] = { | |
50 { "AutoConnect", PROPERTY_INDEX_AUTO_CONNECT, TYPE_BOOLEAN }, | |
51 { "EAP", PROPERTY_INDEX_EAP, TYPE_DICTIONARY }, | |
52 { "HiddenSSID", PROPERTY_INDEX_HIDDEN_SSID, TYPE_BOOLEAN }, | |
53 { "Passphrase", PROPERTY_INDEX_PASSPHRASE, TYPE_STRING }, | |
54 { "ProxyURL", PROPERTY_INDEX_PROXY_CONFIG, TYPE_STRING }, | |
55 { "Security", PROPERTY_INDEX_SECURITY, TYPE_STRING }, | |
56 { "SSID", PROPERTY_INDEX_SSID, TYPE_STRING }, | |
57 { NULL } | |
58 }; | |
59 | |
60 OncValueSignature eap_signature[] = { | |
61 { "AnonymousIdentity", PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY, TYPE_STRING }, | |
62 { "ClientCertPattern", PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN, | |
63 TYPE_DICTIONARY }, | |
64 { "ClientCertRef", PROPERTY_INDEX_ONC_CLIENT_CERT_REF, TYPE_STRING }, | |
65 { "ClientCertType", PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE, TYPE_STRING }, | |
66 { "Identity", PROPERTY_INDEX_EAP_IDENTITY, TYPE_STRING }, | |
67 { "Inner", PROPERTY_INDEX_EAP_PHASE_2_AUTH, TYPE_STRING }, | |
68 { "Outer", PROPERTY_INDEX_EAP_METHOD, TYPE_STRING }, | |
69 { "Password", PROPERTY_INDEX_EAP_PASSWORD, TYPE_STRING }, | |
70 { "ServerCARef", PROPERTY_INDEX_EAP_CA_CERT, TYPE_STRING }, | |
71 { "UseSystemCAs", PROPERTY_INDEX_EAP_USE_SYSTEM_CAS, TYPE_BOOLEAN }, | |
72 { NULL } | |
73 }; | |
74 | |
75 OncValueSignature vpn_signature[] = { | |
76 { "Host", PROPERTY_INDEX_HOST, TYPE_STRING }, | |
77 { "IPsec", PROPERTY_INDEX_ONC_IPSEC, TYPE_DICTIONARY }, | |
78 { "L2TP", PROPERTY_INDEX_ONC_L2TP, TYPE_DICTIONARY }, | |
79 { "OpenVPN", PROPERTY_INDEX_ONC_OPENVPN, TYPE_DICTIONARY }, | |
80 { "Type", PROPERTY_INDEX_PROVIDER_TYPE, TYPE_STRING }, | |
81 { NULL } | |
82 }; | |
83 | |
84 OncValueSignature ipsec_signature[] = { | |
85 { "AuthenticationType", PROPERTY_INDEX_IPSEC_AUTHENTICATIONTYPE, | |
86 TYPE_STRING }, | |
87 { "Group", PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME, TYPE_STRING }, | |
88 { "IKEVersion", PROPERTY_INDEX_IPSEC_IKEVERSION, TYPE_INTEGER }, | |
89 { "ClientCertPattern", PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN, | |
90 TYPE_DICTIONARY }, | |
91 { "ClientCertRef", PROPERTY_INDEX_ONC_CLIENT_CERT_REF, TYPE_STRING }, | |
92 { "ClientCertType", PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE, TYPE_STRING }, | |
93 // Note: EAP and XAUTH not yet supported. | |
94 { "PSK", PROPERTY_INDEX_L2TPIPSEC_PSK, TYPE_STRING }, | |
95 { "SaveCredentials", PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, | |
96 { "ServerCARef", PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS, TYPE_STRING }, | |
97 { NULL } | |
98 }; | |
99 | |
100 OncValueSignature l2tp_signature[] = { | |
101 { "Password", PROPERTY_INDEX_L2TPIPSEC_PASSWORD, TYPE_STRING }, | |
102 { "SaveCredentials", PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, | |
103 { "Username", PROPERTY_INDEX_L2TPIPSEC_USER, TYPE_STRING }, | |
104 { NULL } | |
105 }; | |
106 | |
107 OncValueSignature openvpn_signature[] = { | |
108 { "Auth", PROPERTY_INDEX_OPEN_VPN_AUTH, TYPE_STRING }, | |
109 { "AuthRetry", PROPERTY_INDEX_OPEN_VPN_AUTHRETRY, TYPE_STRING }, | |
110 { "AuthNoCache", PROPERTY_INDEX_OPEN_VPN_AUTHNOCACHE, TYPE_BOOLEAN }, | |
111 { "Cipher", PROPERTY_INDEX_OPEN_VPN_CIPHER, TYPE_STRING }, | |
112 { "ClientCertPattern", PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN, | |
113 TYPE_DICTIONARY }, | |
114 { "ClientCertRef", PROPERTY_INDEX_ONC_CLIENT_CERT_REF, TYPE_STRING }, | |
115 { "ClientCertType", PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE, TYPE_STRING }, | |
116 { "CompLZO", PROPERTY_INDEX_OPEN_VPN_COMPLZO, TYPE_STRING }, | |
117 { "CompNoAdapt", PROPERTY_INDEX_OPEN_VPN_COMPNOADAPT, TYPE_BOOLEAN }, | |
118 { "KeyDirection", PROPERTY_INDEX_OPEN_VPN_KEYDIRECTION, TYPE_STRING }, | |
119 { "NsCertType", PROPERTY_INDEX_OPEN_VPN_NSCERTTYPE, TYPE_STRING }, | |
120 { "Password", PROPERTY_INDEX_OPEN_VPN_PASSWORD, TYPE_STRING }, | |
121 { "Port", PROPERTY_INDEX_OPEN_VPN_PORT, TYPE_INTEGER }, | |
122 { "Proto", PROPERTY_INDEX_OPEN_VPN_PROTO, TYPE_STRING }, | |
123 { "PushPeerInfo", PROPERTY_INDEX_OPEN_VPN_PUSHPEERINFO, TYPE_BOOLEAN }, | |
124 { "RemoteCertEKU", PROPERTY_INDEX_OPEN_VPN_REMOTECERTEKU, TYPE_STRING }, | |
125 { "RemoteCertKU", PROPERTY_INDEX_OPEN_VPN_REMOTECERTKU, TYPE_LIST }, | |
126 { "RemoteCertTLS", PROPERTY_INDEX_OPEN_VPN_REMOTECERTTLS, TYPE_STRING }, | |
127 { "RenegSec", PROPERTY_INDEX_OPEN_VPN_RENEGSEC, TYPE_INTEGER }, | |
128 { "SaveCredentials", PROPERTY_INDEX_SAVE_CREDENTIALS, TYPE_BOOLEAN }, | |
129 { "ServerCARef", PROPERTY_INDEX_OPEN_VPN_CACERT, TYPE_STRING }, | |
130 { "ServerCertRef", PROPERTY_INDEX_OPEN_VPN_CERT, TYPE_STRING }, | |
131 { "ServerPollTimeout", PROPERTY_INDEX_OPEN_VPN_SERVERPOLLTIMEOUT, | |
132 TYPE_INTEGER }, | |
133 { "Shaper", PROPERTY_INDEX_OPEN_VPN_SHAPER, TYPE_INTEGER }, | |
134 { "StaticChallenge", PROPERTY_INDEX_OPEN_VPN_STATICCHALLENGE, TYPE_STRING }, | |
135 { "TLSAuthContents", PROPERTY_INDEX_OPEN_VPN_TLSAUTHCONTENTS, TYPE_STRING }, | |
136 { "TLSRemote", PROPERTY_INDEX_OPEN_VPN_TLSREMOTE, TYPE_STRING }, | |
137 { "Username", PROPERTY_INDEX_OPEN_VPN_USER, TYPE_STRING }, | |
138 { NULL } | |
46 }; | 139 }; |
47 | 140 |
48 // Serve the singleton mapper instance. | 141 // Serve the singleton mapper instance. |
49 const EnumMapper<PropertyIndex>* get_onc_mapper() { | 142 const EnumMapper<PropertyIndex>* get_onc_mapper() { |
50 CR_DEFINE_STATIC_LOCAL(const EnumMapper<PropertyIndex>, mapper, | 143 CR_DEFINE_STATIC_LOCAL(const EnumMapper<PropertyIndex>, mapper, |
51 (property_index_table, | 144 (network_configuration_table, |
52 arraysize(property_index_table), | 145 arraysize(network_configuration_table), |
53 PROPERTY_INDEX_UNKNOWN)); | 146 PROPERTY_INDEX_UNKNOWN)); |
54 return &mapper; | 147 return &mapper; |
55 } | 148 } |
56 | 149 |
57 ConnectionType ParseNetworkType(const std::string& type) { | 150 ConnectionType ParseNetworkType(const std::string& type) { |
58 static EnumMapper<ConnectionType>::Pair table[] = { | 151 static EnumMapper<ConnectionType>::Pair table[] = { |
59 { "WiFi", TYPE_WIFI }, | 152 { "WiFi", TYPE_WIFI }, |
60 { "VPN", TYPE_VPN }, | 153 { "VPN", TYPE_VPN }, |
61 }; | 154 }; |
62 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionType>, parser, | 155 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionType>, parser, |
63 (table, arraysize(table), TYPE_UNKNOWN)); | 156 (table, arraysize(table), TYPE_UNKNOWN)); |
64 return parser.Get(type); | 157 return parser.Get(type); |
65 } | 158 } |
66 | 159 |
67 } // namespace | 160 } // namespace |
68 | 161 |
69 // -------------------- OncNetworkParser -------------------- | 162 // -------------------- OncNetworkParser -------------------- |
70 | 163 |
71 OncNetworkParser::OncNetworkParser(const std::string& onc_blob) | 164 OncNetworkParser::OncNetworkParser(const std::string& onc_blob) |
72 : NetworkParser(get_onc_mapper()), | 165 : NetworkParser(get_onc_mapper()), |
73 network_configs_(NULL), | 166 network_configs_(NULL), |
74 certificates_(NULL) { | 167 certificates_(NULL) { |
168 VLOG(2) << __func__ << ": OncNetworkParser called on " << onc_blob; | |
75 JSONStringValueSerializer deserializer(onc_blob); | 169 JSONStringValueSerializer deserializer(onc_blob); |
76 deserializer.set_allow_trailing_comma(true); | 170 deserializer.set_allow_trailing_comma(true); |
77 scoped_ptr<base::Value> root(deserializer.Deserialize(NULL, &parse_error_)); | 171 scoped_ptr<base::Value> root(deserializer.Deserialize(NULL, &parse_error_)); |
78 | 172 |
79 if (!root.get() || root->GetType() != base::Value::TYPE_DICTIONARY) { | 173 if (!root.get() || root->GetType() != base::Value::TYPE_DICTIONARY) { |
80 LOG(WARNING) << "OncNetworkParser received bad ONC file: " << parse_error_; | 174 LOG(WARNING) << "OncNetworkParser received bad ONC file: " << parse_error_; |
81 } else { | 175 } else { |
82 root_dict_.reset(static_cast<DictionaryValue*>(root.release())); | 176 root_dict_.reset(static_cast<DictionaryValue*>(root.release())); |
83 // At least one of NetworkConfigurations or Certificates is required. | 177 // At least one of NetworkConfigurations or Certificates is required. |
84 if (!root_dict_->GetList("NetworkConfigurations", &network_configs_) && | 178 if (!root_dict_->GetList("NetworkConfigurations", &network_configs_) && |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
148 << " at index " << cert_index; | 242 << " at index " << cert_index; |
149 return false; | 243 return false; |
150 } | 244 } |
151 | 245 |
152 Network* OncNetworkParser::ParseNetwork(int n) { | 246 Network* OncNetworkParser::ParseNetwork(int n) { |
153 if (!network_configs_) | 247 if (!network_configs_) |
154 return NULL; | 248 return NULL; |
155 DictionaryValue* info = NULL; | 249 DictionaryValue* info = NULL; |
156 if (!network_configs_->GetDictionary(n, &info)) | 250 if (!network_configs_->GetDictionary(n, &info)) |
157 return NULL; | 251 return NULL; |
158 // Parse Open Network Configuration blob into a temporary Network object. | |
159 return CreateNetworkFromInfo(std::string(), *info); | 252 return CreateNetworkFromInfo(std::string(), *info); |
160 } | 253 } |
161 | 254 |
162 Network* OncNetworkParser::CreateNetworkFromInfo( | 255 Network* OncNetworkParser::CreateNetworkFromInfo( |
163 const std::string& service_path, | 256 const std::string& service_path, |
164 const DictionaryValue& info) { | 257 const DictionaryValue& info) { |
165 ConnectionType type = ParseTypeFromDictionary(info); | 258 ConnectionType type = ParseTypeFromDictionary(info); |
166 if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. | 259 if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. |
167 return NULL; | 260 return NULL; |
168 scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); | 261 scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); |
169 // Update property with native value for type. | 262 ParseNestedObject(network.get(), |
170 std::string str = NativeNetworkParser::network_type_mapper()->GetKey(type); | 263 "NetworkConfiguration", |
171 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | 264 static_cast<const base::Value&>(info), |
172 network->UpdatePropertyMap(PROPERTY_INDEX_TYPE, *val.get()); | 265 network_configuration_signature, |
173 | 266 ParseNetworkConfigurationValue); |
174 // Get the child dictionary with properties for the network. | |
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() | 267 VLOG(2) << "Created Network '" << network->name() |
185 << "' from info. Path:" << service_path | 268 << "' from info. Path:" << service_path |
186 << " Type:" << ConnectionTypeToString(type); | 269 << " Type:" << ConnectionTypeToString(type); |
187 return network.release(); | 270 return network.release(); |
188 } | 271 } |
189 | 272 |
190 Network* OncNetworkParser::CreateNewNetwork( | 273 Network* OncNetworkParser::CreateNewNetwork( |
191 ConnectionType type, const std::string& service_path) { | 274 ConnectionType type, const std::string& service_path) { |
192 Network* network = NetworkParser::CreateNewNetwork(type, service_path); | 275 Network* network = NetworkParser::CreateNewNetwork(type, service_path); |
193 if (network) { | 276 if (network) { |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
322 module.get(), decoded_pkcs12, string16(), false); | 405 module.get(), decoded_pkcs12, string16(), false); |
323 if (result != net::OK) { | 406 if (result != net::OK) { |
324 LOG(WARNING) << "ONC File: Unable to import Client certificate at index " | 407 LOG(WARNING) << "ONC File: Unable to import Client certificate at index " |
325 << cert_index | 408 << cert_index |
326 << " (error " << net::ErrorToString(result) << ")."; | 409 << " (error " << net::ErrorToString(result) << ")."; |
327 return false; | 410 return false; |
328 } | 411 } |
329 return true; | 412 return true; |
330 } | 413 } |
331 | 414 |
415 bool OncNetworkParser::ParseNestedObject(Network* network, | |
416 const std::string& onc_type, | |
417 const base::Value& value, | |
418 OncValueSignature* signature, | |
419 ParserPointer parser) { | |
420 bool any_errors = false; | |
421 if (!value.IsType(base::Value::TYPE_DICTIONARY)) { | |
422 VLOG(1) << network->name() << ": expected object of type " << onc_type; | |
423 return false; | |
424 } | |
425 VLOG(2) << "Parsing nested object of type " << onc_type; | |
426 const DictionaryValue* dict = NULL; | |
427 value.GetAsDictionary(&dict); | |
428 for (DictionaryValue::key_iterator iter = dict->begin_keys(); | |
429 iter != dict->end_keys(); ++iter) { | |
430 const std::string& key = *iter; | |
431 base::Value* inner_value = NULL; | |
432 dict->GetWithoutPathExpansion(key, &inner_value); | |
433 int field_index; | |
434 for (field_index = 0; signature[field_index].field != NULL; ++field_index) { | |
435 if (key == signature[field_index].field) | |
436 break; | |
437 } | |
438 if (signature[field_index].field == NULL) { | |
439 VLOG(1) << network->name() << ": unexpected field: " | |
440 << key << ", in type: " << onc_type; | |
441 any_errors = true; | |
442 continue; | |
443 } | |
444 if (!inner_value->IsType(signature[field_index].type)) { | |
445 VLOG(1) << network->name() << ": field with wrong type: " << key | |
446 << ", actual type: " << inner_value->GetType() | |
447 << ", expected type: " << signature[field_index].type; | |
448 any_errors = true; | |
449 continue; | |
450 } | |
451 PropertyIndex index = signature[field_index].index; | |
452 // We need to UpdatePropertyMap now since parser might want to | |
453 // change the mapped value. | |
454 network->UpdatePropertyMap(index, *inner_value); | |
455 if (!parser(this, index, *inner_value, network)) { | |
456 VLOG(1) << network->name() << ": problem(s) with field: " << key; | |
457 any_errors = true; | |
458 continue; | |
459 } | |
460 if (VLOG_IS_ON(2)) { | |
461 std::string value_json; | |
462 base::JSONWriter::Write(inner_value, true, &value_json); | |
463 VLOG(2) << network->name() << ": Successfully parsed [" << key | |
464 << "(" << index << ")] = " << value_json; | |
465 } | |
466 } | |
467 return !any_errors; | |
468 } | |
469 | |
470 bool OncNetworkParser::ParseNetworkConfigurationValue( | |
471 OncNetworkParser* parser, | |
472 PropertyIndex index, | |
473 const base::Value& value, | |
474 Network* network) { | |
475 switch (index) { | |
476 case PROPERTY_INDEX_ONC_WIFI: { | |
477 if (TYPE_WIFI != network->type()) { | |
478 VLOG(2) << network->name() | |
479 << ": WiFi field unexpected for this type network"; | |
480 return false; | |
481 } | |
482 return parser->ParseNestedObject(network, | |
483 "WiFi", | |
484 value, | |
485 wifi_signature, | |
486 OncWifiNetworkParser::ParseWifiValue); | |
487 } | |
488 case PROPERTY_INDEX_ONC_VPN: { | |
489 if (TYPE_VPN != network->type()) { | |
490 VLOG(2) << network->name() | |
491 << ": VPN field unexpected for this type network"; | |
492 return false; | |
493 } | |
494 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); | |
495 // Got the "VPN" field. Immediately store the VPN.Type field | |
496 // value so that we can properly validate fields in the VPN | |
497 // object based on the type. | |
498 const DictionaryValue* dict = NULL; | |
499 CHECK(value.GetAsDictionary(&dict)); | |
500 std::string provider_type_string; | |
501 if (!dict->GetString("Type", &provider_type_string)) { | |
502 VLOG(1) << network->name() << ": VPN.Type is missing"; | |
503 return false; | |
504 } | |
505 ProviderType provider_type = | |
506 OncVirtualNetworkParser::ParseProviderType(provider_type_string); | |
507 virtual_network->set_provider_type(provider_type); | |
508 return parser->ParseNestedObject(network, | |
509 "VPN", | |
510 value, | |
511 vpn_signature, | |
512 OncVirtualNetworkParser::ParseVPNValue); | |
513 return true; | |
514 } | |
515 case PROPERTY_INDEX_ONC_REMOVE: | |
516 VLOG(1) << network->name() << ": Remove field not yet implemented"; | |
517 return false; | |
518 case PROPERTY_INDEX_TYPE: { | |
519 // Update property with native value for type. | |
520 std::string str = | |
521 NativeNetworkParser::network_type_mapper()->GetKey(network->type()); | |
522 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | |
523 network->UpdatePropertyMap(PROPERTY_INDEX_TYPE, *val.get()); | |
524 return true; | |
525 } | |
526 case PROPERTY_INDEX_GUID: | |
527 case PROPERTY_INDEX_NAME: | |
528 // Fall back to generic parser for these. | |
529 return parser->ParseValue(index, value, network); | |
530 default: | |
531 break; | |
532 } | |
533 return false; | |
534 } | |
535 | |
332 // -------------------- OncWirelessNetworkParser -------------------- | 536 // -------------------- OncWirelessNetworkParser -------------------- |
333 | 537 |
334 OncWirelessNetworkParser::OncWirelessNetworkParser() {} | 538 OncWirelessNetworkParser::OncWirelessNetworkParser() {} |
335 OncWirelessNetworkParser::~OncWirelessNetworkParser() {} | 539 OncWirelessNetworkParser::~OncWirelessNetworkParser() {} |
336 | 540 |
337 bool OncWirelessNetworkParser::ParseValue(PropertyIndex index, | |
338 const base::Value& value, | |
339 Network* network) { | |
340 DCHECK_NE(TYPE_ETHERNET, network->type()); | |
341 DCHECK_NE(TYPE_VPN, network->type()); | |
342 return OncNetworkParser::ParseValue(index, value, network); | |
343 } | |
344 | |
345 // -------------------- OncWifiNetworkParser -------------------- | 541 // -------------------- OncWifiNetworkParser -------------------- |
346 | 542 |
347 OncWifiNetworkParser::OncWifiNetworkParser() {} | 543 OncWifiNetworkParser::OncWifiNetworkParser() {} |
544 | |
348 OncWifiNetworkParser::~OncWifiNetworkParser() {} | 545 OncWifiNetworkParser::~OncWifiNetworkParser() {} |
349 | 546 |
350 bool OncWifiNetworkParser::ParseValue(PropertyIndex index, | 547 bool OncWifiNetworkParser::ParseWifiValue(OncNetworkParser* parser, |
351 const base::Value& value, | 548 PropertyIndex index, |
352 Network* network) { | 549 const base::Value& value, |
353 DCHECK_EQ(TYPE_WIFI, network->type()); | 550 Network* network) { |
stevenjb
2011/12/02 21:34:45
We should keep the check before doing the static c
kmixter1
2011/12/03 00:20:34
Done.
| |
354 WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); | 551 WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); |
552 std::string string_value; | |
553 bool bool_value = false; | |
stevenjb
2011/12/02 21:34:45
nit: I'm not a fan of extracting something as two
kmixter1
2011/12/03 00:20:34
Done.
| |
554 | |
555 value.GetAsString(&string_value); | |
556 value.GetAsBoolean(&bool_value); | |
355 switch (index) { | 557 switch (index) { |
356 case PROPERTY_INDEX_SSID: { | 558 case PROPERTY_INDEX_SSID: |
357 std::string ssid; | 559 wifi_network->SetName(string_value); |
358 if (!value.GetAsString(&ssid)) | |
359 break; | |
360 wifi_network->SetName(ssid); | |
361 return true; | 560 return true; |
362 } | |
363 case PROPERTY_INDEX_GUID: { | |
364 std::string unique_id; | |
365 if (!value.GetAsString(&unique_id)) | |
366 break; | |
367 wifi_network->set_unique_id(unique_id); | |
368 return true; | |
369 } | |
370 case PROPERTY_INDEX_SECURITY: { | 561 case PROPERTY_INDEX_SECURITY: { |
371 std::string security_string; | 562 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); | 563 wifi_network->set_encryption(security); |
376 // Also update property with native value for security. | 564 // Also update property with native value for security. |
377 std::string str = | 565 std::string str = |
378 NativeNetworkParser::network_security_mapper()->GetKey(security); | 566 NativeNetworkParser::network_security_mapper()->GetKey(security); |
379 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | 567 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); |
380 wifi_network->UpdatePropertyMap(index, *val.get()); | 568 wifi_network->UpdatePropertyMap(index, *val.get()); |
381 return true; | 569 return true; |
382 } | 570 } |
383 case PROPERTY_INDEX_PASSPHRASE: { | 571 case PROPERTY_INDEX_PASSPHRASE: |
384 std::string passphrase; | 572 wifi_network->set_passphrase(string_value); |
385 if (!value.GetAsString(&passphrase)) | |
386 break; | |
387 wifi_network->set_passphrase(passphrase); | |
388 return true; | 573 return true; |
389 } | 574 case PROPERTY_INDEX_IDENTITY: |
390 case PROPERTY_INDEX_IDENTITY: { | 575 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; | 576 return true; |
396 } | 577 case PROPERTY_INDEX_EAP: |
397 case PROPERTY_INDEX_EAP: { | 578 parser->ParseNestedObject(wifi_network, |
398 DCHECK_EQ(value.GetType(), Value::TYPE_DICTIONARY); | 579 "EAP", |
399 const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); | 580 value, |
400 for (DictionaryValue::key_iterator iter = dict.begin_keys(); | 581 eap_signature, |
401 iter != dict.end_keys(); ++iter) { | 582 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; | 583 return true; |
415 } | 584 case PROPERTY_INDEX_AUTO_CONNECT: |
585 network->set_auto_connect(bool_value); | |
586 return true; | |
587 case PROPERTY_INDEX_HIDDEN_SSID: | |
588 // Pass this through to connection manager as is. | |
589 return true; | |
416 default: | 590 default: |
417 return OncWirelessNetworkParser::ParseValue(index, value, network); | 591 break; |
418 } | 592 } |
419 return false; | 593 return false; |
420 } | 594 } |
421 | 595 |
596 bool OncWifiNetworkParser::ParseEAPValue(OncNetworkParser*, | |
597 PropertyIndex index, | |
598 const base::Value& value, | |
599 Network* network) { | |
stevenjb
2011/12/02 21:34:45
Same comment about static cast.
kmixter1
2011/12/03 00:20:34
Done.
| |
600 WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); | |
601 std::string string_value; | |
602 bool bool_value = false; | |
422 | 603 |
423 bool OncWifiNetworkParser::ParseEAPValue(PropertyIndex index, | 604 value.GetAsString(&string_value); |
424 const base::Value& value, | 605 value.GetAsBoolean(&bool_value); |
stevenjb
2011/12/02 21:34:45
same comment about multiple extraction.
kmixter1
2011/12/03 00:20:34
Done.
| |
425 WifiNetwork* wifi_network) { | 606 |
426 switch (index) { | 607 switch (index) { |
427 case PROPERTY_INDEX_EAP_IDENTITY: { | 608 case PROPERTY_INDEX_EAP_IDENTITY: |
428 std::string eap_identity; | 609 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; | 610 return true; |
433 } | |
434 case PROPERTY_INDEX_EAP_METHOD: { | 611 case PROPERTY_INDEX_EAP_METHOD: { |
435 std::string eap_method_str; | 612 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); | 613 wifi_network->set_eap_method(eap_method); |
440 // Also update property with native value for EAP method. | 614 // Also update property with native value for EAP method. |
441 std::string str = | 615 std::string str = |
442 NativeNetworkParser::network_eap_method_mapper()->GetKey(eap_method); | 616 NativeNetworkParser::network_eap_method_mapper()->GetKey(eap_method); |
443 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | 617 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); |
444 wifi_network->UpdatePropertyMap(index, *val.get()); | 618 wifi_network->UpdatePropertyMap(index, *val.get()); |
445 return true; | 619 return true; |
446 } | 620 } |
447 case PROPERTY_INDEX_EAP_PHASE_2_AUTH: { | 621 case PROPERTY_INDEX_EAP_PHASE_2_AUTH: { |
448 std::string eap_phase_2_auth_str; | 622 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); | 623 wifi_network->set_eap_phase_2_auth(eap_phase_2_auth); |
453 // Also update property with native value for EAP phase 2 auth. | 624 // Also update property with native value for EAP phase 2 auth. |
454 std::string str = NativeNetworkParser::network_eap_auth_mapper()->GetKey( | 625 std::string str = NativeNetworkParser::network_eap_auth_mapper()->GetKey( |
455 eap_phase_2_auth); | 626 eap_phase_2_auth); |
456 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | 627 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); |
457 wifi_network->UpdatePropertyMap(index, *val.get()); | 628 wifi_network->UpdatePropertyMap(index, *val.get()); |
458 return true; | 629 return true; |
459 } | 630 } |
460 case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY: { | 631 case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY: |
461 std::string eap_anonymous_identity; | 632 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; | 633 return true; |
466 } | 634 case PROPERTY_INDEX_EAP_CERT_ID: |
467 case PROPERTY_INDEX_EAP_CERT_ID: { | 635 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; | 636 return true; |
473 } | 637 case PROPERTY_INDEX_EAP_CA_CERT_NSS: |
474 case PROPERTY_INDEX_EAP_CA_CERT_NSS: { | 638 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; | 639 return true; |
481 } | 640 case PROPERTY_INDEX_EAP_USE_SYSTEM_CAS: |
482 case PROPERTY_INDEX_EAP_USE_SYSTEM_CAS: { | 641 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; | 642 return true; |
488 } | 643 case PROPERTY_INDEX_EAP_PASSWORD: |
489 case PROPERTY_INDEX_EAP_PASSWORD: { | 644 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; | 645 return true; |
495 } | 646 case PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN: |
647 case PROPERTY_INDEX_ONC_CLIENT_CERT_REF: | |
648 case PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE: | |
649 // TODO(crosbug.com/19409): Support certificate patterns. | |
650 // Ignore for now. | |
651 return true; | |
496 default: | 652 default: |
497 break; | 653 break; |
498 } | 654 } |
499 return false; | 655 return false; |
500 } | 656 } |
501 | 657 |
502 ConnectionSecurity OncWifiNetworkParser::ParseSecurity( | 658 ConnectionSecurity OncWifiNetworkParser::ParseSecurity( |
503 const std::string& security) { | 659 const std::string& security) { |
504 static EnumMapper<ConnectionSecurity>::Pair table[] = { | 660 static EnumMapper<ConnectionSecurity>::Pair table[] = { |
505 { "None", SECURITY_NONE }, | 661 { "None", SECURITY_NONE }, |
506 { "WEP", SECURITY_WEP }, | 662 { "WEP-PSK", SECURITY_WEP }, |
507 { "WPA", SECURITY_WPA }, | 663 { "WPA-PSK", SECURITY_WPA }, |
508 { "WPA2", SECURITY_8021X }, | 664 { "WPA-EAP", SECURITY_8021X }, |
509 }; | 665 }; |
510 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionSecurity>, parser, | 666 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionSecurity>, parser, |
511 (table, arraysize(table), SECURITY_UNKNOWN)); | 667 (table, arraysize(table), SECURITY_UNKNOWN)); |
512 return parser.Get(security); | 668 return parser.Get(security); |
513 } | 669 } |
514 | 670 |
515 EAPMethod OncWifiNetworkParser::ParseEAPMethod(const std::string& method) { | 671 EAPMethod OncWifiNetworkParser::ParseEAPMethod(const std::string& method) { |
516 static EnumMapper<EAPMethod>::Pair table[] = { | 672 static EnumMapper<EAPMethod>::Pair table[] = { |
517 { "PEAP", EAP_METHOD_PEAP }, | 673 { "PEAP", EAP_METHOD_PEAP }, |
518 { "EAP-TLS", EAP_METHOD_TLS }, | 674 { "EAP-TLS", EAP_METHOD_TLS }, |
(...skipping 28 matching lines...) Expand all Loading... | |
547 const DictionaryValue& info, | 703 const DictionaryValue& info, |
548 Network* network) { | 704 Network* network) { |
549 DCHECK_EQ(TYPE_VPN, network->type()); | 705 DCHECK_EQ(TYPE_VPN, network->type()); |
550 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); | 706 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
551 if (!OncNetworkParser::UpdateNetworkFromInfo(info, network)) | 707 if (!OncNetworkParser::UpdateNetworkFromInfo(info, network)) |
552 return false; | 708 return false; |
553 VLOG(1) << "Updating VPN '" << virtual_network->name() | 709 VLOG(1) << "Updating VPN '" << virtual_network->name() |
554 << "': Server: " << virtual_network->server_hostname() | 710 << "': Server: " << virtual_network->server_hostname() |
555 << " Type: " | 711 << " Type: " |
556 << ProviderTypeToString(virtual_network->provider_type()); | 712 << ProviderTypeToString(virtual_network->provider_type()); |
557 if (virtual_network->provider_type() == PROVIDER_TYPE_L2TP_IPSEC_PSK) { | |
558 if (!virtual_network->client_cert_id().empty()) | |
559 virtual_network->set_provider_type(PROVIDER_TYPE_L2TP_IPSEC_USER_CERT); | |
560 } | |
561 return true; | 713 return true; |
562 } | 714 } |
563 | 715 |
564 bool OncVirtualNetworkParser::ParseValue(PropertyIndex index, | 716 bool OncVirtualNetworkParser::ParseVPNValue(OncNetworkParser* parser, |
565 const base::Value& value, | 717 PropertyIndex index, |
566 Network* network) { | 718 const base::Value& value, |
567 DCHECK_EQ(TYPE_VPN, network->type()); | 719 Network* network) { |
568 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); | 720 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
569 switch (index) { | 721 std::string string_value; |
570 case PROPERTY_INDEX_PROVIDER: { | 722 value.GetAsString(&string_value); |
571 DCHECK_EQ(value.GetType(), Value::TYPE_DICTIONARY); | 723 switch (index) { |
572 const DictionaryValue& dict = static_cast<const DictionaryValue&>(value); | 724 case PROPERTY_INDEX_HOST: { |
573 for (DictionaryValue::key_iterator iter = dict.begin_keys(); | 725 virtual_network->set_server_hostname(string_value); |
574 iter != dict.end_keys(); ++iter) { | 726 // Flimflam requires a domain property which is unused. |
575 const std::string& key = *iter; | 727 scoped_ptr<StringValue> val(Value::CreateStringValue("")); |
576 base::Value* provider_value; | 728 network->UpdatePropertyMap(PROPERTY_INDEX_VPN_DOMAIN, *val.get()); |
577 bool res = dict.GetWithoutPathExpansion(key, &provider_value); | 729 return true; |
578 DCHECK(res); | 730 } |
579 if (res) { | 731 case PROPERTY_INDEX_ONC_IPSEC: |
580 PropertyIndex index = mapper().Get(key); | 732 if (virtual_network->provider_type() != PROVIDER_TYPE_L2TP_IPSEC_PSK && |
581 if (!ParseProviderValue(index, *provider_value, virtual_network)) | 733 virtual_network->provider_type() != |
582 VLOG(1) << network->name() << ": Provider unhandled key: " << key | 734 PROVIDER_TYPE_L2TP_IPSEC_USER_CERT) { |
583 << " Type: " << provider_value->GetType(); | 735 VLOG(1) << "IPsec field not allowed with this VPN type"; |
584 } | 736 return false; |
585 } | 737 } |
586 return true; | 738 return parser->ParseNestedObject(network, |
587 } | 739 "IPsec", |
588 default: | 740 value, |
589 return OncNetworkParser::ParseValue(index, value, network); | 741 ipsec_signature, |
742 ParseIPsecValue); | |
743 case PROPERTY_INDEX_ONC_L2TP: | |
744 if (virtual_network->provider_type() != PROVIDER_TYPE_L2TP_IPSEC_PSK) { | |
745 VLOG(1) << "L2TP field not allowed with this VPN type"; | |
746 return false; | |
747 } | |
748 return parser->ParseNestedObject(network, | |
749 "L2TP", | |
750 value, | |
751 l2tp_signature, | |
752 ParseL2TPValue); | |
753 case PROPERTY_INDEX_ONC_OPENVPN: | |
754 if (virtual_network->provider_type() != PROVIDER_TYPE_OPEN_VPN) { | |
755 VLOG(1) << "OpenVPN field not allowed with this VPN type"; | |
756 return false; | |
757 } | |
758 return parser->ParseNestedObject(network, | |
759 "OpenVPN", | |
760 value, | |
761 openvpn_signature, | |
762 ParseOpenVPNValue); | |
763 case PROPERTY_INDEX_PROVIDER_TYPE: { | |
764 // Update property with native value for provider type. | |
765 ProviderType provider_type = GetCanonicalProviderType( | |
766 virtual_network->provider_type()); | |
767 std::string str = | |
768 NativeVirtualNetworkParser::provider_type_mapper()->GetKey( | |
769 provider_type); | |
770 scoped_ptr<StringValue> val(Value::CreateStringValue(str)); | |
771 network->UpdatePropertyMap(PROPERTY_INDEX_PROVIDER_TYPE, *val.get()); | |
772 return true; | |
773 } | |
774 default: | |
590 break; | 775 break; |
591 } | 776 } |
592 return false; | 777 return false; |
593 } | 778 } |
594 | 779 |
595 bool OncVirtualNetworkParser::ParseProviderValue(PropertyIndex index, | 780 bool OncVirtualNetworkParser::ParseIPsecValue(OncNetworkParser* parser, |
596 const base::Value& value, | 781 PropertyIndex index, |
597 VirtualNetwork* network) { | 782 const base::Value& value, |
598 switch (index) { | 783 Network* network) { |
599 case PROPERTY_INDEX_HOST: { | 784 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
600 std::string server_hostname; | 785 std::string string_value; |
601 if (!value.GetAsString(&server_hostname)) | 786 bool bool_value = false; |
787 value.GetAsString(&string_value); | |
788 value.GetAsBoolean(&bool_value); | |
789 | |
790 switch (index) { | |
791 case PROPERTY_INDEX_IPSEC_AUTHENTICATIONTYPE: | |
792 virtual_network->set_provider_type( | |
793 UpdateProviderTypeWithAuthType(virtual_network->provider_type(), | |
794 string_value)); | |
795 return true; | |
796 case PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS: | |
797 virtual_network->set_ca_cert_nss(string_value); | |
798 return true; | |
799 case PROPERTY_INDEX_L2TPIPSEC_PSK: | |
800 virtual_network->set_psk_passphrase(string_value); | |
801 return true; | |
802 case PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME: | |
803 virtual_network->set_group_name(string_value); | |
804 return true; | |
805 case PROPERTY_INDEX_SAVE_CREDENTIALS: | |
806 // Note that the specification allows different settings for | |
807 // IPsec credentials (PSK) and L2TP credentials (username and | |
808 // password) but we merge them in our implementation as is required | |
809 // with the current connection manager. | |
810 virtual_network->set_save_credentials(bool_value); | |
811 return true; | |
812 case PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN: | |
813 case PROPERTY_INDEX_ONC_CLIENT_CERT_REF: | |
814 case PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE: | |
815 // TODO(crosbug.com/19409): Support certificate patterns. | |
816 // Ignore for now. | |
817 return true; | |
818 default: | |
819 break; | |
820 } | |
821 return false; | |
822 } | |
823 | |
824 ProviderType OncVirtualNetworkParser::UpdateProviderTypeWithAuthType( | |
825 ProviderType provider, | |
826 const std::string& auth_type) { | |
827 switch (provider) { | |
828 case PROVIDER_TYPE_L2TP_IPSEC_PSK: | |
829 case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT: | |
830 if (auth_type == "Cert") { | |
831 return PROVIDER_TYPE_L2TP_IPSEC_USER_CERT; | |
832 } else { | |
833 if (auth_type != "PSK") { | |
834 VLOG(1) << "Unexpected authentication type " << auth_type; | |
602 break; | 835 break; |
603 network->set_server_hostname(server_hostname); | 836 } |
604 return true; | 837 return PROVIDER_TYPE_L2TP_IPSEC_PSK; |
605 } | 838 } |
606 case PROPERTY_INDEX_NAME: { | 839 default: |
607 std::string name; | 840 VLOG(1) << "Unexpected provider type with authentication type " |
608 if (!value.GetAsString(&name)) | 841 << auth_type; |
609 break; | 842 break; |
610 network->set_name(name); | 843 } |
611 return true; | 844 return provider; |
612 } | 845 } |
613 case PROPERTY_INDEX_TYPE: { | 846 |
614 std::string provider_type_string; | 847 ProviderType OncVirtualNetworkParser::GetCanonicalProviderType( |
615 if (!value.GetAsString(&provider_type_string)) | 848 ProviderType provider_type) { |
616 break; | 849 if (provider_type == PROVIDER_TYPE_L2TP_IPSEC_USER_CERT) |
617 network->set_provider_type(ParseProviderType(provider_type_string)); | 850 return PROVIDER_TYPE_L2TP_IPSEC_PSK; |
618 return true; | 851 return provider_type; |
619 } | 852 } |
620 case PROPERTY_INDEX_L2TPIPSEC_CA_CERT_NSS: { | 853 |
621 std::string ca_cert_nss; | 854 bool OncVirtualNetworkParser::ParseL2TPValue(OncNetworkParser*, |
622 if (!value.GetAsString(&ca_cert_nss)) | 855 PropertyIndex index, |
623 break; | 856 const base::Value& value, |
624 network->set_ca_cert_nss(ca_cert_nss); | 857 Network* network) { |
625 return true; | 858 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
626 } | 859 std::string string_value; |
627 case PROPERTY_INDEX_L2TPIPSEC_PSK: { | 860 bool bool_value = false; |
628 std::string psk_passphrase; | 861 value.GetAsString(&string_value); |
629 if (!value.GetAsString(&psk_passphrase)) | 862 value.GetAsBoolean(&bool_value); |
630 break; | 863 switch (index) { |
631 network->set_psk_passphrase(psk_passphrase); | 864 case PROPERTY_INDEX_L2TPIPSEC_PASSWORD: |
632 return true; | 865 virtual_network->set_user_passphrase(string_value); |
633 } | 866 return true; |
634 case PROPERTY_INDEX_L2TPIPSEC_CLIENT_CERT_ID: { | 867 case PROPERTY_INDEX_L2TPIPSEC_USER: |
635 std::string client_cert_id; | 868 virtual_network->set_username(string_value); |
636 if (!value.GetAsString(&client_cert_id)) | 869 return true; |
637 break; | 870 case PROPERTY_INDEX_SAVE_CREDENTIALS: |
638 network->set_client_cert_id(client_cert_id); | 871 // Note that the specification allows different settings for |
639 return true; | 872 // IPsec credentials (PSK) and L2TP credentials (username and |
640 } | 873 // password) but we merge them in our implementation as is required |
641 case PROPERTY_INDEX_L2TPIPSEC_USER: { | 874 // with the current connection manager. |
642 std::string username; | 875 virtual_network->set_save_credentials(bool_value); |
643 if (!value.GetAsString(&username)) | 876 return true; |
644 break; | 877 default: |
645 network->set_username(username); | 878 break; |
646 return true; | 879 } |
647 } | 880 return false; |
648 case PROPERTY_INDEX_L2TPIPSEC_PASSWORD: { | 881 } |
649 std::string user_passphrase; | 882 |
650 if (!value.GetAsString(&user_passphrase)) | 883 bool OncVirtualNetworkParser::ParseOpenVPNValue(OncNetworkParser*, |
651 break; | 884 PropertyIndex index, |
652 network->set_user_passphrase(user_passphrase); | 885 const base::Value& value, |
653 return true; | 886 Network* network) { |
654 } | 887 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network); |
655 case PROPERTY_INDEX_L2TPIPSEC_GROUP_NAME: { | 888 std::string string_value; |
656 std::string group_name; | 889 bool bool_value = false; |
657 if (!value.GetAsString(&group_name)) | 890 value.GetAsString(&string_value); |
658 break; | 891 value.GetAsBoolean(&bool_value); |
659 network->set_group_name(group_name); | 892 switch (index) { |
660 return true; | 893 case PROPERTY_INDEX_OPEN_VPN_PASSWORD: |
661 } | 894 virtual_network->set_user_passphrase(string_value); |
662 default: | 895 return true; |
663 break; | 896 case PROPERTY_INDEX_OPEN_VPN_USER: |
664 } | 897 virtual_network->set_username(string_value); |
898 return true; | |
899 case PROPERTY_INDEX_SAVE_CREDENTIALS: | |
900 virtual_network->set_save_credentials(bool_value); | |
901 return true; | |
902 case PROPERTY_INDEX_OPEN_VPN_CACERT: | |
903 virtual_network->set_ca_cert_nss(string_value); | |
904 return true; | |
905 case PROPERTY_INDEX_OPEN_VPN_REMOTECERTKU: { | |
906 // ONC supports a list of these, but we flimflam supports only one | |
907 // today. So extract the first. | |
908 const base::ListValue* value_list = NULL; | |
909 value.GetAsList(&value_list); | |
910 base::Value* first_item = NULL; | |
911 if (!value_list->Get(0, &first_item) || | |
912 !first_item->IsType(base::Value::TYPE_STRING)) { | |
913 VLOG(1) << "RemoteCertKU must be non-empty list of strings"; | |
914 return false; | |
915 } | |
916 virtual_network->UpdatePropertyMap(index, *first_item); | |
917 return true; | |
918 } | |
919 case PROPERTY_INDEX_OPEN_VPN_AUTH: | |
920 case PROPERTY_INDEX_OPEN_VPN_AUTHRETRY: | |
921 case PROPERTY_INDEX_OPEN_VPN_AUTHNOCACHE: | |
922 case PROPERTY_INDEX_OPEN_VPN_CERT: | |
923 case PROPERTY_INDEX_OPEN_VPN_CIPHER: | |
924 case PROPERTY_INDEX_OPEN_VPN_COMPLZO: | |
925 case PROPERTY_INDEX_OPEN_VPN_COMPNOADAPT: | |
926 case PROPERTY_INDEX_OPEN_VPN_KEYDIRECTION: | |
927 case PROPERTY_INDEX_OPEN_VPN_NSCERTTYPE: | |
928 case PROPERTY_INDEX_OPEN_VPN_PORT: | |
929 case PROPERTY_INDEX_OPEN_VPN_PROTO: | |
930 case PROPERTY_INDEX_OPEN_VPN_PUSHPEERINFO: | |
931 case PROPERTY_INDEX_OPEN_VPN_REMOTECERTEKU: | |
932 case PROPERTY_INDEX_OPEN_VPN_REMOTECERTTLS: | |
933 case PROPERTY_INDEX_OPEN_VPN_RENEGSEC: | |
934 case PROPERTY_INDEX_OPEN_VPN_SERVERPOLLTIMEOUT: | |
935 case PROPERTY_INDEX_OPEN_VPN_SHAPER: | |
936 case PROPERTY_INDEX_OPEN_VPN_STATICCHALLENGE: | |
937 case PROPERTY_INDEX_OPEN_VPN_TLSAUTHCONTENTS: | |
938 case PROPERTY_INDEX_OPEN_VPN_TLSREMOTE: | |
939 // Pass these through to connection manager as is. | |
940 return true; | |
941 case PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN: | |
942 case PROPERTY_INDEX_ONC_CLIENT_CERT_REF: | |
943 case PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE: | |
944 // TODO(crosbug.com/19409): Support certificate patterns. | |
945 // Ignore for now. | |
946 return true; | |
947 | |
948 default: | |
949 break; | |
950 } | |
665 return false; | 951 return false; |
666 } | 952 } |
667 | 953 |
668 ProviderType OncVirtualNetworkParser::ParseProviderType( | 954 ProviderType OncVirtualNetworkParser::ParseProviderType( |
669 const std::string& type) { | 955 const std::string& type) { |
670 static EnumMapper<ProviderType>::Pair table[] = { | 956 static EnumMapper<ProviderType>::Pair table[] = { |
671 { flimflam::kProviderL2tpIpsec, PROVIDER_TYPE_L2TP_IPSEC_PSK }, | 957 // We initially map to L2TP-IPsec PSK and then fix this up based |
672 { flimflam::kProviderOpenVpn, PROVIDER_TYPE_OPEN_VPN }, | 958 // on the value of AuthenticationType. |
959 { "L2TP-IPsec", PROVIDER_TYPE_L2TP_IPSEC_PSK }, | |
960 { "OpenVPN", PROVIDER_TYPE_OPEN_VPN }, | |
673 }; | 961 }; |
674 CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser, | 962 CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser, |
675 (table, arraysize(table), PROVIDER_TYPE_MAX)); | 963 (table, arraysize(table), PROVIDER_TYPE_MAX)); |
676 return parser.Get(type); | 964 return parser.Get(type); |
677 } | 965 } |
678 | 966 |
679 } // namespace chromeos | 967 } // namespace chromeos |
OLD | NEW |