Reland "Non-SFI mode: Switch to newlib. (patchset #4 id:60001 of https://codereview...
[chromium-blink-merge.git] / components / signin / core / browser / signin_manager.h
bloba24a0e9485af8437a8b03f5a10672d01d91cadda
1 // Copyright 2014 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 // The signin manager encapsulates some functionality tracking
6 // which user is signed in. See SigninManagerBase for full description of
7 // responsibilities. The class defined in this file provides functionality
8 // required by all platforms except Chrome OS.
9 //
10 // When a user is signed in, a ClientLogin request is run on their behalf.
11 // Auth tokens are fetched from Google and the results are stored in the
12 // TokenService.
13 // TODO(tim): Bug 92948, 226464. ClientLogin is all but gone from use.
15 #ifndef COMPONENTS_SIGNIN_CORE_BROWSER_SIGNIN_MANAGER_H_
16 #define COMPONENTS_SIGNIN_CORE_BROWSER_SIGNIN_MANAGER_H_
18 #if defined(OS_CHROMEOS)
19 // On Chrome OS, SigninManagerBase is all that exists.
20 #include "components/signin/core/browser/signin_manager_base.h"
22 #else
24 #include <set>
25 #include <string>
27 #include "base/compiler_specific.h"
28 #include "base/gtest_prod_util.h"
29 #include "base/logging.h"
30 #include "base/memory/scoped_ptr.h"
31 #include "base/observer_list.h"
32 #include "base/prefs/pref_change_registrar.h"
33 #include "base/prefs/pref_member.h"
34 #include "components/keyed_service/core/keyed_service.h"
35 #include "components/signin/core/browser/account_tracker_service.h"
36 #include "components/signin/core/browser/signin_internals_util.h"
37 #include "components/signin/core/browser/signin_manager_base.h"
38 #include "components/signin/core/browser/signin_metrics.h"
39 #include "net/cookies/canonical_cookie.h"
41 class GaiaCookieManagerService;
42 class GoogleServiceAuthError;
43 class PrefService;
44 class ProfileOAuth2TokenService;
45 class SigninClient;
47 class SigninManager : public SigninManagerBase,
48 public AccountTrackerService::Observer {
49 public:
50 // The callback invoked once the OAuth token has been fetched during signin,
51 // but before the profile transitions to the "signed-in" state. This allows
52 // callers to load policy and prompt the user appropriately before completing
53 // signin. The callback is passed the just-fetched OAuth login refresh token.
54 typedef base::Callback<void(const std::string&)> OAuthTokenFetchedCallback;
56 // This is used to distinguish URLs belonging to the special web signin flow
57 // running in the special signin process from other URLs on the same domain.
58 // We do not grant WebUI privilieges / bindings to this process or to URLs of
59 // this scheme; enforcement of privileges is handled separately by
60 // OneClickSigninHelper.
61 static const char kChromeSigninEffectiveSite[];
63 SigninManager(SigninClient* client,
64 ProfileOAuth2TokenService* token_service,
65 AccountTrackerService* account_tracker_service,
66 GaiaCookieManagerService* cookie_manager_service);
67 ~SigninManager() override;
69 // Returns true if the username is allowed based on the policy string.
70 static bool IsUsernameAllowedByPolicy(const std::string& username,
71 const std::string& policy);
73 // Attempt to sign in this user with a refresh token.
74 // If non-null, the passed |oauth_fetched_callback| callback is invoked once
75 // signin has been completed.
76 // The callback should invoke SignOut() or CompletePendingSignin() to either
77 // continue or cancel the in-process signin.
78 virtual void StartSignInWithRefreshToken(
79 const std::string& refresh_token,
80 const std::string& gaia_id,
81 const std::string& username,
82 const std::string& password,
83 const OAuthTokenFetchedCallback& oauth_fetched_callback);
85 // Copies auth credentials from one SigninManager to this one. This is used
86 // when creating a new profile during the signin process to transfer the
87 // in-progress credentials to the new profile.
88 virtual void CopyCredentialsFrom(const SigninManager& source);
90 // Sign a user out, removing the preference, erasing all keys
91 // associated with the user, and canceling all auth in progress.
92 virtual void SignOut(signin_metrics::ProfileSignout signout_source_metric);
94 // On platforms where SigninManager is responsible for dealing with
95 // invalid username policy updates, we need to check this during
96 // initialization and sign the user out.
97 void Initialize(PrefService* local_state) override;
98 void Shutdown() override;
100 // If applicable, merge the signed in account into the cookie jar.
101 void MergeSigninCredentialIntoCookieJar();
103 // Invoked from an OAuthTokenFetchedCallback to complete user signin.
104 virtual void CompletePendingSignin();
106 // Invoked from SigninManagerAndroid to indicate that the sign-in process
107 // has completed for the email |username|. SigninManager assumes that
108 // |username| can be used to look up the corresponding account_id and gaia_id
109 // for this email.
110 void OnExternalSigninCompleted(const std::string& username);
112 // Returns true if there's a signin in progress.
113 bool AuthInProgress() const override;
115 bool IsSigninAllowed() const override;
117 // Returns true if the passed username is allowed by policy. Virtual for
118 // mocking in tests.
119 virtual bool IsAllowedUsername(const std::string& username) const;
121 // If an authentication is in progress, return the account id being
122 // authenticated. Returns an empty string if no auth is in progress.
123 const std::string& GetAccountIdForAuthInProgress() const;
125 // If an authentication is in progress, return the username being
126 // authenticated. Returns an empty string if no auth is in progress.
127 const std::string& GetUsernameForAuthInProgress() const;
129 // Set the preference to turn off one-click sign-in so that it won't ever
130 // show it again for the user associated with |prefs| (even if the user tries
131 // a new account).
132 static void DisableOneClickSignIn(PrefService* prefs);
134 // Tells the SigninManager whether to prohibit signout for this profile.
135 // If |prohibit_signout| is true, then signout will be prohibited.
136 void ProhibitSignout(bool prohibit_signout);
138 // If true, signout is prohibited for this profile (calls to SignOut() are
139 // ignored).
140 bool IsSignoutProhibited() const;
142 protected:
143 // Flag saying whether signing out is allowed.
144 bool prohibit_signout_;
146 private:
147 enum SigninType { SIGNIN_TYPE_NONE, SIGNIN_TYPE_WITH_REFRESH_TOKEN };
149 std::string SigninTypeToString(SigninType type);
150 friend class FakeSigninManager;
151 FRIEND_TEST_ALL_PREFIXES(SigninManagerTest, ClearTransientSigninData);
152 FRIEND_TEST_ALL_PREFIXES(SigninManagerTest, ProvideSecondFactorSuccess);
153 FRIEND_TEST_ALL_PREFIXES(SigninManagerTest, ProvideSecondFactorFailure);
155 // If user was signed in, load tokens from DB if available.
156 void InitTokenService();
158 // Called to setup the transient signin data during one of the
159 // StartSigninXXX methods. |type| indicates which of the methods is being
160 // used to perform the signin while |username| and |password| identify the
161 // account to be signed in. Returns false and generates an auth error if the
162 // passed |username| is not allowed by policy. |gaia_id| is the obfuscated
163 // gaia id corresponding to |username|.
164 bool PrepareForSignin(SigninType type,
165 const std::string& gaia_id,
166 const std::string& username,
167 const std::string& password);
169 // Persists |account_id| as the currently signed-in account, and triggers
170 // a sign-in success notification.
171 void OnSignedIn();
173 // Waits for the AccountTrackerService, then sends GoogleSigninSucceeded to
174 // the client and clears the local password.
175 void PostSignedIn();
177 // AccountTrackerService::Observer implementation.
178 void OnAccountUpdated(const AccountTrackerService::AccountInfo& info)
179 override;
180 void OnAccountUpdateFailed(const std::string& account_id) override;
182 // Called when a new request to re-authenticate a user is in progress.
183 // Will clear in memory data but leaves the db as such so when the browser
184 // restarts we can use the old token(which might throw a password error).
185 void ClearTransientSigninData();
187 // Called to handle an error from a GAIA auth fetch. Sets the last error
188 // to |error|, sends out a notification of login failure and clears the
189 // transient signin data.
190 void HandleAuthError(const GoogleServiceAuthError& error);
192 void OnSigninAllowedPrefChanged();
193 void OnGoogleServicesUsernamePatternChanged();
195 std::string possibly_invalid_account_id_;
196 std::string possibly_invalid_gaia_id_;
197 std::string possibly_invalid_email_;
198 std::string password_; // This is kept empty whenever possible.
200 // The type of sign being performed. This value is valid only between a call
201 // to one of the StartSigninXXX methods and when the sign in is either
202 // successful or not.
203 SigninType type_;
205 // Temporarily saves the oauth2 refresh token. It will be passed to the
206 // token service so that it does not need to mint new ones.
207 std::string temp_refresh_token_;
209 // The SigninClient object associated with this object. Must outlive this
210 // object.
211 SigninClient* client_;
213 // The ProfileOAuth2TokenService instance associated with this object. Must
214 // outlive this object.
215 ProfileOAuth2TokenService* token_service_;
217 // Object used to use the token to push a GAIA cookie into the cookie jar.
218 GaiaCookieManagerService* cookie_manager_service_;
220 // Helper object to listen for changes to signin preferences stored in non-
221 // profile-specific local prefs (like kGoogleServicesUsernamePattern).
222 PrefChangeRegistrar local_state_pref_registrar_;
224 // Helper object to listen for changes to the signin allowed preference.
225 BooleanPrefMember signin_allowed_;
227 // Two gate conditions for when PostSignedIn should be called. Verify
228 // that the SigninManager has reached OnSignedIn() and the AccountTracker
229 // has completed calling GetUserInfo.
230 bool signin_manager_signed_in_;
231 bool user_info_fetched_by_account_tracker_;
233 base::WeakPtrFactory<SigninManager> weak_pointer_factory_;
235 DISALLOW_COPY_AND_ASSIGN(SigninManager);
238 #endif // !defined(OS_CHROMEOS)
240 #endif // COMPONENTS_SIGNIN_CORE_BROWSER_SIGNIN_MANAGER_H_