1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h"
6 
7 #include <utility>
8 
9 #include "build/build_config.h"
10 #include "components/signin/internal/identity_manager/account_tracker_service.h"
11 #include "components/signin/internal/identity_manager/gaia_cookie_manager_service.h"
12 #include "components/signin/public/base/multilogin_parameters.h"
13 #include "components/signin/public/identity_manager/set_accounts_in_cookie_result.h"
14 #include "google_apis/gaia/core_account_id.h"
15 #include "google_apis/gaia/google_service_auth_error.h"
16 
17 namespace signin {
18 
MultiloginHelperWrapper(std::unique_ptr<OAuthMultiloginHelper> helper)19 AccountsCookieMutatorImpl::MultiloginHelperWrapper::MultiloginHelperWrapper(
20     std::unique_ptr<OAuthMultiloginHelper> helper)
21     : helper_(std::move(helper)) {}
22 
23 AccountsCookieMutatorImpl::MultiloginHelperWrapper::~MultiloginHelperWrapper() =
24     default;
25 
AccountsCookieMutatorImpl(SigninClient * signin_client,ProfileOAuth2TokenService * token_service,GaiaCookieManagerService * gaia_cookie_manager_service,AccountTrackerService * account_tracker_service)26 AccountsCookieMutatorImpl::AccountsCookieMutatorImpl(
27     SigninClient* signin_client,
28     ProfileOAuth2TokenService* token_service,
29     GaiaCookieManagerService* gaia_cookie_manager_service,
30     AccountTrackerService* account_tracker_service)
31     : signin_client_(signin_client),
32       token_service_(token_service),
33       gaia_cookie_manager_service_(gaia_cookie_manager_service),
34       account_tracker_service_(account_tracker_service) {
35   DCHECK(signin_client_);
36   DCHECK(token_service_);
37   DCHECK(gaia_cookie_manager_service_);
38   DCHECK(account_tracker_service_);
39 }
40 
41 AccountsCookieMutatorImpl::~AccountsCookieMutatorImpl() = default;
42 
AddAccountToCookie(const CoreAccountId & account_id,gaia::GaiaSource source,AddAccountToCookieCompletedCallback completion_callback)43 void AccountsCookieMutatorImpl::AddAccountToCookie(
44     const CoreAccountId& account_id,
45     gaia::GaiaSource source,
46     AddAccountToCookieCompletedCallback completion_callback) {
47   gaia_cookie_manager_service_->AddAccountToCookie(
48       account_id, source, std::move(completion_callback));
49 }
50 
AddAccountToCookieWithToken(const CoreAccountId & account_id,const std::string & access_token,gaia::GaiaSource source,AddAccountToCookieCompletedCallback completion_callback)51 void AccountsCookieMutatorImpl::AddAccountToCookieWithToken(
52     const CoreAccountId& account_id,
53     const std::string& access_token,
54     gaia::GaiaSource source,
55     AddAccountToCookieCompletedCallback completion_callback) {
56   gaia_cookie_manager_service_->AddAccountToCookieWithToken(
57       account_id, access_token, source, std::move(completion_callback));
58 }
59 
SetAccountsInCookie(const MultiloginParameters & parameters,gaia::GaiaSource source,base::OnceCallback<void (SetAccountsInCookieResult)> set_accounts_in_cookies_completed_callback)60 void AccountsCookieMutatorImpl::SetAccountsInCookie(
61     const MultiloginParameters& parameters,
62     gaia::GaiaSource source,
63     base::OnceCallback<void(SetAccountsInCookieResult)>
64         set_accounts_in_cookies_completed_callback) {
65   std::vector<GaiaCookieManagerService::AccountIdGaiaIdPair> accounts;
66   for (const auto& account_id : parameters.accounts_to_send) {
67     accounts.push_back(make_pair(
68         account_id, account_tracker_service_->GetAccountInfo(account_id).gaia));
69   }
70   gaia_cookie_manager_service_->SetAccountsInCookie(
71       parameters.mode, accounts, source,
72       std::move(set_accounts_in_cookies_completed_callback));
73 }
74 
75 std::unique_ptr<AccountsCookieMutator::SetAccountsInCookieTask>
SetAccountsInCookieForPartition(PartitionDelegate * partition_delegate,const MultiloginParameters & parameters,base::OnceCallback<void (SetAccountsInCookieResult)> set_accounts_in_cookies_completed_callback)76 AccountsCookieMutatorImpl::SetAccountsInCookieForPartition(
77     PartitionDelegate* partition_delegate,
78     const MultiloginParameters& parameters,
79     base::OnceCallback<void(SetAccountsInCookieResult)>
80         set_accounts_in_cookies_completed_callback) {
81   // The default partition must go through the GaiaCookieManagerService.
82   DCHECK_NE(signin_client_->GetCookieManager(),
83             partition_delegate->GetCookieManagerForPartition())
84       << "The default partition is passed to "
85       << "SetAccountsInCookieForPartition(). Use SetAccountsInCookie() "
86       << "instead.";
87 
88   std::vector<GaiaCookieManagerService::AccountIdGaiaIdPair> accounts;
89   for (const auto& account_id : parameters.accounts_to_send) {
90     accounts.push_back(make_pair(
91         account_id, account_tracker_service_->GetAccountInfo(account_id).gaia));
92   }
93 
94   return std::make_unique<MultiloginHelperWrapper>(
95       std::make_unique<OAuthMultiloginHelper>(
96           signin_client_, partition_delegate, token_service_, parameters.mode,
97           accounts, /*external_cc_result=*/std::string(),
98           std::move(set_accounts_in_cookies_completed_callback)));
99 }
100 
TriggerCookieJarUpdate()101 void AccountsCookieMutatorImpl::TriggerCookieJarUpdate() {
102   gaia_cookie_manager_service_->TriggerListAccounts();
103 }
104 
105 #if defined(OS_IOS)
ForceTriggerOnCookieChange()106 void AccountsCookieMutatorImpl::ForceTriggerOnCookieChange() {
107   gaia_cookie_manager_service_->ForceOnCookieChangeProcessing();
108 }
109 #endif
110 
LogOutAllAccounts(gaia::GaiaSource source,LogOutFromCookieCompletedCallback completion_callback)111 void AccountsCookieMutatorImpl::LogOutAllAccounts(
112     gaia::GaiaSource source,
113     LogOutFromCookieCompletedCallback completion_callback) {
114   gaia_cookie_manager_service_->LogOutAllAccounts(
115       source, std::move(completion_callback));
116 }
117 
118 }  // namespace signin
119