login_performer.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/login/login_performer.h" 6 7#include "base/logging.h" 8#include "base/message_loop.h" 9#include "chrome/browser/browser_process.h" 10#include "chrome/browser/browser_thread.h" 11#include "chrome/browser/chromeos/boot_times_loader.h" 12#include "chrome/browser/chromeos/cros_settings_provider_user.h" 13#include "chrome/browser/chromeos/login/login_utils.h" 14#include "chrome/browser/profile.h" 15#include "chrome/browser/profile_manager.h" 16 17namespace chromeos { 18 19namespace { 20} // namespace 21 22LoginPerformer::LoginPerformer(Delegate* delegate) 23 : last_login_failure_(LoginFailure::None()), 24 delegate_(delegate) {} 25 26//////////////////////////////////////////////////////////////////////////////// 27// LoginPerformer, LoginStatusConsumer implementation: 28 29void LoginPerformer::OnLoginFailure(const LoginFailure& failure) { 30 last_login_failure_ = failure; 31 if (delegate_) { 32 captcha_.clear(); 33 captcha_token_.clear(); 34 if (failure.reason() == LoginFailure::NETWORK_AUTH_FAILED && 35 failure.error().state() == GoogleServiceAuthError::CAPTCHA_REQUIRED) { 36 captcha_token_ = failure.error().captcha().token; 37 } 38 delegate_->OnLoginFailure(failure); 39 } else { 40 // TODO(nkostylev): Provide blocking UI using ScreenLocker. 41 } 42} 43 44void LoginPerformer::OnLoginSuccess( 45 const std::string& username, 46 const GaiaAuthConsumer::ClientLoginResult& credentials, 47 bool pending_requests) { 48 if (delegate_) { 49 delegate_->OnLoginSuccess(username, credentials, pending_requests); 50 if (!pending_requests) 51 MessageLoop::current()->DeleteSoon(FROM_HERE, this); 52 } else { 53 DCHECK(!pending_requests); 54 // Online login has succeeded. Delete our instance. 55 MessageLoop::current()->DeleteSoon(FROM_HERE, this); 56 } 57} 58 59void LoginPerformer::OnOffTheRecordLoginSuccess() { 60 if (delegate_) 61 delegate_->OnOffTheRecordLoginSuccess(); 62 else 63 NOTREACHED(); 64} 65 66void LoginPerformer::OnPasswordChangeDetected( 67 const GaiaAuthConsumer::ClientLoginResult& credentials) { 68 cached_credentials_ = credentials; 69 if (delegate_) { 70 delegate_->OnPasswordChangeDetected(credentials); 71 } else { 72 // TODO(nkostylev): Provide blocking UI using ScreenLocker. 73 } 74} 75 76//////////////////////////////////////////////////////////////////////////////// 77// LoginPerformer, SignedSettingsHelper::Callback implementation: 78 79void LoginPerformer::OnCheckWhiteListCompleted(bool success, 80 const std::string& email) { 81 if (success) { 82 // Whitelist check passed, continue with authentication. 83 StartAuthentication(); 84 } else { 85 if (delegate_) 86 delegate_->WhiteListCheckFailed(email); 87 else 88 NOTREACHED(); 89 } 90} 91 92//////////////////////////////////////////////////////////////////////////////// 93// LoginPerformer, public: 94 95void LoginPerformer::Login(const std::string& username, 96 const std::string& password) { 97 username_ = username; 98 password_ = password; 99 if (UserCrosSettingsProvider::cached_allow_new_user()) { 100 // Starts authentication if guest login is allowed. 101 StartAuthentication(); 102 } else { 103 // Otherwise, do whitelist check first. 104 SignedSettingsHelper::Get()->StartCheckWhitelistOp( 105 username, this); 106 } 107} 108 109void LoginPerformer::LoginOffTheRecord() { 110 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); 111 BrowserThread::PostTask( 112 BrowserThread::UI, FROM_HERE, 113 NewRunnableMethod(authenticator_.get(), 114 &Authenticator::LoginOffTheRecord)); 115} 116 117void LoginPerformer::RecoverEncryptedData(const std::string& old_password) { 118 BrowserThread::PostTask( 119 BrowserThread::UI, FROM_HERE, 120 NewRunnableMethod(authenticator_.get(), 121 &Authenticator::RecoverEncryptedData, 122 old_password, 123 cached_credentials_)); 124 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); 125} 126 127void LoginPerformer::ResyncEncryptedData() { 128 BrowserThread::PostTask( 129 BrowserThread::UI, FROM_HERE, 130 NewRunnableMethod(authenticator_.get(), 131 &Authenticator::ResyncEncryptedData, 132 cached_credentials_)); 133 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); 134} 135 136//////////////////////////////////////////////////////////////////////////////// 137// LoginPerformer, private: 138 139void LoginPerformer::StartAuthentication() { 140 BootTimesLoader::Get()->AddLoginTimeMarker("AuthStarted", false); 141 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); 142 Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile(); 143 BrowserThread::PostTask( 144 BrowserThread::UI, FROM_HERE, 145 NewRunnableMethod(authenticator_.get(), 146 &Authenticator::AuthenticateToLogin, 147 profile, 148 username_, 149 password_, 150 captcha_token_, 151 captcha_)); 152 password_.clear(); 153} 154 155} // namespace chromeos 156