| 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" |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
| 14 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
| 15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 16 #include "chrome/browser/chromeos/login/auth/key.h" |
| 16 #include "chrome/browser/chromeos/login/auth/mock_login_status_consumer.h" | 17 #include "chrome/browser/chromeos/login/auth/mock_login_status_consumer.h" |
| 17 #include "chrome/browser/chromeos/login/auth/mock_url_fetchers.h" | 18 #include "chrome/browser/chromeos/login/auth/mock_url_fetchers.h" |
| 18 #include "chrome/browser/chromeos/login/auth/test_attempt_state.h" | 19 #include "chrome/browser/chromeos/login/auth/test_attempt_state.h" |
| 19 #include "chrome/browser/chromeos/login/auth/user_context.h" | 20 #include "chrome/browser/chromeos/login/auth/user_context.h" |
| 20 #include "chrome/browser/chromeos/login/users/mock_user_manager.h" | 21 #include "chrome/browser/chromeos/login/users/mock_user_manager.h" |
| 21 #include "chrome/browser/chromeos/login/users/user_manager.h" | 22 #include "chrome/browser/chromeos/login/users/user_manager.h" |
| 22 #include "chrome/browser/chromeos/settings/cros_settings.h" | 23 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 23 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h" | 24 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h" |
| 24 #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" | 25 #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" |
| 25 #include "chrome/test/base/testing_profile.h" | 26 #include "chrome/test/base/testing_profile.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 39 | 40 |
| 40 using ::testing::Invoke; | 41 using ::testing::Invoke; |
| 41 using ::testing::Return; | 42 using ::testing::Return; |
| 42 using ::testing::_; | 43 using ::testing::_; |
| 43 | 44 |
| 44 namespace chromeos { | 45 namespace chromeos { |
| 45 | 46 |
| 46 class ParallelAuthenticatorTest : public testing::Test { | 47 class ParallelAuthenticatorTest : public testing::Test { |
| 47 public: | 48 public: |
| 48 ParallelAuthenticatorTest() | 49 ParallelAuthenticatorTest() |
| 49 : username_("me@nowhere.org"), | 50 : user_context_("me@nowhere.org"), |
| 50 password_("fakepass"), | |
| 51 hash_ascii_(ParallelAuthenticator::HashPassword( | |
| 52 password_, | |
| 53 SystemSaltGetter::ConvertRawSaltToHexString( | |
| 54 FakeCryptohomeClient::GetStubSystemSalt()))), | |
| 55 user_manager_enabler_(new MockUserManager), | 51 user_manager_enabler_(new MockUserManager), |
| 56 mock_caller_(NULL) { | 52 mock_caller_(NULL) { |
| 53 user_context_.SetKey(Key("fakepass")); |
| 54 transformed_key_ = *user_context_.GetKey(); |
| 55 transformed_key_.Transform(Key::KEY_TYPE_SALTED_SHA256_TOP_HALF, |
| 56 SystemSaltGetter::ConvertRawSaltToHexString( |
| 57 FakeCryptohomeClient::GetStubSystemSalt())); |
| 57 } | 58 } |
| 58 | 59 |
| 59 virtual ~ParallelAuthenticatorTest() { | 60 virtual ~ParallelAuthenticatorTest() { |
| 60 DCHECK(!mock_caller_); | 61 DCHECK(!mock_caller_); |
| 61 } | 62 } |
| 62 | 63 |
| 63 virtual void SetUp() { | 64 virtual void SetUp() { |
| 64 CommandLine::ForCurrentProcess()->AppendSwitch(switches::kLoginManager); | 65 CommandLine::ForCurrentProcess()->AppendSwitch(switches::kLoginManager); |
| 65 | 66 |
| 66 mock_caller_ = new cryptohome::MockAsyncMethodCaller; | 67 mock_caller_ = new cryptohome::MockAsyncMethodCaller; |
| 67 cryptohome::AsyncMethodCaller::InitializeForTesting(mock_caller_); | 68 cryptohome::AsyncMethodCaller::InitializeForTesting(mock_caller_); |
| 68 | 69 |
| 69 FakeDBusThreadManager* fake_dbus_thread_manager = new FakeDBusThreadManager; | 70 FakeDBusThreadManager* fake_dbus_thread_manager = new FakeDBusThreadManager; |
| 70 fake_cryptohome_client_ = new FakeCryptohomeClient; | 71 fake_cryptohome_client_ = new FakeCryptohomeClient; |
| 71 fake_dbus_thread_manager->SetCryptohomeClient( | 72 fake_dbus_thread_manager->SetCryptohomeClient( |
| 72 scoped_ptr<CryptohomeClient>(fake_cryptohome_client_)); | 73 scoped_ptr<CryptohomeClient>(fake_cryptohome_client_)); |
| 73 DBusThreadManager::InitializeForTesting(fake_dbus_thread_manager); | 74 DBusThreadManager::InitializeForTesting(fake_dbus_thread_manager); |
| 74 | 75 |
| 75 SystemSaltGetter::Initialize(); | 76 SystemSaltGetter::Initialize(); |
| 76 | 77 |
| 77 auth_ = new ParallelAuthenticator(&consumer_); | 78 auth_ = new ParallelAuthenticator(&consumer_); |
| 78 UserContext user_context(username_); | 79 state_.reset(new TestAttemptState(user_context_, false)); |
| 79 user_context.SetPassword(password_); | |
| 80 state_.reset(new TestAttemptState(user_context, false)); | |
| 81 } | 80 } |
| 82 | 81 |
| 83 // Tears down the test fixture. | 82 // Tears down the test fixture. |
| 84 virtual void TearDown() { | 83 virtual void TearDown() { |
| 85 SystemSaltGetter::Shutdown(); | 84 SystemSaltGetter::Shutdown(); |
| 86 DBusThreadManager::Shutdown(); | 85 DBusThreadManager::Shutdown(); |
| 87 | 86 |
| 88 cryptohome::AsyncMethodCaller::Shutdown(); | 87 cryptohome::AsyncMethodCaller::Shutdown(); |
| 89 mock_caller_ = NULL; | 88 mock_caller_ = NULL; |
| 90 } | 89 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 .WillOnce(Invoke(MockConsumer::OnFailQuit)) | 130 .WillOnce(Invoke(MockConsumer::OnFailQuit)) |
| 132 .RetiresOnSaturation(); | 131 .RetiresOnSaturation(); |
| 133 } | 132 } |
| 134 | 133 |
| 135 void ExpectRetailModeLoginSuccess() { | 134 void ExpectRetailModeLoginSuccess() { |
| 136 EXPECT_CALL(consumer_, OnRetailModeLoginSuccess(_)) | 135 EXPECT_CALL(consumer_, OnRetailModeLoginSuccess(_)) |
| 137 .WillOnce(Invoke(MockConsumer::OnRetailModeSuccessQuit)) | 136 .WillOnce(Invoke(MockConsumer::OnRetailModeSuccessQuit)) |
| 138 .RetiresOnSaturation(); | 137 .RetiresOnSaturation(); |
| 139 } | 138 } |
| 140 | 139 |
| 141 void ExpectLoginSuccess(const std::string& username, | 140 void ExpectLoginSuccess(const UserContext& user_context) { |
| 142 const std::string& password, | |
| 143 const std::string& username_hash, | |
| 144 bool pending) { | |
| 145 UserContext user_context(username); | |
| 146 user_context.SetPassword(password); | |
| 147 user_context.SetUserIDHash(username_hash); | |
| 148 EXPECT_CALL(consumer_, OnLoginSuccess(user_context)) | 141 EXPECT_CALL(consumer_, OnLoginSuccess(user_context)) |
| 149 .WillOnce(Invoke(MockConsumer::OnSuccessQuit)) | 142 .WillOnce(Invoke(MockConsumer::OnSuccessQuit)) |
| 150 .RetiresOnSaturation(); | 143 .RetiresOnSaturation(); |
| 151 } | 144 } |
| 152 | 145 |
| 153 void ExpectGuestLoginSuccess() { | 146 void ExpectGuestLoginSuccess() { |
| 154 EXPECT_CALL(consumer_, OnOffTheRecordLoginSuccess()) | 147 EXPECT_CALL(consumer_, OnOffTheRecordLoginSuccess()) |
| 155 .WillOnce(Invoke(MockConsumer::OnGuestSuccessQuit)) | 148 .WillOnce(Invoke(MockConsumer::OnGuestSuccessQuit)) |
| 156 .RetiresOnSaturation(); | 149 .RetiresOnSaturation(); |
| 157 } | 150 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 176 auth->set_attempt_state(state); | 169 auth->set_attempt_state(state); |
| 177 return auth->ResolveState(); | 170 return auth->ResolveState(); |
| 178 } | 171 } |
| 179 | 172 |
| 180 void SetOwnerState(bool owner_check_finished, bool check_result) { | 173 void SetOwnerState(bool owner_check_finished, bool check_result) { |
| 181 auth_->SetOwnerState(owner_check_finished, check_result); | 174 auth_->SetOwnerState(owner_check_finished, check_result); |
| 182 } | 175 } |
| 183 | 176 |
| 184 content::TestBrowserThreadBundle thread_bundle_; | 177 content::TestBrowserThreadBundle thread_bundle_; |
| 185 | 178 |
| 186 std::string username_; | 179 UserContext user_context_; |
| 187 std::string password_; | 180 Key transformed_key_; |
| 188 std::string username_hash_; | |
| 189 std::string hash_ascii_; | |
| 190 | 181 |
| 191 ScopedDeviceSettingsTestHelper device_settings_test_helper_; | 182 ScopedDeviceSettingsTestHelper device_settings_test_helper_; |
| 192 ScopedTestCrosSettings test_cros_settings_; | 183 ScopedTestCrosSettings test_cros_settings_; |
| 193 | 184 |
| 194 ScopedUserManagerEnabler user_manager_enabler_; | 185 ScopedUserManagerEnabler user_manager_enabler_; |
| 195 | 186 |
| 196 cryptohome::MockAsyncMethodCaller* mock_caller_; | 187 cryptohome::MockAsyncMethodCaller* mock_caller_; |
| 197 | 188 |
| 198 MockConsumer consumer_; | 189 MockConsumer consumer_; |
| 199 scoped_refptr<ParallelAuthenticator> auth_; | 190 scoped_refptr<ParallelAuthenticator> auth_; |
| 200 scoped_ptr<TestAttemptState> state_; | 191 scoped_ptr<TestAttemptState> state_; |
| 201 FakeCryptohomeClient* fake_cryptohome_client_; | 192 FakeCryptohomeClient* fake_cryptohome_client_; |
| 202 }; | 193 }; |
| 203 | 194 |
| 204 TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { | 195 TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { |
| 205 UserContext user_context(username_); | 196 EXPECT_CALL(consumer_, OnLoginSuccess(user_context_)) |
| 206 user_context.SetPassword(password_); | |
| 207 user_context.SetUserIDHash(username_hash_); | |
| 208 EXPECT_CALL(consumer_, OnLoginSuccess(user_context)) | |
| 209 .Times(1) | 197 .Times(1) |
| 210 .RetiresOnSaturation(); | 198 .RetiresOnSaturation(); |
| 211 | 199 |
| 212 SetAttemptState(auth_.get(), state_.release()); | 200 SetAttemptState(auth_.get(), state_.release()); |
| 213 auth_->OnLoginSuccess(); | 201 auth_->OnLoginSuccess(); |
| 214 } | 202 } |
| 215 | 203 |
| 216 TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { | 204 TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { |
| 217 EXPECT_CALL(consumer_, OnPasswordChangeDetected()) | 205 EXPECT_CALL(consumer_, OnPasswordChangeDetected()) |
| 218 .Times(1) | 206 .Times(1) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 SetAndResolveState(auth_.get(), state_.release())); | 249 SetAndResolveState(auth_.get(), state_.release())); |
| 262 } | 250 } |
| 263 | 251 |
| 264 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededMount) { | 252 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededMount) { |
| 265 // Set up state as though a cryptohome mount attempt has occurred | 253 // Set up state as though a cryptohome mount attempt has occurred |
| 266 // and succeeded but we are in safe mode and the current user is not owner. | 254 // and succeeded but we are in safe mode and the current user is not owner. |
| 267 // This test will check that the "safe-mode" policy is not set and will let | 255 // This test will check that the "safe-mode" policy is not set and will let |
| 268 // the mount finish successfully. | 256 // the mount finish successfully. |
| 269 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 257 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
| 270 SetOwnerState(false, false); | 258 SetOwnerState(false, false); |
| 271 // and test that the mount has succeeded. | 259 // Test that the mount has succeeded. |
| 272 UserContext user_context(username_); | 260 state_.reset(new TestAttemptState(user_context_, false)); |
| 273 user_context.SetPassword(password_); | |
| 274 state_.reset(new TestAttemptState(user_context, false)); | |
| 275 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 261 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
| 276 EXPECT_EQ(ParallelAuthenticator::OFFLINE_LOGIN, | 262 EXPECT_EQ(ParallelAuthenticator::OFFLINE_LOGIN, |
| 277 SetAndResolveState(auth_.get(), state_.release())); | 263 SetAndResolveState(auth_.get(), state_.release())); |
| 278 } | 264 } |
| 279 | 265 |
| 280 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededFailedMount) { | 266 TEST_F(ParallelAuthenticatorTest, ResolveOwnerNeededFailedMount) { |
| 281 FailOnLoginSuccess(); // Set failing on success as the default... | 267 FailOnLoginSuccess(); // Set failing on success as the default... |
| 282 LoginFailure failure = LoginFailure(LoginFailure::OWNER_REQUIRED); | 268 LoginFailure failure = LoginFailure(LoginFailure::OWNER_REQUIRED); |
| 283 ExpectLoginFailure(failure); | 269 ExpectLoginFailure(failure); |
| 284 | 270 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 306 EXPECT_EQ(ParallelAuthenticator::CONTINUE, | 292 EXPECT_EQ(ParallelAuthenticator::CONTINUE, |
| 307 SetAndResolveState(auth_.get(), state_.release())); | 293 SetAndResolveState(auth_.get(), state_.release())); |
| 308 EXPECT_TRUE(LoginState::Get()->IsInSafeMode()); | 294 EXPECT_TRUE(LoginState::Get()->IsInSafeMode()); |
| 309 | 295 |
| 310 // Simulate TPM token ready event. | 296 // Simulate TPM token ready event. |
| 311 DeviceSettingsService::Get()->OnTPMTokenReady(); | 297 DeviceSettingsService::Get()->OnTPMTokenReady(); |
| 312 | 298 |
| 313 // Flush all the pending operations. The operations should induce an owner | 299 // Flush all the pending operations. The operations should induce an owner |
| 314 // verification. | 300 // verification. |
| 315 device_settings_test_helper_.Flush(); | 301 device_settings_test_helper_.Flush(); |
| 316 // and test that the mount has succeeded. | 302 // Test that the mount has succeeded. |
| 317 UserContext user_context(username_); | 303 state_.reset(new TestAttemptState(user_context_, false)); |
| 318 user_context.SetPassword(password_); | |
| 319 state_.reset(new TestAttemptState(user_context, false)); | |
| 320 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 304 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
| 321 EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED, | 305 EXPECT_EQ(ParallelAuthenticator::OWNER_REQUIRED, |
| 322 SetAndResolveState(auth_.get(), state_.release())); | 306 SetAndResolveState(auth_.get(), state_.release())); |
| 323 | 307 |
| 324 // Unset global objects used by this test. | 308 // Unset global objects used by this test. |
| 325 LoginState::Shutdown(); | 309 LoginState::Shutdown(); |
| 326 EXPECT_TRUE( | 310 EXPECT_TRUE( |
| 327 CrosSettings::Get()->RemoveSettingsProvider(&stub_settings_provider)); | 311 CrosSettings::Get()->RemoveSettingsProvider(&stub_settings_provider)); |
| 328 CrosSettings::Get()->AddSettingsProvider(device_settings_provider); | 312 CrosSettings::Get()->AddSettingsProvider(device_settings_provider); |
| 329 } | 313 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE); | 378 mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE); |
| 395 EXPECT_CALL(*mock_caller_, AsyncMountGuest(_)) | 379 EXPECT_CALL(*mock_caller_, AsyncMountGuest(_)) |
| 396 .Times(1) | 380 .Times(1) |
| 397 .RetiresOnSaturation(); | 381 .RetiresOnSaturation(); |
| 398 | 382 |
| 399 auth_->LoginRetailMode(); | 383 auth_->LoginRetailMode(); |
| 400 base::MessageLoop::current()->Run(); | 384 base::MessageLoop::current()->Run(); |
| 401 } | 385 } |
| 402 | 386 |
| 403 TEST_F(ParallelAuthenticatorTest, DriveDataResync) { | 387 TEST_F(ParallelAuthenticatorTest, DriveDataResync) { |
| 404 ExpectLoginSuccess(username_, | 388 UserContext expected_user_context(user_context_); |
| 405 password_, | 389 expected_user_context.SetUserIDHash( |
| 406 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername, | 390 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername); |
| 407 false); | 391 ExpectLoginSuccess(expected_user_context); |
| 408 FailOnLoginFailure(); | 392 FailOnLoginFailure(); |
| 409 | 393 |
| 410 // Set up mock async method caller to respond successfully to a cryptohome | 394 // Set up mock async method caller to respond successfully to a cryptohome |
| 411 // remove attempt and a cryptohome create attempt (indicated by the | 395 // remove attempt and a cryptohome create attempt (indicated by the |
| 412 // |CREATE_IF_MISSING| flag to AsyncMount). | 396 // |CREATE_IF_MISSING| flag to AsyncMount). |
| 413 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 397 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
| 414 EXPECT_CALL(*mock_caller_, AsyncRemove(username_, _)) | 398 EXPECT_CALL(*mock_caller_, AsyncRemove(user_context_.GetUserID(), _)) |
| 415 .Times(1) | 399 .Times(1) |
| 416 .RetiresOnSaturation(); | 400 .RetiresOnSaturation(); |
| 417 EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, | 401 EXPECT_CALL(*mock_caller_, AsyncMount(user_context_.GetUserID(), |
| 418 cryptohome::CREATE_IF_MISSING, _)) | 402 transformed_key_.GetSecret(), |
| 403 cryptohome::CREATE_IF_MISSING, |
| 404 _)) |
| 419 .Times(1) | 405 .Times(1) |
| 420 .RetiresOnSaturation(); | 406 .RetiresOnSaturation(); |
| 421 EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) | 407 EXPECT_CALL(*mock_caller_, |
| 408 AsyncGetSanitizedUsername(user_context_.GetUserID(), _)) |
| 422 .Times(1) | 409 .Times(1) |
| 423 .RetiresOnSaturation(); | 410 .RetiresOnSaturation(); |
| 424 | 411 |
| 425 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 412 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |
| 426 SetAttemptState(auth_.get(), state_.release()); | 413 SetAttemptState(auth_.get(), state_.release()); |
| 427 | 414 |
| 428 auth_->ResyncEncryptedData(); | 415 auth_->ResyncEncryptedData(); |
| 429 base::MessageLoop::current()->Run(); | 416 base::MessageLoop::current()->Run(); |
| 430 } | 417 } |
| 431 | 418 |
| 432 TEST_F(ParallelAuthenticatorTest, DriveResyncFail) { | 419 TEST_F(ParallelAuthenticatorTest, DriveResyncFail) { |
| 433 FailOnLoginSuccess(); | 420 FailOnLoginSuccess(); |
| 434 ExpectLoginFailure(LoginFailure(LoginFailure::DATA_REMOVAL_FAILED)); | 421 ExpectLoginFailure(LoginFailure(LoginFailure::DATA_REMOVAL_FAILED)); |
| 435 | 422 |
| 436 // Set up mock async method caller to fail a cryptohome remove attempt. | 423 // Set up mock async method caller to fail a cryptohome remove attempt. |
| 437 mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE); | 424 mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_NONE); |
| 438 EXPECT_CALL(*mock_caller_, AsyncRemove(username_, _)) | 425 EXPECT_CALL(*mock_caller_, AsyncRemove(user_context_.GetUserID(), _)) |
| 439 .Times(1) | 426 .Times(1) |
| 440 .RetiresOnSaturation(); | 427 .RetiresOnSaturation(); |
| 441 | 428 |
| 442 SetAttemptState(auth_.get(), state_.release()); | 429 SetAttemptState(auth_.get(), state_.release()); |
| 443 | 430 |
| 444 auth_->ResyncEncryptedData(); | 431 auth_->ResyncEncryptedData(); |
| 445 base::MessageLoop::current()->Run(); | 432 base::MessageLoop::current()->Run(); |
| 446 } | 433 } |
| 447 | 434 |
| 448 TEST_F(ParallelAuthenticatorTest, DriveRequestOldPassword) { | 435 TEST_F(ParallelAuthenticatorTest, DriveRequestOldPassword) { |
| 449 FailOnLoginSuccess(); | 436 FailOnLoginSuccess(); |
| 450 ExpectPasswordChange(); | 437 ExpectPasswordChange(); |
| 451 | 438 |
| 452 state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); | 439 state_->PresetCryptohomeStatus(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); |
| 453 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 440 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |
| 454 SetAttemptState(auth_.get(), state_.release()); | 441 SetAttemptState(auth_.get(), state_.release()); |
| 455 | 442 |
| 456 RunResolve(auth_.get()); | 443 RunResolve(auth_.get()); |
| 457 } | 444 } |
| 458 | 445 |
| 459 TEST_F(ParallelAuthenticatorTest, DriveDataRecover) { | 446 TEST_F(ParallelAuthenticatorTest, DriveDataRecover) { |
| 460 ExpectLoginSuccess(username_, | 447 UserContext expected_user_context(user_context_); |
| 461 password_, | 448 expected_user_context.SetUserIDHash( |
| 462 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername, | 449 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername); |
| 463 false); | 450 ExpectLoginSuccess(expected_user_context); |
| 464 FailOnLoginFailure(); | 451 FailOnLoginFailure(); |
| 465 | 452 |
| 466 // Set up mock async method caller to respond successfully to a key migration. | 453 // Set up mock async method caller to respond successfully to a key migration. |
| 467 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 454 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
| 468 EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, _, hash_ascii_, _)) | 455 EXPECT_CALL(*mock_caller_, AsyncMigrateKey(user_context_.GetUserID(), |
| 456 _, |
| 457 transformed_key_.GetSecret(), |
| 458 _)) |
| 469 .Times(1) | 459 .Times(1) |
| 470 .RetiresOnSaturation(); | 460 .RetiresOnSaturation(); |
| 471 EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, | 461 EXPECT_CALL(*mock_caller_, AsyncMount(user_context_.GetUserID(), |
| 472 cryptohome::MOUNT_FLAGS_NONE, _)) | 462 transformed_key_.GetSecret(), |
| 463 cryptohome::MOUNT_FLAGS_NONE, |
| 464 _)) |
| 473 .Times(1) | 465 .Times(1) |
| 474 .RetiresOnSaturation(); | 466 .RetiresOnSaturation(); |
| 475 EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) | 467 EXPECT_CALL(*mock_caller_, |
| 468 AsyncGetSanitizedUsername(user_context_.GetUserID(), _)) |
| 476 .Times(1) | 469 .Times(1) |
| 477 .RetiresOnSaturation(); | 470 .RetiresOnSaturation(); |
| 478 | 471 |
| 479 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 472 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |
| 480 SetAttemptState(auth_.get(), state_.release()); | 473 SetAttemptState(auth_.get(), state_.release()); |
| 481 | 474 |
| 482 auth_->RecoverEncryptedData(std::string()); | 475 auth_->RecoverEncryptedData(std::string()); |
| 483 base::MessageLoop::current()->Run(); | 476 base::MessageLoop::current()->Run(); |
| 484 } | 477 } |
| 485 | 478 |
| 486 TEST_F(ParallelAuthenticatorTest, DriveDataRecoverButFail) { | 479 TEST_F(ParallelAuthenticatorTest, DriveDataRecoverButFail) { |
| 487 FailOnLoginSuccess(); | 480 FailOnLoginSuccess(); |
| 488 ExpectPasswordChange(); | 481 ExpectPasswordChange(); |
| 489 | 482 |
| 490 // Set up mock async method caller to fail a key migration attempt, | 483 // Set up mock async method caller to fail a key migration attempt, |
| 491 // asserting that the wrong password was used. | 484 // asserting that the wrong password was used. |
| 492 mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); | 485 mock_caller_->SetUp(false, cryptohome::MOUNT_ERROR_KEY_FAILURE); |
| 493 EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, _, hash_ascii_, _)) | 486 EXPECT_CALL(*mock_caller_, AsyncMigrateKey(user_context_.GetUserID(), |
| 487 _, |
| 488 transformed_key_.GetSecret(), |
| 489 _)) |
| 494 .Times(1) | 490 .Times(1) |
| 495 .RetiresOnSaturation(); | 491 .RetiresOnSaturation(); |
| 496 | 492 |
| 497 SetAttemptState(auth_.get(), state_.release()); | 493 SetAttemptState(auth_.get(), state_.release()); |
| 498 | 494 |
| 499 auth_->RecoverEncryptedData(std::string()); | 495 auth_->RecoverEncryptedData(std::string()); |
| 500 base::MessageLoop::current()->Run(); | 496 base::MessageLoop::current()->Run(); |
| 501 } | 497 } |
| 502 | 498 |
| 503 TEST_F(ParallelAuthenticatorTest, ResolveNoMountToFailedMount) { | 499 TEST_F(ParallelAuthenticatorTest, ResolveNoMountToFailedMount) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 518 // an online auth attempt has completed successfully. | 514 // an online auth attempt has completed successfully. |
| 519 state_->PresetCryptohomeStatus(false, | 515 state_->PresetCryptohomeStatus(false, |
| 520 cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); | 516 cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); |
| 521 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 517 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |
| 522 | 518 |
| 523 EXPECT_EQ(ParallelAuthenticator::CREATE_NEW, | 519 EXPECT_EQ(ParallelAuthenticator::CREATE_NEW, |
| 524 SetAndResolveState(auth_.get(), state_.release())); | 520 SetAndResolveState(auth_.get(), state_.release())); |
| 525 } | 521 } |
| 526 | 522 |
| 527 TEST_F(ParallelAuthenticatorTest, DriveCreateForNewUser) { | 523 TEST_F(ParallelAuthenticatorTest, DriveCreateForNewUser) { |
| 528 ExpectLoginSuccess(username_, | 524 UserContext expected_user_context(user_context_); |
| 529 password_, | 525 expected_user_context.SetUserIDHash( |
| 530 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername, | 526 cryptohome::MockAsyncMethodCaller::kFakeSanitizedUsername); |
| 531 false); | 527 ExpectLoginSuccess(expected_user_context); |
| 532 FailOnLoginFailure(); | 528 FailOnLoginFailure(); |
| 533 | 529 |
| 534 // Set up mock async method caller to respond successfully to a cryptohome | 530 // Set up mock async method caller to respond successfully to a cryptohome |
| 535 // create attempt (indicated by the |CREATE_IF_MISSING| flag to AsyncMount). | 531 // create attempt (indicated by the |CREATE_IF_MISSING| flag to AsyncMount). |
| 536 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 532 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
| 537 EXPECT_CALL(*mock_caller_, AsyncMount(username_, hash_ascii_, | 533 EXPECT_CALL(*mock_caller_, AsyncMount(user_context_.GetUserID(), |
| 538 cryptohome::CREATE_IF_MISSING, _)) | 534 transformed_key_.GetSecret(), |
| 535 cryptohome::CREATE_IF_MISSING, |
| 536 _)) |
| 539 .Times(1) | 537 .Times(1) |
| 540 .RetiresOnSaturation(); | 538 .RetiresOnSaturation(); |
| 541 EXPECT_CALL(*mock_caller_, AsyncGetSanitizedUsername(username_, _)) | 539 EXPECT_CALL(*mock_caller_, |
| 540 AsyncGetSanitizedUsername(user_context_.GetUserID(), _)) |
| 542 .Times(1) | 541 .Times(1) |
| 543 .RetiresOnSaturation(); | 542 .RetiresOnSaturation(); |
| 544 | 543 |
| 545 // Set up state as though a cryptohome mount attempt has occurred | 544 // Set up state as though a cryptohome mount attempt has occurred |
| 546 // and been rejected because the user doesn't exist; additionally, | 545 // and been rejected because the user doesn't exist; additionally, |
| 547 // an online auth attempt has completed successfully. | 546 // an online auth attempt has completed successfully. |
| 548 state_->PresetCryptohomeStatus(false, | 547 state_->PresetCryptohomeStatus(false, |
| 549 cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); | 548 cryptohome::MOUNT_ERROR_USER_DOES_NOT_EXIST); |
| 550 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 549 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |
| 551 SetAttemptState(auth_.get(), state_.release()); | 550 SetAttemptState(auth_.get(), state_.release()); |
| 552 | 551 |
| 553 RunResolve(auth_.get()); | 552 RunResolve(auth_.get()); |
| 554 } | 553 } |
| 555 | 554 |
| 556 TEST_F(ParallelAuthenticatorTest, DriveOfflineLogin) { | 555 TEST_F(ParallelAuthenticatorTest, DriveOfflineLogin) { |
| 557 ExpectLoginSuccess(username_, password_, username_hash_, false); | 556 ExpectLoginSuccess(user_context_); |
| 558 FailOnLoginFailure(); | 557 FailOnLoginFailure(); |
| 559 | 558 |
| 560 // Set up state as though a cryptohome mount attempt has occurred and | 559 // Set up state as though a cryptohome mount attempt has occurred and |
| 561 // succeeded. | 560 // succeeded. |
| 562 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 561 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
| 563 SetAttemptState(auth_.get(), state_.release()); | 562 SetAttemptState(auth_.get(), state_.release()); |
| 564 | 563 |
| 565 RunResolve(auth_.get()); | 564 RunResolve(auth_.get()); |
| 566 } | 565 } |
| 567 | 566 |
| 568 TEST_F(ParallelAuthenticatorTest, DriveOnlineLogin) { | 567 TEST_F(ParallelAuthenticatorTest, DriveOnlineLogin) { |
| 569 ExpectLoginSuccess(username_, password_, username_hash_, false); | 568 ExpectLoginSuccess(user_context_); |
| 570 FailOnLoginFailure(); | 569 FailOnLoginFailure(); |
| 571 | 570 |
| 572 // Set up state as though a cryptohome mount attempt has occurred and | 571 // Set up state as though a cryptohome mount attempt has occurred and |
| 573 // succeeded. | 572 // succeeded. |
| 574 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 573 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
| 575 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 574 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |
| 576 SetAttemptState(auth_.get(), state_.release()); | 575 SetAttemptState(auth_.get(), state_.release()); |
| 577 | 576 |
| 578 RunResolve(auth_.get()); | 577 RunResolve(auth_.get()); |
| 579 } | 578 } |
| 580 | 579 |
| 581 TEST_F(ParallelAuthenticatorTest, DriveUnlock) { | 580 TEST_F(ParallelAuthenticatorTest, DriveUnlock) { |
| 582 ExpectLoginSuccess(username_, std::string(), std::string(), false); | 581 ExpectLoginSuccess(user_context_); |
| 583 FailOnLoginFailure(); | 582 FailOnLoginFailure(); |
| 584 | 583 |
| 585 // Set up mock async method caller to respond successfully to a cryptohome | 584 // Set up mock async method caller to respond successfully to a cryptohome |
| 586 // key-check attempt. | 585 // key-check attempt. |
| 587 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 586 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
| 588 EXPECT_CALL(*mock_caller_, AsyncCheckKey(username_, _, _)) | 587 EXPECT_CALL(*mock_caller_, AsyncCheckKey(user_context_.GetUserID(), _, _)) |
| 589 .Times(1) | 588 .Times(1) |
| 590 .RetiresOnSaturation(); | 589 .RetiresOnSaturation(); |
| 591 | 590 |
| 592 auth_->AuthenticateToUnlock(UserContext(username_)); | 591 auth_->AuthenticateToUnlock(user_context_); |
| 593 base::MessageLoop::current()->Run(); | 592 base::MessageLoop::current()->Run(); |
| 594 } | 593 } |
| 595 | 594 |
| 596 } // namespace chromeos | 595 } // namespace chromeos |
| OLD | NEW |