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 |