Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/cros/onc_network_parser.h" | 5 #include "chrome/browser/chromeos/cros/onc_network_parser.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/json/json_value_serializer.h" | 8 #include "base/json/json_value_serializer.h" |
| 9 #include "base/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 |