OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/login/login_utils.h" | 5 #include "chrome/browser/chromeos/login/login_utils.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
11 #include "base/file_path.h" | 11 #include "base/file_path.h" |
12 #include "base/file_util.h" | 12 #include "base/file_util.h" |
13 #include "base/location.h" | 13 #include "base/location.h" |
14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
16 #include "base/memory/singleton.h" | 16 #include "base/memory/singleton.h" |
17 #include "base/path_service.h" | 17 #include "base/path_service.h" |
18 #include "base/string_util.h" | 18 #include "base/string_util.h" |
19 #include "base/stringprintf.h" | 19 #include "base/stringprintf.h" |
20 #include "base/synchronization/lock.h" | 20 #include "base/synchronization/lock.h" |
21 #include "base/threading/thread_restrictions.h" | 21 #include "base/threading/thread_restrictions.h" |
22 #include "base/time.h" | 22 #include "base/time.h" |
23 #include "base/utf_string_conversions.h" | 23 #include "base/utf_string_conversions.h" |
24 #include "chrome/browser/browser_process.h" | 24 #include "chrome/browser/browser_process.h" |
25 #include "chrome/browser/browser_shutdown.h" | 25 #include "chrome/browser/browser_shutdown.h" |
26 #include "chrome/browser/chromeos/boot_times_loader.h" | 26 #include "chrome/browser/chromeos/boot_times_loader.h" |
27 #include "chrome/browser/chromeos/cros/network_library.h" | 27 #include "chrome/browser/chromeos/cros/network_library.h" |
28 #include "chrome/browser/chromeos/cros/cert_library.h" | |
Nikita (slow)
2011/12/01 14:34:13
nit: Move one line up.
zel
2011/12/02 02:35:23
Done.
| |
28 #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" | 29 #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" |
29 #include "chrome/browser/chromeos/dbus/session_manager_client.h" | 30 #include "chrome/browser/chromeos/dbus/session_manager_client.h" |
30 #include "chrome/browser/chromeos/input_method/input_method_manager.h" | 31 #include "chrome/browser/chromeos/input_method/input_method_manager.h" |
31 #include "chrome/browser/chromeos/input_method/input_method_util.h" | 32 #include "chrome/browser/chromeos/input_method/input_method_util.h" |
32 #include "chrome/browser/chromeos/login/background_view.h" | 33 #include "chrome/browser/chromeos/login/background_view.h" |
33 #include "chrome/browser/chromeos/login/cookie_fetcher.h" | 34 #include "chrome/browser/chromeos/login/cookie_fetcher.h" |
34 #include "chrome/browser/chromeos/login/language_switch_menu.h" | 35 #include "chrome/browser/chromeos/login/language_switch_menu.h" |
35 #include "chrome/browser/chromeos/login/login_display_host.h" | 36 #include "chrome/browser/chromeos/login/login_display_host.h" |
36 #include "chrome/browser/chromeos/login/ownership_service.h" | 37 #include "chrome/browser/chromeos/login/ownership_service.h" |
37 #include "chrome/browser/chromeos/login/parallel_authenticator.h" | 38 #include "chrome/browser/chromeos/login/parallel_authenticator.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
97 | 98 |
98 // The service scope of the OAuth v2 token that ChromeOS login will be | 99 // The service scope of the OAuth v2 token that ChromeOS login will be |
99 // requesting. | 100 // requesting. |
100 // TODO(zelidrag): Figure out if we need to add more services here. | 101 // TODO(zelidrag): Figure out if we need to add more services here. |
101 const char kServiceScopeChromeOS[] = | 102 const char kServiceScopeChromeOS[] = |
102 "https://www.googleapis.com/auth/chromesync"; | 103 "https://www.googleapis.com/auth/chromesync"; |
103 | 104 |
104 const char kServiceScopeChromeOSDeviceManagement[] = | 105 const char kServiceScopeChromeOSDeviceManagement[] = |
105 "https://www.googleapis.com/auth/chromeosdevicemanagement"; | 106 "https://www.googleapis.com/auth/chromeosdevicemanagement"; |
106 | 107 |
108 const char kServiceScopeChromeOSDocuments[] = | |
109 "https://docs.google.com/feeds/ " | |
110 "https://spreadsheets.google.com/feeds/ " | |
111 "https://docs.googleusercontent.com/"; | |
112 | |
107 class InitializeCookieMonsterHelper { | 113 class InitializeCookieMonsterHelper { |
108 public: | 114 public: |
109 explicit InitializeCookieMonsterHelper( | 115 explicit InitializeCookieMonsterHelper( |
110 net::URLRequestContextGetter* new_context) | 116 net::URLRequestContextGetter* new_context) |
111 : ALLOW_THIS_IN_INITIALIZER_LIST(callback_(base::Bind( | 117 : ALLOW_THIS_IN_INITIALIZER_LIST(callback_(base::Bind( |
112 &InitializeCookieMonsterHelper::InitializeCookieMonster, | 118 &InitializeCookieMonsterHelper::InitializeCookieMonster, |
113 base::Unretained(this)))), | 119 base::Unretained(this)))), |
114 new_context_(new_context) { | 120 new_context_(new_context) { |
115 } | 121 } |
116 | 122 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
170 class Delegate { | 176 class Delegate { |
171 public: | 177 public: |
172 virtual ~Delegate() {} | 178 virtual ~Delegate() {} |
173 virtual void OnOAuthVerificationSucceeded(const std::string& user_name, | 179 virtual void OnOAuthVerificationSucceeded(const std::string& user_name, |
174 const std::string& sid, | 180 const std::string& sid, |
175 const std::string& lsid, | 181 const std::string& lsid, |
176 const std::string& auth) {} | 182 const std::string& auth) {} |
177 virtual void OnOAuthVerificationFailed(const std::string& user_name) {} | 183 virtual void OnOAuthVerificationFailed(const std::string& user_name) {} |
178 virtual void OnUserCookiesFetchSucceeded(const std::string& user_name) {} | 184 virtual void OnUserCookiesFetchSucceeded(const std::string& user_name) {} |
179 virtual void OnUserCookiesFetchFailed(const std::string& user_name) {} | 185 virtual void OnUserCookiesFetchFailed(const std::string& user_name) {} |
186 virtual void OnDocumentsTokenFetchSucceeded(const std::string& username, | |
187 const std::string& oauth2_token) {} | |
188 virtual void OnDocumentsTokenFetchFailed(const std::string& username) {} | |
180 }; | 189 }; |
181 | 190 |
182 OAuthLoginVerifier(OAuthLoginVerifier::Delegate* delegate, | 191 OAuthLoginVerifier(OAuthLoginVerifier::Delegate* delegate, |
183 Profile* user_profile, | 192 Profile* user_profile, |
184 const std::string& oauth1_token, | 193 const std::string& oauth1_token, |
185 const std::string& oauth1_secret, | 194 const std::string& oauth1_secret, |
186 const std::string& username) | 195 const std::string& username) |
187 : delegate_(delegate), | 196 : delegate_(delegate), |
188 oauth_fetcher_(this, | 197 oauth_fetcher_(this, |
189 user_profile->GetOffTheRecordProfile()->GetRequestContext(), | 198 user_profile->GetOffTheRecordProfile()->GetRequestContext(), |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
265 VERIFICATION_STEP_FAILED, | 274 VERIFICATION_STEP_FAILED, |
266 } VerificationStep; | 275 } VerificationStep; |
267 | 276 |
268 // Kicks off GAIA session cookie retreival process. | 277 // Kicks off GAIA session cookie retreival process. |
269 void StartCookiesRetreival() { | 278 void StartCookiesRetreival() { |
270 DCHECK(!sid_.empty()); | 279 DCHECK(!sid_.empty()); |
271 DCHECK(!lsid_.empty()); | 280 DCHECK(!lsid_.empty()); |
272 gaia_fetcher_.StartIssueAuthToken(sid_, lsid_, GaiaConstants::kGaiaService); | 281 gaia_fetcher_.StartIssueAuthToken(sid_, lsid_, GaiaConstants::kGaiaService); |
273 } | 282 } |
274 | 283 |
284 void StartDocsTokenRetreival() { | |
285 DCHECK(!oauth1_token_.empty()); | |
286 DCHECK(!oauth1_secret_.empty()); | |
287 oauth_fetcher_.SetAutoFetchLimit( | |
288 GaiaOAuthFetcher::OAUTH2_SERVICE_ACCESS_TOKEN); | |
289 oauth_fetcher_.StartOAuthWrapBridge( | |
290 oauth1_token_, oauth1_secret_, GaiaConstants::kGaiaOAuthDuration, | |
291 std::string(kServiceScopeChromeOSDocuments)); | |
292 } | |
293 | |
275 // Decides how to proceed on GAIA response and other errors. It can schedule | 294 // Decides how to proceed on GAIA response and other errors. It can schedule |
276 // to rerun the verification process if detects transient network or service | 295 // to rerun the verification process if detects transient network or service |
277 // errors. | 296 // errors. |
278 bool RetryOnError(const GoogleServiceAuthError& error) { | 297 bool RetryOnError(const GoogleServiceAuthError& error) { |
279 // If we can't connect to GAIA due to network or service related reasons, | 298 // If we can't connect to GAIA due to network or service related reasons, |
280 // we should attempt OAuth token verification again. | 299 // we should attempt OAuth token verification again. |
281 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED || | 300 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED || |
282 error.state() == GoogleServiceAuthError::SERVICE_UNAVAILABLE) { | 301 error.state() == GoogleServiceAuthError::SERVICE_UNAVAILABLE) { |
283 if (verification_count_ < kMaxOAuthTokenVerificationAttemptCount) { | 302 if (verification_count_ < kMaxOAuthTokenVerificationAttemptCount) { |
284 BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, | 303 BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, |
285 base::Bind(&OAuthLoginVerifier::ContinueVerification, AsWeakPtr()), | 304 base::Bind(&OAuthLoginVerifier::ContinueVerification, AsWeakPtr()), |
286 kOAuthVerificationRestartDelay); | 305 kOAuthVerificationRestartDelay); |
287 return true; | 306 return true; |
288 } | 307 } |
289 } | 308 } |
290 step_ = VERIFICATION_STEP_FAILED; | 309 step_ = VERIFICATION_STEP_FAILED; |
291 return false; | 310 return false; |
292 } | 311 } |
293 | 312 |
294 // GaiaOAuthConsumer implementation: | 313 // GaiaOAuthConsumer implementation: |
295 virtual void OnOAuthLoginSuccess(const std::string& sid, | 314 virtual void OnOAuthLoginSuccess(const std::string& sid, |
296 const std::string& lsid, | 315 const std::string& lsid, |
297 const std::string& auth) OVERRIDE { | 316 const std::string& auth) OVERRIDE { |
298 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 317 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
299 step_ = VERIFICATION_STEP_OAUTH_VERIFIED; | 318 step_ = VERIFICATION_STEP_OAUTH_VERIFIED; |
300 verification_count_ = 0; | 319 verification_count_ = 0; |
301 sid_ = sid; | 320 sid_ = sid; |
302 lsid_ = lsid; | 321 lsid_ = lsid; |
303 delegate_->OnOAuthVerificationSucceeded(username_, sid, lsid, auth); | 322 delegate_->OnOAuthVerificationSucceeded(username_, sid, lsid, auth); |
323 StartDocsTokenRetreival(); | |
Nikita (slow)
2011/12/01 14:34:13
Could this be initiated from FetchSecondaryTokens(
zel
2011/12/02 02:35:23
All docs token retrieval related changes in this c
| |
304 StartCookiesRetreival(); | 324 StartCookiesRetreival(); |
305 } | 325 } |
306 | 326 |
307 virtual void OnOAuthLoginFailure( | 327 virtual void OnOAuthLoginFailure( |
308 const GoogleServiceAuthError& error) OVERRIDE { | 328 const GoogleServiceAuthError& error) OVERRIDE { |
309 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 329 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
310 LOG(WARNING) << "Failed to verify OAuth1 access tokens," | 330 LOG(WARNING) << "Failed to verify OAuth1 access tokens," |
311 << " error.state=" << error.state(); | 331 << " error.state=" << error.state(); |
312 if (!RetryOnError(error)) | 332 if (!RetryOnError(error)) |
313 delegate_->OnOAuthVerificationFailed(username_); | 333 delegate_->OnOAuthVerificationFailed(username_); |
(...skipping 25 matching lines...) Expand all Loading... | |
339 delegate_->OnUserCookiesFetchSucceeded(username_); | 359 delegate_->OnUserCookiesFetchSucceeded(username_); |
340 } | 360 } |
341 | 361 |
342 virtual void OnMergeSessionFailure( | 362 virtual void OnMergeSessionFailure( |
343 const GoogleServiceAuthError& error) OVERRIDE { | 363 const GoogleServiceAuthError& error) OVERRIDE { |
344 DVLOG(1) << "Failed MergeSession request," | 364 DVLOG(1) << "Failed MergeSession request," |
345 << " error.state=" << error.state(); | 365 << " error.state=" << error.state(); |
346 OnCookueFetchFailed(error); | 366 OnCookueFetchFailed(error); |
347 } | 367 } |
348 | 368 |
369 virtual void OnOAuthWrapBridgeSuccess( | |
370 const std::string& service_name, | |
371 const std::string& token, | |
372 const std::string& expires_in) OVERRIDE { | |
373 VLOG(1) << "Got OAuth access token for " << service_name; | |
374 delegate_->OnDocumentsTokenFetchSucceeded(username_, token); | |
375 } | |
376 | |
377 virtual void OnOAuthWrapBridgeFailure( | |
378 const std::string& service_name, | |
379 const GoogleServiceAuthError& error) OVERRIDE { | |
380 LOG(WARNING) << "Failed to get OAuth access token for " << service_name | |
381 << ", error: " << error.state(); | |
382 if (!RetryOnError(error)) | |
383 delegate_->OnDocumentsTokenFetchFailed(username_); | |
384 } | |
385 | |
349 OAuthLoginVerifier::Delegate* delegate_; | 386 OAuthLoginVerifier::Delegate* delegate_; |
350 GaiaOAuthFetcher oauth_fetcher_; | 387 GaiaOAuthFetcher oauth_fetcher_; |
351 GaiaAuthFetcher gaia_fetcher_; | 388 GaiaAuthFetcher gaia_fetcher_; |
352 std::string oauth1_token_; | 389 std::string oauth1_token_; |
353 std::string oauth1_secret_; | 390 std::string oauth1_secret_; |
354 std::string sid_; | 391 std::string sid_; |
355 std::string lsid_; | 392 std::string lsid_; |
356 std::string username_; | 393 std::string username_; |
357 Profile* user_profile_; | 394 Profile* user_profile_; |
358 int verification_count_; | 395 int verification_count_; |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1104 } | 1141 } |
1105 } | 1142 } |
1106 | 1143 |
1107 void LoginUtilsImpl::RestoreAuthenticationSession(const std::string& username, | 1144 void LoginUtilsImpl::RestoreAuthenticationSession(const std::string& username, |
1108 Profile* user_profile) { | 1145 Profile* user_profile) { |
1109 username_ = username; | 1146 username_ = username; |
1110 KickStartAuthentication(user_profile); | 1147 KickStartAuthentication(user_profile); |
1111 } | 1148 } |
1112 | 1149 |
1113 void LoginUtilsImpl::KickStartAuthentication(Profile* user_profile) { | 1150 void LoginUtilsImpl::KickStartAuthentication(Profile* user_profile) { |
1114 if (!authenticator_.get()) | |
1115 CreateAuthenticator(NULL); | |
1116 std::string oauth1_token; | 1151 std::string oauth1_token; |
1117 std::string oauth1_secret; | 1152 std::string oauth1_secret; |
1118 if (ReadOAuth1AccessToken(user_profile, &oauth1_token, &oauth1_secret)) | 1153 if (ReadOAuth1AccessToken(user_profile, &oauth1_token, &oauth1_secret)) |
1119 VerifyOAuth1AccessToken(user_profile, oauth1_token, oauth1_secret); | 1154 VerifyOAuth1AccessToken(user_profile, oauth1_token, oauth1_secret); |
1120 | |
1121 authenticator_ = NULL; | |
1122 } | 1155 } |
1123 | 1156 |
1124 void LoginUtilsImpl::SetBackgroundView(BackgroundView* background_view) { | 1157 void LoginUtilsImpl::SetBackgroundView(BackgroundView* background_view) { |
1125 background_view_ = background_view; | 1158 background_view_ = background_view; |
1126 } | 1159 } |
1127 | 1160 |
1128 BackgroundView* LoginUtilsImpl::GetBackgroundView() { | 1161 BackgroundView* LoginUtilsImpl::GetBackgroundView() { |
1129 return background_view_; | 1162 return background_view_; |
1130 } | 1163 } |
1131 | 1164 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1191 User::OAUTH_TOKEN_STATUS_VALID) { | 1224 User::OAUTH_TOKEN_STATUS_VALID) { |
1192 return false; | 1225 return false; |
1193 } | 1226 } |
1194 | 1227 |
1195 PrefService* pref_service = user_profile->GetPrefs(); | 1228 PrefService* pref_service = user_profile->GetPrefs(); |
1196 std::string encoded_token = pref_service->GetString(prefs::kOAuth1Token); | 1229 std::string encoded_token = pref_service->GetString(prefs::kOAuth1Token); |
1197 std::string encoded_secret = pref_service->GetString(prefs::kOAuth1Secret); | 1230 std::string encoded_secret = pref_service->GetString(prefs::kOAuth1Secret); |
1198 if (!encoded_token.length() || !encoded_secret.length()) | 1231 if (!encoded_token.length() || !encoded_secret.length()) |
1199 return false; | 1232 return false; |
1200 | 1233 |
1201 DCHECK(authenticator_.get()); | 1234 std::string decoded_token = |
1202 std::string decoded_token = authenticator_->DecryptToken(encoded_token); | 1235 CrosLibrary::Get()->GetCertLibrary()->DecryptToken(encoded_token); |
1203 std::string decoded_secret = authenticator_->DecryptToken(encoded_secret); | 1236 std::string decoded_secret = |
1237 CrosLibrary::Get()->GetCertLibrary()->DecryptToken(encoded_secret); | |
1204 if (!decoded_token.length() || !decoded_secret.length()) | 1238 if (!decoded_token.length() || !decoded_secret.length()) |
1205 return false; | 1239 return false; |
1206 | 1240 |
1207 *token = decoded_token; | 1241 *token = decoded_token; |
1208 *secret = decoded_secret; | 1242 *secret = decoded_secret; |
1209 return true; | 1243 return true; |
1210 } | 1244 } |
1211 | 1245 |
1212 void LoginUtilsImpl::StoreOAuth1AccessToken(Profile* user_profile, | 1246 void LoginUtilsImpl::StoreOAuth1AccessToken(Profile* user_profile, |
1213 const std::string& token, | 1247 const std::string& token, |
1214 const std::string& secret) { | 1248 const std::string& secret) { |
1215 // First store OAuth1 token + service for the current user profile... | 1249 // First store OAuth1 token + service for the current user profile... |
1216 PrefService* pref_service = user_profile->GetPrefs(); | 1250 PrefService* pref_service = user_profile->GetPrefs(); |
1217 pref_service->SetString(prefs::kOAuth1Token, | 1251 pref_service->SetString(prefs::kOAuth1Token, |
1218 authenticator_->EncryptToken(token)); | 1252 CrosLibrary::Get()->GetCertLibrary()->EncryptToken(token)); |
1219 pref_service->SetString(prefs::kOAuth1Secret, | 1253 pref_service->SetString(prefs::kOAuth1Secret, |
1220 authenticator_->EncryptToken(secret)); | 1254 CrosLibrary::Get()->GetCertLibrary()->EncryptToken(secret)); |
1221 | 1255 |
1222 // ...then record the presence of valid OAuth token for this account in local | 1256 // ...then record the presence of valid OAuth token for this account in local |
1223 // state as well. | 1257 // state as well. |
1224 UserManager::Get()->SaveUserOAuthStatus(username_, | 1258 UserManager::Get()->SaveUserOAuthStatus(username_, |
1225 User::OAUTH_TOKEN_STATUS_VALID); | 1259 User::OAUTH_TOKEN_STATUS_VALID); |
1226 } | 1260 } |
1227 | 1261 |
1228 void LoginUtilsImpl::VerifyOAuth1AccessToken(Profile* user_profile, | 1262 void LoginUtilsImpl::VerifyOAuth1AccessToken(Profile* user_profile, |
1229 const std::string& token, | 1263 const std::string& token, |
1230 const std::string& secret) { | 1264 const std::string& secret) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1327 // Mark login host for deletion after browser starts. This | 1361 // Mark login host for deletion after browser starts. This |
1328 // guarantees that the message loop will be referenced by the | 1362 // guarantees that the message loop will be referenced by the |
1329 // browser before it is dereferenced by the login host. | 1363 // browser before it is dereferenced by the login host. |
1330 if (login_host) { | 1364 if (login_host) { |
1331 login_host->OnSessionStart(); | 1365 login_host->OnSessionStart(); |
1332 login_host = NULL; | 1366 login_host = NULL; |
1333 } | 1367 } |
1334 } | 1368 } |
1335 | 1369 |
1336 } // namespace chromeos | 1370 } // namespace chromeos |
OLD | NEW |