Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(665)

Side by Side Diff: components/signin/core/browser/account_service_flag_fetcher.cc

Issue 284763004: Create AccountServiceFlagFetcher which downloads an account's Gaia service flags. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « components/signin/core/browser/account_service_flag_fetcher.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 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/core/browser/account_service_flag_fetcher.h"
6
7 #include "base/strings/string_split.h"
8 #include "components/signin/core/browser/profile_oauth2_token_service.h"
9 #include "google_apis/gaia/gaia_constants.h"
10
11 AccountServiceFlagFetcher::AccountServiceFlagFetcher(
12 const std::string& account_id,
13 ProfileOAuth2TokenService* token_service,
14 net::URLRequestContextGetter* request_context,
15 const ResultCallback& callback)
16 : OAuth2TokenService::Consumer("account_service_flag_fetcher"),
17 account_id_(account_id),
18 token_service_(token_service),
19 gaia_auth_fetcher_(this, GaiaConstants::kChromeSource, request_context),
20 callback_(callback) {
21 Start();
22 }
23
24 AccountServiceFlagFetcher::~AccountServiceFlagFetcher() {
25 // Ensures PO2TS observation is cleared when AccountServiceFlagFetcher is
26 // destructed before refresh token is available.
27 token_service_->RemoveObserver(this);
28
29 gaia_auth_fetcher_.CancelRequest();
30 }
31
32 void AccountServiceFlagFetcher::Start() {
33 if (token_service_->RefreshTokenIsAvailable(account_id_)) {
34 StartFetchingOAuth2AccessToken();
35 } else {
36 // Wait until we get a refresh token.
37 token_service_->AddObserver(this);
38 }
39 }
40
41 void AccountServiceFlagFetcher::OnRefreshTokenAvailable(
42 const std::string& account_id) {
43 // Wait until we get a refresh token for the requested account.
44 if (account_id != account_id_)
45 return;
46
47 token_service_->RemoveObserver(this);
48
49 StartFetchingOAuth2AccessToken();
50 }
51
52 void AccountServiceFlagFetcher::OnRefreshTokensLoaded() {
53 token_service_->RemoveObserver(this);
54
55 // The PO2TS has loaded all tokens, but we didn't get one for the account we
56 // want. We probably won't get one any time soon, so report an error.
57 DLOG(WARNING) << "AccountServiceFlagFetcher::OnRefreshTokensLoaded: "
58 << "Did not get a refresh token for account " << account_id_;
59 callback_.Run(TOKEN_ERROR, std::vector<std::string>());
60 }
61
62 void AccountServiceFlagFetcher::StartFetchingOAuth2AccessToken() {
63 OAuth2TokenService::ScopeSet scopes;
64 scopes.insert(GaiaConstants::kOAuth1LoginScope);
65 oauth2_access_token_request_ = token_service_->StartRequest(
66 account_id_, scopes, this);
67 }
68
69 void AccountServiceFlagFetcher::OnGetTokenSuccess(
70 const OAuth2TokenService::Request* request,
71 const std::string& access_token,
72 const base::Time& expiration_time) {
73 DCHECK_EQ(oauth2_access_token_request_.get(), request);
74 oauth2_access_token_request_.reset();
75
76 gaia_auth_fetcher_.StartOAuthLogin(access_token, GaiaConstants::kGaiaService);
77 }
78
79 void AccountServiceFlagFetcher::OnGetTokenFailure(
80 const OAuth2TokenService::Request* request,
81 const GoogleServiceAuthError& error) {
82 DCHECK_EQ(oauth2_access_token_request_.get(), request);
83 oauth2_access_token_request_.reset();
84
85 DLOG(WARNING) << "AccountServiceFlagFetcher::OnGetTokenFailure: "
86 << error.ToString();
87 callback_.Run(TOKEN_ERROR, std::vector<std::string>());
88 }
89
90 void AccountServiceFlagFetcher::OnClientLoginSuccess(
91 const ClientLoginResult& result) {
92 gaia_auth_fetcher_.StartGetUserInfo(result.lsid);
93 }
94
95 void AccountServiceFlagFetcher::OnClientLoginFailure(
96 const GoogleServiceAuthError& error) {
97 DLOG(WARNING) << "AccountServiceFlagFetcher::OnClientLoginFailure: "
98 << error.ToString();
99 callback_.Run(SERVICE_ERROR, std::vector<std::string>());
100 }
101
102 void AccountServiceFlagFetcher::OnGetUserInfoSuccess(const UserInfoMap& data) {
103 ResultCode result = SERVICE_ERROR;
104 std::vector<std::string> services;
105 UserInfoMap::const_iterator services_iter = data.find("allServices");
106 if (services_iter != data.end()) {
107 result = SUCCESS;
108 base::SplitString(services_iter->second, ',', &services);
109 } else {
110 DLOG(WARNING) << "AccountServiceFlagFetcher::OnGetUserInfoSuccess: "
111 << "GetUserInfo response didn't include allServices field.";
112 }
113 callback_.Run(result, services);
114 }
115
116 void AccountServiceFlagFetcher::OnGetUserInfoFailure(
117 const GoogleServiceAuthError& error) {
118 DLOG(WARNING) << "AccountServiceFlagFetcher::OnGetUserInfoFailure: "
119 << error.ToString();
120 callback_.Run(SERVICE_ERROR, std::vector<std::string>());
121 }
OLDNEW
« no previous file with comments | « components/signin/core/browser/account_service_flag_fetcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698