Chromium Code Reviews| 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/existing_user_controller.h" | 5 #include "chrome/browser/chromeos/login/existing_user_controller.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 351 delegate = login_performer_delegate_.get(); | 351 delegate = login_performer_delegate_.get(); |
| 352 // Only one instance of LoginPerformer should exist at a time. | 352 // Only one instance of LoginPerformer should exist at a time. |
| 353 login_performer_.reset(NULL); | 353 login_performer_.reset(NULL); |
| 354 login_performer_.reset(new LoginPerformer(delegate)); | 354 login_performer_.reset(new LoginPerformer(delegate)); |
| 355 is_login_in_progress_ = true; | 355 is_login_in_progress_ = true; |
| 356 login_performer_-> | 356 login_performer_-> |
| 357 CreateLocallyManagedUser(display_name, password); | 357 CreateLocallyManagedUser(display_name, password); |
| 358 // TODO(nkostylev): A11y message. | 358 // TODO(nkostylev): A11y message. |
| 359 } | 359 } |
| 360 | 360 |
| 361 void ExistingUserController::CompleteLogin(const std::string& username, | 361 void ExistingUserController::CompleteLogin(const UserCredentials& credentials) { |
| 362 const std::string& password) { | |
| 363 if (!host_) { | 362 if (!host_) { |
| 364 // Complete login event was generated already from UI. Ignore notification. | 363 // Complete login event was generated already from UI. Ignore notification. |
| 365 return; | 364 return; |
| 366 } | 365 } |
| 367 | 366 |
| 368 // Stop the auto-login timer when attempting login. | 367 // Stop the auto-login timer when attempting login. |
| 369 StopPublicSessionAutoLoginTimer(); | 368 StopPublicSessionAutoLoginTimer(); |
| 370 | 369 |
| 371 // Disable UI while loading user profile. | 370 // Disable UI while loading user profile. |
| 372 login_display_->SetUIEnabled(false); | 371 login_display_->SetUIEnabled(false); |
| 373 | 372 |
| 374 if (!time_init_.is_null()) { | 373 if (!time_init_.is_null()) { |
| 375 base::TimeDelta delta = base::Time::Now() - time_init_; | 374 base::TimeDelta delta = base::Time::Now() - time_init_; |
| 376 UMA_HISTOGRAM_MEDIUM_TIMES("Login.PromptToCompleteLoginTime", delta); | 375 UMA_HISTOGRAM_MEDIUM_TIMES("Login.PromptToCompleteLoginTime", delta); |
| 377 time_init_ = base::Time(); // Reset to null. | 376 time_init_ = base::Time(); // Reset to null. |
| 378 } | 377 } |
| 379 | 378 |
| 380 host_->OnCompleteLogin(); | 379 host_->OnCompleteLogin(); |
| 381 | 380 |
| 382 // Do an ownership check now to avoid auto-enrolling if the device has | 381 // Do an ownership check now to avoid auto-enrolling if the device has |
| 383 // already been owned. | 382 // already been owned. |
| 384 DeviceSettingsService::Get()->GetOwnershipStatusAsync( | 383 DeviceSettingsService::Get()->GetOwnershipStatusAsync( |
| 385 base::Bind(&ExistingUserController::CompleteLoginInternal, | 384 base::Bind(&ExistingUserController::CompleteLoginInternal, |
| 386 weak_factory_.GetWeakPtr(), | 385 weak_factory_.GetWeakPtr(), |
| 387 username, password)); | 386 credentials)); |
| 388 } | 387 } |
| 389 | 388 |
| 390 void ExistingUserController::CompleteLoginInternal( | 389 void ExistingUserController::CompleteLoginInternal( |
| 391 const std::string& username, | 390 const UserCredentials& credentials, |
| 392 const std::string& password, | |
| 393 DeviceSettingsService::OwnershipStatus ownership_status, | 391 DeviceSettingsService::OwnershipStatus ownership_status, |
| 394 bool is_owner) { | 392 bool is_owner) { |
| 395 // Auto-enrollment must have made a decision by now. It's too late to enroll | 393 // Auto-enrollment must have made a decision by now. It's too late to enroll |
| 396 // if the protocol isn't done at this point. | 394 // if the protocol isn't done at this point. |
| 397 if (do_auto_enrollment_ && | 395 if (do_auto_enrollment_ && |
| 398 ownership_status == DeviceSettingsService::OWNERSHIP_NONE) { | 396 ownership_status == DeviceSettingsService::OWNERSHIP_NONE) { |
| 399 VLOG(1) << "Forcing auto-enrollment before completing login"; | 397 VLOG(1) << "Forcing auto-enrollment before completing login"; |
| 400 // The only way to get out of the enrollment screen from now on is to either | 398 // The only way to get out of the enrollment screen from now on is to either |
| 401 // complete enrollment, or opt-out of it. So this controller shouldn't force | 399 // complete enrollment, or opt-out of it. So this controller shouldn't force |
| 402 // enrollment again if it is reused for another sign-in. | 400 // enrollment again if it is reused for another sign-in. |
| 403 do_auto_enrollment_ = false; | 401 do_auto_enrollment_ = false; |
| 404 auto_enrollment_username_ = username; | 402 auto_enrollment_username_ = credentials.username; |
| 405 resume_login_callback_ = base::Bind( | 403 resume_login_callback_ = base::Bind( |
| 406 &ExistingUserController::PerformLogin, | 404 &ExistingUserController::PerformLogin, |
| 407 weak_factory_.GetWeakPtr(), | 405 weak_factory_.GetWeakPtr(), |
| 408 username, password, LoginPerformer::AUTH_MODE_EXTENSION); | 406 credentials, LoginPerformer::AUTH_MODE_EXTENSION); |
| 409 ShowEnrollmentScreen(true, username); | 407 ShowEnrollmentScreen(true, credentials.username); |
| 410 // Enable UI for the enrollment screen. SetUIEnabled(true) will post a | 408 // Enable UI for the enrollment screen. SetUIEnabled(true) will post a |
| 411 // request to show the sign-in screen again when invoked at the sign-in | 409 // request to show the sign-in screen again when invoked at the sign-in |
| 412 // screen; invoke SetUIEnabled() after navigating to the enrollment screen. | 410 // screen; invoke SetUIEnabled() after navigating to the enrollment screen. |
| 413 login_display_->SetUIEnabled(true); | 411 login_display_->SetUIEnabled(true); |
| 414 } else { | 412 } else { |
| 415 PerformLogin(username, password, LoginPerformer::AUTH_MODE_EXTENSION); | 413 PerformLogin(credentials, LoginPerformer::AUTH_MODE_EXTENSION); |
| 416 } | 414 } |
| 417 } | 415 } |
| 418 | 416 |
| 419 string16 ExistingUserController::GetConnectedNetworkName() { | 417 string16 ExistingUserController::GetConnectedNetworkName() { |
| 420 return GetCurrentNetworkName(); | 418 return GetCurrentNetworkName(); |
| 421 } | 419 } |
| 422 | 420 |
| 423 void ExistingUserController::Login(const std::string& username, | 421 void ExistingUserController::Login(const UserCredentials& credentials) { |
| 424 const std::string& password) { | 422 if ((credentials.username.empty() || credentials.password.empty()) && |
| 425 if (username.empty() || password.empty()) | 423 credentials.auth_code.empty()) |
|
Nikita (slow)
2013/03/21 22:17:32
Is auth code really required for a regular user lo
zel
2013/03/22 05:03:15
nope, you either need to have username+pwd or auth
| |
| 426 return; | 424 return; |
| 427 | 425 |
| 428 // Stop the auto-login timer when attempting login. | 426 // Stop the auto-login timer when attempting login. |
| 429 StopPublicSessionAutoLoginTimer(); | 427 StopPublicSessionAutoLoginTimer(); |
| 430 | 428 |
| 431 // Disable clicking on other windows. | 429 // Disable clicking on other windows. |
| 432 login_display_->SetUIEnabled(false); | 430 login_display_->SetUIEnabled(false); |
| 433 | 431 |
| 434 BootTimesLoader::Get()->RecordLoginAttempted(); | 432 BootTimesLoader::Get()->RecordLoginAttempted(); |
| 435 | 433 |
| 436 if (last_login_attempt_username_ != username) { | 434 if (last_login_attempt_username_ != credentials.username) { |
| 437 last_login_attempt_username_ = username; | 435 last_login_attempt_username_ = credentials.username; |
| 438 num_login_attempts_ = 0; | 436 num_login_attempts_ = 0; |
| 439 // Also reset state variables, which are used to determine password change. | 437 // Also reset state variables, which are used to determine password change. |
| 440 offline_failed_ = false; | 438 offline_failed_ = false; |
| 441 online_succeeded_for_.clear(); | 439 online_succeeded_for_.clear(); |
| 442 } | 440 } |
| 443 num_login_attempts_++; | 441 num_login_attempts_++; |
| 444 PerformLogin(username, password, LoginPerformer::AUTH_MODE_INTERNAL); | 442 PerformLogin(credentials, LoginPerformer::AUTH_MODE_INTERNAL); |
| 445 } | 443 } |
| 446 | 444 |
| 447 void ExistingUserController::PerformLogin( | 445 void ExistingUserController::PerformLogin( |
| 448 std::string username, | 446 const UserCredentials& credentials, |
| 449 std::string password, | |
| 450 LoginPerformer::AuthorizationMode auth_mode) { | 447 LoginPerformer::AuthorizationMode auth_mode) { |
| 451 // Disable UI while loading user profile. | 448 // Disable UI while loading user profile. |
| 452 login_display_->SetUIEnabled(false); | 449 login_display_->SetUIEnabled(false); |
| 453 resume_login_callback_.Reset(); | 450 resume_login_callback_.Reset(); |
| 454 | 451 |
| 455 // Use the same LoginPerformer for subsequent login as it has state | 452 // Use the same LoginPerformer for subsequent login as it has state |
| 456 // such as Authenticator instance. | 453 // such as Authenticator instance. |
| 457 if (!login_performer_.get() || num_login_attempts_ <= 1) { | 454 if (!login_performer_.get() || num_login_attempts_ <= 1) { |
| 458 LoginPerformer::Delegate* delegate = this; | 455 LoginPerformer::Delegate* delegate = this; |
| 459 if (login_performer_delegate_.get()) | 456 if (login_performer_delegate_.get()) |
| 460 delegate = login_performer_delegate_.get(); | 457 delegate = login_performer_delegate_.get(); |
| 461 // Only one instance of LoginPerformer should exist at a time. | 458 // Only one instance of LoginPerformer should exist at a time. |
| 462 login_performer_.reset(NULL); | 459 login_performer_.reset(NULL); |
| 463 login_performer_.reset(new LoginPerformer(delegate)); | 460 login_performer_.reset(new LoginPerformer(delegate)); |
| 464 } | 461 } |
| 465 | 462 |
| 466 is_login_in_progress_ = true; | 463 is_login_in_progress_ = true; |
| 467 if (gaia::ExtractDomainName(username) == | 464 if (gaia::ExtractDomainName(credentials.username) == |
| 468 UserManager::kLocallyManagedUserDomain) { | 465 UserManager::kLocallyManagedUserDomain) { |
| 469 login_performer_->LoginAsLocallyManagedUser(username, password); | 466 login_performer_->LoginAsLocallyManagedUser( |
| 467 UserCredentials(credentials.username, | |
| 468 credentials.password, | |
| 469 std::string())); // auth_code | |
| 470 } else { | 470 } else { |
| 471 login_performer_->PerformLogin(username, password, auth_mode); | 471 login_performer_->PerformLogin(credentials, auth_mode); |
| 472 } | 472 } |
| 473 accessibility::MaybeSpeak( | 473 accessibility::MaybeSpeak( |
| 474 l10n_util::GetStringUTF8(IDS_CHROMEOS_ACC_LOGIN_SIGNING_IN)); | 474 l10n_util::GetStringUTF8(IDS_CHROMEOS_ACC_LOGIN_SIGNING_IN)); |
| 475 } | 475 } |
| 476 | 476 |
| 477 void ExistingUserController::LoginAsRetailModeUser() { | 477 void ExistingUserController::LoginAsRetailModeUser() { |
| 478 // Stop the auto-login timer when attempting login. | 478 // Stop the auto-login timer when attempting login. |
| 479 StopPublicSessionAutoLoginTimer(); | 479 StopPublicSessionAutoLoginTimer(); |
| 480 | 480 |
| 481 // Disable clicking on other windows. | 481 // Disable clicking on other windows. |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 743 UserManager::Get()->ResetUserFlow(last_login_attempt_username_); | 743 UserManager::Get()->ResetUserFlow(last_login_attempt_username_); |
| 744 | 744 |
| 745 if (login_status_consumer_) | 745 if (login_status_consumer_) |
| 746 login_status_consumer_->OnLoginFailure(failure); | 746 login_status_consumer_->OnLoginFailure(failure); |
| 747 | 747 |
| 748 // Clear the recorded displayed email so it won't affect any future attempts. | 748 // Clear the recorded displayed email so it won't affect any future attempts. |
| 749 display_email_.clear(); | 749 display_email_.clear(); |
| 750 } | 750 } |
| 751 | 751 |
| 752 void ExistingUserController::OnLoginSuccess( | 752 void ExistingUserController::OnLoginSuccess( |
| 753 const std::string& username, | 753 const UserCredentials& credentials, |
| 754 const std::string& password, | |
| 755 bool pending_requests, | 754 bool pending_requests, |
| 756 bool using_oauth) { | 755 bool using_oauth) { |
| 757 is_login_in_progress_ = false; | 756 is_login_in_progress_ = false; |
| 758 offline_failed_ = false; | 757 offline_failed_ = false; |
| 759 | 758 |
| 760 StopPublicSessionAutoLoginTimer(); | 759 StopPublicSessionAutoLoginTimer(); |
| 761 | 760 |
| 762 bool has_cookies = | 761 bool has_cookies = |
| 763 login_performer_->auth_mode() == LoginPerformer::AUTH_MODE_EXTENSION; | 762 login_performer_->auth_mode() == LoginPerformer::AUTH_MODE_EXTENSION && |
| 763 credentials.auth_code.empty(); | |
| 764 | 764 |
| 765 // Login performer will be gone so cache this value to use | 765 // Login performer will be gone so cache this value to use |
| 766 // once profile is loaded. | 766 // once profile is loaded. |
| 767 password_changed_ = login_performer_->password_changed(); | 767 password_changed_ = login_performer_->password_changed(); |
| 768 | 768 |
| 769 // LoginPerformer instance will delete itself once online auth result is OK. | 769 // LoginPerformer instance will delete itself once online auth result is OK. |
| 770 // In case of failure it'll bring up ScreenLock and ask for | 770 // In case of failure it'll bring up ScreenLock and ask for |
| 771 // correct password/display error message. | 771 // correct password/display error message. |
| 772 // Even in case when following online,offline protocol and returning | 772 // Even in case when following online,offline protocol and returning |
| 773 // requests_pending = false, let LoginPerformer delete itself. | 773 // requests_pending = false, let LoginPerformer delete itself. |
| 774 login_performer_->set_delegate(NULL); | 774 login_performer_->set_delegate(NULL); |
| 775 ignore_result(login_performer_.release()); | 775 ignore_result(login_performer_.release()); |
| 776 | 776 |
| 777 // Will call OnProfilePrepared() in the end. | 777 // Will call OnProfilePrepared() in the end. |
| 778 LoginUtils::Get()->PrepareProfile(username, | 778 LoginUtils::Get()->PrepareProfile(credentials, |
| 779 display_email_, | 779 display_email_, |
| 780 password, | |
| 781 using_oauth, | 780 using_oauth, |
| 782 has_cookies, | 781 has_cookies, |
| 783 this); | 782 this); |
| 784 | 783 |
| 785 display_email_.clear(); | 784 display_email_.clear(); |
| 786 | 785 |
| 787 // Notify LoginDisplay to allow it provide visual feedback to user. | 786 // Notify LoginDisplay to allow it provide visual feedback to user. |
| 788 login_display_->OnLoginSuccess(username); | 787 login_display_->OnLoginSuccess(credentials.username); |
| 789 } | 788 } |
| 790 | 789 |
| 791 void ExistingUserController::OnProfilePrepared(Profile* profile) { | 790 void ExistingUserController::OnProfilePrepared(Profile* profile) { |
| 792 OptionallyShowReleaseNotes(profile); | 791 OptionallyShowReleaseNotes(profile); |
| 793 | 792 |
| 794 // Reenable clicking on other windows and status area. | 793 // Reenable clicking on other windows and status area. |
| 795 login_display_->SetUIEnabled(true); | 794 login_display_->SetUIEnabled(true); |
| 796 | 795 |
| 797 if (UserManager::Get()->IsCurrentUserNew() && | 796 if (UserManager::Get()->IsCurrentUserNew() && |
| 798 !UserManager::Get()->GetCurrentUserFlow()->ShouldSkipPostLoginScreens() && | 797 !UserManager::Get()->GetCurrentUserFlow()->ShouldSkipPostLoginScreens() && |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 814 #ifndef NDEBUG | 813 #ifndef NDEBUG |
| 815 } | 814 } |
| 816 #endif | 815 #endif |
| 817 } else { | 816 } else { |
| 818 LoginUtils::Get()->DoBrowserLaunch(profile, host_); | 817 LoginUtils::Get()->DoBrowserLaunch(profile, host_); |
| 819 host_ = NULL; | 818 host_ = NULL; |
| 820 } | 819 } |
| 821 // Inform |login_status_consumer_| about successful login. Set most | 820 // Inform |login_status_consumer_| about successful login. Set most |
| 822 // parameters to empty since they're not needed. | 821 // parameters to empty since they're not needed. |
| 823 if (login_status_consumer_) | 822 if (login_status_consumer_) |
| 824 login_status_consumer_->OnLoginSuccess("", "", false, false); | 823 login_status_consumer_->OnLoginSuccess(UserCredentials(), |
| 824 false, // pending_requests | |
| 825 false); // using_oauth | |
| 825 login_display_->OnFadeOut(); | 826 login_display_->OnFadeOut(); |
| 826 } | 827 } |
| 827 | 828 |
| 828 void ExistingUserController::OnOffTheRecordLoginSuccess() { | 829 void ExistingUserController::OnOffTheRecordLoginSuccess() { |
| 829 is_login_in_progress_ = false; | 830 is_login_in_progress_ = false; |
| 830 offline_failed_ = false; | 831 offline_failed_ = false; |
| 831 if (WizardController::IsDeviceRegistered()) { | 832 if (WizardController::IsDeviceRegistered()) { |
| 832 LoginUtils::Get()->CompleteOffTheRecordLogin(guest_mode_url_); | 833 LoginUtils::Get()->CompleteOffTheRecordLogin(guest_mode_url_); |
| 833 } else { | 834 } else { |
| 834 // Postpone CompleteOffTheRecordLogin until registration completion. | 835 // Postpone CompleteOffTheRecordLogin until registration completion. |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1119 // changed. | 1120 // changed. |
| 1120 UserManager::Get()->SaveUserOAuthStatus( | 1121 UserManager::Get()->SaveUserOAuthStatus( |
| 1121 username, | 1122 username, |
| 1122 User::OAUTH2_TOKEN_STATUS_INVALID); | 1123 User::OAUTH2_TOKEN_STATUS_INVALID); |
| 1123 | 1124 |
| 1124 login_display_->SetUIEnabled(true); | 1125 login_display_->SetUIEnabled(true); |
| 1125 login_display_->ShowGaiaPasswordChanged(username); | 1126 login_display_->ShowGaiaPasswordChanged(username); |
| 1126 } | 1127 } |
| 1127 | 1128 |
| 1128 } // namespace chromeos | 1129 } // namespace chromeos |
| OLD | NEW |