Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Side by Side Diff: chrome/browser/chromeos/login/existing_user_controller.cc

Issue 12704002: Support for auth code based authentication flow for both app and web UI driven flow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase4 Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 } 212 }
213 213
214 void ExistingUserController::DoAutoEnrollment() { 214 void ExistingUserController::DoAutoEnrollment() {
215 do_auto_enrollment_ = true; 215 do_auto_enrollment_ = true;
216 } 216 }
217 217
218 void ExistingUserController::ResumeLogin() { 218 void ExistingUserController::ResumeLogin() {
219 // This means the user signed-in, then auto-enrollment used his credentials 219 // This means the user signed-in, then auto-enrollment used his credentials
220 // to enroll and succeeded. 220 // to enroll and succeeded.
221 resume_login_callback_.Run(); 221 resume_login_callback_.Run();
222 resume_login_callback_.Reset();
222 } 223 }
223 224
224 void ExistingUserController::PrepareKioskAppLaunch() { 225 void ExistingUserController::PrepareKioskAppLaunch() {
225 // Disable login UI while waiting for the kiosk app launch. There is no 226 // Disable login UI while waiting for the kiosk app launch. There is no
226 // balanced UI enable call because this very login screen will not be 227 // balanced UI enable call because this very login screen will not be
227 // accessed again. If app is launched, it will be destroyed. If app fails to 228 // accessed again. If app is launched, it will be destroyed. If app fails to
228 // launch, chrome is restarted to go back to a new login screen. 229 // launch, chrome is restarted to go back to a new login screen.
229 login_display_->SetUIEnabled(false); 230 login_display_->SetUIEnabled(false);
230 } 231 }
231 232
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 delegate = login_performer_delegate_.get(); 351 delegate = login_performer_delegate_.get();
351 // Only one instance of LoginPerformer should exist at a time. 352 // Only one instance of LoginPerformer should exist at a time.
352 login_performer_.reset(NULL); 353 login_performer_.reset(NULL);
353 login_performer_.reset(new LoginPerformer(delegate)); 354 login_performer_.reset(new LoginPerformer(delegate));
354 is_login_in_progress_ = true; 355 is_login_in_progress_ = true;
355 login_performer_-> 356 login_performer_->
356 CreateLocallyManagedUser(display_name, password); 357 CreateLocallyManagedUser(display_name, password);
357 // TODO(nkostylev): A11y message. 358 // TODO(nkostylev): A11y message.
358 } 359 }
359 360
360 void ExistingUserController::CompleteLogin(const std::string& username, 361 void ExistingUserController::CompleteLogin(const UserCredentials& credentials) {
361 const std::string& password) {
362 if (!host_) { 362 if (!host_) {
363 // Complete login event was generated already from UI. Ignore notification. 363 // Complete login event was generated already from UI. Ignore notification.
364 return; 364 return;
365 } 365 }
366 366
367 // Stop the auto-login timer when attempting login. 367 // Stop the auto-login timer when attempting login.
368 StopPublicSessionAutoLoginTimer(); 368 StopPublicSessionAutoLoginTimer();
369 369
370 // Disable UI while loading user profile. 370 // Disable UI while loading user profile.
371 login_display_->SetUIEnabled(false); 371 login_display_->SetUIEnabled(false);
372 372
373 if (!time_init_.is_null()) { 373 if (!time_init_.is_null()) {
374 base::TimeDelta delta = base::Time::Now() - time_init_; 374 base::TimeDelta delta = base::Time::Now() - time_init_;
375 UMA_HISTOGRAM_MEDIUM_TIMES("Login.PromptToCompleteLoginTime", delta); 375 UMA_HISTOGRAM_MEDIUM_TIMES("Login.PromptToCompleteLoginTime", delta);
376 time_init_ = base::Time(); // Reset to null. 376 time_init_ = base::Time(); // Reset to null.
377 } 377 }
378 378
379 host_->OnCompleteLogin(); 379 host_->OnCompleteLogin();
380 380
381 // 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
382 // already been owned. 382 // already been owned.
383 DeviceSettingsService::Get()->GetOwnershipStatusAsync( 383 DeviceSettingsService::Get()->GetOwnershipStatusAsync(
384 base::Bind(&ExistingUserController::CompleteLoginInternal, 384 base::Bind(&ExistingUserController::CompleteLoginInternal,
385 weak_factory_.GetWeakPtr(), 385 weak_factory_.GetWeakPtr(),
386 username, password)); 386 credentials));
387 } 387 }
388 388
389 void ExistingUserController::CompleteLoginInternal( 389 void ExistingUserController::CompleteLoginInternal(
390 const std::string& username, 390 const UserCredentials& credentials,
391 const std::string& password,
392 DeviceSettingsService::OwnershipStatus ownership_status, 391 DeviceSettingsService::OwnershipStatus ownership_status,
393 bool is_owner) { 392 bool is_owner) {
394 // 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
395 // if the protocol isn't done at this point. 394 // if the protocol isn't done at this point.
396 if (do_auto_enrollment_ && 395 if (do_auto_enrollment_ &&
397 ownership_status == DeviceSettingsService::OWNERSHIP_NONE) { 396 ownership_status == DeviceSettingsService::OWNERSHIP_NONE) {
398 VLOG(1) << "Forcing auto-enrollment before completing login"; 397 VLOG(1) << "Forcing auto-enrollment before completing login";
399 // 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
400 // 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
401 // enrollment again if it is reused for another sign-in. 400 // enrollment again if it is reused for another sign-in.
402 do_auto_enrollment_ = false; 401 do_auto_enrollment_ = false;
403 auto_enrollment_username_ = username; 402 auto_enrollment_username_ = credentials.username;
404 resume_login_callback_ = base::Bind( 403 resume_login_callback_ = base::Bind(
405 &ExistingUserController::PerformLogin, 404 &ExistingUserController::PerformLogin,
406 weak_factory_.GetWeakPtr(), 405 weak_factory_.GetWeakPtr(),
407 username, password, LoginPerformer::AUTH_MODE_EXTENSION); 406 credentials, LoginPerformer::AUTH_MODE_EXTENSION);
408 ShowEnrollmentScreen(true, username); 407 ShowEnrollmentScreen(true, credentials.username);
409 // Enable UI for the enrollment screen. SetUIEnabled(true) will post a 408 // Enable UI for the enrollment screen. SetUIEnabled(true) will post a
410 // 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
411 // screen; invoke SetUIEnabled() after navigating to the enrollment screen. 410 // screen; invoke SetUIEnabled() after navigating to the enrollment screen.
412 login_display_->SetUIEnabled(true); 411 login_display_->SetUIEnabled(true);
413 } else { 412 } else {
414 PerformLogin(username, password, LoginPerformer::AUTH_MODE_EXTENSION); 413 PerformLogin(credentials, LoginPerformer::AUTH_MODE_EXTENSION);
415 } 414 }
416 } 415 }
417 416
418 string16 ExistingUserController::GetConnectedNetworkName() { 417 string16 ExistingUserController::GetConnectedNetworkName() {
419 return GetCurrentNetworkName(); 418 return GetCurrentNetworkName();
420 } 419 }
421 420
422 void ExistingUserController::Login(const std::string& username, 421 void ExistingUserController::Login(const UserCredentials& credentials) {
423 const std::string& password) { 422 if ((credentials.username.empty() || credentials.password.empty()) &&
424 if (username.empty() || password.empty()) 423 credentials.auth_code.empty())
425 return; 424 return;
426 425
427 // Stop the auto-login timer when attempting login. 426 // Stop the auto-login timer when attempting login.
428 StopPublicSessionAutoLoginTimer(); 427 StopPublicSessionAutoLoginTimer();
429 428
430 // Disable clicking on other windows. 429 // Disable clicking on other windows.
431 login_display_->SetUIEnabled(false); 430 login_display_->SetUIEnabled(false);
432 431
433 BootTimesLoader::Get()->RecordLoginAttempted(); 432 BootTimesLoader::Get()->RecordLoginAttempted();
434 433
435 if (last_login_attempt_username_ != username) { 434 if (last_login_attempt_username_ != credentials.username) {
436 last_login_attempt_username_ = username; 435 last_login_attempt_username_ = credentials.username;
437 num_login_attempts_ = 0; 436 num_login_attempts_ = 0;
438 // Also reset state variables, which are used to determine password change. 437 // Also reset state variables, which are used to determine password change.
439 offline_failed_ = false; 438 offline_failed_ = false;
440 online_succeeded_for_.clear(); 439 online_succeeded_for_.clear();
441 } 440 }
442 num_login_attempts_++; 441 num_login_attempts_++;
443 PerformLogin(username, password, LoginPerformer::AUTH_MODE_INTERNAL); 442 PerformLogin(credentials, LoginPerformer::AUTH_MODE_INTERNAL);
444 } 443 }
445 444
446 void ExistingUserController::PerformLogin( 445 void ExistingUserController::PerformLogin(
447 std::string username, 446 const UserCredentials& credentials,
448 std::string password,
449 LoginPerformer::AuthorizationMode auth_mode) { 447 LoginPerformer::AuthorizationMode auth_mode) {
450 // Disable UI while loading user profile. 448 // Disable UI while loading user profile.
451 login_display_->SetUIEnabled(false); 449 login_display_->SetUIEnabled(false);
452 resume_login_callback_.Reset();
453 450
454 // Use the same LoginPerformer for subsequent login as it has state 451 // Use the same LoginPerformer for subsequent login as it has state
455 // such as Authenticator instance. 452 // such as Authenticator instance.
456 if (!login_performer_.get() || num_login_attempts_ <= 1) { 453 if (!login_performer_.get() || num_login_attempts_ <= 1) {
457 LoginPerformer::Delegate* delegate = this; 454 LoginPerformer::Delegate* delegate = this;
458 if (login_performer_delegate_.get()) 455 if (login_performer_delegate_.get())
459 delegate = login_performer_delegate_.get(); 456 delegate = login_performer_delegate_.get();
460 // Only one instance of LoginPerformer should exist at a time. 457 // Only one instance of LoginPerformer should exist at a time.
461 login_performer_.reset(NULL); 458 login_performer_.reset(NULL);
462 login_performer_.reset(new LoginPerformer(delegate)); 459 login_performer_.reset(new LoginPerformer(delegate));
463 } 460 }
464 461
465 is_login_in_progress_ = true; 462 is_login_in_progress_ = true;
466 if (gaia::ExtractDomainName(username) == 463 if (gaia::ExtractDomainName(credentials.username) ==
467 UserManager::kLocallyManagedUserDomain) { 464 UserManager::kLocallyManagedUserDomain) {
468 login_performer_->LoginAsLocallyManagedUser(username, password); 465 login_performer_->LoginAsLocallyManagedUser(
466 UserCredentials(credentials.username,
467 credentials.password,
468 std::string())); // auth_code
469 } else { 469 } else {
470 login_performer_->PerformLogin(username, password, auth_mode); 470 login_performer_->PerformLogin(credentials, auth_mode);
471 } 471 }
472 accessibility::MaybeSpeak( 472 accessibility::MaybeSpeak(
473 l10n_util::GetStringUTF8(IDS_CHROMEOS_ACC_LOGIN_SIGNING_IN)); 473 l10n_util::GetStringUTF8(IDS_CHROMEOS_ACC_LOGIN_SIGNING_IN));
474 } 474 }
475 475
476 void ExistingUserController::LoginAsRetailModeUser() { 476 void ExistingUserController::LoginAsRetailModeUser() {
477 // Stop the auto-login timer when attempting login. 477 // Stop the auto-login timer when attempting login.
478 StopPublicSessionAutoLoginTimer(); 478 StopPublicSessionAutoLoginTimer();
479 479
480 // Disable clicking on other windows. 480 // Disable clicking on other windows.
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 UserManager::Get()->ResetUserFlow(last_login_attempt_username_); 747 UserManager::Get()->ResetUserFlow(last_login_attempt_username_);
748 748
749 if (login_status_consumer_) 749 if (login_status_consumer_)
750 login_status_consumer_->OnLoginFailure(failure); 750 login_status_consumer_->OnLoginFailure(failure);
751 751
752 // Clear the recorded displayed email so it won't affect any future attempts. 752 // Clear the recorded displayed email so it won't affect any future attempts.
753 display_email_.clear(); 753 display_email_.clear();
754 } 754 }
755 755
756 void ExistingUserController::OnLoginSuccess( 756 void ExistingUserController::OnLoginSuccess(
757 const std::string& username, 757 const UserCredentials& credentials,
758 const std::string& password,
759 bool pending_requests, 758 bool pending_requests,
760 bool using_oauth) { 759 bool using_oauth) {
761 is_login_in_progress_ = false; 760 is_login_in_progress_ = false;
762 offline_failed_ = false; 761 offline_failed_ = false;
763 762
764 StopPublicSessionAutoLoginTimer(); 763 StopPublicSessionAutoLoginTimer();
765 764
766 bool has_cookies = 765 bool has_cookies =
767 login_performer_->auth_mode() == LoginPerformer::AUTH_MODE_EXTENSION; 766 login_performer_->auth_mode() == LoginPerformer::AUTH_MODE_EXTENSION &&
767 credentials.auth_code.empty();
768 768
769 // Login performer will be gone so cache this value to use 769 // Login performer will be gone so cache this value to use
770 // once profile is loaded. 770 // once profile is loaded.
771 password_changed_ = login_performer_->password_changed(); 771 password_changed_ = login_performer_->password_changed();
772 772
773 // LoginPerformer instance will delete itself once online auth result is OK. 773 // LoginPerformer instance will delete itself once online auth result is OK.
774 // In case of failure it'll bring up ScreenLock and ask for 774 // In case of failure it'll bring up ScreenLock and ask for
775 // correct password/display error message. 775 // correct password/display error message.
776 // Even in case when following online,offline protocol and returning 776 // Even in case when following online,offline protocol and returning
777 // requests_pending = false, let LoginPerformer delete itself. 777 // requests_pending = false, let LoginPerformer delete itself.
778 login_performer_->set_delegate(NULL); 778 login_performer_->set_delegate(NULL);
779 ignore_result(login_performer_.release()); 779 ignore_result(login_performer_.release());
780 780
781 // Will call OnProfilePrepared() in the end. 781 // Will call OnProfilePrepared() in the end.
782 LoginUtils::Get()->PrepareProfile(username, 782 LoginUtils::Get()->PrepareProfile(credentials,
783 display_email_, 783 display_email_,
784 password,
785 using_oauth, 784 using_oauth,
786 has_cookies, 785 has_cookies,
787 this); 786 this);
788 787
789 display_email_.clear(); 788 display_email_.clear();
790 789
791 // Notify LoginDisplay to allow it provide visual feedback to user. 790 // Notify LoginDisplay to allow it provide visual feedback to user.
792 login_display_->OnLoginSuccess(username); 791 login_display_->OnLoginSuccess(credentials.username);
793 } 792 }
794 793
795 void ExistingUserController::OnProfilePrepared(Profile* profile) { 794 void ExistingUserController::OnProfilePrepared(Profile* profile) {
796 OptionallyShowReleaseNotes(profile); 795 OptionallyShowReleaseNotes(profile);
797 796
798 // Reenable clicking on other windows and status area. 797 // Reenable clicking on other windows and status area.
799 login_display_->SetUIEnabled(true); 798 login_display_->SetUIEnabled(true);
800 799
801 if (UserManager::Get()->IsCurrentUserNew() && 800 if (UserManager::Get()->IsCurrentUserNew() &&
802 !UserManager::Get()->GetCurrentUserFlow()->ShouldSkipPostLoginScreens() && 801 !UserManager::Get()->GetCurrentUserFlow()->ShouldSkipPostLoginScreens() &&
(...skipping 15 matching lines...) Expand all
818 #ifndef NDEBUG 817 #ifndef NDEBUG
819 } 818 }
820 #endif 819 #endif
821 } else { 820 } else {
822 LoginUtils::Get()->DoBrowserLaunch(profile, host_); 821 LoginUtils::Get()->DoBrowserLaunch(profile, host_);
823 host_ = NULL; 822 host_ = NULL;
824 } 823 }
825 // Inform |login_status_consumer_| about successful login. Set most 824 // Inform |login_status_consumer_| about successful login. Set most
826 // parameters to empty since they're not needed. 825 // parameters to empty since they're not needed.
827 if (login_status_consumer_) 826 if (login_status_consumer_)
828 login_status_consumer_->OnLoginSuccess("", "", false, false); 827 login_status_consumer_->OnLoginSuccess(UserCredentials(),
828 false, // pending_requests
829 false); // using_oauth
829 login_display_->OnFadeOut(); 830 login_display_->OnFadeOut();
830 } 831 }
831 832
832 void ExistingUserController::OnOffTheRecordLoginSuccess() { 833 void ExistingUserController::OnOffTheRecordLoginSuccess() {
833 is_login_in_progress_ = false; 834 is_login_in_progress_ = false;
834 offline_failed_ = false; 835 offline_failed_ = false;
835 if (WizardController::IsDeviceRegistered()) { 836 if (WizardController::IsDeviceRegistered()) {
836 LoginUtils::Get()->CompleteOffTheRecordLogin(guest_mode_url_); 837 LoginUtils::Get()->CompleteOffTheRecordLogin(guest_mode_url_);
837 } else { 838 } else {
838 // Postpone CompleteOffTheRecordLogin until registration completion. 839 // Postpone CompleteOffTheRecordLogin until registration completion.
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 // changed. 1129 // changed.
1129 UserManager::Get()->SaveUserOAuthStatus( 1130 UserManager::Get()->SaveUserOAuthStatus(
1130 username, 1131 username,
1131 User::OAUTH2_TOKEN_STATUS_INVALID); 1132 User::OAUTH2_TOKEN_STATUS_INVALID);
1132 1133
1133 login_display_->SetUIEnabled(true); 1134 login_display_->SetUIEnabled(true);
1134 login_display_->ShowGaiaPasswordChanged(username); 1135 login_display_->ShowGaiaPasswordChanged(username);
1135 } 1136 }
1136 1137
1137 } // namespace chromeos 1138 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698