| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 dbus_manager->GetShillManagerClient()->GetTestInterface(); | 84 dbus_manager->GetShillManagerClient()->GetTestInterface(); |
| 85 test_service_client_ = | 85 test_service_client_ = |
| 86 dbus_manager->GetShillServiceClient()->GetTestInterface(); | 86 dbus_manager->GetShillServiceClient()->GetTestInterface(); |
| 87 | 87 |
| 88 test_manager_client_->AddTechnology(shill::kTypeWifi, true /* enabled */); | 88 test_manager_client_->AddTechnology(shill::kTypeWifi, true /* enabled */); |
| 89 dbus_manager->GetShillDeviceClient()->GetTestInterface()->AddDevice( | 89 dbus_manager->GetShillDeviceClient()->GetTestInterface()->AddDevice( |
| 90 "/device/wifi1", shill::kTypeWifi, "wifi_device1"); | 90 "/device/wifi1", shill::kTypeWifi, "wifi_device1"); |
| 91 test_manager_client_->AddTechnology(shill::kTypeCellular, | 91 test_manager_client_->AddTechnology(shill::kTypeCellular, |
| 92 true /* enabled */); | 92 true /* enabled */); |
| 93 dbus_manager->GetShillProfileClient()->GetTestInterface()->AddProfile( | 93 dbus_manager->GetShillProfileClient()->GetTestInterface()->AddProfile( |
| 94 "profile_path", std::string() /* shared profile */); | 94 "shared_profile_path", std::string() /* shared profile */); |
| 95 dbus_manager->GetShillProfileClient()->GetTestInterface()->AddProfile( |
| 96 "user_profile_path", user_.username_hash()); |
| 95 | 97 |
| 96 base::RunLoop().RunUntilIdle(); | 98 base::RunLoop().RunUntilIdle(); |
| 97 LoginState::Initialize(); | 99 LoginState::Initialize(); |
| 98 network_state_handler_.reset(NetworkStateHandler::InitializeForTest()); | 100 network_state_handler_.reset(NetworkStateHandler::InitializeForTest()); |
| 99 network_config_handler_.reset( | 101 network_config_handler_.reset( |
| 100 NetworkConfigurationHandler::InitializeForTest( | 102 NetworkConfigurationHandler::InitializeForTest( |
| 101 network_state_handler_.get())); | 103 network_state_handler_.get())); |
| 102 | 104 |
| 103 network_profile_handler_.reset(new NetworkProfileHandler()); | 105 network_profile_handler_.reset(new NetworkProfileHandler()); |
| 104 network_profile_handler_->Init(); | 106 network_profile_handler_->Init(); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 | 215 |
| 214 scoped_refptr<net::CryptoModule> module( | 216 scoped_refptr<net::CryptoModule> module( |
| 215 net::CryptoModule::CreateFromHandle(nssdb->GetPrivateSlot().get())); | 217 net::CryptoModule::CreateFromHandle(nssdb->GetPrivateSlot().get())); |
| 216 ASSERT_EQ( | 218 ASSERT_EQ( |
| 217 net::OK, | 219 net::OK, |
| 218 nssdb->ImportFromPKCS12(module, pkcs12_data, base::string16(), false, | 220 nssdb->ImportFromPKCS12(module, pkcs12_data, base::string16(), false, |
| 219 loaded_certs)); | 221 loaded_certs)); |
| 220 ASSERT_EQ(1U, loaded_certs->size()); | 222 ASSERT_EQ(1U, loaded_certs->size()); |
| 221 } | 223 } |
| 222 | 224 |
| 223 void SetupPolicy() { | 225 void SetupPolicy(const std::string& network_configs_json, |
| 224 const char* kNetworkConfigs = | 226 const base::DictionaryValue& global_config, |
| 225 "[ { \"GUID\": \"wifi1\"," | 227 bool user_policy) { |
| 226 " \"Name\": \"wifi1\"," | |
| 227 " \"Type\": \"WiFi\"," | |
| 228 " \"WiFi\": {" | |
| 229 " \"Security\": \"WPA-PSK\"," | |
| 230 " \"SSID\": \"wifi1\"," | |
| 231 " \"Passphrase\": \"passphrase\"" | |
| 232 " }" | |
| 233 "} ]"; | |
| 234 | |
| 235 std::string error; | 228 std::string error; |
| 236 scoped_ptr<base::Value> network_configs_value( | 229 scoped_ptr<base::Value> network_configs_value( |
| 237 base::JSONReader::ReadAndReturnError( | 230 base::JSONReader::ReadAndReturnError(network_configs_json, |
| 238 kNetworkConfigs, base::JSON_ALLOW_TRAILING_COMMAS, NULL, &error)); | 231 base::JSON_ALLOW_TRAILING_COMMAS, |
| 232 NULL, |
| 233 &error)); |
| 239 ASSERT_TRUE(network_configs_value) << error; | 234 ASSERT_TRUE(network_configs_value) << error; |
| 240 | 235 |
| 241 base::ListValue* network_configs = NULL; | 236 base::ListValue* network_configs = NULL; |
| 242 ASSERT_TRUE(network_configs_value->GetAsList(&network_configs)); | 237 ASSERT_TRUE(network_configs_value->GetAsList(&network_configs)); |
| 243 | 238 |
| 244 base::DictionaryValue global_config; | 239 if (user_policy) { |
| 245 global_config.SetBooleanWithoutPathExpansion( | 240 managed_config_handler_->SetPolicy( |
| 246 ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect, | 241 ::onc::ONC_SOURCE_USER_POLICY, |
| 247 true); | 242 user_.username_hash(), |
| 248 | 243 *network_configs, |
| 249 managed_config_handler_->SetPolicy(::onc::ONC_SOURCE_USER_POLICY, | 244 global_config); |
| 250 "", // userhash | 245 } else { |
| 251 *network_configs, | 246 managed_config_handler_->SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY, |
| 252 global_config); | 247 std::string(), // no username hash |
| 248 *network_configs, |
| 249 global_config); |
| 250 } |
| 253 base::RunLoop().RunUntilIdle(); | 251 base::RunLoop().RunUntilIdle(); |
| 254 } | 252 } |
| 255 | 253 |
| 256 scoped_ptr<NetworkStateHandler> network_state_handler_; | 254 scoped_ptr<NetworkStateHandler> network_state_handler_; |
| 257 scoped_ptr<NetworkConfigurationHandler> network_config_handler_; | 255 scoped_ptr<NetworkConfigurationHandler> network_config_handler_; |
| 258 scoped_ptr<NetworkConnectionHandler> network_connection_handler_; | 256 scoped_ptr<NetworkConnectionHandler> network_connection_handler_; |
| 259 scoped_ptr<ManagedNetworkConfigurationHandlerImpl> managed_config_handler_; | 257 scoped_ptr<ManagedNetworkConfigurationHandlerImpl> managed_config_handler_; |
| 260 scoped_ptr<NetworkProfileHandler> network_profile_handler_; | 258 scoped_ptr<NetworkProfileHandler> network_profile_handler_; |
| 261 crypto::ScopedTestNSSChromeOSUser user_; | 259 crypto::ScopedTestNSSChromeOSUser user_; |
| 262 ShillManagerClient::TestInterface* test_manager_client_; | 260 ShillManagerClient::TestInterface* test_manager_client_; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 GetResultAndReset()); | 313 GetResultAndReset()); |
| 316 | 314 |
| 317 EXPECT_TRUE(Configure(kConfigRequiresActivation)); | 315 EXPECT_TRUE(Configure(kConfigRequiresActivation)); |
| 318 Connect("cellular1"); | 316 Connect("cellular1"); |
| 319 EXPECT_EQ(NetworkConnectionHandler::kErrorActivationRequired, | 317 EXPECT_EQ(NetworkConnectionHandler::kErrorActivationRequired, |
| 320 GetResultAndReset()); | 318 GetResultAndReset()); |
| 321 } | 319 } |
| 322 | 320 |
| 323 namespace { | 321 namespace { |
| 324 | 322 |
| 325 const char* kConfigRequiresCertificateTemplate = | 323 const char* kPolicyWithCertPatternTemplate = |
| 326 "{ \"GUID\": \"wifi4\", \"Type\": \"wifi\", \"Connectable\": false," | 324 "[ { \"GUID\": \"wifi4\"," |
| 327 " \"Security\": \"802_1x\"," | 325 " \"Name\": \"wifi4\"," |
| 328 " \"UIData\": \"{" | 326 " \"Type\": \"WiFi\"," |
| 329 " \\\"certificate_type\\\": \\\"pattern\\\"," | 327 " \"WiFi\": {" |
| 330 " \\\"certificate_pattern\\\": {" | 328 " \"Security\": \"WPA-EAP\"," |
| 331 " \\\"Subject\\\": {\\\"CommonName\\\": \\\"%s\\\" }" | 329 " \"SSID\": \"wifi_ssid\"," |
| 332 " } }\" }"; | 330 " \"EAP\": {" |
| 331 " \"Outer\": \"EAP-TLS\"," |
| 332 " \"ClientCertType\": \"Pattern\"," |
| 333 " \"ClientCertPattern\": {" |
| 334 " \"Subject\": {" |
| 335 " \"CommonName\" : \"%s\"" |
| 336 " }" |
| 337 " }" |
| 338 " }" |
| 339 " }" |
| 340 "} ]"; |
| 333 | 341 |
| 334 } // namespace | 342 } // namespace |
| 335 | 343 |
| 336 // Handle certificates. | 344 // Handle certificates. |
| 337 TEST_F(NetworkConnectionHandlerTest, ConnectCertificateMissing) { | 345 TEST_F(NetworkConnectionHandlerTest, ConnectCertificateMissing) { |
| 338 StartCertLoader(); | 346 StartCertLoader(); |
| 347 SetupPolicy(base::StringPrintf(kPolicyWithCertPatternTemplate, "unknown"), |
| 348 base::DictionaryValue(), // no global config |
| 349 true); // load as user policy |
| 339 | 350 |
| 340 EXPECT_TRUE(Configure( | |
| 341 base::StringPrintf(kConfigRequiresCertificateTemplate, "unknown"))); | |
| 342 Connect("wifi4"); | 351 Connect("wifi4"); |
| 343 EXPECT_EQ(NetworkConnectionHandler::kErrorCertificateRequired, | 352 EXPECT_EQ(NetworkConnectionHandler::kErrorCertificateRequired, |
| 344 GetResultAndReset()); | 353 GetResultAndReset()); |
| 345 } | 354 } |
| 346 | 355 |
| 347 TEST_F(NetworkConnectionHandlerTest, ConnectWithCertificateSuccess) { | 356 TEST_F(NetworkConnectionHandlerTest, ConnectWithCertificateSuccess) { |
| 348 StartCertLoader(); | 357 StartCertLoader(); |
| 349 | 358 |
| 350 net::CertificateList certs; | 359 net::CertificateList certs; |
| 351 ImportClientCertAndKey("websocket_client_cert.p12", | 360 ImportClientCertAndKey("websocket_client_cert.p12", |
| 352 test_nssdb_.get(), | 361 test_nssdb_.get(), |
| 353 &certs); | 362 &certs); |
| 354 | 363 |
| 355 EXPECT_TRUE(Configure( | 364 SetupPolicy(base::StringPrintf(kPolicyWithCertPatternTemplate, |
| 356 base::StringPrintf(kConfigRequiresCertificateTemplate, | 365 certs[0]->subject().common_name.c_str()), |
| 357 certs[0]->subject().common_name.c_str()))); | 366 base::DictionaryValue(), // no global config |
| 367 true); // load as user policy |
| 358 | 368 |
| 359 Connect("wifi4"); | 369 Connect("wifi4"); |
| 360 EXPECT_EQ(kSuccessResult, GetResultAndReset()); | 370 EXPECT_EQ(kSuccessResult, GetResultAndReset()); |
| 361 } | 371 } |
| 362 | 372 |
| 363 TEST_F(NetworkConnectionHandlerTest, | 373 TEST_F(NetworkConnectionHandlerTest, |
| 364 ConnectWithCertificateRequestedBeforeCertsAreLoaded) { | 374 ConnectWithCertificateRequestedBeforeCertsAreLoaded) { |
| 365 net::CertificateList certs; | 375 net::CertificateList certs; |
| 366 ImportClientCertAndKey("websocket_client_cert.p12", | 376 ImportClientCertAndKey("websocket_client_cert.p12", |
| 367 test_nssdb_.get(), | 377 test_nssdb_.get(), |
| 368 &certs); | 378 &certs); |
| 369 | 379 |
| 370 EXPECT_TRUE(Configure( | 380 SetupPolicy(base::StringPrintf(kPolicyWithCertPatternTemplate, |
| 371 base::StringPrintf(kConfigRequiresCertificateTemplate, | 381 certs[0]->subject().common_name.c_str()), |
| 372 certs[0]->subject().common_name.c_str()))); | 382 base::DictionaryValue(), // no global config |
| 383 true); // load as user policy |
| 373 | 384 |
| 374 Connect("wifi4"); | 385 Connect("wifi4"); |
| 375 | 386 |
| 376 // Connect request came before the cert loader loaded certificates, so the | 387 // Connect request came before the cert loader loaded certificates, so the |
| 377 // connect request should have been throttled until the certificates are | 388 // connect request should have been throttled until the certificates are |
| 378 // loaded. | 389 // loaded. |
| 379 EXPECT_EQ("", GetResultAndReset()); | 390 EXPECT_EQ("", GetResultAndReset()); |
| 380 | 391 |
| 381 StartCertLoader(); | 392 StartCertLoader(); |
| 382 | 393 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 405 } | 416 } |
| 406 | 417 |
| 407 namespace { | 418 namespace { |
| 408 | 419 |
| 409 const char* kConfigUnmanagedSharedConnected = | 420 const char* kConfigUnmanagedSharedConnected = |
| 410 "{ \"GUID\": \"wifi0\", \"Type\": \"wifi\", \"State\": \"online\" }"; | 421 "{ \"GUID\": \"wifi0\", \"Type\": \"wifi\", \"State\": \"online\" }"; |
| 411 const char* kConfigManagedSharedConnectable = | 422 const char* kConfigManagedSharedConnectable = |
| 412 "{ \"GUID\": \"wifi1\", \"Type\": \"wifi\", \"State\": \"idle\", " | 423 "{ \"GUID\": \"wifi1\", \"Type\": \"wifi\", \"State\": \"idle\", " |
| 413 " \"Connectable\": true }"; | 424 " \"Connectable\": true }"; |
| 414 | 425 |
| 426 const char* kPolicy = |
| 427 "[ { \"GUID\": \"wifi1\"," |
| 428 " \"Name\": \"wifi1\"," |
| 429 " \"Type\": \"WiFi\"," |
| 430 " \"WiFi\": {" |
| 431 " \"Security\": \"WPA-PSK\"," |
| 432 " \"SSID\": \"wifi1\"," |
| 433 " \"Passphrase\": \"passphrase\"" |
| 434 " }" |
| 435 "} ]"; |
| 436 |
| 415 } // namespace | 437 } // namespace |
| 416 | 438 |
| 417 TEST_F(NetworkConnectionHandlerTest, ReconnectOnLoginEarlyPolicyLoading) { | 439 TEST_F(NetworkConnectionHandlerTest, ReconnectOnLoginEarlyPolicyLoading) { |
| 418 EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected)); | 440 EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected)); |
| 419 EXPECT_TRUE(Configure(kConfigManagedSharedConnectable)); | 441 EXPECT_TRUE(Configure(kConfigManagedSharedConnectable)); |
| 420 test_manager_client_->SetBestServiceToConnect("wifi1"); | 442 test_manager_client_->SetBestServiceToConnect("wifi1"); |
| 421 | 443 |
| 422 // User login shouldn't trigger any change because policy is not loaded yet. | 444 // User login shouldn't trigger any change because policy is not loaded yet. |
| 423 LoginToRegularUser(); | 445 LoginToRegularUser(); |
| 424 EXPECT_EQ(shill::kStateOnline, | 446 EXPECT_EQ(shill::kStateOnline, |
| 425 GetServiceStringProperty("wifi0", shill::kStateProperty)); | 447 GetServiceStringProperty("wifi0", shill::kStateProperty)); |
| 426 EXPECT_EQ(shill::kStateIdle, | 448 EXPECT_EQ(shill::kStateIdle, |
| 427 GetServiceStringProperty("wifi1", shill::kStateProperty)); | 449 GetServiceStringProperty("wifi1", shill::kStateProperty)); |
| 428 | 450 |
| 429 // Policy application should disconnect from the shared and unmanaged network. | 451 // Applying the policy which restricts autoconnect should disconnect from the |
| 430 SetupPolicy(); | 452 // shared, unmanaged network. |
| 453 base::DictionaryValue global_config; |
| 454 global_config.SetBooleanWithoutPathExpansion( |
| 455 ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect, |
| 456 true); |
| 457 |
| 458 SetupPolicy(kPolicy, global_config, false /* load as device policy */); |
| 431 EXPECT_EQ(shill::kStateIdle, | 459 EXPECT_EQ(shill::kStateIdle, |
| 432 GetServiceStringProperty("wifi0", shill::kStateProperty)); | 460 GetServiceStringProperty("wifi0", shill::kStateProperty)); |
| 433 EXPECT_EQ(shill::kStateIdle, | 461 EXPECT_EQ(shill::kStateIdle, |
| 434 GetServiceStringProperty("wifi1", shill::kStateProperty)); | 462 GetServiceStringProperty("wifi1", shill::kStateProperty)); |
| 435 | 463 |
| 436 // Certificate loading should trigger connecting to the 'best' network. | 464 // Certificate loading should trigger connecting to the 'best' network. |
| 437 StartCertLoader(); | 465 StartCertLoader(); |
| 438 EXPECT_EQ(shill::kStateIdle, | 466 EXPECT_EQ(shill::kStateIdle, |
| 439 GetServiceStringProperty("wifi0", shill::kStateProperty)); | 467 GetServiceStringProperty("wifi0", shill::kStateProperty)); |
| 440 EXPECT_EQ(shill::kStateOnline, | 468 EXPECT_EQ(shill::kStateOnline, |
| 441 GetServiceStringProperty("wifi1", shill::kStateProperty)); | 469 GetServiceStringProperty("wifi1", shill::kStateProperty)); |
| 442 } | 470 } |
| 443 | 471 |
| 444 TEST_F(NetworkConnectionHandlerTest, ReconnectOnLoginLatePolicyLoading) { | 472 TEST_F(NetworkConnectionHandlerTest, ReconnectOnLoginLatePolicyLoading) { |
| 445 EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected)); | 473 EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected)); |
| 446 EXPECT_TRUE(Configure(kConfigManagedSharedConnectable)); | 474 EXPECT_TRUE(Configure(kConfigManagedSharedConnectable)); |
| 447 test_manager_client_->SetBestServiceToConnect("wifi1"); | 475 test_manager_client_->SetBestServiceToConnect("wifi1"); |
| 448 | 476 |
| 449 // User login and certificate loading shouldn't trigger any change until the | 477 // User login and certificate loading shouldn't trigger any change until the |
| 450 // policy is loaded. | 478 // policy is loaded. |
| 451 LoginToRegularUser(); | 479 LoginToRegularUser(); |
| 452 StartCertLoader(); | 480 StartCertLoader(); |
| 453 EXPECT_EQ(shill::kStateOnline, | 481 EXPECT_EQ(shill::kStateOnline, |
| 454 GetServiceStringProperty("wifi0", shill::kStateProperty)); | 482 GetServiceStringProperty("wifi0", shill::kStateProperty)); |
| 455 EXPECT_EQ(shill::kStateIdle, | 483 EXPECT_EQ(shill::kStateIdle, |
| 456 GetServiceStringProperty("wifi1", shill::kStateProperty)); | 484 GetServiceStringProperty("wifi1", shill::kStateProperty)); |
| 457 | 485 |
| 458 SetupPolicy(); | 486 // Applying the policy which restricts autoconnect should disconnect from the |
| 487 // shared, unmanaged network. |
| 488 base::DictionaryValue global_config; |
| 489 global_config.SetBooleanWithoutPathExpansion( |
| 490 ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect, |
| 491 true); |
| 492 |
| 493 SetupPolicy(kPolicy, global_config, false /* load as device policy */); |
| 459 EXPECT_EQ(shill::kStateIdle, | 494 EXPECT_EQ(shill::kStateIdle, |
| 460 GetServiceStringProperty("wifi0", shill::kStateProperty)); | 495 GetServiceStringProperty("wifi0", shill::kStateProperty)); |
| 461 EXPECT_EQ(shill::kStateOnline, | 496 EXPECT_EQ(shill::kStateOnline, |
| 462 GetServiceStringProperty("wifi1", shill::kStateProperty)); | 497 GetServiceStringProperty("wifi1", shill::kStateProperty)); |
| 463 } | 498 } |
| 464 | 499 |
| 465 } // namespace chromeos | 500 } // namespace chromeos |
| OLD | NEW |