OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "chromeos/network/network_connection_handler.h" | 5 #include "chromeos/network/network_connection_handler.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
12 #include "chromeos/chromeos_switches.h" | 12 #include "chromeos/chromeos_switches.h" |
13 #include "chromeos/dbus/dbus_thread_manager.h" | 13 #include "chromeos/dbus/dbus_thread_manager.h" |
14 #include "chromeos/dbus/shill_manager_client.h" | 14 #include "chromeos/dbus/shill_manager_client.h" |
15 #include "chromeos/dbus/shill_service_client.h" | 15 #include "chromeos/dbus/shill_service_client.h" |
16 #include "chromeos/network/client_cert_util.h" | 16 #include "chromeos/network/client_cert_util.h" |
17 #include "chromeos/network/network_configuration_handler.h" | 17 #include "chromeos/network/network_configuration_handler.h" |
18 #include "chromeos/network/network_event_log.h" | 18 #include "chromeos/network/network_event_log.h" |
19 #include "chromeos/network/network_handler_callbacks.h" | 19 #include "chromeos/network/network_handler_callbacks.h" |
20 #include "chromeos/network/network_profile_handler.h" | 20 #include "chromeos/network/network_profile_handler.h" |
21 #include "chromeos/network/network_state.h" | 21 #include "chromeos/network/network_state.h" |
22 #include "chromeos/network/network_state_handler.h" | 22 #include "chromeos/network/network_state_handler.h" |
23 #include "chromeos/network/network_ui_data.h" | 23 #include "chromeos/network/network_ui_data.h" |
24 #include "chromeos/network/shill_property_util.h" | 24 #include "chromeos/network/shill_property_util.h" |
25 #include "chromeos/tpm_token_loader.h" | |
25 #include "dbus/object_path.h" | 26 #include "dbus/object_path.h" |
26 #include "net/cert/x509_certificate.h" | 27 #include "net/cert/x509_certificate.h" |
27 #include "third_party/cros_system_api/dbus/service_constants.h" | 28 #include "third_party/cros_system_api/dbus/service_constants.h" |
28 | 29 |
29 namespace chromeos { | 30 namespace chromeos { |
30 | 31 |
31 namespace { | 32 namespace { |
32 | 33 |
33 void InvokeErrorCallback(const std::string& service_path, | 34 void InvokeErrorCallback(const std::string& service_path, |
34 const network_handler::ErrorCallback& error_callback, | 35 const network_handler::ErrorCallback& error_callback, |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
184 } | 185 } |
185 | 186 |
186 void NetworkConnectionHandler::OnCertificatesLoaded( | 187 void NetworkConnectionHandler::OnCertificatesLoaded( |
187 const net::CertificateList& cert_list, | 188 const net::CertificateList& cert_list, |
188 bool initial_load) { | 189 bool initial_load) { |
189 certificates_loaded_ = true; | 190 certificates_loaded_ = true; |
190 NET_LOG_EVENT("Certificates Loaded", ""); | 191 NET_LOG_EVENT("Certificates Loaded", ""); |
191 if (queued_connect_) { | 192 if (queued_connect_) { |
192 NET_LOG_EVENT("Connecting to Queued Network", | 193 NET_LOG_EVENT("Connecting to Queued Network", |
193 queued_connect_->service_path); | 194 queued_connect_->service_path); |
194 ConnectToNetwork(queued_connect_->service_path, | 195 // Make a copy of |queued_connect_| parameters, because |queued_connect_| |
195 queued_connect_->success_callback, | 196 // will get reset at the beginning of |ConnectToNetwork|. |
stevenjb
2014/01/23 18:17:42
Ugh. Subtle. Good catch, thanks.
| |
196 queued_connect_->error_callback, | 197 std::string service_path = queued_connect_->service_path; |
198 base::Closure success_callback = queued_connect_->success_callback; | |
199 network_handler::ErrorCallback error_callback = | |
200 queued_connect_->error_callback; | |
201 | |
202 ConnectToNetwork(service_path, success_callback, error_callback, | |
197 false /* check_error_state */); | 203 false /* check_error_state */); |
198 } else if (initial_load) { | 204 } else if (initial_load) { |
199 // Once certificates have loaded, connect to the "best" available network. | 205 // Once certificates have loaded, connect to the "best" available network. |
200 network_state_handler_->ConnectToBestWifiNetwork(); | 206 network_state_handler_->ConnectToBestWifiNetwork(); |
201 } | 207 } |
202 } | 208 } |
203 | 209 |
204 void NetworkConnectionHandler::ConnectToNetwork( | 210 void NetworkConnectionHandler::ConnectToNetwork( |
205 const std::string& service_path, | 211 const std::string& service_path, |
206 const base::Closure& success_callback, | 212 const base::Closure& success_callback, |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
417 return; | 423 return; |
418 } | 424 } |
419 NET_LOG_EVENT("Connect Request Queued", service_path); | 425 NET_LOG_EVENT("Connect Request Queued", service_path); |
420 queued_connect_.reset(new ConnectRequest( | 426 queued_connect_.reset(new ConnectRequest( |
421 service_path, request->profile_path, | 427 service_path, request->profile_path, |
422 request->success_callback, request->error_callback)); | 428 request->success_callback, request->error_callback)); |
423 pending_requests_.erase(service_path); | 429 pending_requests_.erase(service_path); |
424 return; | 430 return; |
425 } | 431 } |
426 | 432 |
427 pkcs11_id = CertificateIsConfigured(ui_data.get()); | 433 pkcs11_id = CertificateIsConfigured(ui_data.get(), |
434 cert_loader_->cert_list()); | |
428 // Ensure the certificate is available and configured. | 435 // Ensure the certificate is available and configured. |
429 if (!cert_loader_->IsHardwareBacked() || pkcs11_id.empty()) { | 436 if (!cert_loader_->is_hardware_backed() || pkcs11_id.empty()) { |
430 ErrorCallbackForPendingRequest(service_path, kErrorCertificateRequired); | 437 ErrorCallbackForPendingRequest(service_path, kErrorCertificateRequired); |
431 return; | 438 return; |
432 } | 439 } |
433 } else if (check_error_state && | 440 } else if (check_error_state && |
434 !client_cert::IsCertificateConfigured(client_cert_type, | 441 !client_cert::IsCertificateConfigured(client_cert_type, |
435 service_properties)) { | 442 service_properties)) { |
436 // Network may not be configured. | 443 // Network may not be configured. |
437 ErrorCallbackForPendingRequest(service_path, kErrorConfigurationRequired); | 444 ErrorCallbackForPendingRequest(service_path, kErrorConfigurationRequired); |
438 return; | 445 return; |
439 } | 446 } |
440 | 447 |
441 // The network may not be 'Connectable' because the TPM properties are not | 448 // The network may not be 'Connectable' because the TPM properties are not |
442 // set up, so configure tpm slot/pin before connecting. | 449 // set up, so configure tpm slot/pin before connecting. |
443 if (cert_loader_ && cert_loader_->IsHardwareBacked()) { | 450 if (cert_loader_ && cert_loader_->is_hardware_backed()) { |
451 std::string tpm_user_pin; | |
452 if (TPMTokenLoader::IsInitialized()) | |
stevenjb
2014/01/23 18:17:42
Again, can a cert be hardware backed and TPMTokenL
tbarzic
2014/01/23 19:18:37
Done.
| |
453 tpm_user_pin = TPMTokenLoader::Get()->tpm_user_pin(); | |
444 // Pass NULL if pkcs11_id is empty, so that it doesn't clear any | 454 // Pass NULL if pkcs11_id is empty, so that it doesn't clear any |
445 // previously configured client cert. | 455 // previously configured client cert. |
446 client_cert::SetShillProperties( | 456 client_cert::SetShillProperties( |
447 client_cert_type, | 457 client_cert_type, |
448 base::IntToString(cert_loader_->tpm_token_slot_id()), | 458 base::IntToString(cert_loader_->tpm_token_slot_id()), |
449 cert_loader_->tpm_user_pin(), | 459 tpm_user_pin, |
450 pkcs11_id.empty() ? NULL : &pkcs11_id, | 460 pkcs11_id.empty() ? NULL : &pkcs11_id, |
451 &config_properties); | 461 &config_properties); |
452 } | 462 } |
453 } | 463 } |
454 | 464 |
455 if (type == shill::kTypeVPN) { | 465 if (type == shill::kTypeVPN) { |
456 // VPN may require a username, and/or passphrase to be set. (Check after | 466 // VPN may require a username, and/or passphrase to be set. (Check after |
457 // ensuring that any required certificates are configured). | 467 // ensuring that any required certificates are configured). |
458 DCHECK(provider_properties); | 468 DCHECK(provider_properties); |
459 if (VPNRequiresCredentials( | 469 if (VPNRequiresCredentials( |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
614 } | 624 } |
615 | 625 |
616 void NetworkConnectionHandler::CheckAllPendingRequests() { | 626 void NetworkConnectionHandler::CheckAllPendingRequests() { |
617 for (std::map<std::string, ConnectRequest>::iterator iter = | 627 for (std::map<std::string, ConnectRequest>::iterator iter = |
618 pending_requests_.begin(); iter != pending_requests_.end(); ++iter) { | 628 pending_requests_.begin(); iter != pending_requests_.end(); ++iter) { |
619 CheckPendingRequest(iter->first); | 629 CheckPendingRequest(iter->first); |
620 } | 630 } |
621 } | 631 } |
622 | 632 |
623 std::string NetworkConnectionHandler::CertificateIsConfigured( | 633 std::string NetworkConnectionHandler::CertificateIsConfigured( |
624 NetworkUIData* ui_data) { | 634 NetworkUIData* ui_data, |
635 const net::CertificateList& cert_list) { | |
625 if (ui_data->certificate_pattern().Empty()) | 636 if (ui_data->certificate_pattern().Empty()) |
626 return std::string(); | 637 return std::string(); |
627 // Find the matching certificate. | 638 // Find the matching certificate. |
628 scoped_refptr<net::X509Certificate> matching_cert = | 639 scoped_refptr<net::X509Certificate> matching_cert = |
629 client_cert::GetCertificateMatch(ui_data->certificate_pattern()); | 640 client_cert::GetCertificateMatch(ui_data->certificate_pattern(), |
641 cert_list); | |
630 if (!matching_cert.get()) | 642 if (!matching_cert.get()) |
631 return std::string(); | 643 return std::string(); |
632 return CertLoader::GetPkcs11IdForCert(*matching_cert.get()); | 644 return CertLoader::GetPkcs11IdForCert(*matching_cert.get()); |
633 } | 645 } |
634 | 646 |
635 void NetworkConnectionHandler::ErrorCallbackForPendingRequest( | 647 void NetworkConnectionHandler::ErrorCallbackForPendingRequest( |
636 const std::string& service_path, | 648 const std::string& service_path, |
637 const std::string& error_name) { | 649 const std::string& error_name) { |
638 ConnectRequest* request = GetPendingRequest(service_path); | 650 ConnectRequest* request = GetPendingRequest(service_path); |
639 if (!request) { | 651 if (!request) { |
(...skipping 24 matching lines...) Expand all Loading... | |
664 | 676 |
665 void NetworkConnectionHandler::HandleShillDisconnectSuccess( | 677 void NetworkConnectionHandler::HandleShillDisconnectSuccess( |
666 const std::string& service_path, | 678 const std::string& service_path, |
667 const base::Closure& success_callback) { | 679 const base::Closure& success_callback) { |
668 NET_LOG_EVENT("Disconnect Request Sent", service_path); | 680 NET_LOG_EVENT("Disconnect Request Sent", service_path); |
669 if (!success_callback.is_null()) | 681 if (!success_callback.is_null()) |
670 success_callback.Run(); | 682 success_callback.Run(); |
671 } | 683 } |
672 | 684 |
673 } // namespace chromeos | 685 } // namespace chromeos |
OLD | NEW |