OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/signin/token_service.h" | 5 #include "chrome/browser/signin/token_service.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "chrome/browser/prefs/pref_service.h" | 10 #include "chrome/browser/prefs/pref_service.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 // store tokens and fetch them. Move the key-value storage out of | 96 // store tokens and fetch them. Move the key-value storage out of |
97 // token_service, and leave the token fetching in token_service. | 97 // token_service, and leave the token fetching in token_service. |
98 | 98 |
99 void TokenService::AddAuthTokenManually(const std::string& service, | 99 void TokenService::AddAuthTokenManually(const std::string& service, |
100 const std::string& auth_token) { | 100 const std::string& auth_token) { |
101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
102 VLOG(1) << "Got an authorization token for " << service; | 102 VLOG(1) << "Got an authorization token for " << service; |
103 token_map_[service] = auth_token; | 103 token_map_[service] = auth_token; |
104 FireTokenAvailableNotification(service, auth_token); | 104 FireTokenAvailableNotification(service, auth_token); |
105 SaveAuthTokenToDB(service, auth_token); | 105 SaveAuthTokenToDB(service, auth_token); |
| 106 |
| 107 #if defined(OS_CHROMEOS) |
| 108 // We don't ever want to fetch OAuth2 tokens from LSO service token in case |
| 109 // when ChromeOS is in forced OAuth2 use mode. OAuth2 token should only |
| 110 // arrive into token service exclusively through UpdateCredentialsWithOAuth2. |
| 111 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kForceOAuth1)) |
| 112 return; |
| 113 #endif |
| 114 |
106 // If we got ClientLogin token for "lso" service, and we don't already have | 115 // If we got ClientLogin token for "lso" service, and we don't already have |
107 // OAuth2 tokens, start fetching OAuth2 login scoped token pair. | 116 // OAuth2 tokens, start fetching OAuth2 login scoped token pair. |
108 if (service == GaiaConstants::kLSOService && !HasOAuthLoginToken()) { | 117 if (service == GaiaConstants::kLSOService && !HasOAuthLoginToken()) { |
109 int index = GetServiceIndex(service); | 118 int index = GetServiceIndex(service); |
110 CHECK_GE(index, 0); | 119 CHECK_GE(index, 0); |
111 fetchers_[index]->StartLsoForOAuthLoginTokenExchange(auth_token); | 120 fetchers_[index]->StartLsoForOAuthLoginTokenExchange(auth_token); |
112 } | 121 } |
113 } | 122 } |
114 | 123 |
115 | 124 |
(...skipping 24 matching lines...) Expand all Loading... |
140 SaveAuthTokenToDB(GaiaConstants::kGaiaLsid, credentials.lsid); | 149 SaveAuthTokenToDB(GaiaConstants::kGaiaLsid, credentials.lsid); |
141 SaveAuthTokenToDB(GaiaConstants::kGaiaSid, credentials.sid); | 150 SaveAuthTokenToDB(GaiaConstants::kGaiaSid, credentials.sid); |
142 | 151 |
143 // Cancel any currently running requests. | 152 // Cancel any currently running requests. |
144 for (size_t i = 0; i < arraysize(kServices); i++) { | 153 for (size_t i = 0; i < arraysize(kServices); i++) { |
145 fetchers_[i].reset(); | 154 fetchers_[i].reset(); |
146 } | 155 } |
147 } | 156 } |
148 | 157 |
149 void TokenService::UpdateCredentialsWithOAuth2( | 158 void TokenService::UpdateCredentialsWithOAuth2( |
150 const GaiaAuthConsumer::ClientOAuthResult& credentials) { | 159 const GaiaAuthConsumer::ClientOAuthResult& oauth2_tokens) { |
151 // Will be implemented once the ClientOAuth signin is complete. Not called | 160 SaveOAuth2Credentials(oauth2_tokens); |
152 // yet by any code. | |
153 NOTREACHED(); | |
154 } | 161 } |
155 | 162 |
156 void TokenService::LoadTokensFromDB() { | 163 void TokenService::LoadTokensFromDB() { |
157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 164 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
158 if (web_data_service_.get()) | 165 if (web_data_service_.get()) |
159 token_loading_query_ = web_data_service_->GetAllTokens(this); | 166 token_loading_query_ = web_data_service_->GetAllTokens(this); |
160 } | 167 } |
161 | 168 |
162 void TokenService::SaveAuthTokenToDB(const std::string& service, | 169 void TokenService::SaveAuthTokenToDB(const std::string& service, |
163 const std::string& auth_token) { | 170 const std::string& auth_token) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 // Note map[key] is not const. | 232 // Note map[key] is not const. |
226 return (*token_map_.find(service)).second; | 233 return (*token_map_.find(service)).second; |
227 } | 234 } |
228 return EmptyString(); | 235 return EmptyString(); |
229 } | 236 } |
230 | 237 |
231 bool TokenService::HasOAuthLoginToken() const { | 238 bool TokenService::HasOAuthLoginToken() const { |
232 return HasTokenForService(GaiaConstants::kGaiaOAuth2LoginRefreshToken); | 239 return HasTokenForService(GaiaConstants::kGaiaOAuth2LoginRefreshToken); |
233 } | 240 } |
234 | 241 |
| 242 bool TokenService::HasOAuthLoginAccessToken() const { |
| 243 return HasTokenForService(GaiaConstants::kGaiaOAuth2LoginAccessToken); |
| 244 } |
| 245 |
235 const std::string& TokenService::GetOAuth2LoginRefreshToken() const { | 246 const std::string& TokenService::GetOAuth2LoginRefreshToken() const { |
236 return GetTokenForService(GaiaConstants::kGaiaOAuth2LoginRefreshToken); | 247 return GetTokenForService(GaiaConstants::kGaiaOAuth2LoginRefreshToken); |
237 } | 248 } |
238 | 249 |
239 const std::string& TokenService::GetOAuth2LoginAccessToken() const { | 250 const std::string& TokenService::GetOAuth2LoginAccessToken() const { |
240 return GetTokenForService(GaiaConstants::kGaiaOAuth2LoginAccessToken); | 251 return GetTokenForService(GaiaConstants::kGaiaOAuth2LoginAccessToken); |
241 } | 252 } |
242 | 253 |
243 // static | 254 // static |
244 void TokenService::GetServiceNamesForTesting(std::vector<std::string>* names) { | 255 void TokenService::GetServiceNamesForTesting(std::vector<std::string>* names) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 const GoogleServiceAuthError& error) { | 316 const GoogleServiceAuthError& error) { |
306 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 317 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
307 LOG(WARNING) << "Auth token issuing failed for service:" << service | 318 LOG(WARNING) << "Auth token issuing failed for service:" << service |
308 << ", error: " << error.ToString(); | 319 << ", error: " << error.ToString(); |
309 FireTokenRequestFailedNotification(service, error); | 320 FireTokenRequestFailedNotification(service, error); |
310 } | 321 } |
311 | 322 |
312 void TokenService::OnClientOAuthSuccess(const ClientOAuthResult& result) { | 323 void TokenService::OnClientOAuthSuccess(const ClientOAuthResult& result) { |
313 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 324 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
314 VLOG(1) << "Got OAuth2 login token pair"; | 325 VLOG(1) << "Got OAuth2 login token pair"; |
| 326 SaveOAuth2Credentials(result); |
| 327 } |
| 328 |
| 329 void TokenService::SaveOAuth2Credentials(const ClientOAuthResult& result) { |
315 token_map_[GaiaConstants::kGaiaOAuth2LoginRefreshToken] = | 330 token_map_[GaiaConstants::kGaiaOAuth2LoginRefreshToken] = |
316 result.refresh_token; | 331 result.refresh_token; |
317 token_map_[GaiaConstants::kGaiaOAuth2LoginAccessToken] = result.access_token; | 332 token_map_[GaiaConstants::kGaiaOAuth2LoginAccessToken] = result.access_token; |
| 333 // Save refresh token only since access token is transient anyway. |
318 SaveAuthTokenToDB(GaiaConstants::kGaiaOAuth2LoginRefreshToken, | 334 SaveAuthTokenToDB(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
319 result.refresh_token); | 335 result.refresh_token); |
320 SaveAuthTokenToDB(GaiaConstants::kGaiaOAuth2LoginAccessToken, | |
321 result.access_token); | |
322 // We don't save expiration information for now. | 336 // We don't save expiration information for now. |
323 | 337 |
324 FireTokenAvailableNotification(GaiaConstants::kGaiaOAuth2LoginRefreshToken, | 338 FireTokenAvailableNotification(GaiaConstants::kGaiaOAuth2LoginRefreshToken, |
325 result.refresh_token); | 339 result.refresh_token); |
326 } | 340 } |
327 | 341 |
328 void TokenService::OnClientOAuthFailure( | 342 void TokenService::OnClientOAuthFailure( |
329 const GoogleServiceAuthError& error) { | 343 const GoogleServiceAuthError& error) { |
330 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 344 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
331 LOG(WARNING) << "OAuth2 login token pair fetch failed: " << error.ToString(); | 345 LOG(WARNING) << "OAuth2 login token pair fetch failed: " << error.ToString(); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 if (!in_memory_tokens->count(service) && db_tokens.count(service)) { | 428 if (!in_memory_tokens->count(service) && db_tokens.count(service)) { |
415 std::string db_token = db_tokens.find(service)->second; | 429 std::string db_token = db_tokens.find(service)->second; |
416 if (!db_token.empty()) { | 430 if (!db_token.empty()) { |
417 VLOG(1) << "Loading " << service << " token from DB: " << db_token; | 431 VLOG(1) << "Loading " << service << " token from DB: " << db_token; |
418 (*in_memory_tokens)[service] = db_token; | 432 (*in_memory_tokens)[service] = db_token; |
419 FireTokenAvailableNotification(service, db_token); | 433 FireTokenAvailableNotification(service, db_token); |
420 // Failures are only for network errors. | 434 // Failures are only for network errors. |
421 } | 435 } |
422 } | 436 } |
423 } | 437 } |
OLD | NEW |