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" |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
367 // been recently configured), we need to check Connectable again. | 367 // been recently configured), we need to check Connectable again. |
368 if (connectable && type != shill::kTypeVPN) { | 368 if (connectable && type != shill::kTypeVPN) { |
369 // TODO(stevenjb): Shill needs to properly set Connectable for VPN. | 369 // TODO(stevenjb): Shill needs to properly set Connectable for VPN. |
370 CallShillConnect(service_path); | 370 CallShillConnect(service_path); |
371 return; | 371 return; |
372 } | 372 } |
373 | 373 |
374 // Get VPN provider type and host (required for configuration) and ensure | 374 // Get VPN provider type and host (required for configuration) and ensure |
375 // that required VPN non-cert properties are set. | 375 // that required VPN non-cert properties are set. |
376 const base::DictionaryValue* provider_properties = NULL; | 376 const base::DictionaryValue* provider_properties = NULL; |
377 std::string vpn_provider_type, vpn_provider_host; | 377 std::string vpn_provider_type, vpn_provider_host, vpn_client_cert_id; |
378 if (type == shill::kTypeVPN) { | 378 if (type == shill::kTypeVPN) { |
379 // VPN Provider values are read from the "Provider" dictionary, not the | 379 // VPN Provider values are read from the "Provider" dictionary, not the |
380 // "Provider.Type", etc keys (which are used only to set the values). | 380 // "Provider.Type", etc keys (which are used only to set the values). |
381 if (service_properties.GetDictionaryWithoutPathExpansion( | 381 if (service_properties.GetDictionaryWithoutPathExpansion( |
382 shill::kProviderProperty, &provider_properties)) { | 382 shill::kProviderProperty, &provider_properties)) { |
383 provider_properties->GetStringWithoutPathExpansion( | 383 provider_properties->GetStringWithoutPathExpansion( |
384 shill::kTypeProperty, &vpn_provider_type); | 384 shill::kTypeProperty, &vpn_provider_type); |
385 provider_properties->GetStringWithoutPathExpansion( | 385 provider_properties->GetStringWithoutPathExpansion( |
386 shill::kHostProperty, &vpn_provider_host); | 386 shill::kHostProperty, &vpn_provider_host); |
387 provider_properties->GetStringWithoutPathExpansion( | |
388 shill::kL2tpIpsecClientCertIdProperty, &vpn_client_cert_id); | |
387 } | 389 } |
388 if (vpn_provider_type.empty() || vpn_provider_host.empty()) { | 390 if (vpn_provider_type.empty() || vpn_provider_host.empty()) { |
389 ErrorCallbackForPendingRequest(service_path, kErrorConfigurationRequired); | 391 ErrorCallbackForPendingRequest(service_path, kErrorConfigurationRequired); |
390 return; | 392 return; |
391 } | 393 } |
392 } | 394 } |
393 | 395 |
396 scoped_ptr<NetworkUIData> ui_data = | |
397 shill_property_util::GetUIDataFromProperties(service_properties); | |
398 bool has_certificate_in_onc = | |
399 ui_data && (ui_data->certificate_type() != CLIENT_CERT_TYPE_NONE); | |
stevenjb
2014/02/13 21:15:33
It looks like this bool is only used for kTypeVPN.
Ben Chan
2014/02/13 21:30:58
Done.
| |
400 | |
394 client_cert::ConfigType client_cert_type = client_cert::CONFIG_TYPE_NONE; | 401 client_cert::ConfigType client_cert_type = client_cert::CONFIG_TYPE_NONE; |
395 if (type == shill::kTypeVPN) { | 402 if (type == shill::kTypeVPN) { |
396 if (vpn_provider_type == shill::kProviderOpenVpn) | 403 if (vpn_provider_type == shill::kProviderOpenVpn) |
397 client_cert_type = client_cert::CONFIG_TYPE_OPENVPN; | 404 client_cert_type = client_cert::CONFIG_TYPE_OPENVPN; |
398 else | 405 else if (has_certificate_in_onc || !vpn_client_cert_id.empty()) { |
406 // If UIData doesn't contain a certificate (in ONC case), or if | |
407 // |vpn_client_cert_id| is empty (in non-ONC case), it's L2TP/IPsec with | |
408 // PSK and doesn't require a certificate. | |
409 | |
410 // TODO(benchan): Modify shill to specify the authentication type via the | |
411 // kL2tpIpsecAuthenticationType property, so that Chrome doesn't need to | |
412 // deduce the authentication type based on the | |
413 // kL2tpIpsecClientCertIdProperty here (and also in VPNConfigView). | |
399 client_cert_type = client_cert::CONFIG_TYPE_IPSEC; | 414 client_cert_type = client_cert::CONFIG_TYPE_IPSEC; |
415 } | |
400 } else if (type == shill::kTypeWifi && security == shill::kSecurity8021x) { | 416 } else if (type == shill::kTypeWifi && security == shill::kSecurity8021x) { |
401 client_cert_type = client_cert::CONFIG_TYPE_EAP; | 417 client_cert_type = client_cert::CONFIG_TYPE_EAP; |
402 } | 418 } |
403 | 419 |
404 base::DictionaryValue config_properties; | 420 base::DictionaryValue config_properties; |
405 if (client_cert_type != client_cert::CONFIG_TYPE_NONE) { | 421 if (client_cert_type != client_cert::CONFIG_TYPE_NONE) { |
406 // If the client certificate must be configured, this will be set to a | 422 // If the client certificate must be configured, this will be set to a |
407 // non-empty string. | 423 // non-empty string. |
408 std::string pkcs11_id; | 424 std::string pkcs11_id; |
409 | 425 |
410 // Check certificate properties in kUIDataProperty if configured. | 426 // Check certificate properties in kUIDataProperty if configured. |
411 // Note: Wifi/VPNConfigView set these properties explicitly, in which case | 427 // Note: Wifi/VPNConfigView set these properties explicitly, in which case |
412 // only the TPM must be configured. | 428 // only the TPM must be configured. |
413 scoped_ptr<NetworkUIData> ui_data = | |
414 shill_property_util::GetUIDataFromProperties(service_properties); | |
415 if (ui_data && ui_data->certificate_type() == CLIENT_CERT_TYPE_PATTERN) { | 429 if (ui_data && ui_data->certificate_type() == CLIENT_CERT_TYPE_PATTERN) { |
416 // User must be logged in to connect to a network requiring a certificate. | 430 // User must be logged in to connect to a network requiring a certificate. |
417 if (!logged_in_ || !cert_loader_) { | 431 if (!logged_in_ || !cert_loader_) { |
418 ErrorCallbackForPendingRequest(service_path, kErrorCertificateRequired); | 432 ErrorCallbackForPendingRequest(service_path, kErrorCertificateRequired); |
419 return; | 433 return; |
420 } | 434 } |
421 | 435 |
422 // If certificates have not been loaded yet, queue the connect request. | 436 // If certificates have not been loaded yet, queue the connect request. |
423 if (!certificates_loaded_) { | 437 if (!certificates_loaded_) { |
424 NET_LOG_EVENT("Certificates not loaded", ""); | 438 NET_LOG_EVENT("Certificates not loaded", ""); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
466 if (type == shill::kTypeVPN) { | 480 if (type == shill::kTypeVPN) { |
467 // VPN may require a username, and/or passphrase to be set. (Check after | 481 // VPN may require a username, and/or passphrase to be set. (Check after |
468 // ensuring that any required certificates are configured). | 482 // ensuring that any required certificates are configured). |
469 DCHECK(provider_properties); | 483 DCHECK(provider_properties); |
470 if (VPNRequiresCredentials( | 484 if (VPNRequiresCredentials( |
471 service_path, vpn_provider_type, *provider_properties)) { | 485 service_path, vpn_provider_type, *provider_properties)) { |
472 NET_LOG_USER("VPN Requires Credentials", service_path); | 486 NET_LOG_USER("VPN Requires Credentials", service_path); |
473 ErrorCallbackForPendingRequest(service_path, kErrorConfigurationRequired); | 487 ErrorCallbackForPendingRequest(service_path, kErrorConfigurationRequired); |
474 return; | 488 return; |
475 } | 489 } |
490 | |
491 // If it's L2TP/IPsec PSK, there is no properties to configure, so proceed | |
492 // to connect. | |
493 if (client_cert_type == client_cert::CONFIG_TYPE_NONE) { | |
494 CallShillConnect(service_path); | |
495 return; | |
496 } | |
476 } | 497 } |
477 | 498 |
478 if (!config_properties.empty()) { | 499 if (!config_properties.empty()) { |
479 NET_LOG_EVENT("Configuring Network", service_path); | 500 NET_LOG_EVENT("Configuring Network", service_path); |
480 network_configuration_handler_->SetProperties( | 501 network_configuration_handler_->SetProperties( |
481 service_path, | 502 service_path, |
482 config_properties, | 503 config_properties, |
483 base::Bind(&NetworkConnectionHandler::CallShillConnect, | 504 base::Bind(&NetworkConnectionHandler::CallShillConnect, |
484 AsWeakPtr(), | 505 AsWeakPtr(), |
485 service_path), | 506 service_path), |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
676 | 697 |
677 void NetworkConnectionHandler::HandleShillDisconnectSuccess( | 698 void NetworkConnectionHandler::HandleShillDisconnectSuccess( |
678 const std::string& service_path, | 699 const std::string& service_path, |
679 const base::Closure& success_callback) { | 700 const base::Closure& success_callback) { |
680 NET_LOG_EVENT("Disconnect Request Sent", service_path); | 701 NET_LOG_EVENT("Disconnect Request Sent", service_path); |
681 if (!success_callback.is_null()) | 702 if (!success_callback.is_null()) |
682 success_callback.Run(); | 703 success_callback.Run(); |
683 } | 704 } |
684 | 705 |
685 } // namespace chromeos | 706 } // namespace chromeos |
OLD | NEW |