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