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/json/json_writer.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
11 #include "base/values.h" | 11 #include "base/values.h" |
12 #include "chrome/browser/chromeos/cros/native_network_constants.h" | 12 #include "chrome/browser/chromeos/cros/native_network_constants.h" |
13 #include "chrome/browser/chromeos/cros/native_network_parser.h" | 13 #include "chrome/browser/chromeos/cros/native_network_parser.h" |
14 #include "chrome/browser/chromeos/cros/network_library.h" | 14 #include "chrome/browser/chromeos/cros/network_library.h" |
15 #include "net/base/cert_database.h" | 15 #include "net/base/cert_database.h" |
16 #include "net/base/crypto_module.h" | 16 #include "net/base/crypto_module.h" |
17 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
18 #include "net/base/x509_certificate.h" | 18 #include "net/base/x509_certificate.h" |
19 #include "third_party/cros_system_api/dbus/service_constants.h" | 19 #include "third_party/cros_system_api/dbus/service_constants.h" |
(...skipping 16 matching lines...) Expand all Loading... | |
36 | 36 |
37 OncValueSignature network_configuration_signature[] = { | 37 OncValueSignature network_configuration_signature[] = { |
38 // TODO(crosbug.com/23673): Support Ethernet settings. | 38 // TODO(crosbug.com/23673): Support Ethernet settings. |
39 { "GUID", PROPERTY_INDEX_GUID, TYPE_STRING }, | 39 { "GUID", PROPERTY_INDEX_GUID, TYPE_STRING }, |
40 { "Name", PROPERTY_INDEX_NAME, TYPE_STRING }, | 40 { "Name", PROPERTY_INDEX_NAME, TYPE_STRING }, |
41 // TODO(crosbug.com/23674): Support ProxySettings. | 41 // TODO(crosbug.com/23674): Support ProxySettings. |
42 // TODO(crosbug.com/23604): Handle removing networks. | 42 // TODO(crosbug.com/23604): Handle removing networks. |
43 { "Remove", PROPERTY_INDEX_ONC_REMOVE, TYPE_BOOLEAN }, | 43 { "Remove", PROPERTY_INDEX_ONC_REMOVE, TYPE_BOOLEAN }, |
44 { "Type", PROPERTY_INDEX_TYPE, TYPE_STRING }, | 44 { "Type", PROPERTY_INDEX_TYPE, TYPE_STRING }, |
45 { "WiFi", PROPERTY_INDEX_ONC_WIFI, TYPE_DICTIONARY }, | 45 { "WiFi", PROPERTY_INDEX_ONC_WIFI, TYPE_DICTIONARY }, |
46 { "VPN", PROPERTY_INDEX_ONC_VPN, TYPE_DICTIONARY } | 46 { "VPN", PROPERTY_INDEX_ONC_VPN, TYPE_DICTIONARY }, |
47 { NULL } | |
kmixter1
2011/12/06 12:52:37
Ouch, nice catch.
| |
47 }; | 48 }; |
48 | 49 |
49 OncValueSignature wifi_signature[] = { | 50 OncValueSignature wifi_signature[] = { |
50 { "AutoConnect", PROPERTY_INDEX_AUTO_CONNECT, TYPE_BOOLEAN }, | 51 { "AutoConnect", PROPERTY_INDEX_AUTO_CONNECT, TYPE_BOOLEAN, |
52 NetworkUIData::kPropertyAutoConnect }, | |
51 { "EAP", PROPERTY_INDEX_EAP, TYPE_DICTIONARY }, | 53 { "EAP", PROPERTY_INDEX_EAP, TYPE_DICTIONARY }, |
52 { "HiddenSSID", PROPERTY_INDEX_HIDDEN_SSID, TYPE_BOOLEAN }, | 54 { "HiddenSSID", PROPERTY_INDEX_HIDDEN_SSID, TYPE_BOOLEAN }, |
53 { "Passphrase", PROPERTY_INDEX_PASSPHRASE, TYPE_STRING }, | 55 { "Passphrase", PROPERTY_INDEX_PASSPHRASE, TYPE_STRING, |
56 NetworkUIData::kPropertyPassphrase }, | |
54 { "ProxyURL", PROPERTY_INDEX_PROXY_CONFIG, TYPE_STRING }, | 57 { "ProxyURL", PROPERTY_INDEX_PROXY_CONFIG, TYPE_STRING }, |
55 { "Security", PROPERTY_INDEX_SECURITY, TYPE_STRING }, | 58 { "Security", PROPERTY_INDEX_SECURITY, TYPE_STRING }, |
56 { "SSID", PROPERTY_INDEX_SSID, TYPE_STRING }, | 59 { "SSID", PROPERTY_INDEX_SSID, TYPE_STRING }, |
57 { NULL } | 60 { NULL } |
58 }; | 61 }; |
59 | 62 |
60 OncValueSignature eap_signature[] = { | 63 OncValueSignature eap_signature[] = { |
61 { "AnonymousIdentity", PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY, TYPE_STRING }, | 64 { "AnonymousIdentity", PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY, TYPE_STRING, |
65 NetworkUIData::kPropertyEAPAnonymousIdentity }, | |
kmixter1
2011/12/06 12:52:37
why can't these use the same name as in ONC?
Mattias Nissler (ping if slow)
2011/12/06 13:37:59
See other comment.
| |
62 { "ClientCertPattern", PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN, | 66 { "ClientCertPattern", PROPERTY_INDEX_ONC_CLIENT_CERT_PATTERN, |
63 TYPE_DICTIONARY }, | 67 TYPE_DICTIONARY }, |
64 { "ClientCertRef", PROPERTY_INDEX_ONC_CLIENT_CERT_REF, TYPE_STRING }, | 68 { "ClientCertRef", PROPERTY_INDEX_ONC_CLIENT_CERT_REF, TYPE_STRING }, |
65 { "ClientCertType", PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE, TYPE_STRING }, | 69 { "ClientCertType", PROPERTY_INDEX_ONC_CLIENT_CERT_TYPE, TYPE_STRING }, |
66 { "Identity", PROPERTY_INDEX_EAP_IDENTITY, TYPE_STRING }, | 70 { "Identity", PROPERTY_INDEX_EAP_IDENTITY, TYPE_STRING, |
67 { "Inner", PROPERTY_INDEX_EAP_PHASE_2_AUTH, TYPE_STRING }, | 71 NetworkUIData::kPropertyEAPIdentity }, |
68 { "Outer", PROPERTY_INDEX_EAP_METHOD, TYPE_STRING }, | 72 { "Inner", PROPERTY_INDEX_EAP_PHASE_2_AUTH, TYPE_STRING, |
69 { "Password", PROPERTY_INDEX_EAP_PASSWORD, TYPE_STRING }, | 73 NetworkUIData::kPropertyEAPPhase2Auth }, |
70 { "ServerCARef", PROPERTY_INDEX_EAP_CA_CERT, TYPE_STRING }, | 74 { "Outer", PROPERTY_INDEX_EAP_METHOD, TYPE_STRING, |
71 { "UseSystemCAs", PROPERTY_INDEX_EAP_USE_SYSTEM_CAS, TYPE_BOOLEAN }, | 75 NetworkUIData::kPropertyEAPMethod }, |
76 { "Password", PROPERTY_INDEX_EAP_PASSWORD, TYPE_STRING, | |
77 NetworkUIData::kPropertyEAPPassphrase }, | |
78 { "ServerCARef", PROPERTY_INDEX_EAP_CA_CERT, TYPE_STRING, | |
79 NetworkUIData::kPropertyEAPServerCaCertNssNickname }, | |
80 { "UseSystemCAs", PROPERTY_INDEX_EAP_USE_SYSTEM_CAS, TYPE_BOOLEAN, | |
81 NetworkUIData::kPropertyEAPUseSystemCAs }, | |
72 { NULL } | 82 { NULL } |
73 }; | 83 }; |
74 | 84 |
75 OncValueSignature vpn_signature[] = { | 85 OncValueSignature vpn_signature[] = { |
76 { "Host", PROPERTY_INDEX_PROVIDER_HOST, TYPE_STRING }, | 86 { "Host", PROPERTY_INDEX_PROVIDER_HOST, TYPE_STRING }, |
77 { "IPsec", PROPERTY_INDEX_ONC_IPSEC, TYPE_DICTIONARY }, | 87 { "IPsec", PROPERTY_INDEX_ONC_IPSEC, TYPE_DICTIONARY }, |
78 { "L2TP", PROPERTY_INDEX_ONC_L2TP, TYPE_DICTIONARY }, | 88 { "L2TP", PROPERTY_INDEX_ONC_L2TP, TYPE_DICTIONARY }, |
79 { "OpenVPN", PROPERTY_INDEX_ONC_OPENVPN, TYPE_DICTIONARY }, | 89 { "OpenVPN", PROPERTY_INDEX_ONC_OPENVPN, TYPE_DICTIONARY }, |
80 { "Type", PROPERTY_INDEX_PROVIDER_TYPE, TYPE_STRING }, | 90 { "Type", PROPERTY_INDEX_PROVIDER_TYPE, TYPE_STRING }, |
81 { NULL } | 91 { NULL } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
154 }; | 164 }; |
155 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionType>, parser, | 165 CR_DEFINE_STATIC_LOCAL(EnumMapper<ConnectionType>, parser, |
156 (table, arraysize(table), TYPE_UNKNOWN)); | 166 (table, arraysize(table), TYPE_UNKNOWN)); |
157 return parser.Get(type); | 167 return parser.Get(type); |
158 } | 168 } |
159 | 169 |
160 } // namespace | 170 } // namespace |
161 | 171 |
162 // -------------------- OncNetworkParser -------------------- | 172 // -------------------- OncNetworkParser -------------------- |
163 | 173 |
164 OncNetworkParser::OncNetworkParser(const std::string& onc_blob) | 174 OncNetworkParser::OncNetworkParser(const std::string& onc_blob, |
175 NetworkUIData::ONCSource onc_source) | |
165 : NetworkParser(get_onc_mapper()), | 176 : NetworkParser(get_onc_mapper()), |
177 onc_source_(onc_source), | |
166 network_configs_(NULL), | 178 network_configs_(NULL), |
167 certificates_(NULL) { | 179 certificates_(NULL) { |
168 VLOG(2) << __func__ << ": OncNetworkParser called on " << onc_blob; | 180 VLOG(2) << __func__ << ": OncNetworkParser called on " << onc_blob; |
169 JSONStringValueSerializer deserializer(onc_blob); | 181 JSONStringValueSerializer deserializer(onc_blob); |
170 deserializer.set_allow_trailing_comma(true); | 182 deserializer.set_allow_trailing_comma(true); |
171 scoped_ptr<base::Value> root(deserializer.Deserialize(NULL, &parse_error_)); | 183 scoped_ptr<base::Value> root(deserializer.Deserialize(NULL, &parse_error_)); |
172 | 184 |
173 if (!root.get() || root->GetType() != base::Value::TYPE_DICTIONARY) { | 185 if (!root.get() || root->GetType() != base::Value::TYPE_DICTIONARY) { |
174 LOG(WARNING) << "OncNetworkParser received bad ONC file: " << parse_error_; | 186 LOG(WARNING) << "OncNetworkParser received bad ONC file: " << parse_error_; |
175 } else { | 187 } else { |
(...skipping 26 matching lines...) Expand all Loading... | |
202 } | 214 } |
203 | 215 |
204 int OncNetworkParser::GetNetworkConfigsSize() const { | 216 int OncNetworkParser::GetNetworkConfigsSize() const { |
205 return network_configs_ ? network_configs_->GetSize() : 0; | 217 return network_configs_ ? network_configs_->GetSize() : 0; |
206 } | 218 } |
207 | 219 |
208 int OncNetworkParser::GetCertificatesSize() const { | 220 int OncNetworkParser::GetCertificatesSize() const { |
209 return certificates_ ? certificates_->GetSize() : 0; | 221 return certificates_ ? certificates_->GetSize() : 0; |
210 } | 222 } |
211 | 223 |
224 Network* OncNetworkParser::ParseNetwork(int n) { | |
225 if (!network_configs_) | |
226 return NULL; | |
227 DictionaryValue* info = NULL; | |
228 if (!network_configs_->GetDictionary(n, &info)) | |
229 return NULL; | |
230 if (VLOG_IS_ON(2)) { | |
231 std::string network_json; | |
232 base::JSONWriter::Write(static_cast<base::Value*>(info), | |
233 true, &network_json); | |
234 VLOG(2) << "Parsing network at index " << n | |
235 << ": " << network_json; | |
236 } | |
237 | |
238 return CreateNetworkFromInfo(std::string(), *info); | |
239 } | |
240 | |
212 bool OncNetworkParser::ParseCertificate(int cert_index) { | 241 bool OncNetworkParser::ParseCertificate(int cert_index) { |
213 CHECK(certificates_); | 242 CHECK(certificates_); |
214 CHECK(static_cast<size_t>(cert_index) < certificates_->GetSize()); | 243 CHECK(static_cast<size_t>(cert_index) < certificates_->GetSize()); |
215 CHECK(cert_index >= 0); | 244 CHECK(cert_index >= 0); |
216 base::DictionaryValue* certificate = NULL; | 245 base::DictionaryValue* certificate = NULL; |
217 certificates_->GetDictionary(cert_index, &certificate); | 246 certificates_->GetDictionary(cert_index, &certificate); |
218 CHECK(certificate); | 247 CHECK(certificate); |
219 | 248 |
220 if (VLOG_IS_ON(2)) { | 249 if (VLOG_IS_ON(2)) { |
221 std::string certificate_json; | 250 std::string certificate_json; |
(...skipping 27 matching lines...) Expand all Loading... | |
249 } | 278 } |
250 if (cert_type == "Client") { | 279 if (cert_type == "Client") { |
251 return ParseClientCertificate(cert_index, certificate); | 280 return ParseClientCertificate(cert_index, certificate); |
252 } | 281 } |
253 | 282 |
254 LOG(WARNING) << "ONC File: certificate of unknown type: " << cert_type | 283 LOG(WARNING) << "ONC File: certificate of unknown type: " << cert_type |
255 << " at index " << cert_index; | 284 << " at index " << cert_index; |
256 return false; | 285 return false; |
257 } | 286 } |
258 | 287 |
259 Network* OncNetworkParser::ParseNetwork(int n) { | |
260 if (!network_configs_) | |
261 return NULL; | |
262 DictionaryValue* info = NULL; | |
263 if (!network_configs_->GetDictionary(n, &info)) | |
264 return NULL; | |
265 if (VLOG_IS_ON(2)) { | |
266 std::string network_json; | |
267 base::JSONWriter::Write(static_cast<base::Value*>(info), | |
268 true, &network_json); | |
269 VLOG(2) << "Parsing network at index " << n | |
270 << ": " << network_json; | |
271 } | |
272 | |
273 return CreateNetworkFromInfo(std::string(), *info); | |
274 } | |
275 | |
276 Network* OncNetworkParser::CreateNetworkFromInfo( | 288 Network* OncNetworkParser::CreateNetworkFromInfo( |
277 const std::string& service_path, | 289 const std::string& service_path, |
278 const DictionaryValue& info) { | 290 const DictionaryValue& info) { |
279 ConnectionType type = ParseTypeFromDictionary(info); | 291 ConnectionType type = ParseTypeFromDictionary(info); |
280 if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. | 292 if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. |
281 return NULL; | 293 return NULL; |
282 scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); | 294 scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); |
295 | |
296 // Initialize UI data. | |
297 NetworkUIData ui_data; | |
298 ui_data.set_onc_source(onc_source_); | |
299 ui_data.FillDictionary(network->ui_data()); | |
300 | |
301 // Parse all properties recursively. | |
283 if (!ParseNestedObject(network.get(), | 302 if (!ParseNestedObject(network.get(), |
284 "NetworkConfiguration", | 303 "NetworkConfiguration", |
285 static_cast<const base::Value&>(info), | 304 static_cast<const base::Value&>(info), |
286 network_configuration_signature, | 305 network_configuration_signature, |
287 ParseNetworkConfigurationValue)) { | 306 ParseNetworkConfigurationValue)) { |
288 LOG(WARNING) << "Network " << network->name() << " had problems."; | 307 LOG(WARNING) << "Network " << network->name() << " had problems."; |
289 return NULL; | 308 return NULL; |
290 } | 309 } |
310 | |
311 // Update the UI data property. | |
312 std::string ui_data_json; | |
313 base::JSONWriter::Write(network->ui_data(), false, &ui_data_json); | |
314 base::StringValue ui_data_string_value(ui_data_json); | |
315 network->UpdatePropertyMap(PROPERTY_INDEX_UI_DATA, ui_data_string_value); | |
316 | |
291 if (VLOG_IS_ON(2)) { | 317 if (VLOG_IS_ON(2)) { |
292 VLOG(2) << "Created Network '" << network->name() | 318 VLOG(2) << "Created Network '" << network->name() |
293 << "' from info. Path:" << service_path | 319 << "' from info. Path:" << service_path |
294 << " Type:" << ConnectionTypeToString(type); | 320 << " Type:" << ConnectionTypeToString(type); |
295 } | 321 } |
322 | |
296 return network.release(); | 323 return network.release(); |
297 } | 324 } |
298 | 325 |
299 Network* OncNetworkParser::CreateNewNetwork( | 326 Network* OncNetworkParser::CreateNewNetwork( |
300 ConnectionType type, const std::string& service_path) { | 327 ConnectionType type, const std::string& service_path) { |
301 Network* network = NetworkParser::CreateNewNetwork(type, service_path); | 328 Network* network = NetworkParser::CreateNewNetwork(type, service_path); |
302 if (network) { | 329 if (network) { |
303 if (type == TYPE_WIFI) | 330 if (type == TYPE_WIFI) |
304 network->SetNetworkParser(new OncWifiNetworkParser()); | 331 network->SetNetworkParser(new OncWifiNetworkParser()); |
305 else if (type == TYPE_VPN) | 332 else if (type == TYPE_VPN) |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
437 << " (error " << net::ErrorToString(result) << ")."; | 464 << " (error " << net::ErrorToString(result) << ")."; |
438 return false; | 465 return false; |
439 } | 466 } |
440 VLOG(2) << "Successfully imported client certificate at index " | 467 VLOG(2) << "Successfully imported client certificate at index " |
441 << cert_index; | 468 << cert_index; |
442 return true; | 469 return true; |
443 } | 470 } |
444 | 471 |
445 bool OncNetworkParser::ParseNestedObject(Network* network, | 472 bool OncNetworkParser::ParseNestedObject(Network* network, |
446 const std::string& onc_type, | 473 const std::string& onc_type, |
447 const base::Value& value, | 474 const base::Value& value, |
stevenjb
2011/12/08 02:26:35
|value| here is an ONC dictionary entry, yes? We s
| |
448 OncValueSignature* signature, | 475 OncValueSignature* signature, |
449 ParserPointer parser) { | 476 ParserPointer parser) { |
450 bool any_errors = false; | 477 bool any_errors = false; |
451 if (!value.IsType(base::Value::TYPE_DICTIONARY)) { | 478 if (!value.IsType(base::Value::TYPE_DICTIONARY)) { |
452 VLOG(1) << network->name() << ": expected object of type " << onc_type; | 479 VLOG(1) << network->name() << ": expected object of type " << onc_type; |
453 return false; | 480 return false; |
454 } | 481 } |
455 VLOG(2) << "Parsing nested object of type " << onc_type; | 482 VLOG(2) << "Parsing nested object of type " << onc_type; |
456 const DictionaryValue* dict = NULL; | 483 const DictionaryValue* dict = NULL; |
457 value.GetAsDictionary(&dict); | 484 value.GetAsDictionary(&dict); |
(...skipping 22 matching lines...) Expand all Loading... | |
480 } | 507 } |
481 PropertyIndex index = signature[field_index].index; | 508 PropertyIndex index = signature[field_index].index; |
482 // We need to UpdatePropertyMap now since parser might want to | 509 // We need to UpdatePropertyMap now since parser might want to |
483 // change the mapped value. | 510 // change the mapped value. |
484 network->UpdatePropertyMap(index, *inner_value); | 511 network->UpdatePropertyMap(index, *inner_value); |
485 if (!parser(this, index, *inner_value, network)) { | 512 if (!parser(this, index, *inner_value, network)) { |
486 VLOG(1) << network->name() << ": problem(s) with field: " << key; | 513 VLOG(1) << network->name() << ": problem(s) with field: " << key; |
487 any_errors = true; | 514 any_errors = true; |
488 continue; | 515 continue; |
489 } | 516 } |
517 | |
490 if (VLOG_IS_ON(2)) { | 518 if (VLOG_IS_ON(2)) { |
491 std::string value_json; | 519 std::string value_json; |
492 base::JSONWriter::Write(inner_value, true, &value_json); | 520 base::JSONWriter::Write(inner_value, true, &value_json); |
493 VLOG(2) << network->name() << ": Successfully parsed [" << key | 521 VLOG(2) << network->name() << ": Successfully parsed [" << key |
494 << "(" << index << ")] = " << value_json; | 522 << "(" << index << ")] = " << value_json; |
495 } | 523 } |
496 } | 524 } |
525 | |
526 ParseUIData(network, dict, signature); | |
527 | |
497 return !any_errors; | 528 return !any_errors; |
498 } | 529 } |
499 | 530 |
500 // static | 531 // static |
501 bool OncNetworkParser::CheckNetworkType(Network* network, | 532 bool OncNetworkParser::CheckNetworkType(Network* network, |
502 ConnectionType expected, | 533 ConnectionType expected, |
503 const std::string& onc_type) { | 534 const std::string& onc_type) { |
504 if (expected != network->type()) { | 535 if (expected != network->type()) { |
505 VLOG(2) << network->name() | 536 VLOG(2) << network->name() |
506 << ": " << onc_type << " field unexpected for this type network"; | 537 << ": " << onc_type << " field unexpected for this type network"; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
583 case PROPERTY_INDEX_GUID: | 614 case PROPERTY_INDEX_GUID: |
584 case PROPERTY_INDEX_NAME: | 615 case PROPERTY_INDEX_NAME: |
585 // Fall back to generic parser for these. | 616 // Fall back to generic parser for these. |
586 return parser->ParseValue(index, value, network); | 617 return parser->ParseValue(index, value, network); |
587 default: | 618 default: |
588 break; | 619 break; |
589 } | 620 } |
590 return false; | 621 return false; |
591 } | 622 } |
592 | 623 |
624 void OncNetworkParser::ParseUIData(Network* network, | |
625 const base::DictionaryValue* dict, | |
626 OncValueSignature* signature) const { | |
stevenjb
2011/12/08 02:26:35
|signature| is a list of signatures, yes, not a po
| |
627 // Collect the set of recommended properties. | |
628 std::set<std::string> recommended; | |
629 bool all_recommended = false; | |
630 base::ListValue* recommended_list = NULL; | |
631 if (dict->GetList("Recommended", &recommended_list)) { | |
632 for (base::ListValue::const_iterator entry(recommended_list->begin()); | |
633 entry != recommended_list->end(); ++entry) { | |
634 std::string entry_string; | |
635 if ((*entry)->GetAsString(&entry_string)) { | |
636 if (entry_string == ".") { | |
637 all_recommended = true; | |
638 break; | |
639 } else { | |
640 recommended.insert(entry_string); | |
641 } | |
642 } else { | |
643 LOG(WARNING) << "Entries in the recommended list should be strings!"; | |
644 } | |
645 } | |
646 } | |
647 | |
648 // Do a pass over |signature|, filling in UI data where applicable. | |
649 NetworkUIData ui_data; | |
650 for (int i = 0; signature[i].field != NULL; ++i) { | |
651 if (!signature[i].ui_data_key) | |
652 continue; | |
653 | |
654 bool controlled_by_policy = | |
655 (onc_source_ == NetworkUIData::ONC_SOURCE_DEVICE_POLICY || | |
656 onc_source_ == NetworkUIData::ONC_SOURCE_USER_POLICY) && | |
657 !all_recommended && | |
kmixter1
2011/12/06 12:52:37
I was thinking "." meant something a little differ
Mattias Nissler (ping if slow)
2011/12/06 13:37:59
Ah, so I didn't understand what your intention wit
kmixter1
2011/12/07 23:08:29
I added "." just for completeness in the specifica
| |
658 recommended.find(signature[i].ui_data_key) == recommended.end(); | |
stevenjb
2011/12/08 02:26:35
I'm confused by this. Above, we appear to be filli
| |
659 const Value* default_value = NULL; | |
660 network->GetProperty(signature[i].index, &default_value); | |
661 NetworkPropertyUIData property_ui_data( | |
662 controlled_by_policy ? NetworkPropertyUIData::CONTROLLER_POLICY : | |
663 NetworkPropertyUIData::CONTROLLER_USER, | |
664 default_value ? default_value->DeepCopy() : NULL); | |
665 ui_data.SetProperty(signature[i].ui_data_key, property_ui_data); | |
stevenjb
2011/12/08 02:26:35
I can see why it is convenient to save this off, a
| |
666 } | |
667 | |
668 // Merge the result into the network-level |ui_data| dictionary. | |
669 DictionaryValue ui_data_dict; | |
670 ui_data.FillDictionary(&ui_data_dict); | |
671 network->ui_data()->MergeDictionary(&ui_data_dict); | |
672 } | |
673 | |
593 // -------------------- OncWirelessNetworkParser -------------------- | 674 // -------------------- OncWirelessNetworkParser -------------------- |
594 | 675 |
595 OncWirelessNetworkParser::OncWirelessNetworkParser() {} | 676 OncWirelessNetworkParser::OncWirelessNetworkParser() {} |
596 OncWirelessNetworkParser::~OncWirelessNetworkParser() {} | 677 OncWirelessNetworkParser::~OncWirelessNetworkParser() {} |
597 | 678 |
598 // -------------------- OncWifiNetworkParser -------------------- | 679 // -------------------- OncWifiNetworkParser -------------------- |
599 | 680 |
600 OncWifiNetworkParser::OncWifiNetworkParser() {} | 681 OncWifiNetworkParser::OncWifiNetworkParser() {} |
601 | 682 |
602 OncWifiNetworkParser::~OncWifiNetworkParser() {} | 683 OncWifiNetworkParser::~OncWifiNetworkParser() {} |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1036 // on the value of AuthenticationType. | 1117 // on the value of AuthenticationType. |
1037 { "L2TP-IPsec", PROVIDER_TYPE_L2TP_IPSEC_PSK }, | 1118 { "L2TP-IPsec", PROVIDER_TYPE_L2TP_IPSEC_PSK }, |
1038 { "OpenVPN", PROVIDER_TYPE_OPEN_VPN }, | 1119 { "OpenVPN", PROVIDER_TYPE_OPEN_VPN }, |
1039 }; | 1120 }; |
1040 CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser, | 1121 CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser, |
1041 (table, arraysize(table), PROVIDER_TYPE_MAX)); | 1122 (table, arraysize(table), PROVIDER_TYPE_MAX)); |
1042 return parser.Get(type); | 1123 return parser.Get(type); |
1043 } | 1124 } |
1044 | 1125 |
1045 } // namespace chromeos | 1126 } // namespace chromeos |
OLD | NEW |