16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file. 46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "google_apis/gaia/account_tracker.h" 66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/logging.h" 86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/stl_util.h" 96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace gaia { 126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AccountTracker::AccountTracker( 146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IdentityProvider* identity_provider, 156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequestContextGetter* request_context_getter) 166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : identity_provider_(identity_provider), 176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) request_context_getter_(request_context_getter), 186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) shutdown_called_(false) { 196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) identity_provider_->AddObserver(this); 206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) identity_provider_->GetTokenService()->AddObserver(this); 216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AccountTracker::~AccountTracker() { 246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(shutdown_called_); 256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::Shutdown() { 286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) shutdown_called_ = true; 296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) STLDeleteValues(&user_info_requests_); 306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) identity_provider_->GetTokenService()->RemoveObserver(this); 316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) identity_provider_->RemoveObserver(this); 326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::AddObserver(Observer* observer) { 356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) observer_list_.AddObserver(observer); 366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::RemoveObserver(Observer* observer) { 396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) observer_list_.RemoveObserver(observer); 406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::vector<AccountIds> AccountTracker::GetAccounts() const { 436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string active_account_id = 446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) identity_provider_->GetActiveAccountId(); 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<AccountIds> accounts; 466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) for (std::map<std::string, AccountState>::const_iterator it = 486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts_.begin(); 496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) it != accounts_.end(); 506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ++it) { 516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const AccountState& state = it->second; 526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool is_visible = state.is_signed_in && !state.ids.gaia.empty(); 536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (it->first == active_account_id) { 556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (is_visible) 566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts.insert(accounts.begin(), state.ids); 576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) else 586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return std::vector<AccountIds>(); 596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } else if (is_visible) { 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts.push_back(state.ids); 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return accounts; 656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AccountIds AccountTracker::FindAccountIdsByGaiaId(const std::string& gaia_id) { 686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) for (std::map<std::string, AccountState>::const_iterator it = 696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts_.begin(); 706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) it != accounts_.end(); 716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ++it) { 726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const AccountState& state = it->second; 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (state.ids.gaia == gaia_id) { 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return state.ids; 756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return AccountIds(); 796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::OnRefreshTokenAvailable(const std::string& account_id) { 826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Ignore refresh tokens if there is no active account ID at all. 836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (identity_provider_->GetActiveAccountId().empty()) 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "AVAILABLE " << account_id; 876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) UpdateSignInState(account_id, true); 886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::OnRefreshTokenRevoked(const std::string& account_id) { 916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "REVOKED " << account_id; 926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) UpdateSignInState(account_id, false); 936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::OnActiveAccountLogin() { 966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::vector<std::string> accounts = 976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) identity_provider_->GetTokenService()->GetAccounts(); 986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "LOGIN " << accounts.size() << " accounts available."; 1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = accounts.begin(); 1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) it != accounts.end(); 1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ++it) { 1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnRefreshTokenAvailable(*it); 1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::OnActiveAccountLogout() { 1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "LOGOUT"; 1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) StopTrackingAllAccounts(); 1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::SetAccountStateForTest(AccountIds ids, bool is_signed_in) { 1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts_[ids.account_key].ids = ids; 1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts_[ids.account_key].is_signed_in = is_signed_in; 1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "SetAccountStateForTest " << ids.account_key << ":" 1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) << is_signed_in; 1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (VLOG_IS_ON(1)) { 1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) for (std::map<std::string, AccountState>::const_iterator it = 1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts_.begin(); 1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) it != accounts_.end(); 1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ++it) { 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << it->first << ":" << it->second.is_signed_in; 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::NotifyAccountAdded(const AccountState& account) { 1316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(!account.ids.gaia.empty()); 1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FOR_EACH_OBSERVER( 1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Observer, observer_list_, OnAccountAdded(account.ids)); 1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::NotifyAccountRemoved(const AccountState& account) { 1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(!account.ids.gaia.empty()); 1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FOR_EACH_OBSERVER( 1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Observer, observer_list_, OnAccountRemoved(account.ids)); 1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::NotifySignInChanged(const AccountState& account) { 1436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(!account.ids.gaia.empty()); 1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FOR_EACH_OBSERVER(Observer, 1456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) observer_list_, 1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnAccountSignInChanged(account.ids, account.is_signed_in)); 1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::UpdateSignInState(const std::string account_key, 1506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool is_signed_in) { 1516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) StartTrackingAccount(account_key); 1526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccountState& account = accounts_[account_key]; 1536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool needs_gaia_id = account.ids.gaia.empty(); 1546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool was_signed_in = account.is_signed_in; 1556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) account.is_signed_in = is_signed_in; 1566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (needs_gaia_id && is_signed_in) 1586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) StartFetchingUserInfo(account_key); 1596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!needs_gaia_id && (was_signed_in != is_signed_in)) 1616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NotifySignInChanged(account); 1626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::StartTrackingAccount(const std::string account_key) { 1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!ContainsKey(accounts_, account_key)) { 1666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "StartTracking " << account_key; 1676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccountState account_state; 1686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) account_state.ids.account_key = account_key; 1696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) account_state.ids.email = account_key; 1706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) account_state.is_signed_in = false; 1716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts_.insert(make_pair(account_key, account_state)); 1726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::StopTrackingAccount(const std::string account_key) { 1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "StopTracking " << account_key; 1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (ContainsKey(accounts_, account_key)) { 1786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccountState& account = accounts_[account_key]; 1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!account.ids.gaia.empty()) { 1806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) UpdateSignInState(account_key, false); 1816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NotifyAccountRemoved(account); 1826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) accounts_.erase(account_key); 1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (ContainsKey(user_info_requests_, account_key)) 1876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DeleteFetcher(user_info_requests_[account_key]); 1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::StopTrackingAllAccounts() { 1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) while (!accounts_.empty()) 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) StopTrackingAccount(accounts_.begin()->first); 1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::StartFetchingUserInfo(const std::string account_key) { 1966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (ContainsKey(user_info_requests_, account_key)) 1976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DeleteFetcher(user_info_requests_[account_key]); 1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "StartFetching " << account_key; 2006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccountIdFetcher* fetcher = 2016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) new AccountIdFetcher(identity_provider_->GetTokenService(), 2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) request_context_getter_.get(), 2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) this, 2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) account_key); 2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) user_info_requests_[account_key] = fetcher; 2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) fetcher->Start(); 2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::OnUserInfoFetchSuccess(AccountIdFetcher* fetcher, 2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& gaia_id) { 2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& account_key = fetcher->account_key(); 2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(ContainsKey(accounts_, account_key)); 2136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccountState& account = accounts_[account_key]; 2146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) account.ids.gaia = gaia_id; 2166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NotifyAccountAdded(account); 2176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (account.is_signed_in) 2196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NotifySignInChanged(account); 2206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DeleteFetcher(fetcher); 2226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::OnUserInfoFetchFailure(AccountIdFetcher* fetcher) { 2256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) LOG(WARNING) << "Failed to get UserInfo for " << fetcher->account_key(); 2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::string key = fetcher->account_key(); 2276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DeleteFetcher(fetcher); 2286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) StopTrackingAccount(key); 2296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountTracker::DeleteFetcher(AccountIdFetcher* fetcher) { 2326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DVLOG(1) << "DeleteFetcher " << fetcher->account_key(); 2336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& account_key = fetcher->account_key(); 2346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(ContainsKey(user_info_requests_, account_key)); 2356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK_EQ(fetcher, user_info_requests_[account_key]); 2366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) user_info_requests_.erase(account_key); 2376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) delete fetcher; 2386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AccountIdFetcher::AccountIdFetcher( 2416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OAuth2TokenService* token_service, 2426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) net::URLRequestContextGetter* request_context_getter, 2436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccountTracker* tracker, 2446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& account_key) 2456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) : OAuth2TokenService::Consumer("gaia_account_tracker"), 2466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) token_service_(token_service), 2476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) request_context_getter_(request_context_getter), 2486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker_(tracker), 2496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) account_key_(account_key) { 2506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AccountIdFetcher::~AccountIdFetcher() {} 2536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountIdFetcher::Start() { 2556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) login_token_request_ = token_service_->StartRequest( 2566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) account_key_, OAuth2TokenService::ScopeSet(), this); 2576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountIdFetcher::OnGetTokenSuccess( 2606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const OAuth2TokenService::Request* request, 2616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& access_token, 2626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const base::Time& expiration_time) { 2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK_EQ(request, login_token_request_.get()); 2646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) gaia_oauth_client_.reset(new gaia::GaiaOAuthClient(request_context_getter_)); 2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const int kMaxGetUserIdRetries = 3; 2686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) gaia_oauth_client_->GetUserId(access_token, kMaxGetUserIdRetries, this); 2696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountIdFetcher::OnGetTokenFailure( 2726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const OAuth2TokenService::Request* request, 2736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const GoogleServiceAuthError& error) { 2746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) LOG(ERROR) << "OnGetTokenFailure: " << error.ToString(); 2756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK_EQ(request, login_token_request_.get()); 2766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker_->OnUserInfoFetchFailure(this); 2776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountIdFetcher::OnGetUserIdResponse(const std::string& gaia_id) { 2806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker_->OnUserInfoFetchSuccess(this, gaia_id); 2816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountIdFetcher::OnOAuthError() { 2846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) LOG(ERROR) << "OnOAuthError"; 2856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker_->OnUserInfoFetchFailure(this); 2866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountIdFetcher::OnNetworkError(int response_code) { 2896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) LOG(ERROR) << "OnNetworkError " << response_code; 2906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) tracker_->OnUserInfoFetchFailure(this); 2916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} // namespace gaia 294