1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The signin manager encapsulates some functionality tracking
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// which user is signed in. When a user is signed in, a ClientLogin
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// request is run on their behalf. Auth tokens are fetched from Google
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// and the results are stored in the TokenService.
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#ifndef CHROME_BROWSER_SYNC_SIGNIN_MANAGER_H_
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define CHROME_BROWSER_SYNC_SIGNIN_MANAGER_H_
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#pragma once
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/net/gaia/gaia_auth_consumer.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/net/gaia/google_service_auth_error.h"
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass GaiaAuthFetcher;
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass Profile;
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass PrefService;
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Details for the Notification type GOOGLE_SIGNIN_SUCCESSFUL.
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// A listener might use this to make note of a username / password
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// pair for encryption keys.
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstruct GoogleServiceSigninSuccessDetails {
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GoogleServiceSigninSuccessDetails(const std::string& in_username,
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    const std::string& in_password)
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      : username(in_username),
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        password(in_password) {}
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string username;
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string password;
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SigninManager : public GaiaAuthConsumer {
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SigninManager();
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ~SigninManager();
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Call to register our prefs.
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  static void RegisterUserPrefs(PrefService* user_prefs);
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If user was signed in, load tokens from DB if available.
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Initialize(Profile* profile);
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If a user is signed in, this will return their name.
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Otherwise, it will return an empty string.
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string& GetUsername();
50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sets the user name.  Used for migrating credentials from previous system.
52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void SetUsername(const std::string& username);
53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Attempt to sign in this user. If successful, set a preference indicating
55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // the signed in user and send out a notification, then start fetching tokens
56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // for the user.
57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void StartSignIn(const std::string& username,
58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   const std::string& password,
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   const std::string& login_token,
60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   const std::string& login_captcha);
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Used when a second factor access code was required to complete a signin
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // attempt.
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void ProvideSecondFactorAccessCode(const std::string& access_code);
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sign a user out, removing the preference, erasing all keys
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // associated with the user, and canceling all auth in progress.
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void SignOut();
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // GaiaAuthConsumer
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnClientLoginSuccess(const ClientLoginResult& result);
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnClientLoginFailure(const GoogleServiceAuthError& error);
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnGetUserInfoSuccess(const std::string& key,
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                    const std::string& value);
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnGetUserInfoKeyNotFound(const std::string& key);
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnGetUserInfoFailure(const GoogleServiceAuthError& error);
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Profile* profile_;
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string username_;
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string password_;  // This is kept empty whenever possible.
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool had_two_factor_error_;
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Result of the last client login, kept pending the lookup of the
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // canonical email.
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ClientLoginResult last_result_;
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Actual client login handler.
894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<GaiaAuthFetcher> client_login_;
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif  // CHROME_BROWSER_SYNC_SIGNIN_MANAGER_H_
93