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