| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/login/auth/parallel_authenticator.h" | 5 #include "chrome/browser/chromeos/login/auth/parallel_authenticator.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 | 68 |
| 69 FakeDBusThreadManager* fake_dbus_thread_manager = new FakeDBusThreadManager; | 69 FakeDBusThreadManager* fake_dbus_thread_manager = new FakeDBusThreadManager; |
| 70 fake_cryptohome_client_ = new FakeCryptohomeClient; | 70 fake_cryptohome_client_ = new FakeCryptohomeClient; |
| 71 fake_dbus_thread_manager->SetCryptohomeClient( | 71 fake_dbus_thread_manager->SetCryptohomeClient( |
| 72 scoped_ptr<CryptohomeClient>(fake_cryptohome_client_)); | 72 scoped_ptr<CryptohomeClient>(fake_cryptohome_client_)); |
| 73 DBusThreadManager::InitializeForTesting(fake_dbus_thread_manager); | 73 DBusThreadManager::InitializeForTesting(fake_dbus_thread_manager); |
| 74 | 74 |
| 75 SystemSaltGetter::Initialize(); | 75 SystemSaltGetter::Initialize(); |
| 76 | 76 |
| 77 auth_ = new ParallelAuthenticator(&consumer_); | 77 auth_ = new ParallelAuthenticator(&consumer_); |
| 78 state_.reset(new TestAttemptState(UserContext(username_, | 78 UserContext user_context(username_); |
| 79 password_, | 79 user_context.SetPassword(password_); |
| 80 std::string()), | 80 state_.reset(new TestAttemptState(user_context, false)); |
| 81 "", | |
| 82 "", | |
| 83 User::USER_TYPE_REGULAR, | |
| 84 false)); | |
| 85 } | 81 } |
| 86 | 82 |
| 87 // Tears down the test fixture. | 83 // Tears down the test fixture. |
| 88 virtual void TearDown() { | 84 virtual void TearDown() { |
| 89 SystemSaltGetter::Shutdown(); | 85 SystemSaltGetter::Shutdown(); |
| 90 DBusThreadManager::Shutdown(); | 86 DBusThreadManager::Shutdown(); |
| 91 | 87 |
| 92 cryptohome::AsyncMethodCaller::Shutdown(); | 88 cryptohome::AsyncMethodCaller::Shutdown(); |
| 93 mock_caller_ = NULL; | 89 mock_caller_ = NULL; |
| 94 } | 90 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 } | 133 } |
| 138 | 134 |
| 139 void ExpectRetailModeLoginSuccess() { | 135 void ExpectRetailModeLoginSuccess() { |
| 140 EXPECT_CALL(consumer_, OnRetailModeLoginSuccess(_)) | 136 EXPECT_CALL(consumer_, OnRetailModeLoginSuccess(_)) |
| 141 .WillOnce(Invoke(MockConsumer::OnRetailModeSuccessQuit)) | 137 .WillOnce(Invoke(MockConsumer::OnRetailModeSuccessQuit)) |
| 142 .RetiresOnSaturation(); | 138 .RetiresOnSaturation(); |
| 143 } | 139 } |
| 144 | 140 |
| 145 void ExpectLoginSuccess(const std::string& username, | 141 void ExpectLoginSuccess(const std::string& username, |
| 146 const std::string& password, | 142 const std::string& password, |
| 147 const std::string& username_hash_, | 143 const std::string& username_hash, |
| 148 bool pending) { | 144 bool pending) { |
| 149 EXPECT_CALL(consumer_, OnLoginSuccess(UserContext( | 145 UserContext user_context(username); |
| 150 username, | 146 user_context.SetPassword(password); |
| 151 password, | 147 user_context.SetUserIDHash(username_hash); |
| 152 std::string(), | 148 EXPECT_CALL(consumer_, OnLoginSuccess(user_context)) |
| 153 username_hash_, | |
| 154 true, // using_oauth | |
| 155 UserContext::AUTH_FLOW_OFFLINE))) | |
| 156 .WillOnce(Invoke(MockConsumer::OnSuccessQuit)) | 149 .WillOnce(Invoke(MockConsumer::OnSuccessQuit)) |
| 157 .RetiresOnSaturation(); | 150 .RetiresOnSaturation(); |
| 158 } | 151 } |
| 159 | 152 |
| 160 void ExpectGuestLoginSuccess() { | 153 void ExpectGuestLoginSuccess() { |
| 161 EXPECT_CALL(consumer_, OnOffTheRecordLoginSuccess()) | 154 EXPECT_CALL(consumer_, OnOffTheRecordLoginSuccess()) |
| 162 .WillOnce(Invoke(MockConsumer::OnGuestSuccessQuit)) | 155 .WillOnce(Invoke(MockConsumer::OnGuestSuccessQuit)) |
| 163 .RetiresOnSaturation(); | 156 .RetiresOnSaturation(); |
| 164 } | 157 } |
| 165 | 158 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 | 195 |
| 203 cryptohome::MockAsyncMethodCaller* mock_caller_; | 196 cryptohome::MockAsyncMethodCaller* mock_caller_; |
| 204 | 197 |
| 205 MockConsumer consumer_; | 198 MockConsumer consumer_; |
| 206 scoped_refptr<ParallelAuthenticator> auth_; | 199 scoped_refptr<ParallelAuthenticator> auth_; |
| 207 scoped_ptr<TestAttemptState> state_; | 200 scoped_ptr<TestAttemptState> state_; |
| 208 FakeCryptohomeClient* fake_cryptohome_client_; | 201 FakeCryptohomeClient* fake_cryptohome_client_; |
| 209 }; | 202 }; |
| 210 | 203 |
| 211 TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { | 204 TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { |
| 212 EXPECT_CALL(consumer_, OnLoginSuccess(UserContext( | 205 UserContext user_context(username_); |
| 213 username_, | 206 user_context.SetPassword(password_); |
| 214 password_, | 207 user_context.SetUserIDHash(username_hash_); |
| 215 std::string(), | 208 EXPECT_CALL(consumer_, OnLoginSuccess(user_context)) |
| 216 username_hash_, | |
| 217 true, // using oauth | |
| 218 UserContext::AUTH_FLOW_OFFLINE))) | |
| 219 .Times(1) | 209 .Times(1) |
| 220 .RetiresOnSaturation(); | 210 .RetiresOnSaturation(); |
| 221 | 211 |
| 222 SetAttemptState(auth_.get(), state_.release()); | 212 SetAttemptState(auth_.get(), state_.release()); |
| 223 auth_->OnLoginSuccess(); | 213 auth_->OnLoginSuccess(); |
| 224 } | 214 } |
| 225 | 215 |
| 226 TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { | 216 TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { |
| 227 EXPECT_CALL(consumer_, OnPasswordChangeDetected()) | 217 EXPECT_CALL(consumer_, OnPasswordChangeDetected()) |
| 228 .Times(1) | 218 .Times(1) |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 } | 262 } |
| 273 | 263 |
| 274 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededMount) { | 264 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededMount) { |
| 275 // Set up state as though a cryptohome mount attempt has occurred | 265 // Set up state as though a cryptohome mount attempt has occurred |
| 276 // and succeeded but we are in safe mode and the current user is not owner. | 266 // and succeeded but we are in safe mode and the current user is not owner. |
| 277 // This test will check that the "safe-mode" policy is not set and will let | 267 // This test will check that the "safe-mode" policy is not set and will let |
| 278 // the mount finish successfully. | 268 // the mount finish successfully. |
| 279 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 269 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
| 280 SetOwnerState(false, false); | 270 SetOwnerState(false, false); |
| 281 // and test that the mount has succeeded. | 271 // and test that the mount has succeeded. |
| 282 state_.reset(new TestAttemptState(UserContext(username_, | 272 UserContext user_context(username_); |
| 283 password_, | 273 user_context.SetPassword(password_); |
| 284 std::string()), | 274 state_.reset(new TestAttemptState(user_context, false)); |
| 285 "", | |
| 286 "", | |
| 287 User::USER_TYPE_REGULAR, | |
| 288 false)); | |
| 289 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 275 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
| 290 EXPECT_EQ(ParallelAuthenticator::OFFLINE_LOGIN, | 276 EXPECT_EQ(ParallelAuthenticator::OFFLINE_LOGIN, |
| 291 SetAndResolveState(auth_.get(), state_.release())); | 277 SetAndResolveState(auth_.get(), state_.release())); |
| 292 } | 278 } |
| 293 | 279 |
| 294 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededFailedMount) { | 280 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededFailedMount) { |
| 295 FailOnLoginSuccess(); // Set failing on success as the default... | 281 FailOnLoginSuccess(); // Set failing on success as the default... |
| 296 LoginFailure failure = LoginFailure(LoginFailure::OWNER_REQUIRED); | 282 LoginFailure failure = LoginFailure(LoginFailure::OWNER_REQUIRED); |
| 297 ExpectLoginFailure(failure); | 283 ExpectLoginFailure(failure); |
| 298 | 284 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 321 SetAndResolveState(auth_.get(), state_.release())); | 307 SetAndResolveState(auth_.get(), state_.release())); |
| 322 EXPECT_TRUE(LoginState::Get()->IsInSafeMode()); | 308 EXPECT_TRUE(LoginState::Get()->IsInSafeMode()); |
| 323 | 309 |
| 324 // Simulate TPM token ready event. | 310 // Simulate TPM token ready event. |
| 325 DeviceSettingsService::Get()->OnTPMTokenReady(); | 311 DeviceSettingsService::Get()->OnTPMTokenReady(); |
| 326 | 312 |
| 327 // Flush all the pending operations. The operations should induce an owner | 313 // Flush all the pending operations. The operations should induce an owner |
| 328 // verification. | 314 // verification. |
| 329 device_settings_test_helper_.Flush(); | 315 device_settings_test_helper_.Flush(); |
| 330 // and test that the mount has succeeded. | 316 // and test that the mount has succeeded. |
| 331 state_.reset(new TestAttemptState(UserContext(username_, | 317 UserContext user_context(username_); |
| 332 password_, | 318 user_context.SetPassword(password_); |
| 333 std::string()), | 319 state_.reset(new TestAttemptState(user_context, false)); |
| 334 "", | |
| 335 "", | |
| 336 User::USER_TYPE_REGULAR, | |
| 337 false)); | |
| 338 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 320 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
| 339 EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED, | 321 EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED, |
| 340 SetAndResolveState(auth_.get(), state_.release())); | 322 SetAndResolveState(auth_.get(), state_.release())); |
| 341 | 323 |
| 342 // Unset global objects used by this test. | 324 // Unset global objects used by this test. |
| 343 LoginState::Shutdown(); | 325 LoginState::Shutdown(); |
| 344 EXPECT_TRUE( | 326 EXPECT_TRUE( |
| 345 CrosSettings::Get()->RemoveSettingsProvider(&stub_settings_provider)); | 327 CrosSettings::Get()->RemoveSettingsProvider(&stub_settings_provider)); |
| 346 CrosSettings::Get()->AddSettingsProvider(device_settings_provider); | 328 CrosSettings::Get()->AddSettingsProvider(device_settings_provider); |
| 347 } | 329 } |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 ExpectLoginSuccess(username_, std::string(), std::string(), false); | 582 ExpectLoginSuccess(username_, std::string(), std::string(), false); |
| 601 FailOnLoginFailure(); | 583 FailOnLoginFailure(); |
| 602 | 584 |
| 603 // Set up mock async method caller to respond successfully to a cryptohome | 585 // Set up mock async method caller to respond successfully to a cryptohome |
| 604 // key-check attempt. | 586 // key-check attempt. |
| 605 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 587 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
| 606 EXPECT_CALL(*mock_caller_, AsyncCheckKey(username_, _, _)) | 588 EXPECT_CALL(*mock_caller_, AsyncCheckKey(username_, _, _)) |
| 607 .Times(1) | 589 .Times(1) |
| 608 .RetiresOnSaturation(); | 590 .RetiresOnSaturation(); |
| 609 | 591 |
| 610 auth_->AuthenticateToUnlock(UserContext(username_, | 592 auth_->AuthenticateToUnlock(UserContext(username_)); |
| 611 std::string(), | |
| 612 std::string())); | |
| 613 base::MessageLoop::current()->Run(); | 593 base::MessageLoop::current()->Run(); |
| 614 } | 594 } |
| 615 | 595 |
| 616 } // namespace chromeos | 596 } // namespace chromeos |
| OLD | NEW |