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 "chrome/browser/chromeos/login/parallel_authenticator.h" | 5 #include "chrome/browser/chromeos/login/parallel_authenticator.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 virtual void SetUp() { | 75 virtual void SetUp() { |
76 mock_caller_ = new cryptohome::MockAsyncMethodCaller; | 76 mock_caller_ = new cryptohome::MockAsyncMethodCaller; |
77 cryptohome::AsyncMethodCaller::InitializeForTesting(mock_caller_); | 77 cryptohome::AsyncMethodCaller::InitializeForTesting(mock_caller_); |
78 | 78 |
79 mock_cryptohome_library_ .reset(new MockCryptohomeLibrary()); | 79 mock_cryptohome_library_ .reset(new MockCryptohomeLibrary()); |
80 CryptohomeLibrary::SetForTest(mock_cryptohome_library_.get()); | 80 CryptohomeLibrary::SetForTest(mock_cryptohome_library_.get()); |
81 | 81 |
82 io_thread_.Start(); | 82 io_thread_.Start(); |
83 | 83 |
84 auth_ = new ParallelAuthenticator(&consumer_); | 84 auth_ = new ParallelAuthenticator(&consumer_); |
85 auth_->set_using_oauth(false); | |
86 state_.reset(new TestAttemptState(UserContext(username_, | 85 state_.reset(new TestAttemptState(UserContext(username_, |
87 password_, | 86 password_, |
88 std::string()), | 87 std::string()), |
89 hash_ascii_, | 88 hash_ascii_, |
90 "", | 89 "", |
91 "", | 90 "", |
92 User::USER_TYPE_REGULAR, | 91 User::USER_TYPE_REGULAR, |
93 false)); | 92 false)); |
94 } | 93 } |
95 | 94 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 | 151 |
153 void ExpectLoginSuccess(const std::string& username, | 152 void ExpectLoginSuccess(const std::string& username, |
154 const std::string& password, | 153 const std::string& password, |
155 const std::string& username_hash_, | 154 const std::string& username_hash_, |
156 bool pending) { | 155 bool pending) { |
157 EXPECT_CALL(consumer_, OnLoginSuccess(UserContext(username, | 156 EXPECT_CALL(consumer_, OnLoginSuccess(UserContext(username, |
158 password, | 157 password, |
159 std::string(), | 158 std::string(), |
160 username_hash_), | 159 username_hash_), |
161 pending, | 160 pending, |
162 false)) | 161 true /* using_oauth */)) |
163 .WillOnce(Invoke(MockConsumer::OnSuccessQuit)) | 162 .WillOnce(Invoke(MockConsumer::OnSuccessQuit)) |
164 .RetiresOnSaturation(); | 163 .RetiresOnSaturation(); |
165 } | 164 } |
166 | 165 |
167 void ExpectGuestLoginSuccess() { | 166 void ExpectGuestLoginSuccess() { |
168 EXPECT_CALL(consumer_, OnOffTheRecordLoginSuccess()) | 167 EXPECT_CALL(consumer_, OnOffTheRecordLoginSuccess()) |
169 .WillOnce(Invoke(MockConsumer::OnGuestSuccessQuit)) | 168 .WillOnce(Invoke(MockConsumer::OnGuestSuccessQuit)) |
170 .RetiresOnSaturation(); | 169 .RetiresOnSaturation(); |
171 } | 170 } |
172 | 171 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 MockConsumer consumer_; | 222 MockConsumer consumer_; |
224 scoped_refptr<ParallelAuthenticator> auth_; | 223 scoped_refptr<ParallelAuthenticator> auth_; |
225 scoped_ptr<TestAttemptState> state_; | 224 scoped_ptr<TestAttemptState> state_; |
226 }; | 225 }; |
227 | 226 |
228 TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { | 227 TEST_F(ParallelAuthenticatorTest, OnLoginSuccess) { |
229 EXPECT_CALL(consumer_, OnLoginSuccess(UserContext(username_, | 228 EXPECT_CALL(consumer_, OnLoginSuccess(UserContext(username_, |
230 password_, | 229 password_, |
231 std::string(), | 230 std::string(), |
232 username_hash_), | 231 username_hash_), |
233 false, false)) | 232 false, true /* using oauth */)) |
234 .Times(1) | 233 .Times(1) |
235 .RetiresOnSaturation(); | 234 .RetiresOnSaturation(); |
236 | 235 |
237 SetAttemptState(auth_.get(), state_.release()); | 236 SetAttemptState(auth_.get(), state_.release()); |
238 auth_->OnLoginSuccess(false); | 237 auth_->OnLoginSuccess(false); |
239 } | 238 } |
240 | 239 |
241 TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { | 240 TEST_F(ParallelAuthenticatorTest, OnPasswordChangeDetected) { |
242 EXPECT_CALL(consumer_, OnPasswordChangeDetected()) | 241 EXPECT_CALL(consumer_, OnPasswordChangeDetected()) |
243 .Times(1) | 242 .Times(1) |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 RunResolve(auth_.get()); | 611 RunResolve(auth_.get()); |
613 } | 612 } |
614 | 613 |
615 TEST_F(ParallelAuthenticatorTest, DriveOfflineLogin) { | 614 TEST_F(ParallelAuthenticatorTest, DriveOfflineLogin) { |
616 ExpectLoginSuccess(username_, password_, username_hash_, false); | 615 ExpectLoginSuccess(username_, password_, username_hash_, false); |
617 FailOnLoginFailure(); | 616 FailOnLoginFailure(); |
618 | 617 |
619 // Set up state as though a cryptohome mount attempt has occurred and | 618 // Set up state as though a cryptohome mount attempt has occurred and |
620 // succeeded. | 619 // succeeded. |
621 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 620 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
622 GoogleServiceAuthError error = | |
623 GoogleServiceAuthError::FromConnectionError(net::ERR_CONNECTION_RESET); | |
624 state_->PresetOnlineLoginStatus(LoginFailure::FromNetworkAuthFailure(error)); | |
625 SetAttemptState(auth_.get(), state_.release()); | 621 SetAttemptState(auth_.get(), state_.release()); |
626 | 622 |
627 RunResolve(auth_.get()); | 623 RunResolve(auth_.get()); |
628 } | 624 } |
629 | 625 |
630 TEST_F(ParallelAuthenticatorTest, DriveOfflineLoginDelayedOnline) { | |
631 ExpectLoginSuccess(username_, password_, username_hash_, true); | |
632 FailOnLoginFailure(); | |
633 | |
634 // Set up state as though a cryptohome mount attempt has occurred and | |
635 // succeeded. | |
636 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | |
637 // state_ is released further down. | |
638 SetAttemptState(auth_.get(), state_.get()); | |
639 RunResolve(auth_.get()); | |
640 | |
641 // Offline login has completed, so now we "complete" the online request. | |
642 GoogleServiceAuthError error( | |
643 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | |
644 LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); | |
645 state_.release()->PresetOnlineLoginStatus(failure); | |
646 ExpectLoginFailure(failure); | |
647 | |
648 RunResolve(auth_.get()); | |
649 } | |
650 | |
651 TEST_F(ParallelAuthenticatorTest, DriveOfflineLoginGetNewPassword) { | |
652 ExpectLoginSuccess(username_, password_, username_hash_, true); | |
653 FailOnLoginFailure(); | |
654 | |
655 // Set up mock cryptohome library to respond successfully to a key migration. | |
656 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | |
657 EXPECT_CALL(*mock_caller_, AsyncMigrateKey(username_, | |
658 state_->ascii_hash, | |
659 _, | |
660 _)) | |
661 .Times(1) | |
662 .RetiresOnSaturation(); | |
663 EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) | |
664 .WillOnce(Return(std::string())) | |
665 .RetiresOnSaturation(); | |
666 | |
667 // Set up state as though a cryptohome mount attempt has occurred and | |
668 // succeeded; also, an online request that never made it. | |
669 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | |
670 // state_ is released further down. | |
671 SetAttemptState(auth_.get(), state_.get()); | |
672 RunResolve(auth_.get()); | |
673 | |
674 // Offline login has completed, so now we "complete" the online request. | |
675 GoogleServiceAuthError error( | |
676 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | |
677 LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); | |
678 state_.release()->PresetOnlineLoginStatus(failure); | |
679 ExpectLoginFailure(failure); | |
680 | |
681 RunResolve(auth_.get()); | |
682 | |
683 // After the request below completes, OnLoginSuccess gets called again. | |
684 ExpectLoginSuccess(username_, password_, username_hash_, false); | |
685 | |
686 MockURLFetcherFactory<SuccessFetcher> factory; | |
687 TestingProfile profile; | |
688 | |
689 auth_->RetryAuth(&profile, | |
690 UserContext(username_, | |
691 std::string(), | |
692 std::string()), | |
693 std::string(), | |
694 std::string()); | |
695 message_loop_.Run(); | |
696 message_loop_.RunUntilIdle(); | |
697 } | |
698 | |
699 TEST_F(ParallelAuthenticatorTest, DriveOfflineLoginGetCaptchad) { | |
700 ExpectLoginSuccess(username_, password_, username_hash_, true); | |
701 FailOnLoginFailure(); | |
702 EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) | |
703 .WillOnce(Return(std::string())) | |
704 .RetiresOnSaturation(); | |
705 | |
706 // Set up state as though a cryptohome mount attempt has occurred and | |
707 // succeeded; also, an online request that never made it. | |
708 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | |
709 // state_ is released further down. | |
710 SetAttemptState(auth_.get(), state_.get()); | |
711 RunResolve(auth_.get()); | |
712 | |
713 // Offline login has completed, so now we "complete" the online request. | |
714 GoogleServiceAuthError error( | |
715 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | |
716 LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); | |
717 state_.release()->PresetOnlineLoginStatus(failure); | |
718 ExpectLoginFailure(failure); | |
719 | |
720 RunResolve(auth_.get()); | |
721 | |
722 // After the request below completes, OnLoginSuccess gets called again. | |
723 failure = LoginFailure::FromNetworkAuthFailure( | |
724 GoogleServiceAuthError::FromClientLoginCaptchaChallenge( | |
725 CaptchaFetcher::GetCaptchaToken(), | |
726 GURL(CaptchaFetcher::GetCaptchaUrl()), | |
727 GURL(CaptchaFetcher::GetUnlockUrl()))); | |
728 ExpectLoginFailure(failure); | |
729 | |
730 MockURLFetcherFactory<CaptchaFetcher> factory; | |
731 TestingProfile profile; | |
732 | |
733 auth_->RetryAuth(&profile, | |
734 UserContext(username_, | |
735 std::string(), | |
736 std::string()), | |
737 std::string(), | |
738 std::string()); | |
739 message_loop_.Run(); | |
740 message_loop_.RunUntilIdle(); | |
741 } | |
742 | |
743 TEST_F(ParallelAuthenticatorTest, DriveOnlineLogin) { | 626 TEST_F(ParallelAuthenticatorTest, DriveOnlineLogin) { |
744 ExpectLoginSuccess(username_, password_, username_hash_, false); | 627 ExpectLoginSuccess(username_, password_, username_hash_, false); |
745 FailOnLoginFailure(); | 628 FailOnLoginFailure(); |
746 | 629 |
747 // Set up state as though a cryptohome mount attempt has occurred and | 630 // Set up state as though a cryptohome mount attempt has occurred and |
748 // succeeded. | 631 // succeeded. |
749 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | 632 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); |
750 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); | 633 state_->PresetOnlineLoginStatus(LoginFailure::LoginFailureNone()); |
751 SetAttemptState(auth_.get(), state_.release()); | 634 SetAttemptState(auth_.get(), state_.release()); |
752 | 635 |
753 RunResolve(auth_.get()); | 636 RunResolve(auth_.get()); |
754 } | 637 } |
755 | 638 |
756 // http://crbug.com/106538 | |
757 TEST_F(ParallelAuthenticatorTest, DISABLED_DriveNeedNewPassword) { | |
758 FailOnLoginSuccess(); // Set failing on success as the default... | |
759 // ...but expect ONE successful login first. | |
760 ExpectLoginSuccess(username_, password_, username_hash_, true); | |
761 GoogleServiceAuthError error( | |
762 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | |
763 LoginFailure failure = LoginFailure::FromNetworkAuthFailure(error); | |
764 ExpectLoginFailure(failure); | |
765 | |
766 // Set up state as though a cryptohome mount attempt has occurred and | |
767 // succeeded. | |
768 state_->PresetCryptohomeStatus(true, cryptohome::MOUNT_ERROR_NONE); | |
769 state_->PresetOnlineLoginStatus(failure); | |
770 SetAttemptState(auth_.get(), state_.release()); | |
771 | |
772 RunResolve(auth_.get()); | |
773 } | |
774 | |
775 TEST_F(ParallelAuthenticatorTest, DriveUnlock) { | 639 TEST_F(ParallelAuthenticatorTest, DriveUnlock) { |
776 ExpectLoginSuccess(username_, std::string(), std::string(), false); | 640 ExpectLoginSuccess(username_, std::string(), std::string(), false); |
777 FailOnLoginFailure(); | 641 FailOnLoginFailure(); |
778 | 642 |
779 // Set up mock cryptohome library to respond successfully to a cryptohome | 643 // Set up mock cryptohome library to respond successfully to a cryptohome |
780 // key-check attempt. | 644 // key-check attempt. |
781 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); | 645 mock_caller_->SetUp(true, cryptohome::MOUNT_ERROR_NONE); |
782 EXPECT_CALL(*mock_caller_, AsyncCheckKey(username_, _, _)) | 646 EXPECT_CALL(*mock_caller_, AsyncCheckKey(username_, _, _)) |
783 .Times(1) | 647 .Times(1) |
784 .RetiresOnSaturation(); | 648 .RetiresOnSaturation(); |
785 EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) | 649 EXPECT_CALL(*mock_cryptohome_library_, GetSystemSalt()) |
786 .WillOnce(Return(std::string())) | 650 .WillOnce(Return(std::string())) |
787 .RetiresOnSaturation(); | 651 .RetiresOnSaturation(); |
788 | 652 |
789 auth_->AuthenticateToUnlock(UserContext(username_, | 653 auth_->AuthenticateToUnlock(UserContext(username_, |
790 std::string(), | 654 std::string(), |
791 std::string())); | 655 std::string())); |
792 message_loop_.Run(); | 656 message_loop_.Run(); |
793 } | 657 } |
794 | 658 |
795 } // namespace chromeos | 659 } // namespace chromeos |
OLD | NEW |