Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/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/bind.h" | |
| 9 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 10 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 11 #include "base/file_path.h" | 12 #include "base/file_path.h" |
| 12 #include "base/file_util.h" | 13 #include "base/file_util.h" |
| 13 #include "base/location.h" | 14 #include "base/location.h" |
| 14 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 15 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
| 16 #include "base/memory/singleton.h" | 17 #include "base/memory/singleton.h" |
| 17 #include "base/path_service.h" | 18 #include "base/path_service.h" |
| 18 #include "base/string_util.h" | 19 #include "base/string_util.h" |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 535 public GaiaOAuthConsumer, | 536 public GaiaOAuthConsumer, |
| 536 public OAuthLoginVerifier::Delegate, | 537 public OAuthLoginVerifier::Delegate, |
| 537 public net::NetworkChangeNotifier::OnlineStateObserver, | 538 public net::NetworkChangeNotifier::OnlineStateObserver, |
| 538 public base::SupportsWeakPtr<LoginUtilsImpl> { | 539 public base::SupportsWeakPtr<LoginUtilsImpl> { |
| 539 public: | 540 public: |
| 540 LoginUtilsImpl() | 541 LoginUtilsImpl() |
| 541 : pending_requests_(false), | 542 : pending_requests_(false), |
| 542 using_oauth_(false), | 543 using_oauth_(false), |
| 543 has_cookies_(false), | 544 has_cookies_(false), |
| 544 delegate_(NULL), | 545 delegate_(NULL), |
| 545 job_restart_request_(NULL) { | 546 job_restart_request_(NULL), |
| 547 user_policy_ready_(false), | |
| 548 profile_pending_creation_(NULL) { | |
| 546 net::NetworkChangeNotifier::AddOnlineStateObserver(this); | 549 net::NetworkChangeNotifier::AddOnlineStateObserver(this); |
| 547 } | 550 } |
| 548 | 551 |
| 549 virtual ~LoginUtilsImpl() { | 552 virtual ~LoginUtilsImpl() { |
| 550 net::NetworkChangeNotifier::RemoveOnlineStateObserver(this); | 553 net::NetworkChangeNotifier::RemoveOnlineStateObserver(this); |
| 551 } | 554 } |
| 552 | 555 |
| 553 // LoginUtils implementation: | 556 // LoginUtils implementation: |
| 554 virtual void PrepareProfile( | 557 virtual void PrepareProfile( |
| 555 const std::string& username, | 558 const std::string& username, |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 641 const std::string& token, | 644 const std::string& token, |
| 642 const std::string& secret); | 645 const std::string& secret); |
| 643 | 646 |
| 644 // Check user's profile for kApplicationLocale setting. | 647 // Check user's profile for kApplicationLocale setting. |
| 645 void RespectLocalePreference(Profile* pref); | 648 void RespectLocalePreference(Profile* pref); |
| 646 | 649 |
| 647 // Callback for asynchronous profile creation. | 650 // Callback for asynchronous profile creation. |
| 648 void OnProfileCreated(Profile* profile, | 651 void OnProfileCreated(Profile* profile, |
| 649 Profile::CreateStatus status); | 652 Profile::CreateStatus status); |
| 650 | 653 |
| 654 // Callback for asynchronous notification that user policy is ready. | |
| 655 void OnUserPolicyReady(); | |
| 656 | |
| 657 // Invoked to resume profile creation after the profile is created and user | |
| 658 // policy has been loaded. | |
| 659 void ResumeProfileCreation(Profile* user_profile); | |
| 660 | |
| 651 std::string password_; | 661 std::string password_; |
| 652 GaiaAuthConsumer::ClientLoginResult credentials_; | 662 GaiaAuthConsumer::ClientLoginResult credentials_; |
| 653 bool pending_requests_; | 663 bool pending_requests_; |
| 654 bool using_oauth_; | 664 bool using_oauth_; |
| 655 bool has_cookies_; | 665 bool has_cookies_; |
| 656 // Has to be scoped_refptr, see comment for CreateAuthenticator(...). | 666 // Has to be scoped_refptr, see comment for CreateAuthenticator(...). |
| 657 scoped_refptr<Authenticator> authenticator_; | 667 scoped_refptr<Authenticator> authenticator_; |
| 658 scoped_ptr<GaiaOAuthFetcher> oauth_fetcher_; | 668 scoped_ptr<GaiaOAuthFetcher> oauth_fetcher_; |
| 659 scoped_ptr<PolicyOAuthFetcher> policy_oauth_fetcher_; | 669 scoped_ptr<PolicyOAuthFetcher> policy_oauth_fetcher_; |
| 660 scoped_ptr<OAuthLoginVerifier> oauth_login_verifier_; | 670 scoped_ptr<OAuthLoginVerifier> oauth_login_verifier_; |
| 661 | 671 |
| 662 // Delegate to be fired when the profile will be prepared. | 672 // Delegate to be fired when the profile will be prepared. |
| 663 LoginUtils::Delegate* delegate_; | 673 LoginUtils::Delegate* delegate_; |
| 664 | 674 |
| 665 // Used to restart Chrome to switch to the guest mode. | 675 // Used to restart Chrome to switch to the guest mode. |
| 666 JobRestartRequest* job_restart_request_; | 676 JobRestartRequest* job_restart_request_; |
| 667 | 677 |
| 678 // Profile creation should only resume once user policy is ready. Since both | |
| 679 // profile creation and user policy readiness notifications come | |
|
Mattias Nissler (ping if slow)
2012/02/16 10:24:11
s/come/are reported/
| |
| 680 // asynchronously, these fields are used to track whether both are done. | |
| 681 bool user_policy_ready_; | |
| 682 Profile* profile_pending_creation_; | |
| 683 | |
| 668 DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl); | 684 DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl); |
| 669 }; | 685 }; |
| 670 | 686 |
| 671 class LoginUtilsWrapper { | 687 class LoginUtilsWrapper { |
| 672 public: | 688 public: |
| 673 static LoginUtilsWrapper* GetInstance() { | 689 static LoginUtilsWrapper* GetInstance() { |
| 674 return Singleton<LoginUtilsWrapper>::get(); | 690 return Singleton<LoginUtilsWrapper>::get(); |
| 675 } | 691 } |
| 676 | 692 |
| 677 LoginUtils* get() { | 693 LoginUtils* get() { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 744 // PrefService has the right values. | 760 // PrefService has the right values. |
| 745 // Profile creation is also resumed if the fetch attempt fails. | 761 // Profile creation is also resumed if the fetch attempt fails. |
| 746 bool wait_for_policy_fetch = | 762 bool wait_for_policy_fetch = |
| 747 using_oauth_ && | 763 using_oauth_ && |
| 748 authenticator_.get() && | 764 authenticator_.get() && |
| 749 (connector->GetUserAffiliation(username) == | 765 (connector->GetUserAffiliation(username) == |
| 750 policy::USER_AFFILIATION_MANAGED); | 766 policy::USER_AFFILIATION_MANAGED); |
| 751 | 767 |
| 752 // Initialize user policy before the profile is created so the profile | 768 // Initialize user policy before the profile is created so the profile |
| 753 // initialization code sees the cached policy settings. | 769 // initialization code sees the cached policy settings. |
| 754 connector->InitializeUserPolicy(username, wait_for_policy_fetch); | 770 user_policy_ready_ = false; |
| 771 profile_pending_creation_ = NULL; | |
| 772 connector->InitializeUserPolicy( | |
|
Nikita (slow)
2012/02/20 16:10:24
What's the cost (and what happens behind the scene
Joao da Silva
2012/02/20 16:23:15
The cost is always the same. A couple of objects a
| |
| 773 username, | |
| 774 wait_for_policy_fetch, | |
| 775 base::Bind(&LoginUtilsImpl::OnUserPolicyReady, AsWeakPtr())); | |
| 755 | 776 |
| 756 if (wait_for_policy_fetch) { | 777 if (wait_for_policy_fetch) { |
| 757 // Profile creation will block until user policy is fetched, which | 778 // Profile creation will block until user policy is fetched, which |
| 758 // requires the DeviceManagement token. Try to fetch it now. | 779 // requires the DeviceManagement token. Try to fetch it now. |
| 759 VLOG(1) << "Profile creation requires policy token, fetching now"; | 780 VLOG(1) << "Profile creation requires policy token, fetching now"; |
| 760 policy_oauth_fetcher_.reset( | 781 policy_oauth_fetcher_.reset( |
| 761 new PolicyOAuthFetcher(authenticator_->authentication_profile())); | 782 new PolicyOAuthFetcher(authenticator_->authentication_profile())); |
| 762 policy_oauth_fetcher_->Start(); | 783 policy_oauth_fetcher_->Start(); |
| 763 } | 784 } |
| 764 | 785 |
| 765 // The default profile will have been changed because the ProfileManager | 786 // The default profile will have been changed because the ProfileManager |
| 766 // will process the notification that the UserManager sends out. | 787 // will process the notification that the UserManager sends out. |
| 767 ProfileManager::CreateDefaultProfileAsync( | 788 ProfileManager::CreateDefaultProfileAsync( |
| 768 base::Bind(&LoginUtilsImpl::OnProfileCreated, AsWeakPtr())); | 789 base::Bind(&LoginUtilsImpl::OnProfileCreated, AsWeakPtr())); |
|
Mattias Nissler (ping if slow)
2012/02/16 10:24:11
Since user policy is not initialized at this point
Nikita (slow)
2012/02/20 16:10:24
I think this part could be done in a separate CL p
Joao da Silva
2012/02/20 16:23:15
Yes. This turned out to be a larger issue and we'v
| |
| 769 } | 790 } |
| 770 | 791 |
| 771 void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) { | 792 void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) { |
| 772 if (delegate_ == delegate) | 793 if (delegate_ == delegate) |
| 773 delegate_ = NULL; | 794 delegate_ = NULL; |
| 774 } | 795 } |
| 775 | 796 |
| 797 void LoginUtilsImpl::OnUserPolicyReady() { | |
| 798 user_policy_ready_ = true; | |
| 799 if (profile_pending_creation_) { | |
| 800 ResumeProfileCreation(profile_pending_creation_); | |
| 801 profile_pending_creation_ = NULL; | |
| 802 } | |
| 803 } | |
| 804 | |
| 776 void LoginUtilsImpl::OnProfileCreated( | 805 void LoginUtilsImpl::OnProfileCreated( |
| 777 Profile* user_profile, | 806 Profile* user_profile, |
| 778 Profile::CreateStatus status) { | 807 Profile::CreateStatus status) { |
| 779 CHECK(user_profile); | 808 CHECK(user_profile); |
| 780 switch (status) { | 809 switch (status) { |
| 781 case Profile::CREATE_STATUS_INITIALIZED: | 810 case Profile::CREATE_STATUS_INITIALIZED: |
| 811 if (user_policy_ready_) | |
| 812 ResumeProfileCreation(user_profile); | |
| 813 else | |
| 814 profile_pending_creation_ = user_profile; | |
| 782 break; | 815 break; |
| 783 case Profile::CREATE_STATUS_CREATED: { | 816 case Profile::CREATE_STATUS_CREATED: { |
| 784 if (UserManager::Get()->current_user_is_new()) | 817 if (UserManager::Get()->current_user_is_new()) |
| 785 SetFirstLoginPrefs(user_profile->GetPrefs()); | 818 SetFirstLoginPrefs(user_profile->GetPrefs()); |
| 786 // Make sure that the google service username is properly set (we do this | 819 // Make sure that the google service username is properly set (we do this |
| 787 // on every sign in, not just the first login, to deal with existing | 820 // on every sign in, not just the first login, to deal with existing |
| 788 // profiles that might not have it set yet). | 821 // profiles that might not have it set yet). |
| 789 StringPrefMember google_services_username; | 822 StringPrefMember google_services_username; |
| 790 google_services_username.Init(prefs::kGoogleServicesUsername, | 823 google_services_username.Init(prefs::kGoogleServicesUsername, |
| 791 user_profile->GetPrefs(), NULL); | 824 user_profile->GetPrefs(), NULL); |
| 792 google_services_username.SetValue( | 825 google_services_username.SetValue( |
| 793 UserManager::Get()->logged_in_user().display_email()); | 826 UserManager::Get()->logged_in_user().display_email()); |
| 794 // Make sure we flip every profile to not share proxies if the user hasn't | 827 // Make sure we flip every profile to not share proxies if the user hasn't |
| 795 // specified so explicitly. | 828 // specified so explicitly. |
| 796 const PrefService::Preference* use_shared_proxies_pref = | 829 const PrefService::Preference* use_shared_proxies_pref = |
| 797 user_profile->GetPrefs()->FindPreference(prefs::kUseSharedProxies); | 830 user_profile->GetPrefs()->FindPreference(prefs::kUseSharedProxies); |
| 798 if (use_shared_proxies_pref->IsDefaultValue()) | 831 if (use_shared_proxies_pref->IsDefaultValue()) |
| 799 user_profile->GetPrefs()->SetBoolean(prefs::kUseSharedProxies, false); | 832 user_profile->GetPrefs()->SetBoolean(prefs::kUseSharedProxies, false); |
| 800 RespectLocalePreference(user_profile); | 833 RespectLocalePreference(user_profile); |
| 801 return; | 834 break; |
| 802 } | 835 } |
| 803 case Profile::CREATE_STATUS_FAIL: | 836 case Profile::CREATE_STATUS_FAIL: |
| 804 default: | 837 default: |
| 805 NOTREACHED(); | 838 NOTREACHED(); |
| 806 return; | 839 break; |
| 807 } | 840 } |
| 841 } | |
| 808 | 842 |
| 843 void LoginUtilsImpl::ResumeProfileCreation(Profile* user_profile) { | |
| 809 BootTimesLoader* btl = BootTimesLoader::Get(); | 844 BootTimesLoader* btl = BootTimesLoader::Get(); |
| 810 btl->AddLoginTimeMarker("UserProfileGotten", false); | 845 btl->AddLoginTimeMarker("UserProfileGotten", false); |
| 811 | 846 |
| 812 if (using_oauth_) { | 847 if (using_oauth_) { |
| 813 // Reuse the access token fetched by the PolicyOAuthFetcher, if it was | 848 // Reuse the access token fetched by the PolicyOAuthFetcher, if it was |
| 814 // used to fetch policies before Profile creation. | 849 // used to fetch policies before Profile creation. |
| 815 if (policy_oauth_fetcher_.get() && | 850 if (policy_oauth_fetcher_.get() && |
| 816 !policy_oauth_fetcher_->oauth1_token().empty()) { | 851 !policy_oauth_fetcher_->oauth1_token().empty()) { |
| 817 VLOG(1) << "Resuming profile creation after fetching policy token"; | 852 VLOG(1) << "Resuming profile creation after fetching policy token"; |
| 818 StoreOAuth1AccessToken(user_profile, | 853 StoreOAuth1AccessToken(user_profile, |
| (...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1406 bool LoginUtils::IsWhitelisted(const std::string& username) { | 1441 bool LoginUtils::IsWhitelisted(const std::string& username) { |
| 1407 CrosSettings* cros_settings = CrosSettings::Get(); | 1442 CrosSettings* cros_settings = CrosSettings::Get(); |
| 1408 bool allow_new_user = false; | 1443 bool allow_new_user = false; |
| 1409 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); | 1444 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); |
| 1410 if (allow_new_user) | 1445 if (allow_new_user) |
| 1411 return true; | 1446 return true; |
| 1412 return cros_settings->FindEmailInList(kAccountsPrefUsers, username); | 1447 return cros_settings->FindEmailInList(kAccountsPrefUsers, username); |
| 1413 } | 1448 } |
| 1414 | 1449 |
| 1415 } // namespace chromeos | 1450 } // namespace chromeos |
| OLD | NEW |