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

Side by Side Diff: chrome/browser/chromeos/settings/device_oauth2_token_service_delegate.cc

Issue 1143323005: Refactor AO2TS to make it easier to componentize. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: debug Created 5 years, 5 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" 5 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_delegate. h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/memory/weak_ptr.h" 12 #include "base/memory/weak_ptr.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "base/prefs/pref_registry_simple.h" 14 #include "base/prefs/pref_registry_simple.h"
15 #include "base/prefs/pref_service.h" 15 #include "base/prefs/pref_service.h"
16 #include "base/values.h" 16 #include "base/values.h"
17 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/chromeos/settings/token_encryptor.h" 18 #include "chrome/browser/chromeos/settings/token_encryptor.h"
19 #include "chrome/common/pref_names.h" 19 #include "chrome/common/pref_names.h"
20 #include "chromeos/cryptohome/system_salt_getter.h" 20 #include "chromeos/cryptohome/system_salt_getter.h"
21 #include "chromeos/settings/cros_settings_names.h" 21 #include "chromeos/settings/cros_settings_names.h"
22 #include "google_apis/gaia/gaia_constants.h" 22 #include "google_apis/gaia/gaia_constants.h"
23 #include "google_apis/gaia/gaia_urls.h" 23 #include "google_apis/gaia/gaia_urls.h"
24 #include "google_apis/gaia/google_service_auth_error.h" 24 #include "google_apis/gaia/google_service_auth_error.h"
25 #include "google_apis/gaia/oauth2_access_token_fetcher_impl.h" 25 #include "google_apis/gaia/oauth2_access_token_fetcher_impl.h"
26 #include "policy/proto/device_management_backend.pb.h" 26 #include "policy/proto/device_management_backend.pb.h"
27 27
28 namespace chromeos { 28 namespace chromeos {
29 29
30 struct DeviceOAuth2TokenService::PendingRequest { 30 void DeviceOAuth2TokenServiceDelegate::OnServiceAccountIdentityChanged() {
31 PendingRequest(const base::WeakPtr<RequestImpl>& request,
32 const std::string& client_id,
33 const std::string& client_secret,
34 const ScopeSet& scopes)
35 : request(request),
36 client_id(client_id),
37 client_secret(client_secret),
38 scopes(scopes) {}
39
40 const base::WeakPtr<RequestImpl> request;
41 const std::string client_id;
42 const std::string client_secret;
43 const ScopeSet scopes;
44 };
45
46 void DeviceOAuth2TokenService::OnServiceAccountIdentityChanged() {
47 if (!GetRobotAccountId().empty() && !refresh_token_.empty()) 31 if (!GetRobotAccountId().empty() && !refresh_token_.empty())
48 FireRefreshTokenAvailable(GetRobotAccountId()); 32 FireRefreshTokenAvailable(GetRobotAccountId());
49 } 33 }
50 34
51 DeviceOAuth2TokenService::DeviceOAuth2TokenService( 35 DeviceOAuth2TokenServiceDelegate::DeviceOAuth2TokenServiceDelegate(
52 net::URLRequestContextGetter* getter, 36 net::URLRequestContextGetter* getter,
53 PrefService* local_state) 37 PrefService* local_state)
54 : url_request_context_getter_(getter), 38 : url_request_context_getter_(getter),
55 local_state_(local_state), 39 local_state_(local_state),
56 state_(STATE_LOADING), 40 state_(STATE_LOADING),
57 max_refresh_token_validation_retries_(3), 41 max_refresh_token_validation_retries_(3),
42 has_pending_requests_(false),
43 service_error_status_observer_(nullptr),
58 service_account_identity_subscription_( 44 service_account_identity_subscription_(
59 CrosSettings::Get()->AddSettingsObserver( 45 CrosSettings::Get()
60 kServiceAccountIdentity, 46 ->AddSettingsObserver(
61 base::Bind( 47 kServiceAccountIdentity,
62 &DeviceOAuth2TokenService::OnServiceAccountIdentityChanged, 48 base::Bind(&DeviceOAuth2TokenServiceDelegate::
63 base::Unretained(this))).Pass()), 49 OnServiceAccountIdentityChanged,
50 base::Unretained(this)))
51 .Pass()),
64 weak_ptr_factory_(this) { 52 weak_ptr_factory_(this) {
65 // Pull in the system salt. 53 // Pull in the system salt.
66 SystemSaltGetter::Get()->GetSystemSalt( 54 SystemSaltGetter::Get()->GetSystemSalt(
67 base::Bind(&DeviceOAuth2TokenService::DidGetSystemSalt, 55 base::Bind(&DeviceOAuth2TokenServiceDelegate::DidGetSystemSalt,
68 weak_ptr_factory_.GetWeakPtr())); 56 weak_ptr_factory_.GetWeakPtr()));
69 } 57 }
70 58
71 DeviceOAuth2TokenService::~DeviceOAuth2TokenService() { 59 DeviceOAuth2TokenServiceDelegate::~DeviceOAuth2TokenServiceDelegate() {
72 FlushPendingRequests(false, GoogleServiceAuthError::REQUEST_CANCELED); 60 if (service_error_status_observer_)
61 service_error_status_observer_->OnServiceError(
62 GoogleServiceAuthError::REQUEST_CANCELED);
73 FlushTokenSaveCallbacks(false); 63 FlushTokenSaveCallbacks(false);
74 } 64 }
75 65
76 // static 66 void DeviceOAuth2TokenServiceDelegate::SetAndSaveRefreshToken(
77 void DeviceOAuth2TokenService::RegisterPrefs(PrefRegistrySimple* registry) {
78 registry->RegisterStringPref(prefs::kDeviceRobotAnyApiRefreshToken,
79 std::string());
80 }
81
82 void DeviceOAuth2TokenService::SetAndSaveRefreshToken(
83 const std::string& refresh_token, 67 const std::string& refresh_token,
84 const StatusCallback& result_callback) { 68 const StatusCallback& result_callback) {
85 FlushPendingRequests(false, GoogleServiceAuthError::REQUEST_CANCELED); 69 if (service_error_status_observer_)
Mattias Nissler (ping if slow) 2015/07/01 12:34:13 nit: add curly braces for multi-line conditional s
gogerald1 2015/07/01 17:58:42 Done.
70 service_error_status_observer_->OnServiceError(
71 GoogleServiceAuthError::REQUEST_CANCELED);
86 72
87 bool waiting_for_salt = state_ == STATE_LOADING; 73 bool waiting_for_salt = state_ == STATE_LOADING;
88 refresh_token_ = refresh_token; 74 refresh_token_ = refresh_token;
89 state_ = STATE_VALIDATION_PENDING; 75 state_ = STATE_VALIDATION_PENDING;
90 76
91 // If the robot account ID is not available yet, do not announce the token. It 77 // If the robot account ID is not available yet, do not announce the token. It
92 // will be done from OnServiceAccountIdentityChanged() once the robot account 78 // will be done from OnServiceAccountIdentityChanged() once the robot account
93 // ID becomes available as well. 79 // ID becomes available as well.
94 if (!GetRobotAccountId().empty()) 80 if (!GetRobotAccountId().empty())
95 FireRefreshTokenAvailable(GetRobotAccountId()); 81 FireRefreshTokenAvailable(GetRobotAccountId());
96 82
97 token_save_callbacks_.push_back(result_callback); 83 token_save_callbacks_.push_back(result_callback);
98 if (!waiting_for_salt) { 84 if (!waiting_for_salt) {
99 if (system_salt_.empty()) 85 if (system_salt_.empty())
100 FlushTokenSaveCallbacks(false); 86 FlushTokenSaveCallbacks(false);
101 else 87 else
102 EncryptAndSaveToken(); 88 EncryptAndSaveToken();
103 } 89 }
104 } 90 }
105 91
106 bool DeviceOAuth2TokenService::RefreshTokenIsAvailable( 92 bool DeviceOAuth2TokenServiceDelegate::RefreshTokenIsAvailable(
107 const std::string& account_id) const { 93 const std::string& account_id) const {
108 switch (state_) { 94 switch (state_) {
109 case STATE_NO_TOKEN: 95 case STATE_NO_TOKEN:
110 case STATE_TOKEN_INVALID: 96 case STATE_TOKEN_INVALID:
111 return false; 97 return false;
112 case STATE_LOADING: 98 case STATE_LOADING:
113 case STATE_VALIDATION_PENDING: 99 case STATE_VALIDATION_PENDING:
114 case STATE_VALIDATION_STARTED: 100 case STATE_VALIDATION_STARTED:
115 case STATE_TOKEN_VALID: 101 case STATE_TOKEN_VALID:
116 return account_id == GetRobotAccountId(); 102 return account_id == GetRobotAccountId();
117 } 103 }
118 104
119 NOTREACHED() << "Unhandled state " << state_; 105 NOTREACHED() << "Unhandled state " << state_;
120 return false; 106 return false;
121 } 107 }
122 108
123 std::string DeviceOAuth2TokenService::GetRobotAccountId() const { 109 std::string DeviceOAuth2TokenServiceDelegate::GetRobotAccountId() const {
124 std::string result; 110 std::string result;
125 CrosSettings::Get()->GetString(kServiceAccountIdentity, &result); 111 CrosSettings::Get()->GetString(kServiceAccountIdentity, &result);
126 return result; 112 return result;
127 } 113 }
128 114
129 void DeviceOAuth2TokenService::OnRefreshTokenResponse( 115 void DeviceOAuth2TokenServiceDelegate::OnRefreshTokenResponse(
130 const std::string& access_token, 116 const std::string& access_token,
131 int expires_in_seconds) { 117 int expires_in_seconds) {
132 gaia_oauth_client_->GetTokenInfo( 118 gaia_oauth_client_->GetTokenInfo(access_token,
133 access_token, 119 max_refresh_token_validation_retries_, this);
134 max_refresh_token_validation_retries_,
135 this);
136 } 120 }
137 121
138 void DeviceOAuth2TokenService::OnGetTokenInfoResponse( 122 void DeviceOAuth2TokenServiceDelegate::OnGetTokenInfoResponse(
139 scoped_ptr<base::DictionaryValue> token_info) { 123 scoped_ptr<base::DictionaryValue> token_info) {
140 std::string gaia_robot_id; 124 std::string gaia_robot_id;
141 token_info->GetString("email", &gaia_robot_id); 125 token_info->GetString("email", &gaia_robot_id);
142 gaia_oauth_client_.reset(); 126 gaia_oauth_client_.reset();
143 127
144 CheckRobotAccountId(gaia_robot_id); 128 CheckRobotAccountId(gaia_robot_id);
145 } 129 }
146 130
147 void DeviceOAuth2TokenService::OnOAuthError() { 131 void DeviceOAuth2TokenServiceDelegate::OnOAuthError() {
148 gaia_oauth_client_.reset(); 132 gaia_oauth_client_.reset();
149 state_ = STATE_TOKEN_INVALID; 133 state_ = STATE_TOKEN_INVALID;
150 FlushPendingRequests(false, GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 134 if (service_error_status_observer_)
Mattias Nissler (ping if slow) 2015/07/01 12:34:13 nit: braces
gogerald1 2015/07/01 17:58:41 Done.
135 service_error_status_observer_->OnServiceError(
136 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
151 } 137 }
152 138
153 void DeviceOAuth2TokenService::OnNetworkError(int response_code) { 139 void DeviceOAuth2TokenServiceDelegate::OnNetworkError(int response_code) {
154 gaia_oauth_client_.reset(); 140 gaia_oauth_client_.reset();
155 141
156 // Go back to pending validation state. That'll allow a retry on subsequent 142 // Go back to pending validation state. That'll allow a retry on subsequent
157 // token minting requests. 143 // token minting requests.
158 state_ = STATE_VALIDATION_PENDING; 144 state_ = STATE_VALIDATION_PENDING;
159 FlushPendingRequests(false, GoogleServiceAuthError::CONNECTION_FAILED); 145 if (service_error_status_observer_)
Mattias Nissler (ping if slow) 2015/07/01 12:34:13 nit: braces
gogerald1 2015/07/01 17:58:41 Done.
146 service_error_status_observer_->OnServiceError(
147 GoogleServiceAuthError::CONNECTION_FAILED);
160 } 148 }
161 149
162 std::string DeviceOAuth2TokenService::GetRefreshToken( 150 std::string DeviceOAuth2TokenServiceDelegate::GetRefreshToken(
163 const std::string& account_id) const { 151 const std::string& account_id) const {
164 switch (state_) { 152 switch (state_) {
165 case STATE_LOADING: 153 case STATE_LOADING:
166 case STATE_NO_TOKEN: 154 case STATE_NO_TOKEN:
167 case STATE_TOKEN_INVALID: 155 case STATE_TOKEN_INVALID:
168 // This shouldn't happen: GetRefreshToken() is only called for actual 156 // This shouldn't happen: GetRefreshToken() is only called for actual
169 // token minting operations. In above states, requests are either queued 157 // token minting operations. In above states, requests are either queued
170 // or short-circuited to signal error immediately, so no actual token 158 // or short-circuited to signal error immediately, so no actual token
171 // minting via OAuth2TokenService::FetchOAuth2Token should be triggered. 159 // minting via OAuth2TokenService::FetchOAuth2Token should be triggered.
172 NOTREACHED(); 160 NOTREACHED();
173 return std::string(); 161 return std::string();
174 case STATE_VALIDATION_PENDING: 162 case STATE_VALIDATION_PENDING:
175 case STATE_VALIDATION_STARTED: 163 case STATE_VALIDATION_STARTED:
176 case STATE_TOKEN_VALID: 164 case STATE_TOKEN_VALID:
177 return refresh_token_; 165 return refresh_token_;
178 } 166 }
179 167
180 NOTREACHED() << "Unhandled state " << state_; 168 NOTREACHED() << "Unhandled state " << state_;
181 return std::string(); 169 return std::string();
182 } 170 }
183 171
184 net::URLRequestContextGetter* DeviceOAuth2TokenService::GetRequestContext() { 172 net::URLRequestContextGetter*
173 DeviceOAuth2TokenServiceDelegate::GetRequestContext() const {
185 return url_request_context_getter_.get(); 174 return url_request_context_getter_.get();
186 } 175 }
187 176
188 void DeviceOAuth2TokenService::FetchOAuth2Token( 177 OAuth2AccessTokenFetcher*
189 RequestImpl* request, 178 DeviceOAuth2TokenServiceDelegate::CreateAccessTokenFetcher(
190 const std::string& account_id,
191 net::URLRequestContextGetter* getter,
192 const std::string& client_id,
193 const std::string& client_secret,
194 const ScopeSet& scopes) {
195 switch (state_) {
196 case STATE_VALIDATION_PENDING:
197 // If this is the first request for a token, start validation.
198 StartValidation();
199 // fall through.
200 case STATE_LOADING:
201 case STATE_VALIDATION_STARTED:
202 // Add a pending request that will be satisfied once validation completes.
203 pending_requests_.push_back(new PendingRequest(
204 request->AsWeakPtr(), client_id, client_secret, scopes));
205 return;
206 case STATE_NO_TOKEN:
207 FailRequest(request, GoogleServiceAuthError::USER_NOT_SIGNED_UP);
208 return;
209 case STATE_TOKEN_INVALID:
210 FailRequest(request, GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
211 return;
212 case STATE_TOKEN_VALID:
213 // Pass through to OAuth2TokenService to satisfy the request.
214 OAuth2TokenService::FetchOAuth2Token(
215 request, account_id, getter, client_id, client_secret, scopes);
216 return;
217 }
218
219 NOTREACHED() << "Unexpected state " << state_;
220 }
221
222 OAuth2AccessTokenFetcher* DeviceOAuth2TokenService::CreateAccessTokenFetcher(
223 const std::string& account_id, 179 const std::string& account_id,
224 net::URLRequestContextGetter* getter, 180 net::URLRequestContextGetter* getter,
225 OAuth2AccessTokenConsumer* consumer) { 181 OAuth2AccessTokenConsumer* consumer) {
226 std::string refresh_token = GetRefreshToken(account_id); 182 std::string refresh_token = GetRefreshToken(account_id);
227 DCHECK(!refresh_token.empty()); 183 DCHECK(!refresh_token.empty());
228 return new OAuth2AccessTokenFetcherImpl(consumer, getter, refresh_token); 184 return new OAuth2AccessTokenFetcherImpl(consumer, getter, refresh_token);
229 } 185 }
230 186
231 187 void DeviceOAuth2TokenServiceDelegate::DidGetSystemSalt(
232 void DeviceOAuth2TokenService::DidGetSystemSalt(
233 const std::string& system_salt) { 188 const std::string& system_salt) {
234 system_salt_ = system_salt; 189 system_salt_ = system_salt;
235 190
236 // Bail out if system salt is not available. 191 // Bail out if system salt is not available.
237 if (system_salt_.empty()) { 192 if (system_salt_.empty()) {
238 LOG(ERROR) << "Failed to get system salt."; 193 LOG(ERROR) << "Failed to get system salt.";
239 FlushTokenSaveCallbacks(false); 194 FlushTokenSaveCallbacks(false);
240 state_ = STATE_NO_TOKEN; 195 state_ = STATE_NO_TOKEN;
241 FireRefreshTokensLoaded(); 196 FireRefreshTokensLoaded();
242 return; 197 return;
(...skipping 16 matching lines...) Expand all
259 LOG(ERROR) << "Failed to decrypt refresh token."; 214 LOG(ERROR) << "Failed to decrypt refresh token.";
260 state_ = STATE_NO_TOKEN; 215 state_ = STATE_NO_TOKEN;
261 FireRefreshTokensLoaded(); 216 FireRefreshTokensLoaded();
262 return; 217 return;
263 } 218 }
264 } 219 }
265 220
266 state_ = STATE_VALIDATION_PENDING; 221 state_ = STATE_VALIDATION_PENDING;
267 222
268 // If there are pending requests, start a validation. 223 // If there are pending requests, start a validation.
269 if (!pending_requests_.empty()) 224 if (has_pending_requests_)
270 StartValidation(); 225 StartValidation();
271 226
272 // Announce the token. 227 // Announce the token.
273 FireRefreshTokenAvailable(GetRobotAccountId()); 228 FireRefreshTokenAvailable(GetRobotAccountId());
274 FireRefreshTokensLoaded(); 229 FireRefreshTokensLoaded();
275 } 230 }
276 231
277 void DeviceOAuth2TokenService::CheckRobotAccountId( 232 void DeviceOAuth2TokenServiceDelegate::CheckRobotAccountId(
278 const std::string& gaia_robot_id) { 233 const std::string& gaia_robot_id) {
279 // Make sure the value returned by GetRobotAccountId has been validated 234 // Make sure the value returned by GetRobotAccountId has been validated
280 // against current device settings. 235 // against current device settings.
281 switch (CrosSettings::Get()->PrepareTrustedValues(base::Bind( 236 switch (CrosSettings::Get()->PrepareTrustedValues(
282 &DeviceOAuth2TokenService::CheckRobotAccountId, 237 base::Bind(&DeviceOAuth2TokenServiceDelegate::CheckRobotAccountId,
283 weak_ptr_factory_.GetWeakPtr(), 238 weak_ptr_factory_.GetWeakPtr(), gaia_robot_id))) {
284 gaia_robot_id))) {
285 case CrosSettingsProvider::TRUSTED: 239 case CrosSettingsProvider::TRUSTED:
286 // All good, compare account ids below. 240 // All good, compare account ids below.
287 break; 241 break;
288 case CrosSettingsProvider::TEMPORARILY_UNTRUSTED: 242 case CrosSettingsProvider::TEMPORARILY_UNTRUSTED:
289 // The callback passed to PrepareTrustedValues above will trigger a 243 // The callback passed to PrepareTrustedValues above will trigger a
290 // re-check eventually. 244 // re-check eventually.
291 return; 245 return;
292 case CrosSettingsProvider::PERMANENTLY_UNTRUSTED: 246 case CrosSettingsProvider::PERMANENTLY_UNTRUSTED:
293 // There's no trusted account id, which is equivalent to no token present. 247 // There's no trusted account id, which is equivalent to no token present.
294 LOG(WARNING) << "Device settings permanently untrusted."; 248 LOG(WARNING) << "Device settings permanently untrusted.";
295 state_ = STATE_NO_TOKEN; 249 state_ = STATE_NO_TOKEN;
296 FlushPendingRequests(false, GoogleServiceAuthError::USER_NOT_SIGNED_UP); 250 if (service_error_status_observer_)
Mattias Nissler (ping if slow) 2015/07/01 12:34:13 nit: braces
gogerald1 2015/07/01 17:58:42 Done.
251 service_error_status_observer_->OnServiceError(
252 GoogleServiceAuthError::USER_NOT_SIGNED_UP);
297 return; 253 return;
298 } 254 }
299 255
300 std::string policy_robot_id = GetRobotAccountId(); 256 std::string policy_robot_id = GetRobotAccountId();
301 if (policy_robot_id == gaia_robot_id) { 257 if (policy_robot_id == gaia_robot_id) {
302 state_ = STATE_TOKEN_VALID; 258 state_ = STATE_TOKEN_VALID;
303 FlushPendingRequests(true, GoogleServiceAuthError::NONE); 259 if (service_error_status_observer_)
Mattias Nissler (ping if slow) 2015/07/01 12:34:13 nit: braces
gogerald1 2015/07/01 17:58:41 Done.
260 service_error_status_observer_->OnServiceError(
261 GoogleServiceAuthError::NONE);
304 } else { 262 } else {
305 if (gaia_robot_id.empty()) { 263 if (gaia_robot_id.empty()) {
306 LOG(WARNING) << "Device service account owner in policy is empty."; 264 LOG(WARNING) << "Device service account owner in policy is empty.";
307 } else { 265 } else {
308 LOG(WARNING) << "Device service account owner in policy does not match " 266 LOG(WARNING) << "Device service account owner in policy does not match "
309 << "refresh token owner \"" << gaia_robot_id << "\"."; 267 << "refresh token owner \"" << gaia_robot_id << "\".";
310 } 268 }
311 state_ = STATE_TOKEN_INVALID; 269 state_ = STATE_TOKEN_INVALID;
312 FlushPendingRequests(false, 270 if (service_error_status_observer_)
Mattias Nissler (ping if slow) 2015/07/01 12:34:13 nit: braces Given the frequency of this code bloc
gogerald1 2015/07/01 17:58:41 Acknowledged. might be more efficient to inline sh
Mattias Nissler (ping if slow) 2015/07/01 18:50:04 I don't think efficiency is of any concern in this
313 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 271 service_error_status_observer_->OnServiceError(
272 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
314 } 273 }
315 } 274 }
316 275
317 void DeviceOAuth2TokenService::EncryptAndSaveToken() { 276 void DeviceOAuth2TokenServiceDelegate::EncryptAndSaveToken() {
318 DCHECK_NE(state_, STATE_LOADING); 277 DCHECK_NE(state_, STATE_LOADING);
319 278
320 CryptohomeTokenEncryptor encryptor(system_salt_); 279 CryptohomeTokenEncryptor encryptor(system_salt_);
321 std::string encrypted_refresh_token = 280 std::string encrypted_refresh_token =
322 encryptor.EncryptWithSystemSalt(refresh_token_); 281 encryptor.EncryptWithSystemSalt(refresh_token_);
323 bool result = true; 282 bool result = true;
324 if (encrypted_refresh_token.empty()) { 283 if (encrypted_refresh_token.empty()) {
325 LOG(ERROR) << "Failed to encrypt refresh token; save aborted."; 284 LOG(ERROR) << "Failed to encrypt refresh token; save aborted.";
326 result = false; 285 result = false;
327 } else { 286 } else {
328 local_state_->SetString(prefs::kDeviceRobotAnyApiRefreshToken, 287 local_state_->SetString(prefs::kDeviceRobotAnyApiRefreshToken,
329 encrypted_refresh_token); 288 encrypted_refresh_token);
330 } 289 }
331 290
332 FlushTokenSaveCallbacks(result); 291 FlushTokenSaveCallbacks(result);
333 } 292 }
334 293
335 void DeviceOAuth2TokenService::StartValidation() { 294 void DeviceOAuth2TokenServiceDelegate::StartValidation() {
336 DCHECK_EQ(state_, STATE_VALIDATION_PENDING); 295 DCHECK_EQ(state_, STATE_VALIDATION_PENDING);
337 DCHECK(!gaia_oauth_client_); 296 DCHECK(!gaia_oauth_client_);
338 297
339 state_ = STATE_VALIDATION_STARTED; 298 state_ = STATE_VALIDATION_STARTED;
340 299
341 gaia_oauth_client_.reset(new gaia::GaiaOAuthClient( 300 gaia_oauth_client_.reset(
342 g_browser_process->system_request_context())); 301 new gaia::GaiaOAuthClient(g_browser_process->system_request_context()));
343 302
344 GaiaUrls* gaia_urls = GaiaUrls::GetInstance(); 303 GaiaUrls* gaia_urls = GaiaUrls::GetInstance();
345 gaia::OAuthClientInfo client_info; 304 gaia::OAuthClientInfo client_info;
346 client_info.client_id = gaia_urls->oauth2_chrome_client_id(); 305 client_info.client_id = gaia_urls->oauth2_chrome_client_id();
347 client_info.client_secret = gaia_urls->oauth2_chrome_client_secret(); 306 client_info.client_secret = gaia_urls->oauth2_chrome_client_secret();
348 307
349 gaia_oauth_client_->RefreshToken( 308 gaia_oauth_client_->RefreshToken(
350 client_info, 309 client_info, refresh_token_,
351 refresh_token_,
352 std::vector<std::string>(1, GaiaConstants::kOAuthWrapBridgeUserInfoScope), 310 std::vector<std::string>(1, GaiaConstants::kOAuthWrapBridgeUserInfoScope),
353 max_refresh_token_validation_retries_, 311 max_refresh_token_validation_retries_, this);
354 this);
355 } 312 }
356 313
357 void DeviceOAuth2TokenService::FlushPendingRequests( 314 void DeviceOAuth2TokenServiceDelegate::FlushTokenSaveCallbacks(bool result) {
358 bool token_is_valid,
359 GoogleServiceAuthError::State error) {
360 std::vector<PendingRequest*> requests;
361 requests.swap(pending_requests_);
362 for (std::vector<PendingRequest*>::iterator request(requests.begin());
363 request != requests.end();
364 ++request) {
365 scoped_ptr<PendingRequest> scoped_request(*request);
366 if (!scoped_request->request)
367 continue;
368
369 if (token_is_valid) {
370 OAuth2TokenService::FetchOAuth2Token(
371 scoped_request->request.get(),
372 scoped_request->request->GetAccountId(),
373 GetRequestContext(),
374 scoped_request->client_id,
375 scoped_request->client_secret,
376 scoped_request->scopes);
377 } else {
378 FailRequest(scoped_request->request.get(), error);
379 }
380 }
381 }
382
383 void DeviceOAuth2TokenService::FlushTokenSaveCallbacks(bool result) {
384 std::vector<StatusCallback> callbacks; 315 std::vector<StatusCallback> callbacks;
385 callbacks.swap(token_save_callbacks_); 316 callbacks.swap(token_save_callbacks_);
386 for (std::vector<StatusCallback>::iterator callback(callbacks.begin()); 317 for (std::vector<StatusCallback>::iterator callback(callbacks.begin());
387 callback != callbacks.end(); 318 callback != callbacks.end(); ++callback) {
388 ++callback) {
389 if (!callback->is_null()) 319 if (!callback->is_null())
390 callback->Run(result); 320 callback->Run(result);
391 } 321 }
392 } 322 }
393 323
394 void DeviceOAuth2TokenService::FailRequest( 324 void DeviceOAuth2TokenServiceDelegate::HasPendingRequests(bool has) {
Mattias Nissler (ping if slow) 2015/07/01 12:34:13 nit: This should be RequestValidation() and should
gogerald1 2015/07/01 17:58:42 Done.
395 RequestImpl* request, 325 has_pending_requests_ = has;
396 GoogleServiceAuthError::State error) {
397 GoogleServiceAuthError auth_error(error);
398 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
399 &RequestImpl::InformConsumer,
400 request->AsWeakPtr(),
401 auth_error,
402 std::string(),
403 base::Time()));
404 } 326 }
405 327
406 } // namespace chromeos 328 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698