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

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

Issue 8804020: Set onc_source UI data parameter when importing ONC. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address Ken's comments. 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 <keyhi.h>
7 #include <pk11pub.h> 8 #include <pk11pub.h>
8 #include <keyhi.h>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
11 #include "base/json/json_value_serializer.h" 11 #include "base/json/json_value_serializer.h"
12 #include "base/json/json_writer.h" // for debug output only. 12 #include "base/json/json_writer.h" // for debug output only.
13 #include "base/stringprintf.h" 13 #include "base/stringprintf.h"
14 #include "base/values.h" 14 #include "base/values.h"
15 #include "chrome/browser/chromeos/cros/native_network_constants.h" 15 #include "chrome/browser/chromeos/cros/native_network_constants.h"
16 #include "chrome/browser/chromeos/cros/native_network_parser.h" 16 #include "chrome/browser/chromeos/cros/native_network_parser.h"
17 #include "chrome/browser/chromeos/cros/network_library.h" 17 #include "chrome/browser/chromeos/cros/network_library.h"
18 #include "net/base/cert_database.h" 18 #include "net/base/cert_database.h"
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 std::string ConvertValueToString(const base::Value& value) { 176 std::string ConvertValueToString(const base::Value& value) {
177 std::string value_json; 177 std::string value_json;
178 base::JSONWriter::Write(&value, false, &value_json); 178 base::JSONWriter::Write(&value, false, &value_json);
179 return value_json; 179 return value_json;
180 } 180 }
181 181
182 } // namespace 182 } // namespace
183 183
184 // -------------------- OncNetworkParser -------------------- 184 // -------------------- OncNetworkParser --------------------
185 185
186 OncNetworkParser::OncNetworkParser(const std::string& onc_blob) 186 OncNetworkParser::OncNetworkParser(const std::string& onc_blob,
187 NetworkUIData::ONCSource onc_source)
187 : NetworkParser(get_onc_mapper()), 188 : NetworkParser(get_onc_mapper()),
189 onc_source_(onc_source),
188 network_configs_(NULL), 190 network_configs_(NULL),
189 certificates_(NULL) { 191 certificates_(NULL) {
190 VLOG(2) << __func__ << ": OncNetworkParser called on " << onc_blob; 192 VLOG(2) << __func__ << ": OncNetworkParser called on " << onc_blob;
191 JSONStringValueSerializer deserializer(onc_blob); 193 JSONStringValueSerializer deserializer(onc_blob);
192 deserializer.set_allow_trailing_comma(true); 194 deserializer.set_allow_trailing_comma(true);
193 scoped_ptr<base::Value> root(deserializer.Deserialize(NULL, &parse_error_)); 195 scoped_ptr<base::Value> root(deserializer.Deserialize(NULL, &parse_error_));
194 196
195 if (!root.get() || root->GetType() != base::Value::TYPE_DICTIONARY) { 197 if (!root.get() || root->GetType() != base::Value::TYPE_DICTIONARY) {
196 LOG(WARNING) << "OncNetworkParser received bad ONC file: " << parse_error_; 198 LOG(WARNING) << "OncNetworkParser received bad ONC file: " << parse_error_;
197 } else { 199 } else {
(...skipping 21 matching lines...) Expand all
219 221
220 // static 222 // static
221 const EnumMapper<PropertyIndex>* OncNetworkParser::property_mapper() { 223 const EnumMapper<PropertyIndex>* OncNetworkParser::property_mapper() {
222 return get_onc_mapper(); 224 return get_onc_mapper();
223 } 225 }
224 226
225 int OncNetworkParser::GetNetworkConfigsSize() const { 227 int OncNetworkParser::GetNetworkConfigsSize() const {
226 return network_configs_ ? network_configs_->GetSize() : 0; 228 return network_configs_ ? network_configs_->GetSize() : 0;
227 } 229 }
228 230
231 Network* OncNetworkParser::ParseNetwork(int n) {
232 if (!network_configs_)
233 return NULL;
234 DictionaryValue* info = NULL;
235 if (!network_configs_->GetDictionary(n, &info))
236 return NULL;
237 if (VLOG_IS_ON(2)) {
238 std::string network_json;
239 base::JSONWriter::Write(static_cast<base::Value*>(info),
240 true, &network_json);
241 VLOG(2) << "Parsing network at index " << n
242 << ": " << network_json;
243 }
244
245 return CreateNetworkFromInfo(std::string(), *info);
246 }
247
229 int OncNetworkParser::GetCertificatesSize() const { 248 int OncNetworkParser::GetCertificatesSize() const {
230 return certificates_ ? certificates_->GetSize() : 0; 249 return certificates_ ? certificates_->GetSize() : 0;
231 } 250 }
232 251
233 scoped_refptr<net::X509Certificate> OncNetworkParser::ParseCertificate( 252 scoped_refptr<net::X509Certificate> OncNetworkParser::ParseCertificate(
234 int cert_index) { 253 int cert_index) {
235 CHECK(certificates_); 254 CHECK(certificates_);
236 CHECK(static_cast<size_t>(cert_index) < certificates_->GetSize()); 255 CHECK(static_cast<size_t>(cert_index) < certificates_->GetSize());
237 CHECK(cert_index >= 0); 256 CHECK(cert_index >= 0);
238 base::DictionaryValue* certificate = NULL; 257 base::DictionaryValue* certificate = NULL;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 } 294 }
276 if (cert_type == "Client") { 295 if (cert_type == "Client") {
277 return ParseClientCertificate(cert_index, guid, certificate); 296 return ParseClientCertificate(cert_index, guid, certificate);
278 } 297 }
279 298
280 LOG(WARNING) << "ONC File: certificate of unknown type: " << cert_type 299 LOG(WARNING) << "ONC File: certificate of unknown type: " << cert_type
281 << " at index " << cert_index; 300 << " at index " << cert_index;
282 return NULL; 301 return NULL;
283 } 302 }
284 303
285 Network* OncNetworkParser::ParseNetwork(int n) {
286 if (!network_configs_)
287 return NULL;
288 DictionaryValue* info = NULL;
289 if (!network_configs_->GetDictionary(n, &info))
290 return NULL;
291 if (VLOG_IS_ON(2)) {
292 std::string network_json;
293 base::JSONWriter::Write(static_cast<base::Value*>(info),
294 true, &network_json);
295 VLOG(2) << "Parsing network at index " << n
296 << ": " << network_json;
297 }
298
299 return CreateNetworkFromInfo(std::string(), *info);
300 }
301
302 Network* OncNetworkParser::CreateNetworkFromInfo( 304 Network* OncNetworkParser::CreateNetworkFromInfo(
303 const std::string& service_path, 305 const std::string& service_path,
304 const DictionaryValue& info) { 306 const DictionaryValue& info) {
305 ConnectionType type = ParseTypeFromDictionary(info); 307 ConnectionType type = ParseTypeFromDictionary(info);
306 if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type. 308 if (type == TYPE_UNKNOWN) // Return NULL if cannot parse network type.
307 return NULL; 309 return NULL;
308 scoped_ptr<Network> network(CreateNewNetwork(type, service_path)); 310 scoped_ptr<Network> network(CreateNewNetwork(type, service_path));
311
312 // Initialize UI data.
313 NetworkUIData ui_data;
314 ui_data.set_onc_source(onc_source_);
315 ui_data.FillDictionary(network->ui_data());
316
317 // Copy ONC to the network object.
318 network->onc()->MergeDictionary(&info);
319
320 // Parse all properties recursively.
309 if (!ParseNestedObject(network.get(), 321 if (!ParseNestedObject(network.get(),
310 "NetworkConfiguration", 322 "NetworkConfiguration",
311 static_cast<const base::Value&>(info), 323 static_cast<const base::Value&>(info),
312 network_configuration_signature, 324 network_configuration_signature,
313 ParseNetworkConfigurationValue)) { 325 ParseNetworkConfigurationValue)) {
314 LOG(WARNING) << "Network " << network->name() << " failed to parse."; 326 LOG(WARNING) << "Network " << network->name() << " failed to parse.";
315 return NULL; 327 return NULL;
316 } 328 }
329
330 // Update the UI data property.
331 std::string ui_data_json;
332 base::JSONWriter::Write(network->ui_data(), false, &ui_data_json);
333 base::StringValue ui_data_string_value(ui_data_json);
334 network->UpdatePropertyMap(PROPERTY_INDEX_UI_DATA, ui_data_string_value);
335
317 if (VLOG_IS_ON(2)) { 336 if (VLOG_IS_ON(2)) {
318 VLOG(2) << "Created Network '" << network->name() 337 VLOG(2) << "Created Network '" << network->name()
319 << "' from info. Path:" << service_path 338 << "' from info. Path:" << service_path
320 << " Type:" << ConnectionTypeToString(type); 339 << " Type:" << ConnectionTypeToString(type);
321 } 340 }
341
322 return network.release(); 342 return network.release();
323 } 343 }
324 344
345 bool OncNetworkParser::ParseNestedObject(Network* network,
346 const std::string& onc_type,
347 const base::Value& value,
348 OncValueSignature* signature,
349 ParserPointer parser) {
350 bool any_errors = false;
351 if (!value.IsType(base::Value::TYPE_DICTIONARY)) {
352 VLOG(1) << network->name() << ": expected object of type " << onc_type;
353 return false;
354 }
355 VLOG(2) << "Parsing nested object of type " << onc_type;
356 const DictionaryValue* dict = NULL;
357 value.GetAsDictionary(&dict);
358 for (DictionaryValue::key_iterator iter = dict->begin_keys();
359 iter != dict->end_keys(); ++iter) {
360 const std::string& key = *iter;
361
362 // The list of Recommended key is only of interest to the UI code and the UI
stevenjb 2011/12/14 00:27:38 nit: s/The list of Recommended key is/Recommended
Mattias Nissler (ping if slow) 2011/12/14 20:46:38 Done.
363 // reads it directly from the ONC blob.
364 if (key == "Recommended")
365 continue;
366
367 base::Value* inner_value = NULL;
368 dict->GetWithoutPathExpansion(key, &inner_value);
369 CHECK(inner_value != NULL);
370 int field_index;
371 for (field_index = 0; signature[field_index].field != NULL; ++field_index) {
372 if (key == signature[field_index].field)
373 break;
374 }
375 if (signature[field_index].field == NULL) {
376 VLOG(1) << network->name() << ": unexpected field: "
377 << key << ", in type: " << onc_type;
378 any_errors = true;
379 continue;
380 }
381 if (!inner_value->IsType(signature[field_index].type)) {
382 VLOG(1) << network->name() << ": field with wrong type: " << key
383 << ", actual type: " << inner_value->GetType()
384 << ", expected type: " << signature[field_index].type;
385 any_errors = true;
386 continue;
387 }
388 PropertyIndex index = signature[field_index].index;
389 // We need to UpdatePropertyMap now since parser might want to
390 // change the mapped value.
391 network->UpdatePropertyMap(index, *inner_value);
392 if (!parser(this, index, *inner_value, network)) {
393 VLOG(1) << network->name() << ": field not parsed: " << key;
394 any_errors = true;
395 continue;
396 }
397
398 if (VLOG_IS_ON(2)) {
399 std::string value_json;
400 base::JSONWriter::Write(inner_value, true, &value_json);
401 VLOG(2) << network->name() << ": Successfully parsed [" << key
402 << "(" << index << ")] = " << value_json;
403 }
404 }
405 return !any_errors;
406 }
407
325 Network* OncNetworkParser::CreateNewNetwork( 408 Network* OncNetworkParser::CreateNewNetwork(
326 ConnectionType type, const std::string& service_path) { 409 ConnectionType type, const std::string& service_path) {
327 Network* network = NetworkParser::CreateNewNetwork(type, service_path); 410 Network* network = NetworkParser::CreateNewNetwork(type, service_path);
328 if (network) { 411 if (network) {
329 if (type == TYPE_WIFI) 412 if (type == TYPE_WIFI)
330 network->SetNetworkParser(new OncWifiNetworkParser()); 413 network->SetNetworkParser(new OncWifiNetworkParser());
331 else if (type == TYPE_VPN) 414 else if (type == TYPE_VPN)
332 network->SetNetworkParser(new OncVirtualNetworkParser()); 415 network->SetNetworkParser(new OncVirtualNetworkParser());
333 } 416 }
334 return network; 417 return network;
(...skipping 15 matching lines...) Expand all
350 return type_string; 433 return type_string;
351 } 434 }
352 435
353 std::string OncNetworkParser::GetGuidFromDictionary( 436 std::string OncNetworkParser::GetGuidFromDictionary(
354 const base::DictionaryValue& info) { 437 const base::DictionaryValue& info) {
355 std::string guid_string; 438 std::string guid_string;
356 info.GetString("GUID", &guid_string); 439 info.GetString("GUID", &guid_string);
357 return guid_string; 440 return guid_string;
358 } 441 }
359 442
443 // static
444 bool OncNetworkParser::ParseNetworkConfigurationValue(
445 OncNetworkParser* parser,
446 PropertyIndex index,
447 const base::Value& value,
448 Network* network) {
449 switch (index) {
450 case PROPERTY_INDEX_ONC_WIFI: {
451 return parser->ParseNestedObject(network,
452 "WiFi",
453 value,
454 wifi_signature,
455 OncWifiNetworkParser::ParseWifiValue);
456 }
457 case PROPERTY_INDEX_ONC_VPN: {
458 if (!CheckNetworkType(network, TYPE_VPN, "VPN"))
459 return false;
460 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network);
461 // Got the "VPN" field. Immediately store the VPN.Type field
462 // value so that we can properly validate fields in the VPN
463 // object based on the type.
464 const DictionaryValue* dict = NULL;
465 CHECK(value.GetAsDictionary(&dict));
466 std::string provider_type_string;
467 if (!dict->GetString("Type", &provider_type_string)) {
468 VLOG(1) << network->name() << ": VPN.Type is missing";
469 return false;
470 }
471 ProviderType provider_type =
472 OncVirtualNetworkParser::ParseProviderType(provider_type_string);
473 virtual_network->set_provider_type(provider_type);
474 return parser->ParseNestedObject(network,
475 "VPN",
476 value,
477 vpn_signature,
478 OncVirtualNetworkParser::ParseVPNValue);
479 return true;
480 }
481 case PROPERTY_INDEX_ONC_REMOVE:
482 VLOG(1) << network->name() << ": Remove field not yet implemented";
483 return false;
484 case PROPERTY_INDEX_TYPE: {
485 // Update property with native value for type.
486 std::string str =
487 NativeNetworkParser::network_type_mapper()->GetKey(network->type());
488 scoped_ptr<StringValue> val(Value::CreateStringValue(str));
489 network->UpdatePropertyMap(PROPERTY_INDEX_TYPE, *val.get());
490 return true;
491 }
492 case PROPERTY_INDEX_GUID:
493 case PROPERTY_INDEX_NAME:
494 // Fall back to generic parser for these.
495 return parser->ParseValue(index, value, network);
496 default:
497 break;
498 }
499 return false;
500 }
501
502 // static
503 bool OncNetworkParser::CheckNetworkType(Network* network,
504 ConnectionType expected,
505 const std::string& onc_type) {
506 if (expected != network->type()) {
507 LOG(WARNING) << network->name() << ": "
508 << onc_type << " field unexpected for this type network";
509 return false;
510 }
511 return true;
512 }
513
360 scoped_refptr<net::X509Certificate> 514 scoped_refptr<net::X509Certificate>
361 OncNetworkParser::ParseServerOrCaCertificate( 515 OncNetworkParser::ParseServerOrCaCertificate(
362 int cert_index, 516 int cert_index,
363 const std::string& cert_type, 517 const std::string& cert_type,
364 const std::string& guid, 518 const std::string& guid,
365 base::DictionaryValue* certificate) { 519 base::DictionaryValue* certificate) {
366 net::CertDatabase cert_database; 520 net::CertDatabase cert_database;
367 bool web_trust = false; 521 bool web_trust = false;
368 base::ListValue* trust_list = NULL; 522 base::ListValue* trust_list = NULL;
369 if (certificate->GetList("Trust", &trust_list)) { 523 if (certificate->GetList("Trust", &trust_list)) {
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 } else { 653 } else {
500 LOG(WARNING) << "ONC File: Unable to find private key for cert at index" 654 LOG(WARNING) << "ONC File: Unable to find private key for cert at index"
501 << cert_index; 655 << cert_index;
502 } 656 }
503 657
504 VLOG(2) << "Successfully imported client certificate at index " 658 VLOG(2) << "Successfully imported client certificate at index "
505 << cert_index; 659 << cert_index;
506 return cert_result; 660 return cert_result;
507 } 661 }
508 662
509 bool OncNetworkParser::ParseNestedObject(Network* network,
510 const std::string& onc_type,
511 const base::Value& value,
512 OncValueSignature* signature,
513 ParserPointer parser) {
514 bool any_errors = false;
515 if (!value.IsType(base::Value::TYPE_DICTIONARY)) {
516 VLOG(1) << network->name() << ": expected object of type " << onc_type;
517 return false;
518 }
519 VLOG(2) << "Parsing nested object of type " << onc_type;
520 const DictionaryValue* dict = NULL;
521 value.GetAsDictionary(&dict);
522 for (DictionaryValue::key_iterator iter = dict->begin_keys();
523 iter != dict->end_keys(); ++iter) {
524 const std::string& key = *iter;
525 base::Value* inner_value = NULL;
526 dict->GetWithoutPathExpansion(key, &inner_value);
527 CHECK(inner_value != NULL);
528 int field_index;
529 for (field_index = 0; signature[field_index].field != NULL; ++field_index) {
530 if (key == signature[field_index].field)
531 break;
532 }
533 if (signature[field_index].field == NULL) {
534 VLOG(1) << network->name() << ": unexpected field: "
535 << key << ", in type: " << onc_type;
536 any_errors = true;
537 continue;
538 }
539 if (!inner_value->IsType(signature[field_index].type)) {
540 VLOG(1) << network->name() << ": field with wrong type: " << key
541 << ", actual type: " << inner_value->GetType()
542 << ", expected type: " << signature[field_index].type;
543 any_errors = true;
544 continue;
545 }
546 PropertyIndex index = signature[field_index].index;
547 // We need to UpdatePropertyMap now since parser might want to
548 // change the mapped value.
549 network->UpdatePropertyMap(index, *inner_value);
550 if (!parser(this, index, *inner_value, network)) {
551 VLOG(1) << network->name() << ": field not parsed: " << key;
552 any_errors = true;
553 continue;
554 }
555 if (VLOG_IS_ON(2)) {
556 std::string value_json;
557 base::JSONWriter::Write(inner_value, true, &value_json);
558 VLOG(2) << network->name() << ": Successfully parsed [" << key
559 << "(" << index << ")] = " << value_json;
560 }
561 }
562 return !any_errors;
563 }
564
565 // static
566 bool OncNetworkParser::CheckNetworkType(Network* network,
567 ConnectionType expected,
568 const std::string& onc_type) {
569 if (expected != network->type()) {
570 LOG(WARNING) << network->name() << ": "
571 << onc_type << " field unexpected for this type network";
572 return false;
573 }
574 return true;
575 }
576
577 // static
578 bool OncNetworkParser::ParseNetworkConfigurationValue(
579 OncNetworkParser* parser,
580 PropertyIndex index,
581 const base::Value& value,
582 Network* network) {
583 switch (index) {
584 case PROPERTY_INDEX_ONC_WIFI: {
585 return parser->ParseNestedObject(network,
586 "WiFi",
587 value,
588 wifi_signature,
589 OncWifiNetworkParser::ParseWifiValue);
590 }
591 case PROPERTY_INDEX_ONC_VPN: {
592 if (!CheckNetworkType(network, TYPE_VPN, "VPN"))
593 return false;
594 VirtualNetwork* virtual_network = static_cast<VirtualNetwork*>(network);
595 // Got the "VPN" field. Immediately store the VPN.Type field
596 // value so that we can properly validate fields in the VPN
597 // object based on the type.
598 const DictionaryValue* dict = NULL;
599 CHECK(value.GetAsDictionary(&dict));
600 std::string provider_type_string;
601 if (!dict->GetString("Type", &provider_type_string)) {
602 VLOG(1) << network->name() << ": VPN.Type is missing";
603 return false;
604 }
605 ProviderType provider_type =
606 OncVirtualNetworkParser::ParseProviderType(provider_type_string);
607 virtual_network->set_provider_type(provider_type);
608 return parser->ParseNestedObject(network,
609 "VPN",
610 value,
611 vpn_signature,
612 OncVirtualNetworkParser::ParseVPNValue);
613 return true;
614 }
615 case PROPERTY_INDEX_ONC_REMOVE:
616 VLOG(1) << network->name() << ": Remove field not yet implemented";
617 return false;
618 case PROPERTY_INDEX_TYPE: {
619 // Update property with native value for type.
620 std::string str =
621 NativeNetworkParser::network_type_mapper()->GetKey(network->type());
622 scoped_ptr<StringValue> val(Value::CreateStringValue(str));
623 network->UpdatePropertyMap(PROPERTY_INDEX_TYPE, *val.get());
624 return true;
625 }
626 case PROPERTY_INDEX_GUID:
627 case PROPERTY_INDEX_NAME:
628 // Fall back to generic parser for these.
629 return parser->ParseValue(index, value, network);
630 default:
631 break;
632 }
633 return false;
634 }
635
636 // static
637 bool OncNetworkParser::DeleteCertAndKeyByNickname(const std::string& label) {
638 net::CertificateList cert_list;
639 ListCertsWithNickname(label, &cert_list);
640 net::CertDatabase cert_db;
641 bool result = true;
642 for (net::CertificateList::iterator iter = cert_list.begin();
643 iter != cert_list.end(); ++iter) {
644 // If we fail, we try and delete the rest still.
645 // TODO(gspencer): this isn't very "transactional". If we fail on some, but
646 // not all, then it's possible to leave things in a weird state.
647 // Luckily there should only be one cert with a particular
648 // label, and the cert not being found is one of the few reasons the
649 // delete could fail, but still... The other choice is to return
650 // failure immediately, but that doesn't seem to do what is intended.
651 if (!cert_db.DeleteCertAndKey(iter->get()))
652 result = false;
653 }
654 return result;
655 }
656
657 // static 663 // static
658 void OncNetworkParser::ListCertsWithNickname(const std::string& label, 664 void OncNetworkParser::ListCertsWithNickname(const std::string& label,
659 net::CertificateList* result) { 665 net::CertificateList* result) {
660 net::CertificateList all_certs; 666 net::CertificateList all_certs;
661 net::CertDatabase cert_db; 667 net::CertDatabase cert_db;
662 cert_db.ListCerts(&all_certs); 668 cert_db.ListCerts(&all_certs);
663 result->clear(); 669 result->clear();
664 for (net::CertificateList::iterator iter = all_certs.begin(); 670 for (net::CertificateList::iterator iter = all_certs.begin();
665 iter != all_certs.end(); ++iter) { 671 iter != all_certs.end(); ++iter) {
666 if (iter->get()->os_cert_handle()->nickname) { 672 if (iter->get()->os_cert_handle()->nickname) {
(...skipping 19 matching lines...) Expand all
686 if (private_key) { 692 if (private_key) {
687 char* private_key_nickname = PK11_GetPrivateKeyNickname(private_key); 693 char* private_key_nickname = PK11_GetPrivateKeyNickname(private_key);
688 if (private_key_nickname && private_key_nickname == label) 694 if (private_key_nickname && private_key_nickname == label)
689 result->push_back(*iter); 695 result->push_back(*iter);
690 PORT_Free(private_key_nickname); 696 PORT_Free(private_key_nickname);
691 SECKEY_DestroyPrivateKey(private_key); 697 SECKEY_DestroyPrivateKey(private_key);
692 } 698 }
693 } 699 }
694 } 700 }
695 701
702 // static
703 bool OncNetworkParser::DeleteCertAndKeyByNickname(const std::string& label) {
704 net::CertificateList cert_list;
705 ListCertsWithNickname(label, &cert_list);
706 net::CertDatabase cert_db;
707 bool result = true;
708 for (net::CertificateList::iterator iter = cert_list.begin();
709 iter != cert_list.end(); ++iter) {
710 // If we fail, we try and delete the rest still.
711 // TODO(gspencer): this isn't very "transactional". If we fail on some, but
712 // not all, then it's possible to leave things in a weird state.
713 // Luckily there should only be one cert with a particular
714 // label, and the cert not being found is one of the few reasons the
715 // delete could fail, but still... The other choice is to return
716 // failure immediately, but that doesn't seem to do what is intended.
717 if (!cert_db.DeleteCertAndKey(iter->get()))
718 result = false;
719 }
720 return result;
721 }
722
696 // -------------------- OncWirelessNetworkParser -------------------- 723 // -------------------- OncWirelessNetworkParser --------------------
697 724
698 OncWirelessNetworkParser::OncWirelessNetworkParser() {} 725 OncWirelessNetworkParser::OncWirelessNetworkParser() {}
699 OncWirelessNetworkParser::~OncWirelessNetworkParser() {} 726 OncWirelessNetworkParser::~OncWirelessNetworkParser() {}
700 727
701 // -------------------- OncWifiNetworkParser -------------------- 728 // -------------------- OncWifiNetworkParser --------------------
702 729
703 OncWifiNetworkParser::OncWifiNetworkParser() {} 730 OncWifiNetworkParser::OncWifiNetworkParser() {}
704 731
705 OncWifiNetworkParser::~OncWifiNetworkParser() {} 732 OncWifiNetworkParser::~OncWifiNetworkParser() {}
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
1150 // on the value of AuthenticationType. 1177 // on the value of AuthenticationType.
1151 { "L2TP-IPsec", PROVIDER_TYPE_L2TP_IPSEC_PSK }, 1178 { "L2TP-IPsec", PROVIDER_TYPE_L2TP_IPSEC_PSK },
1152 { "OpenVPN", PROVIDER_TYPE_OPEN_VPN }, 1179 { "OpenVPN", PROVIDER_TYPE_OPEN_VPN },
1153 }; 1180 };
1154 CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser, 1181 CR_DEFINE_STATIC_LOCAL(EnumMapper<ProviderType>, parser,
1155 (table, arraysize(table), PROVIDER_TYPE_MAX)); 1182 (table, arraysize(table), PROVIDER_TYPE_MAX));
1156 return parser.Get(type); 1183 return parser.Get(type);
1157 } 1184 }
1158 1185
1159 } // namespace chromeos 1186 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698