1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_manager_base.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/prefs/pref_service.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_split.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_client.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/common/signin_pref_names.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/common/signin_switches.h" 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using namespace signin_internals_util; 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochSigninManagerBase::SigninManagerBase(SigninClient* client) 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch : client_(client), initialized_(false), weak_pointer_factory_(this) {} 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochSigninManagerBase::~SigninManagerBase() {} 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid SigninManagerBase::Initialize(PrefService* local_state) { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should never call Initialize() twice. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(!IsInitialized()); 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch initialized_ = true; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the user is clearing the token service from the command line, then 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // clear their login info also (not valid to be logged in without any 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // tokens). 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cmd_line->HasSwitch(switches::kClearTokenService)) 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch client_->GetPrefs()->ClearPref(prefs::kGoogleServicesUsername); 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string user = 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch client_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!user.empty()) { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_IOS) 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Prior to M38, Chrome on iOS did not normalize the email before setting 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // it in SigninManager. |AccountReconcilor| expects the authenticated email 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to be normalized as it used as an account identifier and is compared 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to the accounts available in the cookies. 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user = gaia::CanonicalizeEmail(gaia::SanitizeEmail(user)); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetAuthenticatedUsername(user); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool SigninManagerBase::IsInitialized() const { return initialized_; } 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SigninManagerBase::IsSigninAllowed() const { 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return client_->GetPrefs()->GetBoolean(prefs::kSigninAllowed); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const std::string& SigninManagerBase::GetAuthenticatedUsername() const { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return authenticated_username_; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const std::string& SigninManagerBase::GetAuthenticatedAccountId() const { 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetAuthenticatedUsername(); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninManagerBase::SetAuthenticatedUsername(const std::string& username) { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!authenticated_username_.empty()) { 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DLOG_IF(ERROR, !gaia::AreEmailsSame(username, authenticated_username_)) 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch << "Tried to change the authenticated username to something different: " 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch << "Current: " << authenticated_username_ << ", New: " << username; 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_IOS) 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Prior to M26, chrome on iOS did not normalize the email before setting 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // it in SigninManager. If the emails are the same as given by 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // gaia::AreEmailsSame() but not the same as given by std::string::op==(), 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // make sure to set the authenticated name below. 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!gaia::AreEmailsSame(username, authenticated_username_) || 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) username == authenticated_username_) { 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string pref_username = 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch client_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(pref_username.empty() || gaia::AreEmailsSame(username, pref_username)) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << "username: " << username << "; pref_username: " << pref_username; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) authenticated_username_ = username; 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch client_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, username); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotifyDiagnosticsObservers(USERNAME, username); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Go ahead and update the last signed in username here as well. Once a 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // user is signed in the two preferences should match. Doing it here as 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // opposed to on signin allows us to catch the upgrade scenario. 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch client_->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername, username); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void SigninManagerBase::clear_authenticated_username() { 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) authenticated_username_.clear(); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool SigninManagerBase::IsAuthenticated() const { 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return !GetAuthenticatedAccountId().empty(); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool SigninManagerBase::AuthInProgress() const { 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // SigninManagerBase never kicks off auth processes itself. 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SigninManagerBase::Shutdown() {} 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SigninManagerBase::AddObserver(Observer* observer) { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer_list_.AddObserver(observer); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SigninManagerBase::RemoveObserver(Observer* observer) { 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer_list_.RemoveObserver(observer); 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninManagerBase::AddSigninDiagnosticsObserver( 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninDiagnosticsObserver* observer) { 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_diagnostics_observers_.AddObserver(observer); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninManagerBase::RemoveSigninDiagnosticsObserver( 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninDiagnosticsObserver* observer) { 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_diagnostics_observers_.RemoveObserver(observer); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninManagerBase::NotifyDiagnosticsObservers( 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UntimedSigninStatusField& field, 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& value) { 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FOR_EACH_OBSERVER(SigninDiagnosticsObserver, 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_diagnostics_observers_, 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotifySigninValueChanged(field, value)); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninManagerBase::NotifyDiagnosticsObservers( 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const TimedSigninStatusField& field, 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& value) { 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FOR_EACH_OBSERVER(SigninDiagnosticsObserver, 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) signin_diagnostics_observers_, 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotifySigninValueChanged(field, value)); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 151