account_reconcilor.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 28bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 38bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// found in the LICENSE file. 48bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/signin/core/browser/account_reconcilor.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <algorithm> 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/bind.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/json/json_reader.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/logging.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/message_loop/message_loop.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/time/time.h" 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_client.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/signin/core/browser/signin_metrics.h" 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/signin/core/browser/signin_oauth_helper.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/signin/core/common/profile_management_switches.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "google_apis/gaia/gaia_auth_fetcher.h" 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/gaia_oauth_client.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/cookies/canonical_cookie.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class EmailEqualToFunc : public std::equal_to<std::pair<std::string, bool> > { 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool operator()(const std::pair<std::string, bool>& p1, 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::pair<std::string, bool>& p2) const; 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool EmailEqualToFunc::operator()( 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::pair<std::string, bool>& p1, 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::pair<std::string, bool>& p2) const { 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return p1.second == p2.second && gaia::AreEmailsSame(p1.first, p2.first); 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Fetches a refresh token from the given session in the GAIA cookie. This is 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// a best effort only. If it should fail, another reconcile action will occur 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// shortly anyway. 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AccountReconcilor::RefreshTokenFetcher 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public SigninOAuthHelper, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public SigninOAuthHelper::Consumer { 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RefreshTokenFetcher(AccountReconcilor* reconcilor, 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int session_index); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~RefreshTokenFetcher() {} 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Overridden from GaiaAuthConsumer: 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnSigninOAuthInformationAvailable( 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& email, 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& display_email, 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& refresh_token) OVERRIDE; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called when an error occurs while getting the information. 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnSigninOAuthInformationFailure( 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error) OVERRIDE; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor_; 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string account_id_; 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int session_index_; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RefreshTokenFetcher); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AccountReconcilor::RefreshTokenFetcher::RefreshTokenFetcher( 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* reconcilor, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int session_index) 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : SigninOAuthHelper(reconcilor->client()->GetURLRequestContext(), 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::IntToString(session_index), 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this), 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reconcilor_(reconcilor), 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) account_id_(account_id), 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) session_index_(session_index) { 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(reconcilor_); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!account_id.empty()); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void AccountReconcilor::RefreshTokenFetcher::OnSigninOAuthInformationAvailable( 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& email, 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& display_email, 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& refresh_token) { 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VLOG(1) << "RefreshTokenFetcher::OnSigninOAuthInformationAvailable:" 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << " account=" << account_id_ << " email=" << email 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << " displayEmail=" << display_email; 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(rogerta): because of the problem with email vs displayEmail and 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // emails that have been canonicalized, the argument |email| is used here 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to make sure the correct string is used when calling the token service. 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This will be cleaned up when chrome moves to using gaia obfuscated id. 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reconcilor_->HandleRefreshTokenFetched(email, refresh_token); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void AccountReconcilor::RefreshTokenFetcher::OnSigninOAuthInformationFailure( 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error) { 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VLOG(1) << "RefreshTokenFetcher::OnSigninOAuthInformationFailure:" 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << " account=" << account_id_ << " session_index=" << session_index_; 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor_->HandleRefreshTokenFetched(account_id_, std::string()); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AccountReconcilor::EmailLessFunc::operator()(const std::string& s1, 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& s2) const { 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return gaia::CanonicalizeEmail(s1) < gaia::CanonicalizeEmail(s2); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class AccountReconcilor::UserIdFetcher 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public gaia::GaiaOAuthClient::Delegate { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UserIdFetcher(AccountReconcilor* reconcilor, 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& access_token, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the scopes needed by the UserIdFetcher. 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static OAuth2TokenService::ScopeSet GetScopes(); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Overriden from gaia::GaiaOAuthClient::Delegate. 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnGetUserIdResponse(const std::string& user_id) OVERRIDE; 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnOAuthError() OVERRIDE; 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnNetworkError(int response_code) OVERRIDE; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor* const reconcilor_; 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string account_id_; 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string access_token_; 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gaia::GaiaOAuthClient gaia_auth_client_; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UserIdFetcher); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AccountReconcilor::UserIdFetcher::UserIdFetcher(AccountReconcilor* reconcilor, 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& access_token, 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : reconcilor_(reconcilor), 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) account_id_(account_id), 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) access_token_(access_token), 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gaia_auth_client_(reconcilor_->client()->GetURLRequestContext()) { 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(reconcilor_); 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!account_id_.empty()); 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int kMaxRetries = 5; 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gaia_auth_client_.GetUserId(access_token_, kMaxRetries, this); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)OAuth2TokenService::ScopeSet AccountReconcilor::UserIdFetcher::GetScopes() { 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OAuth2TokenService::ScopeSet scopes; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scopes.insert("https://www.googleapis.com/auth/userinfo.profile"); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scopes; 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::UserIdFetcher::OnGetUserIdResponse( 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& user_id) { 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnGetUserIdResponse: " << account_id_; 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // HandleSuccessfulAccountIdCheck() may delete |this|, so call it last. 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor_->HandleSuccessfulAccountIdCheck(account_id_); 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::UserIdFetcher::OnOAuthError() { 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnOAuthError: " << account_id_; 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Invalidate the access token to force a refetch next time. 174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch reconcilor_->token_service()->InvalidateToken( 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch account_id_, GetScopes(), access_token_); 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // HandleFailedAccountIdCheck() may delete |this|, so call it last. 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reconcilor_->HandleFailedAccountIdCheck(account_id_); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::UserIdFetcher::OnNetworkError(int response_code) { 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnNetworkError: " << account_id_ 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << " response_code=" << response_code; 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(rogerta): some response error should not be treated like 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // permanent errors. Figure out appropriate ones. 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // HandleFailedAccountIdCheck() may delete |this|, so call it last. 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reconcilor_->HandleFailedAccountIdCheck(account_id_); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochAccountReconcilor::AccountReconcilor(ProfileOAuth2TokenService* token_service, 192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninManagerBase* signin_manager, 193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SigninClient* client) 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : OAuth2TokenService::Consumer("account_reconcilor"), 195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch token_service_(token_service), 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch signin_manager_(signin_manager), 197e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch client_(client), 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch merge_session_helper_(token_service_, 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch client->GetURLRequestContext(), 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this), 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registered_with_token_service_(false), 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_reconcile_started_(false), 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) first_execution_(true), 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) are_gaia_accounts_set_(false), 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) requests_(NULL) { 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::AccountReconcilor"; 2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)AccountReconcilor::~AccountReconcilor() { 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VLOG(1) << "AccountReconcilor::~AccountReconcilor"; 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make sure shutdown was called first. 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!registered_with_token_service_); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!requests_); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(0u, user_id_fetchers_.size()); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(0u, refresh_token_fetchers_.size()); 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void AccountReconcilor::Initialize(bool start_reconcile_if_tokens_available) { 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VLOG(1) << "AccountReconcilor::Initialize"; 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RegisterWithSigninManager(); 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If this user is not signed in, the reconcilor should do nothing but 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // wait for signin. 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsProfileConnected()) { 225e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RegisterForCookieChanges(); 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RegisterWithTokenService(); 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Start a reconcile if the tokens are already loaded. 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (start_reconcile_if_tokens_available && 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch token_service_->GetAccounts().size() > 0) { 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) StartReconcile(); 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AccountReconcilor::Shutdown() { 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::Shutdown"; 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) merge_session_helper_.CancelAll(); 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) merge_session_helper_.RemoveObserver(this); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gaia_fetcher_.reset(); 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_gaia_accounts_callbacks_.clear(); 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteFetchers(); 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UnregisterWithSigninManager(); 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UnregisterWithTokenService(); 245e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UnregisterForCookieChanges(); 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::AddMergeSessionObserver( 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MergeSessionHelper::Observer* observer) { 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) merge_session_helper_.AddObserver(observer); 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::RemoveMergeSessionObserver( 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MergeSessionHelper::Observer* observer) { 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) merge_session_helper_.RemoveObserver(observer); 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::DeleteFetchers() { 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delete[] requests_; 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) requests_ = NULL; 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_id_fetchers_.clear(); 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) refresh_token_fetchers_.clear(); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AccountReconcilor::AreAllRefreshTokensChecked() const { 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return chrome_accounts_.size() == 268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch (valid_chrome_accounts_.size() + invalid_chrome_accounts_.size()); 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 271e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid AccountReconcilor::RegisterForCookieChanges() { 272e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // First clear any existing registration to avoid DCHECKs that can otherwise 273e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // go off in some embedders on reauth (e.g., ChromeSigninClient). 274e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UnregisterForCookieChanges(); 275e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch client_->SetCookieChangedCallback( 276e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::Bind(&AccountReconcilor::OnCookieChanged, base::Unretained(this))); 2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 279e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid AccountReconcilor::UnregisterForCookieChanges() { 280e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch client_->SetCookieChangedCallback(SigninClient::CookieChangedCallback()); 2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AccountReconcilor::RegisterWithSigninManager() { 284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch signin_manager_->AddObserver(this); 2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AccountReconcilor::UnregisterWithSigninManager() { 288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch signin_manager_->RemoveObserver(this); 2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AccountReconcilor::RegisterWithTokenService() { 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::RegisterWithTokenService"; 2934ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch // During re-auth, the reconcilor will get a callback about successful signin 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // even when the profile is already connected. Avoid re-registering 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // with the token service since this will DCHECK. 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (registered_with_token_service_) 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch token_service_->AddObserver(this); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registered_with_token_service_ = true; 3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AccountReconcilor::UnregisterWithTokenService() { 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!registered_with_token_service_) 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch token_service_->RemoveObserver(this); 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registered_with_token_service_ = false; 3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool AccountReconcilor::IsProfileConnected() { 312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return !signin_manager_->GetAuthenticatedUsername().empty(); 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 315e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid AccountReconcilor::OnCookieChanged(const net::CanonicalCookie* cookie) { 316e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (cookie->Name() == "LSID" && 317e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch cookie->Domain() == GaiaUrls::GetInstance()->gaia_url().host() && 318e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch cookie->IsSecure() && cookie->IsHttpOnly()) { 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnCookieChanged: LSID changed"; 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It is possible that O2RT is not available at this moment. 322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!token_service_->GetAccounts().size()) { 323e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch VLOG(1) << "AccountReconcilor::OnCookieChanged: cookie change is ingored" 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "because O2RT is not available yet."; 325e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 326e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StartReconcile(); 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 3311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AccountReconcilor::OnRefreshTokenAvailable(const std::string& account_id) { 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnRefreshTokenAvailable: " << account_id; 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StartReconcile(); 3351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 3361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AccountReconcilor::OnRefreshTokenRevoked(const std::string& account_id) { 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnRefreshTokenRevoked: " << account_id; 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PerformStartRemoveAction(account_id); 3401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 3418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AccountReconcilor::OnRefreshTokensLoaded() {} 3438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 344c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid AccountReconcilor::GoogleSigninSucceeded(const std::string& username, 345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& password) { 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::GoogleSigninSucceeded: signed in"; 347e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch RegisterForCookieChanges(); 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RegisterWithTokenService(); 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::GoogleSignedOut(const std::string& username) { 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::GoogleSignedOut: signed out"; 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gaia_fetcher_.reset(); 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) get_gaia_accounts_callbacks_.clear(); 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AbortReconcile(); 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UnregisterWithTokenService(); 357e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch UnregisterForCookieChanges(); 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PerformLogoutAllAccountsAction(); 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void AccountReconcilor::PerformMergeAction(const std::string& account_id) { 3626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!switches::IsNewProfileManagement()) { 3636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MarkAccountAsAddedToCookie(account_id); 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::PerformMergeAction: " << account_id; 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) merge_session_helper_.LogIn(account_id); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AccountReconcilor::PerformStartRemoveAction( 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& account_id) { 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VLOG(1) << "AccountReconcilor::PerformStartRemoveAction: " << account_id; 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetAccountsFromCookie(base::Bind( 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &AccountReconcilor::PerformFinishRemoveAction, 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Unretained(this), 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) account_id)); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AccountReconcilor::PerformFinishRemoveAction( 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id, 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error, 382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<std::pair<std::string, bool> >& accounts) { 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!switches::IsNewProfileManagement()) 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VLOG(1) << "AccountReconcilor::PerformFinishRemoveAction:" 386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << " account=" << account_id << " error=" << error.ToString(); 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error.state() == GoogleServiceAuthError::NONE) { 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AbortReconcile(); 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<std::string> accounts_only; 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (std::vector<std::pair<std::string, bool> >::const_iterator i = 391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch accounts.begin(); 392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch i != accounts.end(); 393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++i) { 394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) accounts_only.push_back(i->first); 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) merge_session_helper_.LogOut(account_id, accounts_only); 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Wait for the next ReconcileAction if there is an error. 3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid AccountReconcilor::PerformAddToChromeAction(const std::string& account_id, 402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int session_index) { 4036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!switches::IsNewProfileManagement()) { 4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MarkAccountAsAddedToChrome(account_id); 405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 4066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::PerformAddToChromeAction:" 408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << " account=" << account_id << " session_index=" << session_index; 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID) && !defined(OS_IOS) 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) refresh_token_fetchers_.push_back( 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new RefreshTokenFetcher(this, account_id, session_index)); 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::PerformLogoutAllAccountsAction() { 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!switches::IsNewProfileManagement()) 418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::PerformLogoutAllAccountsAction"; 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) merge_session_helper_.LogOutAllAccounts(); 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::StartReconcile() { 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IsProfileConnected() || is_reconcile_started_) 425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_reconcile_started_ = true; 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Reset state for validating gaia cookie. 430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) are_gaia_accounts_set_ = false; 431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gaia_accounts_.clear(); 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetAccountsFromCookie(base::Bind( 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &AccountReconcilor::ContinueReconcileActionAfterGetGaiaAccounts, 434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Unretained(this))); 435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Reset state for validating oauth2 tokens. 437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) primary_account_.clear(); 438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome_accounts_.clear(); 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteFetchers(); 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) valid_chrome_accounts_.clear(); 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) invalid_chrome_accounts_.clear(); 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_to_cookie_.clear(); 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_to_chrome_.clear(); 444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ValidateAccountsFromTokenService(); 4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::GetAccountsFromCookie( 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetAccountsFromCookieCallback callback) { 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) get_gaia_accounts_callbacks_.push_back(callback); 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!gaia_fetcher_) { 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There is no list account request in flight. 452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gaia_fetcher_.reset(new GaiaAuthFetcher( 453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, GaiaConstants::kChromeSource, client_->GetURLRequestContext())); 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gaia_fetcher_->StartListAccounts(); 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AccountReconcilor::OnListAccountsSuccess(const std::string& data) { 459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gaia_fetcher_.reset(); 460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Get account information from response data. 462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<std::pair<std::string, bool> > gaia_accounts; 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool valid_json = gaia::ParseListAccountsData(data, &gaia_accounts); 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!valid_json) { 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnListAccountsSuccess: parsing error"; 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (gaia_accounts.size() > 0) { 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnListAccountsSuccess: " 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Gaia " << gaia_accounts.size() << " accounts, " 469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << "Primary is '" << gaia_accounts[0].first << "'"; 470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnListAccountsSuccess: No accounts"; 472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There must be at least one callback waiting for result. 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!get_gaia_accounts_callbacks_.empty()); 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GoogleServiceAuthError error = 478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch !valid_json ? GoogleServiceAuthError( 479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE) 480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : GoogleServiceAuthError::AuthErrorNone(); 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) get_gaia_accounts_callbacks_.front().Run(error, gaia_accounts); 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) get_gaia_accounts_callbacks_.pop_front(); 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MayBeDoNextListAccounts(); 485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AccountReconcilor::OnListAccountsFailure( 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GoogleServiceAuthError& error) { 489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gaia_fetcher_.reset(); 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnListAccountsFailure: " << error.ToString(); 491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<std::pair<std::string, bool> > empty_accounts; 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There must be at least one callback waiting for result. 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!get_gaia_accounts_callbacks_.empty()); 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) get_gaia_accounts_callbacks_.front().Run(error, empty_accounts); 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) get_gaia_accounts_callbacks_.pop_front(); 498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MayBeDoNextListAccounts(); 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::MayBeDoNextListAccounts() { 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!get_gaia_accounts_callbacks_.empty()) { 504c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gaia_fetcher_.reset(new GaiaAuthFetcher( 505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch this, GaiaConstants::kChromeSource, client_->GetURLRequestContext())); 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gaia_fetcher_->StartListAccounts(); 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::ContinueReconcileActionAfterGetGaiaAccounts( 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error, 512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<std::pair<std::string, bool> >& accounts) { 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error.state() == GoogleServiceAuthError::NONE) { 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gaia_accounts_ = accounts; 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) are_gaia_accounts_set_ = true; 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinishReconcile(); 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AbortReconcile(); 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AccountReconcilor::ValidateAccountsFromTokenService() { 523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch primary_account_ = signin_manager_->GetAuthenticatedUsername(); 524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!primary_account_.empty()); 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chrome_accounts_ = token_service_->GetAccounts(); 527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_GT(chrome_accounts_.size(), 0u); 528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::ValidateAccountsFromTokenService: " 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Chrome " << chrome_accounts_.size() << " accounts, " 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Primary is '" << primary_account_ << "'"; 532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!requests_); 534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) requests_ = 535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new scoped_ptr<OAuth2TokenService::Request>[chrome_accounts_.size()]; 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const OAuth2TokenService::ScopeSet scopes = 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AccountReconcilor::UserIdFetcher::GetScopes(); 538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < chrome_accounts_.size(); ++i) { 539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch requests_[i] = 540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch token_service_->StartRequest(chrome_accounts_[i], scopes, this); 541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(0u, user_id_fetchers_.size()); 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_id_fetchers_.resize(chrome_accounts_.size()); 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AccountReconcilor::OnGetTokenSuccess( 548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const OAuth2TokenService::Request* request, 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& access_token, 550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Time& expiration_time) { 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t index; 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (index = 0; index < chrome_accounts_.size(); ++index) { 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (request == requests_[index].get()) 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(index < chrome_accounts_.size()); 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id = chrome_accounts_[index]; 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::OnGetTokenSuccess: valid " << account_id; 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!user_id_fetchers_[index]); 563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch user_id_fetchers_[index] = new UserIdFetcher(this, access_token, account_id); 564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AccountReconcilor::OnGetTokenFailure( 567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const OAuth2TokenService::Request* request, 568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GoogleServiceAuthError& error) { 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t index; 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (index = 0; index < chrome_accounts_.size(); ++index) { 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (request == requests_[index].get()) 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(index < chrome_accounts_.size()); 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id = chrome_accounts_[index]; 5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 578c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch VLOG(1) << "AccountReconcilor::OnGetTokenFailure: invalid " << account_id; 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HandleFailedAccountIdCheck(account_id); 580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void AccountReconcilor::OnNewProfileManagementFlagChanged( 583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool new_flag_status) { 584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (new_flag_status) { 585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The reconciler may have been newly created just before this call, or may 586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // have already existed and in mid-reconcile. To err on the safe side, force 587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // a restart. 588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Shutdown(); 589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Initialize(true); 590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else { 591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Shutdown(); 592f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 594f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::FinishReconcile() { 596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Make sure that the process of validating the gaia cookie and the oauth2 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // tokens individually is done before proceeding with reconciliation. 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!are_gaia_accounts_set_ || !AreAllRefreshTokensChecked()) 599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::FinishReconcile"; 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteFetchers(); 6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(add_to_cookie_.empty()); 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(add_to_chrome_.empty()); 6076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int number_gaia_accounts = gaia_accounts_.size(); 608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool are_primaries_equal = 6096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) number_gaia_accounts > 0 && 610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gaia::AreEmailsSame(primary_account_, gaia_accounts_[0].first); 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (are_primaries_equal) { 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Determine if we need to merge accounts from gaia cookie to chrome. 615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < gaia_accounts_.size(); ++i) { 616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& gaia_account = gaia_accounts_[i].first; 617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (gaia_accounts_[i].second && 618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch valid_chrome_accounts_.find(gaia_account) == 619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch valid_chrome_accounts_.end()) { 6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_to_chrome_.push_back(std::make_pair(gaia_account, i)); 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::FinishReconcile: rebuild cookie"; 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Really messed up state. Blow away the gaia cookie completely and 6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // rebuild it, making sure the primary account as specified by the 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // SigninManager is the first session in the gaia cookie. 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PerformLogoutAllAccountsAction(); 629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gaia_accounts_.clear(); 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Create a list of accounts that need to be added to the gaia cookie. 633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The primary account must be first to make sure it becomes the default 634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // account in the case where chrome is completely rebuilding the cookie. 635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) add_to_cookie_.push_back(primary_account_); 636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (EmailSet::const_iterator i = valid_chrome_accounts_.begin(); 637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) i != valid_chrome_accounts_.end(); 638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++i) { 639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (*i != primary_account_) 640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) add_to_cookie_.push_back(*i); 641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // For each account known to chrome, PerformMergeAction() if the account is 644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // not already in the cookie jar or its state is invalid, or signal merge 645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // completed otherwise. Make a copy of |add_to_cookie_| since calls to 646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // SignalComplete() will change the array. 647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<std::string> add_to_cookie_copy = add_to_cookie_; 648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int added_to_cookie = 0; 649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < add_to_cookie_copy.size(); ++i) { 650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gaia_accounts_.end() != 651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::find_if(gaia_accounts_.begin(), 652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gaia_accounts_.end(), 653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::bind1st(EmailEqualToFunc(), 654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::make_pair(add_to_cookie_copy[i], 655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) true)))) { 656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) merge_session_helper_.SignalComplete( 657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) add_to_cookie_copy[i], 658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GoogleServiceAuthError::AuthErrorNone()); 659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PerformMergeAction(add_to_cookie_copy[i]); 661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) added_to_cookie++; 662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // For each account in the gaia cookie not known to chrome, 666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // PerformAddToChromeAction. Make a copy of |add_to_chrome| since calls to 667f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // PerformAddToChromeAction() may modify this array. 668f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<std::pair<std::string, int> > add_to_chrome_copy = add_to_chrome_; 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<std::pair<std::string, int> >::const_iterator i = 670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) add_to_chrome_copy.begin(); 671f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) i != add_to_chrome_copy.end(); 672c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++i) { 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PerformAddToChromeAction(i->first, i->second); 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) signin_metrics::LogSigninAccountReconciliation(valid_chrome_accounts_.size(), 677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) added_to_cookie, 678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) add_to_chrome_.size(), 679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) are_primaries_equal, 6806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) first_execution_, 6816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) number_gaia_accounts); 682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) first_execution_ = false; 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CalculateIfReconcileIsDone(); 684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScheduleStartReconcileIfChromeAccountsChanged(); 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::AbortReconcile() { 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::AbortReconcile: we'll try again later"; 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeleteFetchers(); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_to_cookie_.clear(); 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_to_chrome_.clear(); 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CalculateIfReconcileIsDone(); 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::CalculateIfReconcileIsDone() { 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_reconcile_started_ = !add_to_cookie_.empty() || !add_to_chrome_.empty(); 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!is_reconcile_started_) 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "AccountReconcilor::CalculateIfReconcileIsDone: done"; 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void AccountReconcilor::ScheduleStartReconcileIfChromeAccountsChanged() { 702a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_reconcile_started_) 703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Start a reconcile as the token accounts have changed. 706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VLOG(1) << "AccountReconcilor::StartReconcileIfChromeAccountsChanged"; 707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<std::string> reconciled_accounts(chrome_accounts_); 708c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<std::string> new_chrome_accounts(token_service_->GetAccounts()); 709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::sort(reconciled_accounts.begin(), reconciled_accounts.end()); 710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::sort(new_chrome_accounts.begin(), new_chrome_accounts.end()); 711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (reconciled_accounts != new_chrome_accounts) { 712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoop::current()->PostTask( 713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&AccountReconcilor::StartReconcile, base::Unretained(this))); 715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Remove the account from the list that is being merged. 7196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountReconcilor::MarkAccountAsAddedToCookie( 7206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& account_id) { 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<std::string>::iterator i = add_to_cookie_.begin(); 722c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch i != add_to_cookie_.end(); 723c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++i) { 7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (account_id == *i) { 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_to_cookie_.erase(i); 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountReconcilor::MergeSessionCompleted( 7326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& account_id, 7336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const GoogleServiceAuthError& error) { 7346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) VLOG(1) << "AccountReconcilor::MergeSessionCompleted: account_id=" 7356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) << account_id; 7366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 7376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MarkAccountAsAddedToCookie(account_id); 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CalculateIfReconcileIsDone(); 739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScheduleStartReconcileIfChromeAccountsChanged(); 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::HandleSuccessfulAccountIdCheck( 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id) { 7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) valid_chrome_accounts_.insert(account_id); 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinishReconcile(); 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AccountReconcilor::HandleFailedAccountIdCheck( 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& account_id) { 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) invalid_chrome_accounts_.insert(account_id); 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FinishReconcile(); 7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AccountReconcilor::PerformAddAccountToTokenService( 755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& account_id, 756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& refresh_token) { 757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The flow should never get to this method if new_profile_management is 758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // false, but better safe than sorry. 759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!switches::IsNewProfileManagement()) 760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) token_service_->UpdateCredentials(account_id, refresh_token); 762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Remove the account from the list that is being updated. 7656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountReconcilor::MarkAccountAsAddedToChrome( 7666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& account_id) { 7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::vector<std::pair<std::string, int> >::iterator i = 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_to_chrome_.begin(); 769c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch i != add_to_chrome_.end(); 770c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++i) { 771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (gaia::AreEmailsSame(account_id, i->first)) { 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) add_to_chrome_.erase(i); 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 7766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 7776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 7786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AccountReconcilor::HandleRefreshTokenFetched( 7796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& account_id, 7806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& refresh_token) { 7816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!refresh_token.empty()) 7826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PerformAddAccountToTokenService(account_id, refresh_token); 7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) MarkAccountAsAddedToChrome(account_id); 7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CalculateIfReconcileIsDone(); 7861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 787