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

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/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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698