Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(421)

Side by Side Diff: chrome/browser/chromeos/cros/onc_network_parser.cc

Issue 8759014: Add ONC VPN support for OpenVPN and L2TP/IPsec VPNs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698