Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(144)

Side by Side Diff: components/signin/core/browser/signin_manager.cc

Issue 964563002: Replace SetAuthenticatedUsername with SetAuthenticatedAccountId. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@priv
Patch Set: rebased Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/signin/core/browser/signin_manager.h" 5 #include "components/signin/core/browser/signin_manager.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/prefs/pref_service.h" 11 #include "base/prefs/pref_service.h"
12 #include "base/strings/string_split.h" 12 #include "base/strings/string_split.h"
13 #include "base/strings/string_util.h" 13 #include "base/strings/string_util.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
15 #include "base/time/time.h" 15 #include "base/time/time.h"
16 #include "components/signin/core/browser/account_tracker_service.h"
16 #include "components/signin/core/browser/gaia_cookie_manager_service.h" 17 #include "components/signin/core/browser/gaia_cookie_manager_service.h"
17 #include "components/signin/core/browser/profile_oauth2_token_service.h" 18 #include "components/signin/core/browser/profile_oauth2_token_service.h"
18 #include "components/signin/core/browser/signin_account_id_helper.h"
19 #include "components/signin/core/browser/signin_client.h" 19 #include "components/signin/core/browser/signin_client.h"
20 #include "components/signin/core/browser/signin_internals_util.h" 20 #include "components/signin/core/browser/signin_internals_util.h"
21 #include "components/signin/core/browser/signin_manager_cookie_helper.h" 21 #include "components/signin/core/browser/signin_manager_cookie_helper.h"
22 #include "components/signin/core/browser/signin_metrics.h" 22 #include "components/signin/core/browser/signin_metrics.h"
23 #include "components/signin/core/common/signin_pref_names.h" 23 #include "components/signin/core/common/signin_pref_names.h"
24 #include "google_apis/gaia/gaia_auth_util.h" 24 #include "google_apis/gaia/gaia_auth_util.h"
25 #include "google_apis/gaia/gaia_constants.h" 25 #include "google_apis/gaia/gaia_constants.h"
26 #include "google_apis/gaia/gaia_urls.h" 26 #include "google_apis/gaia/gaia_urls.h"
27 #include "google_apis/gaia/google_service_auth_error.h" 27 #include "google_apis/gaia/google_service_auth_error.h"
28 #include "third_party/icu/source/i18n/unicode/regex.h" 28 #include "third_party/icu/source/i18n/unicode/regex.h"
29 29
30 using namespace signin_internals_util; 30 using namespace signin_internals_util;
31 31
32 SigninManager::SigninManager(SigninClient* client, 32 SigninManager::SigninManager(SigninClient* client,
33 ProfileOAuth2TokenService* token_service, 33 ProfileOAuth2TokenService* token_service,
34 AccountTrackerService* account_tracker_service, 34 AccountTrackerService* account_tracker_service,
35 GaiaCookieManagerService* cookie_manager_service) 35 GaiaCookieManagerService* cookie_manager_service)
36 : SigninManagerBase(client), 36 : SigninManagerBase(client, account_tracker_service),
37 prohibit_signout_(false), 37 prohibit_signout_(false),
38 type_(SIGNIN_TYPE_NONE), 38 type_(SIGNIN_TYPE_NONE),
39 client_(client), 39 client_(client),
40 token_service_(token_service), 40 token_service_(token_service),
41 account_tracker_service_(account_tracker_service),
42 cookie_manager_service_(cookie_manager_service), 41 cookie_manager_service_(cookie_manager_service),
43 signin_manager_signed_in_(false), 42 signin_manager_signed_in_(false),
44 user_info_fetched_by_account_tracker_(false), 43 user_info_fetched_by_account_tracker_(false),
45 weak_pointer_factory_(this) {} 44 weak_pointer_factory_(this) {}
46 45
47 SigninManager::~SigninManager() {} 46 SigninManager::~SigninManager() {}
48 47
49 void SigninManager::InitTokenService() { 48 void SigninManager::InitTokenService() {
50 if (token_service_ && IsAuthenticated()) 49 if (token_service_ && IsAuthenticated())
51 token_service_->LoadCredentials(GetAuthenticatedAccountId()); 50 token_service_->LoadCredentials(GetAuthenticatedAccountId());
52 } 51 }
53 52
54 std::string SigninManager::SigninTypeToString(SigninManager::SigninType type) { 53 std::string SigninManager::SigninTypeToString(SigninManager::SigninType type) {
55 switch (type) { 54 switch (type) {
56 case SIGNIN_TYPE_NONE: 55 case SIGNIN_TYPE_NONE:
57 return "No Signin"; 56 return "No Signin";
58 case SIGNIN_TYPE_WITH_REFRESH_TOKEN: 57 case SIGNIN_TYPE_WITH_REFRESH_TOKEN:
59 return "With refresh token"; 58 return "With refresh token";
60 } 59 }
61 60
62 NOTREACHED(); 61 NOTREACHED();
63 return std::string(); 62 return std::string();
64 } 63 }
65 64
66 bool SigninManager::PrepareForSignin(SigninType type, 65 bool SigninManager::PrepareForSignin(SigninType type,
66 const std::string& gaia_id,
67 const std::string& username, 67 const std::string& username,
68 const std::string& password) { 68 const std::string& password) {
69 DCHECK(possibly_invalid_username_.empty() || 69 std::string account_id =
70 possibly_invalid_username_ == username); 70 account_tracker_service()->PickAccountIdForAccount(gaia_id, username);
71 DCHECK(!username.empty()); 71 DCHECK(possibly_invalid_account_id_.empty() ||
72 possibly_invalid_account_id_ == account_id);
73 DCHECK(!account_id.empty());
72 74
73 if (!IsAllowedUsername(username)) { 75 if (!IsAllowedUsername(username)) {
74 // Account is not allowed by admin policy. 76 // Account is not allowed by admin policy.
75 HandleAuthError( 77 HandleAuthError(
76 GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED)); 78 GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED));
77 return false; 79 return false;
78 } 80 }
79 81
80 // This attempt is either 1) the user trying to establish initial sync, or 82 // This attempt is either 1) the user trying to establish initial sync, or
81 // 2) trying to refresh credentials for an existing username. If it is 2, we 83 // 2) trying to refresh credentials for an existing username. If it is 2, we
82 // need to try again, but take care to leave state around tracking that the 84 // need to try again, but take care to leave state around tracking that the
83 // user has successfully signed in once before with this username, so that on 85 // user has successfully signed in once before with this username, so that on
84 // restart we don't think sync setup has never completed. 86 // restart we don't think sync setup has never completed.
85 ClearTransientSigninData(); 87 ClearTransientSigninData();
86 type_ = type; 88 type_ = type;
87 possibly_invalid_username_.assign(username); 89 possibly_invalid_account_id_.assign(account_id);
90 possibly_invalid_gaia_id_.assign(gaia_id);
91 possibly_invalid_email_.assign(username);
88 password_.assign(password); 92 password_.assign(password);
89 signin_manager_signed_in_ = false; 93 signin_manager_signed_in_ = false;
90 user_info_fetched_by_account_tracker_ = false; 94 user_info_fetched_by_account_tracker_ = false;
91 NotifyDiagnosticsObservers(SIGNIN_STARTED, SigninTypeToString(type)); 95 NotifyDiagnosticsObservers(SIGNIN_STARTED, SigninTypeToString(type));
92 return true; 96 return true;
93 } 97 }
94 98
95 void SigninManager::StartSignInWithRefreshToken( 99 void SigninManager::StartSignInWithRefreshToken(
96 const std::string& refresh_token, 100 const std::string& refresh_token,
101 const std::string& gaia_id,
97 const std::string& username, 102 const std::string& username,
98 const std::string& password, 103 const std::string& password,
99 const OAuthTokenFetchedCallback& callback) { 104 const OAuthTokenFetchedCallback& callback) {
100 DCHECK(!IsAuthenticated() || 105 DCHECK(!IsAuthenticated());
101 gaia::AreEmailsSame(username, GetAuthenticatedUsername()));
102 106
103 if (!PrepareForSignin(SIGNIN_TYPE_WITH_REFRESH_TOKEN, username, password)) 107 if (!PrepareForSignin(SIGNIN_TYPE_WITH_REFRESH_TOKEN, gaia_id, username,
108 password)) {
104 return; 109 return;
110 }
105 111
106 // Store our callback and token. 112 // Store our token.
107 temp_refresh_token_ = refresh_token; 113 temp_refresh_token_ = refresh_token;
108 possibly_invalid_username_ = username;
109 114
110 if (!callback.is_null() && !temp_refresh_token_.empty()) { 115 if (!callback.is_null() && !temp_refresh_token_.empty()) {
111 callback.Run(temp_refresh_token_); 116 callback.Run(temp_refresh_token_);
112 } else { 117 } else {
113 // No oauth token or callback, so just complete our pending signin. 118 // No oauth token or callback, so just complete our pending signin.
114 CompletePendingSignin(); 119 CompletePendingSignin();
115 } 120 }
116 } 121 }
117 122
118 void SigninManager::CopyCredentialsFrom(const SigninManager& source) { 123 void SigninManager::CopyCredentialsFrom(const SigninManager& source) {
119 DCHECK_NE(this, &source); 124 DCHECK_NE(this, &source);
120 possibly_invalid_username_ = source.possibly_invalid_username_; 125 possibly_invalid_account_id_ = source.possibly_invalid_account_id_;
126 possibly_invalid_gaia_id_ = source.possibly_invalid_gaia_id_;
127 possibly_invalid_email_ = source.possibly_invalid_email_;
121 temp_refresh_token_ = source.temp_refresh_token_; 128 temp_refresh_token_ = source.temp_refresh_token_;
122 password_ = source.password_; 129 password_ = source.password_;
123 } 130 }
124 131
125 void SigninManager::ClearTransientSigninData() { 132 void SigninManager::ClearTransientSigninData() {
126 DCHECK(IsInitialized()); 133 DCHECK(IsInitialized());
127 134
128 possibly_invalid_username_.clear(); 135 possibly_invalid_account_id_.clear();
136 possibly_invalid_gaia_id_.clear();
137 possibly_invalid_email_.clear();
129 password_.clear(); 138 password_.clear();
130 type_ = SIGNIN_TYPE_NONE; 139 type_ = SIGNIN_TYPE_NONE;
131 temp_refresh_token_.clear(); 140 temp_refresh_token_.clear();
132 } 141 }
133 142
134 void SigninManager::HandleAuthError(const GoogleServiceAuthError& error) { 143 void SigninManager::HandleAuthError(const GoogleServiceAuthError& error) {
135 ClearTransientSigninData(); 144 ClearTransientSigninData();
136 145
137 FOR_EACH_OBSERVER(SigninManagerBase::Observer, 146 FOR_EACH_OBSERVER(SigninManagerBase::Observer,
138 observer_list_, 147 observer_list_,
(...skipping 26 matching lines...) Expand all
165 return; 174 return;
166 } 175 }
167 176
168 ClearTransientSigninData(); 177 ClearTransientSigninData();
169 178
170 const std::string account_id = GetAuthenticatedAccountId(); 179 const std::string account_id = GetAuthenticatedAccountId();
171 const std::string username = GetAuthenticatedUsername(); 180 const std::string username = GetAuthenticatedUsername();
172 const base::Time signin_time = 181 const base::Time signin_time =
173 base::Time::FromInternalValue( 182 base::Time::FromInternalValue(
174 client_->GetPrefs()->GetInt64(prefs::kSignedInTime)); 183 client_->GetPrefs()->GetInt64(prefs::kSignedInTime));
175 ClearAuthenticatedUsername(); 184 clear_authenticated_user();
176 client_->GetPrefs()->ClearPref(prefs::kGoogleServicesHostedDomain); 185 client_->GetPrefs()->ClearPref(prefs::kGoogleServicesHostedDomain);
177 client_->GetPrefs()->ClearPref(prefs::kGoogleServicesUsername); 186 client_->GetPrefs()->ClearPref(prefs::kGoogleServicesAccountId);
187 client_->GetPrefs()->ClearPref(prefs::kGoogleServicesUserAccountId);
178 client_->GetPrefs()->ClearPref(prefs::kSignedInTime); 188 client_->GetPrefs()->ClearPref(prefs::kSignedInTime);
179 client_->OnSignedOut(); 189 client_->OnSignedOut();
180 190
181 // Determine the duration the user was logged in and log that to UMA. 191 // Determine the duration the user was logged in and log that to UMA.
182 if (!signin_time.is_null()) { 192 if (!signin_time.is_null()) {
183 base::TimeDelta signed_in_duration = base::Time::Now() - signin_time; 193 base::TimeDelta signed_in_duration = base::Time::Now() - signin_time;
184 UMA_HISTOGRAM_COUNTS("Signin.SignedInDurationBeforeSignout", 194 UMA_HISTOGRAM_COUNTS("Signin.SignedInDurationBeforeSignout",
185 signed_in_duration.InMinutes()); 195 signed_in_duration.InMinutes());
186 } 196 }
187 197
(...skipping 18 matching lines...) Expand all
206 local_state_pref_registrar_.Add( 216 local_state_pref_registrar_.Add(
207 prefs::kGoogleServicesUsernamePattern, 217 prefs::kGoogleServicesUsernamePattern,
208 base::Bind(&SigninManager::OnGoogleServicesUsernamePatternChanged, 218 base::Bind(&SigninManager::OnGoogleServicesUsernamePatternChanged,
209 weak_pointer_factory_.GetWeakPtr())); 219 weak_pointer_factory_.GetWeakPtr()));
210 } 220 }
211 signin_allowed_.Init(prefs::kSigninAllowed, 221 signin_allowed_.Init(prefs::kSigninAllowed,
212 client_->GetPrefs(), 222 client_->GetPrefs(),
213 base::Bind(&SigninManager::OnSigninAllowedPrefChanged, 223 base::Bind(&SigninManager::OnSigninAllowedPrefChanged,
214 base::Unretained(this))); 224 base::Unretained(this)));
215 225
216 std::string user = 226 std::string account_id =
217 client_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); 227 client_->GetPrefs()->GetString(prefs::kGoogleServicesAccountId);
218 if ((!user.empty() && !IsAllowedUsername(user)) || !IsSigninAllowed()) { 228 std::string user = account_id.empty() ? std::string() :
229 account_tracker_service()->GetAccountInfo(account_id).email;
230 if ((!account_id.empty() && !IsAllowedUsername(user)) || !IsSigninAllowed()) {
219 // User is signed in, but the username is invalid - the administrator must 231 // User is signed in, but the username is invalid - the administrator must
220 // have changed the policy since the last signin, so sign out the user. 232 // have changed the policy since the last signin, so sign out the user.
221 SignOut(signin_metrics::SIGNIN_PREF_CHANGED_DURING_SIGNIN); 233 SignOut(signin_metrics::SIGNIN_PREF_CHANGED_DURING_SIGNIN);
222 } 234 }
223 235
224 InitTokenService(); 236 InitTokenService();
225 account_id_helper_.reset( 237 account_tracker_service()->AddObserver(this);
226 new SigninAccountIdHelper(client_, token_service_, this));
227
228 account_tracker_service_->AddObserver(this);
229 } 238 }
230 239
231 void SigninManager::Shutdown() { 240 void SigninManager::Shutdown() {
232 account_tracker_service_->RemoveObserver(this); 241 account_tracker_service()->RemoveObserver(this);
242
Mike Lerman 2015/04/08 14:45:27 nit: Remove empty line.
Roger Tawa OOO till Jul 10th 2015/04/08 20:24:21 Done.
233 local_state_pref_registrar_.RemoveAll(); 243 local_state_pref_registrar_.RemoveAll();
234 account_id_helper_.reset();
235 SigninManagerBase::Shutdown(); 244 SigninManagerBase::Shutdown();
236 } 245 }
237 246
238 void SigninManager::OnGoogleServicesUsernamePatternChanged() { 247 void SigninManager::OnGoogleServicesUsernamePatternChanged() {
239 if (IsAuthenticated() && 248 if (IsAuthenticated() && !IsAllowedUsername(GetAuthenticatedUsername())) {
240 !IsAllowedUsername(GetAuthenticatedUsername())) {
241 // Signed in user is invalid according to the current policy so sign 249 // Signed in user is invalid according to the current policy so sign
242 // the user out. 250 // the user out.
243 SignOut(signin_metrics::GOOGLE_SERVICE_NAME_PATTERN_CHANGED); 251 SignOut(signin_metrics::GOOGLE_SERVICE_NAME_PATTERN_CHANGED);
244 } 252 }
245 } 253 }
246 254
247 bool SigninManager::IsSigninAllowed() const { 255 bool SigninManager::IsSigninAllowed() const {
248 return signin_allowed_.GetValue(); 256 return signin_allowed_.GetValue();
249 } 257 }
250 258
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 const PrefService* local_state = local_state_pref_registrar_.prefs(); 298 const PrefService* local_state = local_state_pref_registrar_.prefs();
291 if (!local_state) 299 if (!local_state)
292 return true; // In a unit test with no local state - all names are allowed. 300 return true; // In a unit test with no local state - all names are allowed.
293 301
294 std::string pattern = 302 std::string pattern =
295 local_state->GetString(prefs::kGoogleServicesUsernamePattern); 303 local_state->GetString(prefs::kGoogleServicesUsernamePattern);
296 return IsUsernameAllowedByPolicy(username, pattern); 304 return IsUsernameAllowedByPolicy(username, pattern);
297 } 305 }
298 306
299 bool SigninManager::AuthInProgress() const { 307 bool SigninManager::AuthInProgress() const {
300 return !possibly_invalid_username_.empty(); 308 return !possibly_invalid_account_id_.empty();
309 }
310
311 const std::string& SigninManager::GetAccountIdForAuthInProgress() const {
312 return possibly_invalid_account_id_;
301 } 313 }
302 314
303 const std::string& SigninManager::GetUsernameForAuthInProgress() const { 315 const std::string& SigninManager::GetUsernameForAuthInProgress() const {
304 return possibly_invalid_username_; 316 return possibly_invalid_email_;
305 } 317 }
306 318
307 void SigninManager::DisableOneClickSignIn(PrefService* prefs) { 319 void SigninManager::DisableOneClickSignIn(PrefService* prefs) {
308 prefs->SetBoolean(prefs::kReverseAutologinEnabled, false); 320 prefs->SetBoolean(prefs::kReverseAutologinEnabled, false);
309 } 321 }
310 322
311 void SigninManager::MergeSigninCredentialIntoCookieJar() { 323 void SigninManager::MergeSigninCredentialIntoCookieJar() {
312 if (!client_->ShouldMergeSigninCredentialsIntoCookieJar()) 324 if (!client_->ShouldMergeSigninCredentialsIntoCookieJar())
313 return; 325 return;
314 326
315 if (!IsAuthenticated()) 327 if (!IsAuthenticated())
316 return; 328 return;
317 329
318 cookie_manager_service_->AddAccountToCookie(GetAuthenticatedAccountId()); 330 cookie_manager_service_->AddAccountToCookie(GetAuthenticatedAccountId());
319 } 331 }
320 332
321 void SigninManager::CompletePendingSignin() { 333 void SigninManager::CompletePendingSignin() {
322 NotifyDiagnosticsObservers(SIGNIN_COMPLETED, "Successful"); 334 NotifyDiagnosticsObservers(SIGNIN_COMPLETED, "Successful");
323 335 DCHECK(!possibly_invalid_account_id_.empty());
324 DCHECK(!possibly_invalid_username_.empty()); 336 OnSignedIn();
325 OnSignedIn(possibly_invalid_username_);
326 337
327 DCHECK(!temp_refresh_token_.empty()); 338 DCHECK(!temp_refresh_token_.empty());
328 DCHECK(IsAuthenticated()); 339 DCHECK(IsAuthenticated());
329 token_service_->UpdateCredentials(GetAuthenticatedAccountId(), 340
330 temp_refresh_token_); 341 std::string account_id = GetAuthenticatedAccountId();
342 token_service_->UpdateCredentials(account_id, temp_refresh_token_);
331 temp_refresh_token_.clear(); 343 temp_refresh_token_.clear();
332 344
333 MergeSigninCredentialIntoCookieJar(); 345 MergeSigninCredentialIntoCookieJar();
334 } 346 }
335 347
336 void SigninManager::OnExternalSigninCompleted(const std::string& username) { 348 void SigninManager::OnExternalSigninCompleted(const std::string& username) {
337 OnSignedIn(username); 349 AccountTrackerService::AccountInfo info =
350 account_tracker_service()->FindAccountInfoByEmail(username);
351 DCHECK(!info.gaia.empty());
352 DCHECK(!info.email.empty());
353 possibly_invalid_account_id_ = info.account_id;
354 possibly_invalid_gaia_id_ = info.gaia;
355 possibly_invalid_email_ = info.email;
356 OnSignedIn();
338 } 357 }
339 358
340 void SigninManager::OnSignedIn(const std::string& username) { 359 void SigninManager::OnSignedIn() {
341 client_->GetPrefs()->SetInt64(prefs::kSignedInTime, 360 client_->GetPrefs()->SetInt64(prefs::kSignedInTime,
342 base::Time::Now().ToInternalValue()); 361 base::Time::Now().ToInternalValue());
343 SetAuthenticatedUsername(username); 362 SetAuthenticatedAccountInfo(possibly_invalid_gaia_id_,
344 possibly_invalid_username_.clear(); 363 possibly_invalid_email_);
364 possibly_invalid_account_id_.clear();
365 possibly_invalid_gaia_id_.clear();
366 possibly_invalid_email_.clear();
345 signin_manager_signed_in_ = true; 367 signin_manager_signed_in_ = true;
346 368
347 FOR_EACH_OBSERVER( 369 FOR_EACH_OBSERVER(
348 SigninManagerBase::Observer, 370 SigninManagerBase::Observer,
349 observer_list_, 371 observer_list_,
350 GoogleSigninSucceeded(GetAuthenticatedAccountId(), 372 GoogleSigninSucceeded(GetAuthenticatedAccountId(),
351 GetAuthenticatedUsername(), 373 GetAuthenticatedUsername(),
352 password_)); 374 password_));
353 375
354 client_->OnSignedIn(GetAuthenticatedAccountId(), 376 client_->OnSignedIn(GetAuthenticatedAccountId(),
(...skipping 27 matching lines...) Expand all
382 void SigninManager::OnAccountUpdateFailed(const std::string& account_id) { 404 void SigninManager::OnAccountUpdateFailed(const std::string& account_id) {
383 user_info_fetched_by_account_tracker_ = true; 405 user_info_fetched_by_account_tracker_ = true;
384 PostSignedIn(); 406 PostSignedIn();
385 } 407 }
386 408
387 void SigninManager::ProhibitSignout(bool prohibit_signout) { 409 void SigninManager::ProhibitSignout(bool prohibit_signout) {
388 prohibit_signout_ = prohibit_signout; 410 prohibit_signout_ = prohibit_signout;
389 } 411 }
390 412
391 bool SigninManager::IsSignoutProhibited() const { return prohibit_signout_; } 413 bool SigninManager::IsSignoutProhibited() const { return prohibit_signout_; }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698