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 bool failed() const { |
| 359 return !oauth_fetcher_.HasPendingFetch() && policy_token_.empty(); |
| 360 } |
| 361 |
| 362 private: |
| 363 virtual void OnGetOAuthTokenSuccess(const std::string& oauth_token) OVERRIDE { |
| 364 VLOG(1) << "Got OAuth request token"; |
| 365 } |
| 366 |
| 367 virtual void OnGetOAuthTokenFailure( |
| 368 const GoogleServiceAuthError& error) OVERRIDE { |
| 369 LOG(WARNING) << "Failed to get OAuth request token, error: " |
| 370 << error.state(); |
| 371 SetPolicyToken(""); |
| 372 } |
| 373 |
| 374 virtual void OnOAuthGetAccessTokenSuccess( |
| 375 const std::string& token, |
| 376 const std::string& secret) OVERRIDE { |
| 377 VLOG(1) << "Got OAuth access token"; |
| 378 oauth1_token_ = token; |
| 379 oauth1_secret_ = secret; |
| 380 } |
| 381 |
| 382 virtual void OnOAuthGetAccessTokenFailure( |
| 383 const GoogleServiceAuthError& error) OVERRIDE { |
| 384 LOG(WARNING) << "Failed to get OAuth access token, error: " |
| 385 << error.state(); |
| 386 SetPolicyToken(""); |
| 387 } |
| 388 |
337 virtual void OnOAuthWrapBridgeSuccess( | 389 virtual void OnOAuthWrapBridgeSuccess( |
338 const std::string& service_name, | 390 const std::string& service_name, |
339 const std::string& token, | 391 const std::string& token, |
340 const std::string& expires_in) OVERRIDE { | 392 const std::string& expires_in) OVERRIDE { |
341 policy::BrowserPolicyConnector* browser_policy_connector = | 393 VLOG(1) << "Got OAuth access token for " << service_name; |
342 g_browser_process->browser_policy_connector(); | 394 SetPolicyToken(token); |
343 browser_policy_connector->RegisterForUserPolicy(token); | |
344 } | 395 } |
345 | 396 |
346 virtual void OnOAuthWrapBridgeFailure( | 397 virtual void OnOAuthWrapBridgeFailure( |
347 const std::string& service_name, | 398 const std::string& service_name, |
348 const GoogleServiceAuthError& error) OVERRIDE { | 399 const GoogleServiceAuthError& error) OVERRIDE { |
349 LOG(WARNING) << "Failed to get OAuth access token for " << service_name; | 400 LOG(WARNING) << "Failed to get OAuth access token for " << service_name |
| 401 << ", error: " << error.state(); |
| 402 SetPolicyToken(""); |
350 } | 403 } |
351 | 404 |
352 private: | 405 void SetPolicyToken(const std::string& token) { |
| 406 policy_token_ = token; |
| 407 g_browser_process->browser_policy_connector()->RegisterForUserPolicy(token); |
| 408 } |
| 409 |
353 GaiaOAuthFetcher oauth_fetcher_; | 410 GaiaOAuthFetcher oauth_fetcher_; |
354 std::string oauth1_token_; | 411 std::string oauth1_token_; |
355 std::string oauth1_secret_; | 412 std::string oauth1_secret_; |
| 413 std::string policy_token_; |
356 | 414 |
357 DISALLOW_COPY_AND_ASSIGN(PolicyOAuthFetcher); | 415 DISALLOW_COPY_AND_ASSIGN(PolicyOAuthFetcher); |
358 }; | 416 }; |
359 | 417 |
360 // Used to request a restart to switch to the guest mode. | 418 // Used to request a restart to switch to the guest mode. |
361 class JobRestartRequest | 419 class JobRestartRequest |
362 : public base::RefCountedThreadSafe<JobRestartRequest> { | 420 : public base::RefCountedThreadSafe<JobRestartRequest> { |
363 public: | 421 public: |
364 JobRestartRequest(int pid, const std::string& command_line) | 422 JobRestartRequest(int pid, const std::string& command_line) |
365 : pid_(pid), | 423 : pid_(pid), |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 Profile* new_profile) OVERRIDE; | 512 Profile* new_profile) OVERRIDE; |
455 virtual void TransferDefaultAuthCache(Profile* default_profile, | 513 virtual void TransferDefaultAuthCache(Profile* default_profile, |
456 Profile* new_profile) OVERRIDE; | 514 Profile* new_profile) OVERRIDE; |
457 | 515 |
458 // ProfileManagerObserver implementation: | 516 // ProfileManagerObserver implementation: |
459 virtual void OnProfileCreated(Profile* profile, Status status) OVERRIDE; | 517 virtual void OnProfileCreated(Profile* profile, Status status) OVERRIDE; |
460 | 518 |
461 // GaiaOAuthConsumer overrides. | 519 // GaiaOAuthConsumer overrides. |
462 virtual void OnGetOAuthTokenSuccess(const std::string& oauth_token) OVERRIDE; | 520 virtual void OnGetOAuthTokenSuccess(const std::string& oauth_token) OVERRIDE; |
463 virtual void OnGetOAuthTokenFailure( | 521 virtual void OnGetOAuthTokenFailure( |
464 const GoogleServiceAuthError& error) OVERRIDE; | 522 const GoogleServiceAuthError& error) OVERRIDE; |
465 virtual void OnOAuthGetAccessTokenSuccess(const std::string& token, | 523 virtual void OnOAuthGetAccessTokenSuccess(const std::string& token, |
466 const std::string& secret) OVERRIDE; | 524 const std::string& secret) OVERRIDE; |
467 virtual void OnOAuthGetAccessTokenFailure( | 525 virtual void OnOAuthGetAccessTokenFailure( |
468 const GoogleServiceAuthError& error) OVERRIDE; | 526 const GoogleServiceAuthError& error) OVERRIDE; |
469 | 527 |
470 // net::NetworkChangeNotifier::OnlineStateObserver overrides. | 528 // net::NetworkChangeNotifier::OnlineStateObserver overrides. |
471 virtual void OnOnlineStateChanged(bool online) OVERRIDE; | 529 virtual void OnOnlineStateChanged(bool online) OVERRIDE; |
472 | 530 |
473 // Given the authenticated credentials from the cookie jar, try to exchange | 531 // Given the authenticated credentials from the cookie jar, try to exchange |
474 // fetch OAuth request, v1 and v2 tokens. | 532 // fetch OAuth request, v1 and v2 tokens. |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 | 656 |
599 username_ = username; | 657 username_ = username; |
600 password_ = password; | 658 password_ = password; |
601 | 659 |
602 credentials_ = credentials; | 660 credentials_ = credentials; |
603 pending_requests_ = pending_requests; | 661 pending_requests_ = pending_requests; |
604 using_oauth_ = using_oauth; | 662 using_oauth_ = using_oauth; |
605 has_cookies_ = has_cookies; | 663 has_cookies_ = has_cookies; |
606 delegate_ = delegate; | 664 delegate_ = delegate; |
607 | 665 |
| 666 policy::BrowserPolicyConnector* connector = |
| 667 g_browser_process->browser_policy_connector(); |
| 668 |
| 669 // If this is an enterprise device and the user belongs to the enterprise |
| 670 // domain, then wait for a policy fetch before logging the user in. This |
| 671 // will delay Profile creation until the policy is fetched, so that features |
| 672 // controlled by policy (e.g. Sync, Startup tabs) only start after the |
| 673 // PrefService has the right values. |
| 674 // Profile creation is also resumed if the fetch attempt fails. |
| 675 bool wait_for_policy_fetch = |
| 676 using_oauth_ && |
| 677 authenticator_.get() && |
| 678 (connector->GetUserAffiliation(username) == |
| 679 policy::CloudPolicyDataStore::USER_AFFILIATION_MANAGED); |
| 680 |
608 // Initialize user policy before the profile is created so the profile | 681 // Initialize user policy before the profile is created so the profile |
609 // initialization code sees the policy settings. | 682 // initialization code sees the cached policy settings. |
610 g_browser_process->browser_policy_connector()->InitializeUserPolicy(username); | 683 connector->InitializeUserPolicy(username, wait_for_policy_fetch); |
| 684 |
| 685 if (wait_for_policy_fetch) { |
| 686 // Profile creation will block until user policy is fetched, which |
| 687 // requires the DeviceManagement token. Try to fetch it now. |
| 688 VLOG(1) << "Profile creation requires policy token, fetching now"; |
| 689 policy_oauth_fetcher_.reset( |
| 690 new PolicyOAuthFetcher(authenticator_->authentication_profile())); |
| 691 policy_oauth_fetcher_->Start(); |
| 692 } |
611 | 693 |
612 // The default profile will have been changed because the ProfileManager | 694 // The default profile will have been changed because the ProfileManager |
613 // will process the notification that the UserManager sends out. | 695 // will process the notification that the UserManager sends out. |
614 ProfileManager::CreateDefaultProfileAsync(this); | 696 ProfileManager::CreateDefaultProfileAsync(this); |
615 } | 697 } |
616 | 698 |
617 void LoginUtilsImpl::DelegateDeleted(Delegate* delegate) { | 699 void LoginUtilsImpl::DelegateDeleted(Delegate* delegate) { |
618 if (delegate_ == delegate) | 700 if (delegate_ == delegate) |
619 delegate_ = NULL; | 701 delegate_ = NULL; |
620 } | 702 } |
621 | 703 |
622 void LoginUtilsImpl::OnProfileCreated(Profile* user_profile, Status status) { | 704 void LoginUtilsImpl::OnProfileCreated(Profile* user_profile, Status status) { |
623 CHECK(user_profile); | 705 CHECK(user_profile); |
624 switch (status) { | 706 switch (status) { |
625 case STATUS_INITIALIZED: | 707 case STATUS_INITIALIZED: |
626 break; | 708 break; |
627 case STATUS_CREATED: | 709 case STATUS_CREATED: |
628 if (UserManager::Get()->current_user_is_new()) | 710 if (UserManager::Get()->current_user_is_new()) |
629 SetFirstLoginPrefs(user_profile->GetPrefs()); | 711 SetFirstLoginPrefs(user_profile->GetPrefs()); |
630 RespectLocalePreference(user_profile); | 712 RespectLocalePreference(user_profile); |
631 return; | 713 return; |
632 case STATUS_FAIL: | 714 case STATUS_FAIL: |
633 default: | 715 default: |
634 NOTREACHED(); | 716 NOTREACHED(); |
635 return; | 717 return; |
636 } | 718 } |
637 | 719 |
638 // Initialize the user-policy backend. | 720 // Initialize the user-policy backend. |
639 policy::BrowserPolicyConnector* browser_policy_connector = | |
640 g_browser_process->browser_policy_connector(); | |
641 | |
642 if (!using_oauth_) { | 721 if (!using_oauth_) { |
643 browser_policy_connector->SetUserPolicyTokenService( | 722 g_browser_process->browser_policy_connector()-> |
644 user_profile->GetTokenService()); | 723 SetUserPolicyTokenService(user_profile->GetTokenService()); |
645 } | 724 } |
646 | 725 |
647 // We suck. This is a hack since we do not have the enterprise feature | 726 // We suck. This is a hack since we do not have the enterprise feature |
648 // done yet to pull down policies from the domain admin. We'll take this | 727 // done yet to pull down policies from the domain admin. We'll take this |
649 // out when we get that done properly. | 728 // out when we get that done properly. |
650 // TODO(xiyuan): Remove this once enterprise feature is ready. | 729 // TODO(xiyuan): Remove this once enterprise feature is ready. |
651 if (EndsWith(username_, "@google.com", true)) { | 730 if (EndsWith(username_, "@google.com", true)) { |
652 PrefService* pref_service = user_profile->GetPrefs(); | 731 PrefService* pref_service = user_profile->GetPrefs(); |
653 pref_service->SetBoolean(prefs::kEnableScreenLock, true); | 732 pref_service->SetBoolean(prefs::kEnableScreenLock, true); |
654 } | 733 } |
655 | 734 |
656 BootTimesLoader* btl = BootTimesLoader::Get(); | 735 BootTimesLoader* btl = BootTimesLoader::Get(); |
657 btl->AddLoginTimeMarker("UserProfileGotten", false); | 736 btl->AddLoginTimeMarker("UserProfileGotten", false); |
658 | 737 |
659 if (using_oauth_) { | 738 if (using_oauth_) { |
| 739 // Reuse the access token fetched by the PolicyOAuthFetcher, if it was |
| 740 // used to fetch policies before Profile creation. |
| 741 if (policy_oauth_fetcher_.get() && |
| 742 !policy_oauth_fetcher_->oauth1_token().empty()) { |
| 743 VLOG(1) << "Resuming profile creation after fetching policy token"; |
| 744 StoreOAuth1AccessToken(user_profile, |
| 745 policy_oauth_fetcher_->oauth1_token(), |
| 746 policy_oauth_fetcher_->oauth1_secret()); |
| 747 } |
| 748 |
660 // Transfer cookies when user signs in using extension. | 749 // Transfer cookies when user signs in using extension. |
661 if (has_cookies_) { | 750 if (has_cookies_) { |
662 // Transfer cookies from the profile that was used for authentication. | 751 // Transfer cookies from the profile that was used for authentication. |
663 // This profile contains cookies that auth extension should have already | 752 // This profile contains cookies that auth extension should have already |
664 // put in place that will ensure that the newly created session is | 753 // put in place that will ensure that the newly created session is |
665 // authenticated for the websites that work with the used authentication | 754 // authenticated for the websites that work with the used authentication |
666 // schema. | 755 // schema. |
667 TransferDefaultCookies(authenticator_->authentication_profile(), | 756 TransferDefaultCookies(authenticator_->authentication_profile(), |
668 user_profile); | 757 user_profile); |
669 } | 758 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
743 // TODO(altimofeev): Need to sanitize memory used to store password. | 832 // TODO(altimofeev): Need to sanitize memory used to store password. |
744 credentials_ = GaiaAuthConsumer::ClientLoginResult(); | 833 credentials_ = GaiaAuthConsumer::ClientLoginResult(); |
745 } | 834 } |
746 | 835 |
747 void LoginUtilsImpl::FetchOAuth1AccessToken(Profile* auth_profile) { | 836 void LoginUtilsImpl::FetchOAuth1AccessToken(Profile* auth_profile) { |
748 oauth_fetcher_.reset(new GaiaOAuthFetcher(this, | 837 oauth_fetcher_.reset(new GaiaOAuthFetcher(this, |
749 auth_profile->GetRequestContext(), | 838 auth_profile->GetRequestContext(), |
750 auth_profile, | 839 auth_profile, |
751 kServiceScopeChromeOS)); | 840 kServiceScopeChromeOS)); |
752 // Let's first get the Oauth request token and OAuth1 token+secret. | 841 // Let's first get the Oauth request token and OAuth1 token+secret. |
753 // One we get that, we will kick off individial requests for OAuth2 tokens for | 842 // Once we get that, we will kick off individual requests for OAuth2 tokens |
754 // all our services. | 843 // for all our services. |
755 oauth_fetcher_->SetAutoFetchLimit(GaiaOAuthFetcher::OAUTH1_ALL_ACCESS_TOKEN); | 844 oauth_fetcher_->SetAutoFetchLimit(GaiaOAuthFetcher::OAUTH1_ALL_ACCESS_TOKEN); |
756 oauth_fetcher_->StartGetOAuthTokenRequest(); | 845 oauth_fetcher_->StartGetOAuthTokenRequest(); |
757 } | 846 } |
758 | 847 |
759 void LoginUtilsImpl::FetchCookies(Profile* user_profile, | 848 void LoginUtilsImpl::FetchCookies(Profile* user_profile, |
760 const GaiaAuthConsumer::ClientLoginResult& credentials) { | 849 const GaiaAuthConsumer::ClientLoginResult& credentials) { |
761 if (!using_oauth_) { | 850 if (!using_oauth_) { |
762 // Take the credentials passed in and try to exchange them for | 851 // Take the credentials passed in and try to exchange them for |
763 // full-fledged Google authentication cookies. This is | 852 // full-fledged Google authentication cookies. This is |
764 // best-effort; it's possible that we'll fail due to network | 853 // 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... |
797 password_, false); | 886 password_, false); |
798 username_ = ""; | 887 username_ = ""; |
799 password_ = ""; | 888 password_ = ""; |
800 | 889 |
801 token_service->Initialize(GaiaConstants::kChromeOSSource, user_profile); | 890 token_service->Initialize(GaiaConstants::kChromeOSSource, user_profile); |
802 token_service->LoadTokensFromDB(); | 891 token_service->LoadTokensFromDB(); |
803 } | 892 } |
804 token_service->UpdateCredentials(credentials); | 893 token_service->UpdateCredentials(credentials); |
805 if (token_service->AreCredentialsValid()) | 894 if (token_service->AreCredentialsValid()) |
806 token_service->StartFetchingTokens(); | 895 token_service->StartFetchingTokens(); |
807 | |
808 } | 896 } |
809 | 897 |
810 void LoginUtilsImpl::RespectLocalePreference(Profile* profile) { | 898 void LoginUtilsImpl::RespectLocalePreference(Profile* profile) { |
811 DCHECK(profile != NULL); | 899 DCHECK(profile != NULL); |
812 PrefService* prefs = profile->GetPrefs(); | 900 PrefService* prefs = profile->GetPrefs(); |
813 DCHECK(prefs != NULL); | 901 DCHECK(prefs != NULL); |
814 if (g_browser_process == NULL) | 902 if (g_browser_process == NULL) |
815 return; | 903 return; |
816 | 904 |
817 std::string pref_locale = prefs->GetString(prefs::kApplicationLocale); | 905 std::string pref_locale = prefs->GetString(prefs::kApplicationLocale); |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 profile->GetRequestContext())); | 1153 profile->GetRequestContext())); |
1066 } | 1154 } |
1067 | 1155 |
1068 void LoginUtilsImpl::OnGetOAuthTokenSuccess(const std::string& oauth_token) { | 1156 void LoginUtilsImpl::OnGetOAuthTokenSuccess(const std::string& oauth_token) { |
1069 VLOG(1) << "Got OAuth request token!"; | 1157 VLOG(1) << "Got OAuth request token!"; |
1070 } | 1158 } |
1071 | 1159 |
1072 void LoginUtilsImpl::OnGetOAuthTokenFailure( | 1160 void LoginUtilsImpl::OnGetOAuthTokenFailure( |
1073 const GoogleServiceAuthError& error) { | 1161 const GoogleServiceAuthError& error) { |
1074 // TODO(zelidrag): Pop up sync setup UI here? | 1162 // TODO(zelidrag): Pop up sync setup UI here? |
1075 LOG(WARNING) << "Failed fetching OAuth request token"; | 1163 LOG(WARNING) << "Failed fetching OAuth request token, error: " |
| 1164 << error.state(); |
1076 } | 1165 } |
1077 | 1166 |
1078 void LoginUtilsImpl::OnOAuthGetAccessTokenSuccess(const std::string& token, | 1167 void LoginUtilsImpl::OnOAuthGetAccessTokenSuccess(const std::string& token, |
1079 const std::string& secret) { | 1168 const std::string& secret) { |
1080 VLOG(1) << "Got OAuth v1 token!"; | 1169 VLOG(1) << "Got OAuth v1 token!"; |
1081 Profile* user_profile = ProfileManager::GetDefaultProfile(); | 1170 Profile* user_profile = ProfileManager::GetDefaultProfile(); |
1082 StoreOAuth1AccessToken(user_profile, token, secret); | 1171 StoreOAuth1AccessToken(user_profile, token, secret); |
1083 | 1172 |
1084 // Verify OAuth1 token by doing OAuthLogin and fetching credentials. | 1173 // Verify OAuth1 token by doing OAuthLogin and fetching credentials. |
1085 VerifyOAuth1AccessToken(user_profile, token, secret); | 1174 VerifyOAuth1AccessToken(user_profile, token, secret); |
1086 } | 1175 } |
1087 | 1176 |
| 1177 void LoginUtilsImpl::OnOAuthGetAccessTokenFailure( |
| 1178 const GoogleServiceAuthError& error) { |
| 1179 // TODO(zelidrag): Pop up sync setup UI here? |
| 1180 LOG(WARNING) << "Failed fetching OAuth request token, error: " |
| 1181 << error.state(); |
| 1182 } |
| 1183 |
1088 void LoginUtilsImpl::FetchSecondaryTokens(Profile* offrecord_profile, | 1184 void LoginUtilsImpl::FetchSecondaryTokens(Profile* offrecord_profile, |
1089 const std::string& token, | 1185 const std::string& token, |
1090 const std::string& secret) { | 1186 const std::string& secret) { |
1091 FetchPolicyToken(offrecord_profile, token, secret); | 1187 FetchPolicyToken(offrecord_profile, token, secret); |
1092 // TODO(rickcam, zelidrag): Wire TokenService there when it becomes | 1188 // TODO(rickcam, zelidrag): Wire TokenService there when it becomes |
1093 // capable of handling OAuth1 tokens directly. | 1189 // capable of handling OAuth1 tokens directly. |
1094 } | 1190 } |
1095 | 1191 |
1096 bool LoginUtilsImpl::ReadOAuth1AccessToken(Profile* user_profile, | 1192 bool LoginUtilsImpl::ReadOAuth1AccessToken(Profile* user_profile, |
1097 std::string* token, | 1193 std::string* token, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1152 token, | 1248 token, |
1153 secret, | 1249 secret, |
1154 username_)); | 1250 username_)); |
1155 oauth_login_verifier_->Start(); | 1251 oauth_login_verifier_->Start(); |
1156 } | 1252 } |
1157 | 1253 |
1158 | 1254 |
1159 void LoginUtilsImpl::FetchPolicyToken(Profile* offrecord_profile, | 1255 void LoginUtilsImpl::FetchPolicyToken(Profile* offrecord_profile, |
1160 const std::string& token, | 1256 const std::string& token, |
1161 const std::string& secret) { | 1257 const std::string& secret) { |
1162 // Trigger oauth token fetch for user policy. | 1258 // Fetch dm service token now, if it hasn't been fetched yet. |
1163 policy_oauth_fetcher_.reset(new PolicyOAuthFetcher(offrecord_profile, | 1259 if (!policy_oauth_fetcher_.get() || policy_oauth_fetcher_->failed()) { |
1164 token, | 1260 // Trigger oauth token fetch for user policy. |
1165 secret)); | 1261 policy_oauth_fetcher_.reset(new PolicyOAuthFetcher(offrecord_profile, |
1166 policy_oauth_fetcher_->Start(); | 1262 token, |
| 1263 secret)); |
| 1264 policy_oauth_fetcher_->Start(); |
| 1265 } |
1167 | 1266 |
1168 // TODO(zelidrag): We should add initialization of other services somewhere | 1267 // TODO(zelidrag): We should add initialization of other services somewhere |
1169 // here as well. This could be handled with TokenService class once it is | 1268 // here as well. This could be handled with TokenService class once it is |
1170 // ready to handle OAuth tokens. | 1269 // ready to handle OAuth tokens. |
1171 | 1270 |
1172 // We don't need authenticator instance any more, reset it so that | 1271 // We don't need authenticator instance any more, reset it so that |
1173 // ScreenLocker would create a separate instance. | 1272 // ScreenLocker would create a separate instance. |
1174 // TODO(nkostylev): There's a potential race if SL would be created before | 1273 // TODO(nkostylev): There's a potential race if SL would be created before |
1175 // OAuth tokens are fetched. It would use incorrect Authenticator instance. | 1274 // OAuth tokens are fetched. It would use incorrect Authenticator instance. |
1176 authenticator_ = NULL; | 1275 authenticator_ = NULL; |
1177 } | 1276 } |
1178 | 1277 |
1179 void LoginUtilsImpl::OnOAuthGetAccessTokenFailure( | |
1180 const GoogleServiceAuthError& error) { | |
1181 // TODO(zelidrag): Pop up sync setup UI here? | |
1182 LOG(WARNING) << "Failed fetching OAuth v1 token, error: " << error.state(); | |
1183 } | |
1184 | |
1185 void LoginUtilsImpl::OnOnlineStateChanged(bool online) { | 1278 void LoginUtilsImpl::OnOnlineStateChanged(bool online) { |
1186 // If we come online for the first time after successful offline login, | 1279 // If we come online for the first time after successful offline login, |
1187 // we need to kick of OAuth token verification process again. | 1280 // we need to kick of OAuth token verification process again. |
1188 if (UserManager::Get()->user_is_logged_in() && | 1281 if (UserManager::Get()->user_is_logged_in() && |
1189 UserManager::Get()->offline_login() && online) { | 1282 UserManager::Get()->offline_login() && online) { |
1190 KickStartAuthentication(ProfileManager::GetDefaultProfile()); | 1283 KickStartAuthentication(ProfileManager::GetDefaultProfile()); |
1191 } | 1284 } |
1192 } | 1285 } |
1193 | 1286 |
1194 LoginUtils* LoginUtils::Get() { | 1287 LoginUtils* LoginUtils::Get() { |
(...skipping 26 matching lines...) Expand all Loading... |
1221 // Mark login host for deletion after browser starts. This | 1314 // Mark login host for deletion after browser starts. This |
1222 // guarantees that the message loop will be referenced by the | 1315 // guarantees that the message loop will be referenced by the |
1223 // browser before it is dereferenced by the login host. | 1316 // browser before it is dereferenced by the login host. |
1224 if (login_host) { | 1317 if (login_host) { |
1225 login_host->OnSessionStart(); | 1318 login_host->OnSessionStart(); |
1226 login_host = NULL; | 1319 login_host = NULL; |
1227 } | 1320 } |
1228 } | 1321 } |
1229 | 1322 |
1230 } // namespace chromeos | 1323 } // namespace chromeos |
OLD | NEW |