account_tracker.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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 "google_apis/gaia/account_tracker.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gaia { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccountTracker::AccountTracker( 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IdentityProvider* identity_provider, 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* request_context_getter) 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : identity_provider_(identity_provider), 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_context_getter_(request_context_getter), 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutdown_called_(false) { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) identity_provider_->AddObserver(this); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) identity_provider_->GetTokenService()->AddObserver(this); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)AccountTracker::~AccountTracker() { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(shutdown_called_); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::Shutdown() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutdown_called_ = true; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteValues(&user_info_requests_); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) identity_provider_->GetTokenService()->RemoveObserver(this); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) identity_provider_->RemoveObserver(this); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::AddObserver(Observer* observer) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_list_.AddObserver(observer); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::RemoveObserver(Observer* observer) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_list_.RemoveObserver(observer); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<AccountIds> AccountTracker::GetAccounts() const { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string active_account_id = 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) identity_provider_->GetActiveAccountId(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<AccountIds> accounts; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::map<std::string, AccountState>::const_iterator it = 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accounts_.begin(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != accounts_.end(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AccountState& state = it->second; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_visible = state.is_signed_in && !state.ids.gaia.empty(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->first == active_account_id) { 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_visible) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) accounts.insert(accounts.begin(), state.ids); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::vector<AccountIds>(); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (is_visible) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accounts.push_back(state.ids); 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return accounts; 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)AccountIds AccountTracker::FindAccountIdsByGaiaId(const std::string& gaia_id) { 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (std::map<std::string, AccountState>::const_iterator it = 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) accounts_.begin(); 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != accounts_.end(); 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ++it) { 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const AccountState& state = it->second; 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (state.ids.gaia == gaia_id) { 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return state.ids; 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AccountIds(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::OnRefreshTokenAvailable(const std::string& account_id) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore refresh tokens if there is no active account ID at all. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (identity_provider_->GetActiveAccountId().empty()) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "AVAILABLE " << account_id; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSignInState(account_id, true); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::OnRefreshTokenRevoked(const std::string& account_id) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "REVOKED " << account_id; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSignInState(account_id, false); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::OnActiveAccountLogin() { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> accounts = 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) identity_provider_->GetTokenService()->GetAccounts(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "LOGIN " << accounts.size() << " accounts available."; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<std::string>::const_iterator it = accounts.begin(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != accounts.end(); 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ++it) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnRefreshTokenAvailable(*it); 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::OnActiveAccountLogout() { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "LOGOUT"; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopTrackingAllAccounts(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccountTracker::SetAccountStateForTest(AccountIds ids, bool is_signed_in) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accounts_[ids.account_key].ids = ids; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accounts_[ids.account_key].is_signed_in = is_signed_in; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "SetAccountStateForTest " << ids.account_key << ":" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << is_signed_in; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (VLOG_IS_ON(1)) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::map<std::string, AccountState>::const_iterator it = 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accounts_.begin(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != accounts_.end(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << it->first << ":" << it->second.is_signed_in; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::NotifyAccountAdded(const AccountState& account) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!account.ids.gaia.empty()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Observer, observer_list_, OnAccountAdded(account.ids)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::NotifyAccountRemoved(const AccountState& account) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!account.ids.gaia.empty()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Observer, observer_list_, OnAccountRemoved(account.ids)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::NotifySignInChanged(const AccountState& account) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!account.ids.gaia.empty()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(Observer, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_list_, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnAccountSignInChanged(account.ids, account.is_signed_in)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::UpdateSignInState(const std::string account_key, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_signed_in) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartTrackingAccount(account_key); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccountState& account = accounts_[account_key]; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_gaia_id = account.ids.gaia.empty(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool was_signed_in = account.is_signed_in; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) account.is_signed_in = is_signed_in; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (needs_gaia_id && is_signed_in) 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StartFetchingUserInfo(account_key); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!needs_gaia_id && (was_signed_in != is_signed_in)) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifySignInChanged(account); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::StartTrackingAccount(const std::string account_key) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ContainsKey(accounts_, account_key)) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "StartTracking " << account_key; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccountState account_state; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) account_state.ids.account_key = account_key; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) account_state.ids.email = account_key; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) account_state.is_signed_in = false; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accounts_.insert(make_pair(account_key, account_state)); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::StopTrackingAccount(const std::string account_key) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "StopTracking " << account_key; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ContainsKey(accounts_, account_key)) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccountState& account = accounts_[account_key]; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!account.ids.gaia.empty()) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateSignInState(account_key, false); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyAccountRemoved(account); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accounts_.erase(account_key); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ContainsKey(user_info_requests_, account_key)) 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DeleteFetcher(user_info_requests_[account_key]); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::StopTrackingAllAccounts() { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!accounts_.empty()) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopTrackingAccount(accounts_.begin()->first); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::StartFetchingUserInfo(const std::string account_key) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ContainsKey(user_info_requests_, account_key)) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteFetcher(user_info_requests_[account_key]); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DVLOG(1) << "StartFetching " << account_key; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AccountIdFetcher* fetcher = 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new AccountIdFetcher(identity_provider_->GetTokenService(), 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_context_getter_.get(), 203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this, 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) account_key); 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) user_info_requests_[account_key] = fetcher; 206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fetcher->Start(); 207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void AccountTracker::OnUserInfoFetchSuccess(AccountIdFetcher* fetcher, 210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& gaia_id) { 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& account_key = fetcher->account_key(); 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(ContainsKey(accounts_, account_key)); 213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AccountState& account = accounts_[account_key]; 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) account.ids.gaia = gaia_id; 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NotifyAccountAdded(account); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (account.is_signed_in) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotifySignInChanged(account); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteFetcher(fetcher); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccountTracker::OnUserInfoFetchFailure(AccountIdFetcher* fetcher) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Failed to get UserInfo for " << fetcher->account_key(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = fetcher->account_key(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteFetcher(fetcher); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopTrackingAccount(key); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountTracker::DeleteFetcher(AccountIdFetcher* fetcher) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "DeleteFetcher " << fetcher->account_key(); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& account_key = fetcher->account_key(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ContainsKey(user_info_requests_, account_key)); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(fetcher, user_info_requests_[account_key]); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_info_requests_.erase(account_key); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete fetcher; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccountIdFetcher::AccountIdFetcher( 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OAuth2TokenService* token_service, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* request_context_getter, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AccountTracker* tracker, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& account_key) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : OAuth2TokenService::Consumer("gaia_account_tracker"), 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) token_service_(token_service), 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_context_getter_(request_context_getter), 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_(tracker), 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) account_key_(account_key) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccountIdFetcher::~AccountIdFetcher() {} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AccountIdFetcher::Start() { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) login_token_request_ = token_service_->StartRequest( 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) account_key_, OAuth2TokenService::ScopeSet(), this); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountIdFetcher::OnGetTokenSuccess( 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OAuth2TokenService::Request* request, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& expiration_time) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(request, login_token_request_.get()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gaia_oauth_client_.reset(new gaia::GaiaOAuthClient(request_context_getter_)); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kMaxGetUserIdRetries = 3; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gaia_oauth_client_->GetUserId(access_token, kMaxGetUserIdRetries, this); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountIdFetcher::OnGetTokenFailure( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OAuth2TokenService::Request* request, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& error) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "OnGetTokenFailure: " << error.ToString(); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(request, login_token_request_.get()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_->OnUserInfoFetchFailure(this); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountIdFetcher::OnGetUserIdResponse(const std::string& gaia_id) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_->OnUserInfoFetchSuccess(this, gaia_id); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountIdFetcher::OnOAuthError() { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "OnOAuthError"; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_->OnUserInfoFetchFailure(this); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountIdFetcher::OnNetworkError(int response_code) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "OnNetworkError " << response_code; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_->OnUserInfoFetchFailure(this); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gaia 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)