signin_manager_base.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/signin/core/browser/signin_manager_base.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/command_line.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h" 13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/string_split.h" 14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/string_util.h" 15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/signin/core/browser/signin_client.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/signin/core/common/signin_pref_names.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/signin/core/common/signin_switches.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "google_apis/gaia/gaia_auth_util.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "google_apis/gaia/gaia_constants.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using namespace signin_internals_util; 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)SigninManagerBase::SigninManagerBase(SigninClient* client) 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : client_(client), initialized_(false), weak_pointer_factory_(this) {} 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)SigninManagerBase::~SigninManagerBase() {} 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::Initialize(PrefService* local_state) { 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Should never call Initialize() twice. 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(!IsInitialized()); 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) initialized_ = true; 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // If the user is clearing the token service from the command line, then 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // clear their login info also (not valid to be logged in without any 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // tokens). 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (cmd_line->HasSwitch(switches::kClearTokenService)) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) client_->GetPrefs()->ClearPref(prefs::kGoogleServicesUsername); 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string user = 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) client_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!user.empty()) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SetAuthenticatedUsername(user); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SigninManagerBase::IsInitialized() const { return initialized_; } 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SigninManagerBase::IsSigninAllowed() const { 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return client_->GetPrefs()->GetBoolean(prefs::kSigninAllowed); 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const std::string& SigninManagerBase::GetAuthenticatedUsername() const { 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return authenticated_username_; 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const std::string& SigninManagerBase::GetAuthenticatedAccountId() const { 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return GetAuthenticatedUsername(); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::SetAuthenticatedUsername(const std::string& username) { 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!authenticated_username_.empty()) { 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DLOG_IF(ERROR, !gaia::AreEmailsSame(username, authenticated_username_)) 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) << "Tried to change the authenticated username to something different: " 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) << "Current: " << authenticated_username_ << ", New: " << username; 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_IOS) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Prior to M26, chrome on iOS did not normalize the email before setting 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // it in SigninManager. If the emails are the same as given by 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // gaia::AreEmailsSame() but not the same as given by std::string::op==(), 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // make sure to set the authenticated name below. 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!gaia::AreEmailsSame(username, authenticated_username_) || 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) username == authenticated_username_) { 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string pref_username = 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) client_->GetPrefs()->GetString(prefs::kGoogleServicesUsername); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(pref_username.empty() || gaia::AreEmailsSame(username, pref_username)) 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) << "username: " << username << "; pref_username: " << pref_username; 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) authenticated_username_ = username; 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) client_->GetPrefs()->SetString(prefs::kGoogleServicesUsername, username); 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifyDiagnosticsObservers(USERNAME, username); 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Go ahead and update the last signed in username here as well. Once a 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // user is signed in the two preferences should match. Doing it here as 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // opposed to on signin allows us to catch the upgrade scenario. 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) client_->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername, username); 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::clear_authenticated_username() { 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) authenticated_username_.clear(); 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool SigninManagerBase::AuthInProgress() const { 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // SigninManagerBase never kicks off auth processes itself. 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::Shutdown() {} 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::AddObserver(Observer* observer) { 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observer_list_.AddObserver(observer); 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid SigninManagerBase::RemoveObserver(Observer* observer) { 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observer_list_.RemoveObserver(observer); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::AddSigninDiagnosticsObserver( 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SigninDiagnosticsObserver* observer) { 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) signin_diagnostics_observers_.AddObserver(observer); 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::RemoveSigninDiagnosticsObserver( 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SigninDiagnosticsObserver* observer) { 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) signin_diagnostics_observers_.RemoveObserver(observer); 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::NotifyDiagnosticsObservers( 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const UntimedSigninStatusField& field, 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& value) { 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FOR_EACH_OBSERVER(SigninDiagnosticsObserver, 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) signin_diagnostics_observers_, 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifySigninValueChanged(field, value)); 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void SigninManagerBase::NotifyDiagnosticsObservers( 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const TimedSigninStatusField& field, 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& value) { 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FOR_EACH_OBSERVER(SigninDiagnosticsObserver, 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) signin_diagnostics_observers_, 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NotifySigninValueChanged(field, value)); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)