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" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
95 const char kServiceScopeChromeOS[] = | 95 const char kServiceScopeChromeOS[] = |
96 "https://www.googleapis.com/auth/chromesync"; | 96 "https://www.googleapis.com/auth/chromesync"; |
97 | 97 |
98 const char kServiceScopeChromeOSDeviceManagement[] = | 98 const char kServiceScopeChromeOSDeviceManagement[] = |
99 "https://www.googleapis.com/auth/chromeosdevicemanagement"; | 99 "https://www.googleapis.com/auth/chromeosdevicemanagement"; |
100 } // namespace | 100 } // namespace |
101 | 101 |
102 // Task for fetching tokens from UI thread. | 102 // Task for fetching tokens from UI thread. |
103 class StartSyncOnUIThreadTask : public Task { | 103 class StartSyncOnUIThreadTask : public Task { |
104 public: | 104 public: |
105 StartSyncOnUIThreadTask( | 105 explicit StartSyncOnUIThreadTask( |
106 const GaiaAuthConsumer::ClientLoginResult& credentials) | 106 const GaiaAuthConsumer::ClientLoginResult& credentials) |
107 : credentials_(credentials) {} | 107 : credentials_(credentials) {} |
108 virtual ~StartSyncOnUIThreadTask() {} | 108 virtual ~StartSyncOnUIThreadTask() {} |
109 | 109 |
110 // Task override. | 110 // Task override. |
111 virtual void Run() { | 111 virtual void Run() OVERRIDE { |
112 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 112 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
113 LoginUtils::Get()->FetchCookies(ProfileManager::GetDefaultProfile(), | 113 LoginUtils::Get()->FetchCookies(ProfileManager::GetDefaultProfile(), |
114 credentials_); | 114 credentials_); |
115 LoginUtils::Get()->StartSync(ProfileManager::GetDefaultProfile(), | 115 LoginUtils::Get()->StartSync(ProfileManager::GetDefaultProfile(), |
116 credentials_); | 116 credentials_); |
117 } | 117 } |
118 | 118 |
119 private: | 119 private: |
120 GaiaAuthConsumer::ClientLoginResult credentials_; | 120 GaiaAuthConsumer::ClientLoginResult credentials_; |
121 | |
122 DISALLOW_COPY_AND_ASSIGN(StartSyncOnUIThreadTask); | |
121 }; | 123 }; |
122 | 124 |
123 // Transfers initial set of Profile cookies from the default profile. | 125 // Transfers initial set of Profile cookies from the default profile. |
124 class TransferDefaultCookiesOnIOThreadTask : public Task { | 126 class TransferDefaultCookiesOnIOThreadTask : public Task { |
125 public: | 127 public: |
126 TransferDefaultCookiesOnIOThreadTask( | 128 TransferDefaultCookiesOnIOThreadTask( |
127 net::URLRequestContextGetter* auth_context, | 129 net::URLRequestContextGetter* auth_context, |
128 net::URLRequestContextGetter* new_context) | 130 net::URLRequestContextGetter* new_context) |
129 : auth_context_(auth_context), | 131 : auth_context_(auth_context), |
130 new_context_(new_context) {} | 132 new_context_(new_context) {} |
131 virtual ~TransferDefaultCookiesOnIOThreadTask() {} | 133 virtual ~TransferDefaultCookiesOnIOThreadTask() {} |
132 | 134 |
133 // Task override. | 135 // Task override. |
134 virtual void Run() { | 136 virtual void Run() OVERRIDE { |
135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
136 net::CookieStore* default_store = | 138 net::CookieStore* default_store = |
137 auth_context_->GetURLRequestContext()->cookie_store(); | 139 auth_context_->GetURLRequestContext()->cookie_store(); |
138 net::CookieMonster* default_monster = default_store->GetCookieMonster(); | 140 net::CookieMonster* default_monster = default_store->GetCookieMonster(); |
139 default_monster->SetKeepExpiredCookies(); | 141 default_monster->SetKeepExpiredCookies(); |
140 default_monster->GetAllCookiesAsync( | 142 default_monster->GetAllCookiesAsync( |
141 base::Bind( | 143 base::Bind( |
142 &TransferDefaultCookiesOnIOThreadTask::InitializeCookieMonster, | 144 &TransferDefaultCookiesOnIOThreadTask::InitializeCookieMonster, |
143 base::Unretained(this))); | 145 base::Unretained(this))); |
144 } | 146 } |
145 | 147 |
146 void InitializeCookieMonster(const net::CookieList& cookies) { | 148 void InitializeCookieMonster(const net::CookieList& cookies) { |
147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
148 net::CookieStore* new_store = | 150 net::CookieStore* new_store = |
149 new_context_->GetURLRequestContext()->cookie_store(); | 151 new_context_->GetURLRequestContext()->cookie_store(); |
150 net::CookieMonster* new_monster = new_store->GetCookieMonster(); | 152 net::CookieMonster* new_monster = new_store->GetCookieMonster(); |
151 | 153 |
152 if (!new_monster->InitializeFrom(cookies)) { | 154 if (!new_monster->InitializeFrom(cookies)) { |
153 LOG(WARNING) << "Failed initial cookie transfer."; | 155 LOG(WARNING) << "Failed initial cookie transfer."; |
154 } | 156 } |
155 } | 157 } |
156 | 158 |
157 private: | 159 private: |
158 net::URLRequestContextGetter* auth_context_; | 160 net::URLRequestContextGetter* auth_context_; |
159 net::URLRequestContextGetter* new_context_; | 161 net::URLRequestContextGetter* new_context_; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
216 GaiaConstants::kPicasaService, | 218 GaiaConstants::kPicasaService, |
217 oauth1_token_, | 219 oauth1_token_, |
218 oauth1_secret_); | 220 oauth1_secret_); |
219 } | 221 } |
220 } | 222 } |
221 | 223 |
222 // GaiaOAuthConsumer implementation: | 224 // GaiaOAuthConsumer implementation: |
223 virtual void OnOAuthLoginSuccess(const std::string& sid, | 225 virtual void OnOAuthLoginSuccess(const std::string& sid, |
224 const std::string& lsid, | 226 const std::string& lsid, |
225 const std::string& auth) OVERRIDE { | 227 const std::string& auth) OVERRIDE { |
226 GaiaAuthConsumer::ClientLoginResult credentials(sid, | 228 GaiaAuthConsumer::ClientLoginResult credentials( |
227 lsid, auth, std::string()); | 229 sid, lsid, auth, std::string()); |
228 UserManager::Get()->set_offline_login(false); | 230 UserManager::Get()->set_offline_login(false); |
229 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 231 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
230 new StartSyncOnUIThreadTask(credentials)); | 232 new StartSyncOnUIThreadTask(credentials)); |
231 } | 233 } |
232 | 234 |
233 virtual void OnOAuthLoginFailure( | 235 virtual void OnOAuthLoginFailure( |
234 const GoogleServiceAuthError& error) OVERRIDE { | 236 const GoogleServiceAuthError& error) OVERRIDE { |
235 LOG(WARNING) << "Failed to verify OAuth1 access tokens," | 237 LOG(WARNING) << "Failed to verify OAuth1 access tokens, error: " |
236 << " error.state=" << error.state(); | 238 << error.state(); |
237 | 239 |
238 // Mark this account's OAuth token state as invalid if the failure is not | 240 // Mark this account's OAuth token state as invalid if the failure is not |
239 // caused by network error. | 241 // caused by network error. |
240 if (error.state() != GoogleServiceAuthError::CONNECTION_FAILED) { | 242 if (error.state() != GoogleServiceAuthError::CONNECTION_FAILED) { |
241 UserManager::Get()->SaveUserOAuthStatus(username_, | 243 UserManager::Get()->SaveUserOAuthStatus(username_, |
242 User::OAUTH_TOKEN_STATUS_INVALID); | 244 User::OAUTH_TOKEN_STATUS_INVALID); |
243 } else { | 245 } else { |
244 UserManager::Get()->set_offline_login(true); | 246 UserManager::Get()->set_offline_login(true); |
245 } | 247 } |
246 } | 248 } |
(...skipping 23 matching lines...) Expand all Loading... | |
270 } | 272 } |
271 | 273 |
272 // GaiaAuthConsumer overrides. | 274 // GaiaAuthConsumer overrides. |
273 virtual void OnIssueAuthTokenSuccess(const std::string& service, | 275 virtual void OnIssueAuthTokenSuccess(const std::string& service, |
274 const std::string& auth_token) OVERRIDE { | 276 const std::string& auth_token) OVERRIDE { |
275 gaia_fetcher_.StartMergeSession(auth_token); | 277 gaia_fetcher_.StartMergeSession(auth_token); |
276 } | 278 } |
277 | 279 |
278 virtual void OnIssueAuthTokenFailure(const std::string& service, | 280 virtual void OnIssueAuthTokenFailure(const std::string& service, |
279 const GoogleServiceAuthError& error) OVERRIDE { | 281 const GoogleServiceAuthError& error) OVERRIDE { |
280 LOG(WARNING) << "Failed IssueAuthToken request," | 282 LOG(WARNING) << "Failed IssueAuthToken request, error: " << error.state(); |
281 << " error.state=" << error.state(); | |
282 HandlerGaiaAuthError(error); | 283 HandlerGaiaAuthError(error); |
283 delete this; | 284 delete this; |
284 } | 285 } |
285 | 286 |
286 virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE { | 287 virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE { |
287 VLOG(1) << "MergeSession successful."; | 288 VLOG(1) << "MergeSession successful."; |
288 delete this; | 289 delete this; |
289 } | 290 } |
290 | 291 |
291 virtual void OnMergeSessionFailure( | 292 virtual void OnMergeSessionFailure( |
292 const GoogleServiceAuthError& error) OVERRIDE { | 293 const GoogleServiceAuthError& error) OVERRIDE { |
293 LOG(WARNING) << "Failed MergeSession request," | 294 LOG(WARNING) << "Failed MergeSession request, error: " << error.state(); |
294 << " error.state=" << error.state(); | |
295 HandlerGaiaAuthError(error); | 295 HandlerGaiaAuthError(error); |
296 delete this; | 296 delete this; |
297 } | 297 } |
298 | 298 |
299 private: | 299 private: |
300 void HandlerGaiaAuthError(const GoogleServiceAuthError& error) { | 300 void HandlerGaiaAuthError(const GoogleServiceAuthError& error) { |
301 // Mark this account's login state as offline if we encountered a network | 301 // Mark this account's login state as offline if we encountered a network |
302 // error. That will make us verify user OAuth token and try to fetch session | 302 // error. That will make us verify user OAuth token and try to fetch session |
303 // cookies again once we detect that the machine comes online. | 303 // cookies again once we detect that the machine comes online. |
304 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED) | 304 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED) |
305 UserManager::Get()->set_offline_login(true); | 305 UserManager::Get()->set_offline_login(true); |
306 } | 306 } |
307 | 307 |
308 GaiaAuthFetcher gaia_fetcher_; | 308 GaiaAuthFetcher gaia_fetcher_; |
309 DISALLOW_COPY_AND_ASSIGN(UserSessionCookieFetcher); | 309 DISALLOW_COPY_AND_ASSIGN(UserSessionCookieFetcher); |
310 }; | 310 }; |
311 | 311 |
312 | 312 // Fetches the oauth token for the device management service. Since Profile |
313 // Fetches an OAuth token and initializes user policy with it. | 313 // creation might be blocking on a user policy fetch, this fetcher must always |
314 // send a (possibly empty) token to the BrowserPolicyConnector, which will then | |
315 // let the policy subsystem proceed and resume Profile creation. | |
316 // Sending the token even when no Profile is pending is also OK. | |
314 class PolicyOAuthFetcher : public GaiaOAuthConsumer { | 317 class PolicyOAuthFetcher : public GaiaOAuthConsumer { |
315 public: | 318 public: |
319 // Fetches the device management service's oauth token using |oauth1_token| | |
320 // and |oauth1_secret| as access tokens. | |
316 PolicyOAuthFetcher(Profile* profile, | 321 PolicyOAuthFetcher(Profile* profile, |
317 const std::string& oauth1_token, | 322 const std::string& oauth1_token, |
318 const std::string& oauth1_secret) | 323 const std::string& oauth1_secret) |
319 : oauth_fetcher_(this, | 324 : oauth_fetcher_(this, |
320 profile->GetRequestContext(), | 325 profile->GetRequestContext(), |
321 profile, | 326 profile, |
322 kServiceScopeChromeOSDeviceManagement), | 327 kServiceScopeChromeOSDeviceManagement), |
323 oauth1_token_(oauth1_token), | 328 oauth1_token_(oauth1_token), |
324 oauth1_secret_(oauth1_secret) { | 329 oauth1_secret_(oauth1_secret) { |
325 oauth_fetcher_.SetAutoFetchLimit( | |
326 GaiaOAuthFetcher::OAUTH2_SERVICE_ACCESS_TOKEN); | |
327 } | 330 } |
331 | |
332 // Fetches the device management service's oauth token, after also retrieving | |
333 // the access tokens. | |
334 explicit PolicyOAuthFetcher(Profile* profile) | |
335 : oauth_fetcher_(this, | |
336 profile->GetRequestContext(), | |
337 profile, | |
338 kServiceScopeChromeOSDeviceManagement) { | |
339 } | |
340 | |
328 virtual ~PolicyOAuthFetcher() {} | 341 virtual ~PolicyOAuthFetcher() {} |
329 | 342 |
330 void Start() { | 343 void Start() { |
331 oauth_fetcher_.StartOAuthWrapBridge( | 344 oauth_fetcher_.SetAutoFetchLimit( |
332 oauth1_token_, oauth1_secret_, GaiaConstants::kGaiaOAuthDuration, | 345 GaiaOAuthFetcher::OAUTH2_SERVICE_ACCESS_TOKEN); |
333 std::string(kServiceScopeChromeOSDeviceManagement)); | 346 |
347 if (oauth1_token_.empty()) { | |
348 oauth_fetcher_.StartGetOAuthTokenRequest(); | |
349 } else { | |
350 oauth_fetcher_.StartOAuthWrapBridge( | |
351 oauth1_token_, oauth1_secret_, GaiaConstants::kGaiaOAuthDuration, | |
352 std::string(kServiceScopeChromeOSDeviceManagement)); | |
353 } | |
334 } | 354 } |
335 | 355 |
336 // GaiaOAuthConsumer implementation: | 356 const std::string& oauth1_token() const { return oauth1_token_; } |
357 const std::string& oauth1_secret() const { return oauth1_secret_; } | |
358 const std::string& policy_token() const { return policy_token_; } | |
359 | |
360 private: | |
361 virtual void OnGetOAuthTokenSuccess(const std::string& oauth_token) OVERRIDE { | |
362 VLOG(1) << "Got OAuth request token"; | |
363 } | |
364 | |
365 virtual void OnGetOAuthTokenFailure( | |
366 const GoogleServiceAuthError& error) OVERRIDE { | |
367 LOG(WARNING) << "Failed to get OAuth request token, error: " | |
368 << error.state(); | |
369 SetPolicyToken(""); | |
370 } | |
371 | |
372 virtual void OnOAuthGetAccessTokenSuccess( | |
373 const std::string& token, | |
374 const std::string& secret) OVERRIDE { | |
375 VLOG(1) << "Got OAuth access token"; | |
376 oauth1_token_ = token; | |
377 oauth1_secret_ = secret; | |
378 } | |
379 | |
380 virtual void OnOAuthGetAccessTokenFailure( | |
381 const GoogleServiceAuthError& error) OVERRIDE { | |
382 LOG(WARNING) << "Failed to get OAuth access token, error: " | |
383 << error.state(); | |
384 SetPolicyToken(""); | |
385 } | |
386 | |
337 virtual void OnOAuthWrapBridgeSuccess( | 387 virtual void OnOAuthWrapBridgeSuccess( |
338 const std::string& service_name, | 388 const std::string& service_name, |
339 const std::string& token, | 389 const std::string& token, |
340 const std::string& expires_in) OVERRIDE { | 390 const std::string& expires_in) OVERRIDE { |
341 policy::BrowserPolicyConnector* browser_policy_connector = | 391 VLOG(1) << "Got OAuth access token for " << service_name; |
342 g_browser_process->browser_policy_connector(); | 392 SetPolicyToken(token); |
343 browser_policy_connector->RegisterForUserPolicy(token); | |
344 } | 393 } |
345 | 394 |
346 virtual void OnOAuthWrapBridgeFailure( | 395 virtual void OnOAuthWrapBridgeFailure( |
347 const std::string& service_name, | 396 const std::string& service_name, |
348 const GoogleServiceAuthError& error) OVERRIDE { | 397 const GoogleServiceAuthError& error) OVERRIDE { |
349 LOG(WARNING) << "Failed to get OAuth access token for " << service_name; | 398 LOG(WARNING) << "Failed to get OAuth access token for " << service_name |
399 << ", error: " << error.state(); | |
400 SetPolicyToken(""); | |
350 } | 401 } |
351 | 402 |
352 private: | 403 void SetPolicyToken(const std::string& token) { |
404 policy_token_ = token; | |
405 g_browser_process->browser_policy_connector()->RegisterForUserPolicy(token); | |
406 } | |
407 | |
353 GaiaOAuthFetcher oauth_fetcher_; | 408 GaiaOAuthFetcher oauth_fetcher_; |
354 std::string oauth1_token_; | 409 std::string oauth1_token_; |
355 std::string oauth1_secret_; | 410 std::string oauth1_secret_; |
411 std::string policy_token_; | |
356 | 412 |
357 DISALLOW_COPY_AND_ASSIGN(PolicyOAuthFetcher); | 413 DISALLOW_COPY_AND_ASSIGN(PolicyOAuthFetcher); |
358 }; | 414 }; |
359 | 415 |
360 // Used to request a restart to switch to the guest mode. | 416 // Used to request a restart to switch to the guest mode. |
361 class JobRestartRequest | 417 class JobRestartRequest |
362 : public base::RefCountedThreadSafe<JobRestartRequest> { | 418 : public base::RefCountedThreadSafe<JobRestartRequest> { |
363 public: | 419 public: |
364 JobRestartRequest(int pid, const std::string& command_line) | 420 JobRestartRequest(int pid, const std::string& command_line) |
365 : pid_(pid), | 421 : pid_(pid), |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
452 Profile* new_profile) OVERRIDE; | 508 Profile* new_profile) OVERRIDE; |
453 virtual void TransferDefaultAuthCache(Profile* default_profile, | 509 virtual void TransferDefaultAuthCache(Profile* default_profile, |
454 Profile* new_profile) OVERRIDE; | 510 Profile* new_profile) OVERRIDE; |
455 | 511 |
456 // ProfileManagerObserver implementation: | 512 // ProfileManagerObserver implementation: |
457 virtual void OnProfileCreated(Profile* profile, Status status) OVERRIDE; | 513 virtual void OnProfileCreated(Profile* profile, Status status) OVERRIDE; |
458 | 514 |
459 // GaiaOAuthConsumer overrides. | 515 // GaiaOAuthConsumer overrides. |
460 virtual void OnGetOAuthTokenSuccess(const std::string& oauth_token) OVERRIDE; | 516 virtual void OnGetOAuthTokenSuccess(const std::string& oauth_token) OVERRIDE; |
461 virtual void OnGetOAuthTokenFailure( | 517 virtual void OnGetOAuthTokenFailure( |
462 const GoogleServiceAuthError& error) OVERRIDE; | 518 const GoogleServiceAuthError& error) OVERRIDE; |
463 virtual void OnOAuthGetAccessTokenSuccess(const std::string& token, | 519 virtual void OnOAuthGetAccessTokenSuccess(const std::string& token, |
464 const std::string& secret) OVERRIDE; | 520 const std::string& secret) OVERRIDE; |
465 virtual void OnOAuthGetAccessTokenFailure( | 521 virtual void OnOAuthGetAccessTokenFailure( |
466 const GoogleServiceAuthError& error) OVERRIDE; | 522 const GoogleServiceAuthError& error) OVERRIDE; |
467 | 523 |
468 // net::NetworkChangeNotifier::OnlineStateObserver overrides. | 524 // net::NetworkChangeNotifier::OnlineStateObserver overrides. |
469 virtual void OnOnlineStateChanged(bool online) OVERRIDE; | 525 virtual void OnOnlineStateChanged(bool online) OVERRIDE; |
470 | 526 |
471 // Given the authenticated credentials from the cookie jar, try to exchange | 527 // Given the authenticated credentials from the cookie jar, try to exchange |
472 // fetch OAuth request, v1 and v2 tokens. | 528 // fetch OAuth request, v1 and v2 tokens. |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
593 | 649 |
594 username_ = username; | 650 username_ = username; |
595 password_ = password; | 651 password_ = password; |
596 | 652 |
597 credentials_ = credentials; | 653 credentials_ = credentials; |
598 pending_requests_ = pending_requests; | 654 pending_requests_ = pending_requests; |
599 using_oauth_ = using_oauth; | 655 using_oauth_ = using_oauth; |
600 has_cookies_ = has_cookies; | 656 has_cookies_ = has_cookies; |
601 delegate_ = delegate; | 657 delegate_ = delegate; |
602 | 658 |
659 policy::BrowserPolicyConnector* connector = | |
660 g_browser_process->browser_policy_connector(); | |
661 | |
662 // If this is an enterprise device and the user belongs to the enterprise | |
663 // domain, then wait for a policy fetch before logging the user in. This | |
664 // will delay Profile creation until the policy is fetched, so that features | |
665 // controlled by policy (e.g. Sync, Startup tabs) only start after the | |
666 // PrefService has the right values. | |
667 // Profile creation is also resumed if the fetch attempt fails. | |
668 bool wait_for_policy_fetch = | |
669 using_oauth_ && | |
670 authenticator_.get() && | |
671 (connector->GetUserAffiliation(username) == | |
672 policy::CloudPolicyDataStore::USER_AFFILIATION_MANAGED); | |
673 | |
603 // Initialize user policy before the profile is created so the profile | 674 // Initialize user policy before the profile is created so the profile |
604 // initialization code sees the policy settings. | 675 // initialization code sees the cached policy settings. |
605 g_browser_process->browser_policy_connector()->InitializeUserPolicy(username); | 676 connector->InitializeUserPolicy(username, wait_for_policy_fetch); |
677 | |
678 if (wait_for_policy_fetch) { | |
679 // Profile creation will block until user policy is fetched, which | |
680 // requires the DeviceManagement token. Try to fetch it now. | |
681 VLOG(1) << "Profile creation requires policy token, fetching now"; | |
682 policy_oauth_fetcher_.reset( | |
683 new PolicyOAuthFetcher(authenticator_->authentication_profile())); | |
684 policy_oauth_fetcher_->Start(); | |
685 } | |
606 | 686 |
607 // The default profile will have been changed because the ProfileManager | 687 // The default profile will have been changed because the ProfileManager |
608 // will process the notification that the UserManager sends out. | 688 // will process the notification that the UserManager sends out. |
609 ProfileManager::CreateDefaultProfileAsync(this); | 689 ProfileManager::CreateDefaultProfileAsync(this); |
610 } | 690 } |
611 | 691 |
612 void LoginUtilsImpl::DelegateDeleted(Delegate* delegate) { | 692 void LoginUtilsImpl::DelegateDeleted(Delegate* delegate) { |
613 if (delegate_ == delegate) | 693 if (delegate_ == delegate) |
614 delegate_ = NULL; | 694 delegate_ = NULL; |
615 } | 695 } |
616 | 696 |
617 void LoginUtilsImpl::OnProfileCreated(Profile* user_profile, Status status) { | 697 void LoginUtilsImpl::OnProfileCreated(Profile* user_profile, Status status) { |
618 CHECK(user_profile); | 698 CHECK(user_profile); |
619 switch (status) { | 699 switch (status) { |
620 case STATUS_INITIALIZED: | 700 case STATUS_INITIALIZED: |
621 break; | 701 break; |
622 case STATUS_CREATED: | 702 case STATUS_CREATED: |
623 if (UserManager::Get()->current_user_is_new()) | 703 if (UserManager::Get()->current_user_is_new()) |
624 SetFirstLoginPrefs(user_profile->GetPrefs()); | 704 SetFirstLoginPrefs(user_profile->GetPrefs()); |
625 RespectLocalePreference(user_profile); | 705 RespectLocalePreference(user_profile); |
626 return; | 706 return; |
627 case STATUS_FAIL: | 707 case STATUS_FAIL: |
628 default: | 708 default: |
629 NOTREACHED(); | 709 NOTREACHED(); |
630 return; | 710 return; |
631 } | 711 } |
632 | 712 |
633 // Initialize the user-policy backend. | 713 // Initialize the user-policy backend. |
634 policy::BrowserPolicyConnector* browser_policy_connector = | |
635 g_browser_process->browser_policy_connector(); | |
636 | |
637 if (!using_oauth_) { | 714 if (!using_oauth_) { |
638 browser_policy_connector->SetUserPolicyTokenService( | 715 g_browser_process->browser_policy_connector()-> |
639 user_profile->GetTokenService()); | 716 SetUserPolicyTokenService(user_profile->GetTokenService()); |
640 } | 717 } |
641 | 718 |
642 // We suck. This is a hack since we do not have the enterprise feature | 719 // We suck. This is a hack since we do not have the enterprise feature |
643 // done yet to pull down policies from the domain admin. We'll take this | 720 // done yet to pull down policies from the domain admin. We'll take this |
644 // out when we get that done properly. | 721 // out when we get that done properly. |
645 // TODO(xiyuan): Remove this once enterprise feature is ready. | 722 // TODO(xiyuan): Remove this once enterprise feature is ready. |
646 if (EndsWith(username_, "@google.com", true)) { | 723 if (EndsWith(username_, "@google.com", true)) { |
647 PrefService* pref_service = user_profile->GetPrefs(); | 724 PrefService* pref_service = user_profile->GetPrefs(); |
648 pref_service->SetBoolean(prefs::kEnableScreenLock, true); | 725 pref_service->SetBoolean(prefs::kEnableScreenLock, true); |
649 } | 726 } |
650 | 727 |
651 BootTimesLoader* btl = BootTimesLoader::Get(); | 728 BootTimesLoader* btl = BootTimesLoader::Get(); |
652 btl->AddLoginTimeMarker("UserProfileGotten", false); | 729 btl->AddLoginTimeMarker("UserProfileGotten", false); |
653 | 730 |
654 if (using_oauth_) { | 731 if (using_oauth_) { |
732 // Reuse the access token fetched by the PolicyOAuthFetcher, if it was | |
733 // used to fetch policies before Profile creation. | |
734 if (policy_oauth_fetcher_.get() && | |
735 !policy_oauth_fetcher_->oauth1_token().empty()) { | |
736 VLOG(1) << "Resuming profile creation after fetching policy token"; | |
737 StoreOAuth1AccessToken(user_profile, | |
738 policy_oauth_fetcher_->oauth1_token(), | |
739 policy_oauth_fetcher_->oauth1_secret()); | |
740 } | |
741 | |
655 // Transfer cookies when user signs in using extension. | 742 // Transfer cookies when user signs in using extension. |
656 if (has_cookies_) { | 743 if (has_cookies_) { |
657 // Transfer cookies from the profile that was used for authentication. | 744 // Transfer cookies from the profile that was used for authentication. |
658 // This profile contains cookies that auth extension should have already | 745 // This profile contains cookies that auth extension should have already |
659 // put in place that will ensure that the newly created session is | 746 // put in place that will ensure that the newly created session is |
660 // authenticated for the websites that work with the used authentication | 747 // authenticated for the websites that work with the used authentication |
661 // schema. | 748 // schema. |
662 TransferDefaultCookies(authenticator_->authentication_profile(), | 749 TransferDefaultCookies(authenticator_->authentication_profile(), |
663 user_profile); | 750 user_profile); |
664 } | 751 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
738 // TODO(altimofeev): Need to sanitize memory used to store password. | 825 // TODO(altimofeev): Need to sanitize memory used to store password. |
739 credentials_ = GaiaAuthConsumer::ClientLoginResult(); | 826 credentials_ = GaiaAuthConsumer::ClientLoginResult(); |
740 } | 827 } |
741 | 828 |
742 void LoginUtilsImpl::FetchOAuth1AccessToken(Profile* auth_profile) { | 829 void LoginUtilsImpl::FetchOAuth1AccessToken(Profile* auth_profile) { |
743 oauth_fetcher_.reset(new GaiaOAuthFetcher(this, | 830 oauth_fetcher_.reset(new GaiaOAuthFetcher(this, |
744 auth_profile->GetRequestContext(), | 831 auth_profile->GetRequestContext(), |
745 auth_profile, | 832 auth_profile, |
746 kServiceScopeChromeOS)); | 833 kServiceScopeChromeOS)); |
747 // Let's first get the Oauth request token and OAuth1 token+secret. | 834 // Let's first get the Oauth request token and OAuth1 token+secret. |
748 // One we get that, we will kick off individial requests for OAuth2 tokens for | 835 // Once we get that, we will kick off individual requests for OAuth2 tokens |
749 // all our services. | 836 // for all our services. |
750 oauth_fetcher_->SetAutoFetchLimit(GaiaOAuthFetcher::OAUTH1_ALL_ACCESS_TOKEN); | 837 oauth_fetcher_->SetAutoFetchLimit(GaiaOAuthFetcher::OAUTH1_ALL_ACCESS_TOKEN); |
751 oauth_fetcher_->StartGetOAuthTokenRequest(); | 838 oauth_fetcher_->StartGetOAuthTokenRequest(); |
752 } | 839 } |
753 | 840 |
754 void LoginUtilsImpl::FetchCookies(Profile* user_profile, | 841 void LoginUtilsImpl::FetchCookies(Profile* user_profile, |
755 const GaiaAuthConsumer::ClientLoginResult& credentials) { | 842 const GaiaAuthConsumer::ClientLoginResult& credentials) { |
756 if (!using_oauth_) { | 843 if (!using_oauth_) { |
757 // Take the credentials passed in and try to exchange them for | 844 // Take the credentials passed in and try to exchange them for |
758 // full-fledged Google authentication cookies. This is | 845 // full-fledged Google authentication cookies. This is |
759 // best-effort; it's possible that we'll fail due to network | 846 // best-effort; it's possible that we'll fail due to network |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
792 password_, false); | 879 password_, false); |
793 username_ = ""; | 880 username_ = ""; |
794 password_ = ""; | 881 password_ = ""; |
795 | 882 |
796 token_service->Initialize(GaiaConstants::kChromeOSSource, user_profile); | 883 token_service->Initialize(GaiaConstants::kChromeOSSource, user_profile); |
797 token_service->LoadTokensFromDB(); | 884 token_service->LoadTokensFromDB(); |
798 } | 885 } |
799 token_service->UpdateCredentials(credentials); | 886 token_service->UpdateCredentials(credentials); |
800 if (token_service->AreCredentialsValid()) | 887 if (token_service->AreCredentialsValid()) |
801 token_service->StartFetchingTokens(); | 888 token_service->StartFetchingTokens(); |
802 | |
803 } | 889 } |
804 | 890 |
805 void LoginUtilsImpl::RespectLocalePreference(Profile* profile) { | 891 void LoginUtilsImpl::RespectLocalePreference(Profile* profile) { |
806 DCHECK(profile != NULL); | 892 DCHECK(profile != NULL); |
807 PrefService* prefs = profile->GetPrefs(); | 893 PrefService* prefs = profile->GetPrefs(); |
808 DCHECK(prefs != NULL); | 894 DCHECK(prefs != NULL); |
809 if (g_browser_process == NULL) | 895 if (g_browser_process == NULL) |
810 return; | 896 return; |
811 | 897 |
812 std::string pref_locale = prefs->GetString(prefs::kApplicationLocale); | 898 std::string pref_locale = prefs->GetString(prefs::kApplicationLocale); |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1043 profile->GetRequestContext())); | 1129 profile->GetRequestContext())); |
1044 } | 1130 } |
1045 | 1131 |
1046 void LoginUtilsImpl::OnGetOAuthTokenSuccess(const std::string& oauth_token) { | 1132 void LoginUtilsImpl::OnGetOAuthTokenSuccess(const std::string& oauth_token) { |
1047 VLOG(1) << "Got OAuth request token!"; | 1133 VLOG(1) << "Got OAuth request token!"; |
1048 } | 1134 } |
1049 | 1135 |
1050 void LoginUtilsImpl::OnGetOAuthTokenFailure( | 1136 void LoginUtilsImpl::OnGetOAuthTokenFailure( |
1051 const GoogleServiceAuthError& error) { | 1137 const GoogleServiceAuthError& error) { |
1052 // TODO(zelidrag): Pop up sync setup UI here? | 1138 // TODO(zelidrag): Pop up sync setup UI here? |
1053 LOG(WARNING) << "Failed fetching OAuth request token"; | 1139 LOG(WARNING) << "Failed fetching OAuth request token, error: " |
1140 << error.state(); | |
1054 } | 1141 } |
1055 | 1142 |
1056 void LoginUtilsImpl::OnOAuthGetAccessTokenSuccess(const std::string& token, | 1143 void LoginUtilsImpl::OnOAuthGetAccessTokenSuccess(const std::string& token, |
1057 const std::string& secret) { | 1144 const std::string& secret) { |
1058 VLOG(1) << "Got OAuth v1 token!"; | 1145 VLOG(1) << "Got OAuth v1 token!"; |
1059 Profile* user_profile = ProfileManager::GetDefaultProfile(); | 1146 Profile* user_profile = ProfileManager::GetDefaultProfile(); |
1060 StoreOAuth1AccessToken(user_profile, token, secret); | 1147 StoreOAuth1AccessToken(user_profile, token, secret); |
1061 | 1148 |
1062 // Verify OAuth1 token by doing OAuthLogin and fetching credentials. | 1149 // Verify OAuth1 token by doing OAuthLogin and fetching credentials. |
1063 VerifyOAuth1AccessToken(user_profile, token, secret); | 1150 VerifyOAuth1AccessToken(user_profile, token, secret); |
1064 } | 1151 } |
1065 | 1152 |
1153 void LoginUtilsImpl::OnOAuthGetAccessTokenFailure( | |
1154 const GoogleServiceAuthError& error) { | |
1155 // TODO(zelidrag): Pop up sync setup UI here? | |
1156 LOG(WARNING) << "Failed fetching OAuth request token, error: " | |
1157 << error.state(); | |
1158 } | |
1159 | |
1066 void LoginUtilsImpl::FetchSecondaryTokens(Profile* offrecord_profile, | 1160 void LoginUtilsImpl::FetchSecondaryTokens(Profile* offrecord_profile, |
1067 const std::string& token, | 1161 const std::string& token, |
1068 const std::string& secret) { | 1162 const std::string& secret) { |
1069 FetchPolicyToken(offrecord_profile, token, secret); | 1163 FetchPolicyToken(offrecord_profile, token, secret); |
1070 // TODO(rickcam, zelidrag): Wire TokenService there when it becomes | 1164 // TODO(rickcam, zelidrag): Wire TokenService there when it becomes |
1071 // capable of handling OAuth1 tokens directly. | 1165 // capable of handling OAuth1 tokens directly. |
1072 } | 1166 } |
1073 | 1167 |
1074 bool LoginUtilsImpl::ReadOAuth1AccessToken(Profile* user_profile, | 1168 bool LoginUtilsImpl::ReadOAuth1AccessToken(Profile* user_profile, |
1075 std::string* token, | 1169 std::string* token, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1130 token, | 1224 token, |
1131 secret, | 1225 secret, |
1132 username_)); | 1226 username_)); |
1133 oauth_login_verifier_->Start(); | 1227 oauth_login_verifier_->Start(); |
1134 } | 1228 } |
1135 | 1229 |
1136 | 1230 |
1137 void LoginUtilsImpl::FetchPolicyToken(Profile* offrecord_profile, | 1231 void LoginUtilsImpl::FetchPolicyToken(Profile* offrecord_profile, |
1138 const std::string& token, | 1232 const std::string& token, |
1139 const std::string& secret) { | 1233 const std::string& secret) { |
1140 // Trigger oauth token fetch for user policy. | 1234 // Fetch dm service token now, if it hasn't been fetched yet. |
1141 policy_oauth_fetcher_.reset(new PolicyOAuthFetcher(offrecord_profile, | 1235 if (!policy_oauth_fetcher_.get() || |
1142 token, | 1236 policy_oauth_fetcher_->policy_token().empty()) { |
Nikita (slow)
2011/11/15 12:09:23
Could we distinguish these cases:
1. Policy token
Nikita (slow)
2011/11/15 12:16:20
should NOT restart it.
Joao da Silva
2011/11/15 14:35:56
Done. This method makes a new fetch if it hasn't b
| |
1143 secret)); | 1237 // Trigger oauth token fetch for user policy. |
1144 policy_oauth_fetcher_->Start(); | 1238 policy_oauth_fetcher_.reset(new PolicyOAuthFetcher(offrecord_profile, |
1239 token, | |
1240 secret)); | |
1241 policy_oauth_fetcher_->Start(); | |
1242 } | |
1145 | 1243 |
1146 // TODO(zelidrag): We should add initialization of other services somewhere | 1244 // TODO(zelidrag): We should add initialization of other services somewhere |
1147 // here as well. This could be handled with TokenService class once it is | 1245 // here as well. This could be handled with TokenService class once it is |
1148 // ready to handle OAuth tokens. | 1246 // ready to handle OAuth tokens. |
1149 | 1247 |
1150 // We don't need authenticator instance any more, reset it so that | 1248 // We don't need authenticator instance any more, reset it so that |
1151 // ScreenLocker would create a separate instance. | 1249 // ScreenLocker would create a separate instance. |
1152 // TODO(nkostylev): There's a potential race if SL would be created before | 1250 // TODO(nkostylev): There's a potential race if SL would be created before |
1153 // OAuth tokens are fetched. It would use incorrect Authenticator instance. | 1251 // OAuth tokens are fetched. It would use incorrect Authenticator instance. |
1154 authenticator_ = NULL; | 1252 authenticator_ = NULL; |
1155 } | 1253 } |
1156 | 1254 |
1157 void LoginUtilsImpl::OnOAuthGetAccessTokenFailure( | |
1158 const GoogleServiceAuthError& error) { | |
1159 // TODO(zelidrag): Pop up sync setup UI here? | |
1160 LOG(WARNING) << "Failed fetching OAuth v1 token, error: " << error.state(); | |
1161 } | |
1162 | |
1163 void LoginUtilsImpl::OnOnlineStateChanged(bool online) { | 1255 void LoginUtilsImpl::OnOnlineStateChanged(bool online) { |
1164 // If we come online for the first time after successful offline login, | 1256 // If we come online for the first time after successful offline login, |
1165 // we need to kick of OAuth token verification process again. | 1257 // we need to kick of OAuth token verification process again. |
1166 if (UserManager::Get()->user_is_logged_in() && | 1258 if (UserManager::Get()->user_is_logged_in() && |
1167 UserManager::Get()->offline_login() && online) { | 1259 UserManager::Get()->offline_login() && online) { |
1168 if (!authenticator_.get()) | 1260 if (!authenticator_.get()) |
1169 CreateAuthenticator(NULL); | 1261 CreateAuthenticator(NULL); |
1170 std::string oauth1_token; | 1262 std::string oauth1_token; |
1171 std::string oauth1_secret; | 1263 std::string oauth1_secret; |
1172 Profile* user_profile = ProfileManager::GetDefaultProfile(); | 1264 Profile* user_profile = ProfileManager::GetDefaultProfile(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1206 // Mark login host for deletion after browser starts. This | 1298 // Mark login host for deletion after browser starts. This |
1207 // guarantees that the message loop will be referenced by the | 1299 // guarantees that the message loop will be referenced by the |
1208 // browser before it is dereferenced by the login host. | 1300 // browser before it is dereferenced by the login host. |
1209 if (login_host) { | 1301 if (login_host) { |
1210 login_host->OnSessionStart(); | 1302 login_host->OnSessionStart(); |
1211 login_host = NULL; | 1303 login_host = NULL; |
1212 } | 1304 } |
1213 } | 1305 } |
1214 | 1306 |
1215 } // namespace chromeos | 1307 } // namespace chromeos |
OLD | NEW |