| Index: chrome/browser/chromeos/login/login_performer.cc
|
| diff --git a/chrome/browser/chromeos/login/login_performer.cc b/chrome/browser/chromeos/login/login_performer.cc
|
| index 22255fa1dd68127c9b2ba91d4493f56c34db730b..4840116a00d667788ff3f1c4b08bb54eb6537023 100644
|
| --- a/chrome/browser/chromeos/login/login_performer.cc
|
| +++ b/chrome/browser/chromeos/login/login_performer.cc
|
| @@ -18,7 +18,6 @@
|
| #include "chrome/browser/chromeos/boot_times_loader.h"
|
| #include "chrome/browser/chromeos/login/login_utils.h"
|
| #include "chrome/browser/chromeos/login/managed/locally_managed_user_login_flow.h"
|
| -#include "chrome/browser/chromeos/login/screen_locker.h"
|
| #include "chrome/browser/chromeos/login/user_manager.h"
|
| #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
|
| #include "chrome/browser/chromeos/profiles/profile_helper.h"
|
| @@ -46,29 +45,18 @@ using content::UserMetricsAction;
|
|
|
| namespace chromeos {
|
|
|
| -// Initialize default LoginPerformer.
|
| -// static
|
| -LoginPerformer* LoginPerformer::default_performer_ = NULL;
|
| -
|
| LoginPerformer::LoginPerformer(Delegate* delegate)
|
| : online_attempt_host_(this),
|
| last_login_failure_(LoginFailure::LoginFailureNone()),
|
| delegate_(delegate),
|
| password_changed_(false),
|
| password_changed_callback_count_(0),
|
| - screen_lock_requested_(false),
|
| - initial_online_auth_pending_(false),
|
| auth_mode_(AUTH_MODE_INTERNAL),
|
| weak_factory_(this) {
|
| - DCHECK(default_performer_ == NULL)
|
| - << "LoginPerformer should have only one instance.";
|
| - default_performer_ = this;
|
| }
|
|
|
| LoginPerformer::~LoginPerformer() {
|
| DVLOG(1) << "Deleting LoginPerformer";
|
| - DCHECK(default_performer_ != NULL) << "Default instance should exist.";
|
| - default_performer_ = NULL;
|
| if (authenticator_.get())
|
| authenticator_->SetConsumer(NULL);
|
| }
|
| @@ -88,33 +76,9 @@ void LoginPerformer::OnLoginFailure(const LoginFailure& failure) {
|
| if (delegate_) {
|
| delegate_->OnLoginFailure(failure);
|
| return;
|
| - }
|
| -
|
| - // Consequent online login failure with blocking UI on.
|
| - // No difference between cases whether screen was locked by the user or
|
| - // by LoginPerformer except for the very first screen lock while waiting
|
| - // for online auth. Otherwise it will be SL active > timeout > screen unlock.
|
| - // Display recoverable error message using ScreenLocker,
|
| - // force sign out otherwise.
|
| - if (ScreenLocker::default_screen_locker() && !initial_online_auth_pending_) {
|
| - ResolveLockLoginFailure();
|
| - return;
|
| - }
|
| - initial_online_auth_pending_ = false;
|
| -
|
| - // Offline auth - OK, online auth - failed.
|
| - if (failure.reason() == LoginFailure::NETWORK_AUTH_FAILED) {
|
| - ResolveInitialNetworkAuthFailure();
|
| - } else if (failure.reason() == LoginFailure::LOGIN_TIMED_OUT) {
|
| - VLOG(1) << "Online login timed out. "
|
| - << "Granting user access based on offline auth only.";
|
| - // ScreenLock is not active, it's ok to delete itself.
|
| - base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| } else {
|
| // COULD_NOT_MOUNT_CRYPTOHOME, COULD_NOT_MOUNT_TMPFS:
|
| // happens during offline auth only.
|
| - // UNLOCK_FAILED is used during normal screen lock case.
|
| - // TODO(nkostylev) DATA_REMOVAL_FAILED - ?
|
| NOTREACHED();
|
| }
|
| }
|
| @@ -146,13 +110,8 @@ void LoginPerformer::OnLoginSuccess(
|
| DCHECK(delegate_);
|
| // After delegate_->OnLoginSuccess(...) is called, delegate_ releases
|
| // LoginPerformer ownership. LP now manages it's lifetime on its own.
|
| - // 2 things could make it exist longer:
|
| - // 1. ScreenLock active (pending correct new password input)
|
| - // 2. Pending online auth request.
|
| - if (!pending_requests)
|
| - base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| - else
|
| - initial_online_auth_pending_ = true;
|
| + DCHECK(!pending_requests);
|
| + base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
|
|
| delegate_->OnLoginSuccess(user_context,
|
| pending_requests,
|
| @@ -175,11 +134,7 @@ void LoginPerformer::OnPasswordChangeDetected() {
|
| if (delegate_) {
|
| delegate_->OnPasswordChangeDetected();
|
| } else {
|
| - last_login_failure_ =
|
| - LoginFailure::FromNetworkAuthFailure(GoogleServiceAuthError(
|
| - GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
|
| - DVLOG(1) << "Password change detected - locking screen.";
|
| - RequestScreenLock();
|
| + NOTREACHED();
|
| }
|
| }
|
|
|
| @@ -195,27 +150,6 @@ void LoginPerformer::OnChecked(const std::string& username, bool success) {
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| -// LoginPerformer, content::NotificationObserver implementation:
|
| -//
|
| -
|
| -void LoginPerformer::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - if (type != chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED)
|
| - return;
|
| -
|
| - bool is_screen_locked = *content::Details<bool>(details).ptr();
|
| - if (is_screen_locked) {
|
| - if (screen_lock_requested_) {
|
| - screen_lock_requested_ = false;
|
| - ResolveScreenLocked();
|
| - }
|
| - } else {
|
| - ResolveScreenUnlocked();
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| // LoginPerformer, public:
|
|
|
| void LoginPerformer::PerformLogin(const UserContext& user_context,
|
| @@ -225,31 +159,28 @@ void LoginPerformer::PerformLogin(const UserContext& user_context,
|
|
|
| CrosSettings* cros_settings = CrosSettings::Get();
|
|
|
| - // Whitelist check is always performed during initial login and
|
| - // should not be performed when ScreenLock is active (pending online auth).
|
| - if (!ScreenLocker::default_screen_locker()) {
|
| - CrosSettingsProvider::TrustedStatus status =
|
| - cros_settings->PrepareTrustedValues(
|
| - base::Bind(&LoginPerformer::PerformLogin,
|
| - weak_factory_.GetWeakPtr(),
|
| - user_context_, auth_mode));
|
| - // Must not proceed without signature verification.
|
| - if (status == CrosSettingsProvider::PERMANENTLY_UNTRUSTED) {
|
| - if (delegate_)
|
| - delegate_->PolicyLoadFailed();
|
| - else
|
| - NOTREACHED();
|
| - return;
|
| - } else if (status != CrosSettingsProvider::TRUSTED) {
|
| - // Value of AllowNewUser setting is still not verified.
|
| - // Another attempt will be invoked after verification completion.
|
| - return;
|
| - }
|
| + // Whitelist check is always performed during initial login.
|
| + CrosSettingsProvider::TrustedStatus status =
|
| + cros_settings->PrepareTrustedValues(
|
| + base::Bind(&LoginPerformer::PerformLogin,
|
| + weak_factory_.GetWeakPtr(),
|
| + user_context_, auth_mode));
|
| + // Must not proceed without signature verification.
|
| + if (status == CrosSettingsProvider::PERMANENTLY_UNTRUSTED) {
|
| + if (delegate_)
|
| + delegate_->PolicyLoadFailed();
|
| + else
|
| + NOTREACHED();
|
| + return;
|
| + } else if (status != CrosSettingsProvider::TRUSTED) {
|
| + // Value of AllowNewUser setting is still not verified.
|
| + // Another attempt will be invoked after verification completion.
|
| + return;
|
| }
|
|
|
| bool is_whitelisted = LoginUtils::IsWhitelisted(
|
| gaia::CanonicalizeEmail(user_context.username));
|
| - if (ScreenLocker::default_screen_locker() || is_whitelisted) {
|
| + if (is_whitelisted) {
|
| switch (auth_mode_) {
|
| case AUTH_MODE_EXTENSION:
|
| StartLoginCompletion();
|
| @@ -333,149 +264,6 @@ void LoginPerformer::ResyncEncryptedData() {
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // LoginPerformer, private:
|
|
|
| -void LoginPerformer::RequestScreenLock() {
|
| - DVLOG(1) << "Screen lock requested";
|
| - // Will receive notifications on screen unlock and delete itself.
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
|
| - content::NotificationService::AllSources());
|
| - if (ScreenLocker::default_screen_locker()) {
|
| - DVLOG(1) << "Screen already locked";
|
| - ResolveScreenLocked();
|
| - } else {
|
| - screen_lock_requested_ = true;
|
| - // TODO(antrim) : additional logging for crbug/173178
|
| - LOG(WARNING) << "Requesting screen lock from LoginPerformer";
|
| - DBusThreadManager::Get()->GetSessionManagerClient()->RequestLockScreen();
|
| - }
|
| -}
|
| -
|
| -void LoginPerformer::RequestScreenUnlock() {
|
| - DVLOG(1) << "Screen unlock requested";
|
| - if (ScreenLocker::default_screen_locker()) {
|
| - DBusThreadManager::Get()->GetSessionManagerClient()->RequestUnlockScreen();
|
| - // Will unsubscribe from notifications once unlock is successful.
|
| - } else {
|
| - LOG(ERROR) << "Screen is not locked";
|
| - NOTREACHED();
|
| - }
|
| -}
|
| -
|
| -void LoginPerformer::ResolveInitialNetworkAuthFailure() {
|
| - DVLOG(1) << "auth_error: " << last_login_failure_.error().state();
|
| -
|
| - switch (last_login_failure_.error().state()) {
|
| - case GoogleServiceAuthError::CONNECTION_FAILED:
|
| - case GoogleServiceAuthError::SERVICE_UNAVAILABLE:
|
| - case GoogleServiceAuthError::TWO_FACTOR:
|
| - case GoogleServiceAuthError::REQUEST_CANCELED:
|
| - // Offline auth already done. Online auth will be done next time
|
| - // or once user accesses web property.
|
| - VLOG(1) << "Granting user access based on offline auth only. "
|
| - << "Online login failed with "
|
| - << last_login_failure_.error().state();
|
| - // Resolving initial online auth failure, no ScreenLock is active.
|
| - base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| - return;
|
| - case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS:
|
| - // Offline auth OK, so it might be the case of changed password.
|
| - password_changed_ = true;
|
| - case GoogleServiceAuthError::USER_NOT_SIGNED_UP:
|
| - case GoogleServiceAuthError::ACCOUNT_DELETED:
|
| - case GoogleServiceAuthError::ACCOUNT_DISABLED:
|
| - // Access not granted. User has to sign out.
|
| - // Request screen lock & show error message there.
|
| - case GoogleServiceAuthError::CAPTCHA_REQUIRED:
|
| - default:
|
| - // Unless there's new GoogleServiceAuthErrors state has been added.
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -}
|
| -
|
| -void LoginPerformer::ResolveLockLoginFailure() {
|
| - if (last_login_failure_.reason() == LoginFailure::LOGIN_TIMED_OUT) {
|
| - LOG(WARNING) << "Online login timed out - unlocking screen. "
|
| - << "Granting user access based on offline auth only.";
|
| - RequestScreenUnlock();
|
| - return;
|
| - } else if (last_login_failure_.reason() ==
|
| - LoginFailure::NETWORK_AUTH_FAILED) {
|
| - ResolveLockNetworkAuthFailure();
|
| - return;
|
| - } else if (last_login_failure_.reason() ==
|
| - LoginFailure::COULD_NOT_MOUNT_CRYPTOHOME ||
|
| - last_login_failure_.reason() ==
|
| - LoginFailure::DATA_REMOVAL_FAILED) {
|
| - LOG(ERROR) << "Cryptohome error, forcing sign out.";
|
| - } else {
|
| - // COULD_NOT_MOUNT_TMPFS, UNLOCK_FAILED should not happen here.
|
| - NOTREACHED();
|
| - }
|
| - ScreenLocker::default_screen_locker()->Signout();
|
| -}
|
| -
|
| -void LoginPerformer::ResolveLockNetworkAuthFailure() {
|
| - DCHECK(ScreenLocker::default_screen_locker())
|
| - << "ScreenLocker instance doesn't exist.";
|
| - DCHECK(last_login_failure_.reason() == LoginFailure::NETWORK_AUTH_FAILED);
|
| -
|
| - int msg_id = IDS_LOGIN_ERROR_AUTHENTICATING;
|
| - HelpAppLauncher::HelpTopic help_topic =
|
| - HelpAppLauncher::HELP_CANT_ACCESS_ACCOUNT;
|
| - bool sign_out_only = false;
|
| -
|
| - DVLOG(1) << "auth_error: " << last_login_failure_.error().state();
|
| -
|
| - switch (last_login_failure_.error().state()) {
|
| - case GoogleServiceAuthError::CONNECTION_FAILED:
|
| - case GoogleServiceAuthError::SERVICE_UNAVAILABLE:
|
| - case GoogleServiceAuthError::TWO_FACTOR:
|
| - case GoogleServiceAuthError::REQUEST_CANCELED:
|
| - // Offline auth already done. Online auth will be done next time
|
| - // or once user accesses web property.
|
| - LOG(WARNING) << "Granting user access based on offline auth only. "
|
| - << "Online login failed with "
|
| - << last_login_failure_.error().state();
|
| - RequestScreenUnlock();
|
| - return;
|
| - case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS:
|
| - // Password change detected.
|
| - msg_id = IDS_LOGIN_ERROR_PASSWORD_CHANGED;
|
| - break;
|
| - case GoogleServiceAuthError::USER_NOT_SIGNED_UP:
|
| - case GoogleServiceAuthError::ACCOUNT_DELETED:
|
| - case GoogleServiceAuthError::ACCOUNT_DISABLED:
|
| - // Access not granted. User has to sign out.
|
| - // Show error message using existing screen lock.
|
| - msg_id = IDS_LOGIN_ERROR_RESTRICTED;
|
| - help_topic = HelpAppLauncher::HELP_ACCOUNT_DISABLED;
|
| - sign_out_only = true;
|
| - break;
|
| - case GoogleServiceAuthError::CAPTCHA_REQUIRED:
|
| - default:
|
| - // Unless there's new GoogleServiceAuthError state has been added.
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -
|
| - ScreenLocker::default_screen_locker()->ShowErrorMessage(msg_id,
|
| - help_topic,
|
| - sign_out_only);
|
| -}
|
| -
|
| -void LoginPerformer::ResolveScreenLocked() {
|
| - DVLOG(1) << "Screen locked";
|
| - ResolveLockNetworkAuthFailure();
|
| -}
|
| -
|
| -void LoginPerformer::ResolveScreenUnlocked() {
|
| - DVLOG(1) << "Screen unlocked";
|
| - registrar_.RemoveAll();
|
| - // If screen was unlocked that was for a reason, should delete itself now.
|
| - base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| -}
|
| -
|
| void LoginPerformer::StartLoginCompletion() {
|
| DVLOG(1) << "Login completion started";
|
| BootTimesLoader::Get()->AddLoginTimeMarker("AuthStarted", false);
|
| @@ -502,24 +290,12 @@ void LoginPerformer::StartAuthentication() {
|
| BrowserThread::UI, FROM_HERE,
|
| base::Bind(&Authenticator::AuthenticateToLogin, authenticator_.get(),
|
| profile,
|
| - user_context_,
|
| - std::string(),
|
| - std::string()));
|
| + user_context_));
|
| // Make unobtrusive online check. It helps to determine password change
|
| // state in the case when offline login fails.
|
| online_attempt_host_.Check(profile, user_context_);
|
| } else {
|
| - DCHECK(authenticator_.get())
|
| - << "Authenticator instance doesn't exist for login attempt retry.";
|
| - // At this point offline auth has been successful,
|
| - // retry online auth, using existing Authenticator instance.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&Authenticator::RetryAuth, authenticator_.get(),
|
| - profile,
|
| - user_context_,
|
| - std::string(),
|
| - std::string()));
|
| + NOTREACHED();
|
| }
|
| user_context_.password.clear();
|
| user_context_.auth_code.clear();
|
|
|