Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: chrome/browser/chromeos/login/login_utils.cc

Issue 24473002: Made session restore block about:flags driven browser restart. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/chromeos/login/oauth2_login_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/chromeos/chromeos_version.h" 10 #include "base/chromeos/chromeos_version.h"
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 : public LoginUtils, 98 : public LoginUtils,
99 public OAuth2LoginManager::Observer, 99 public OAuth2LoginManager::Observer,
100 public net::NetworkChangeNotifier::ConnectionTypeObserver, 100 public net::NetworkChangeNotifier::ConnectionTypeObserver,
101 public base::SupportsWeakPtr<LoginUtilsImpl> { 101 public base::SupportsWeakPtr<LoginUtilsImpl> {
102 public: 102 public:
103 LoginUtilsImpl() 103 LoginUtilsImpl()
104 : using_oauth_(false), 104 : using_oauth_(false),
105 has_web_auth_cookies_(false), 105 has_web_auth_cookies_(false),
106 delegate_(NULL), 106 delegate_(NULL),
107 should_restore_auth_session_(false), 107 should_restore_auth_session_(false),
108 exit_after_session_restore_(false),
108 session_restore_strategy_( 109 session_restore_strategy_(
109 OAuth2LoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN) { 110 OAuth2LoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN) {
110 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 111 net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
111 } 112 }
112 113
113 virtual ~LoginUtilsImpl() { 114 virtual ~LoginUtilsImpl() {
114 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 115 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
115 } 116 }
116 117
117 // LoginUtils implementation: 118 // LoginUtils implementation:
118 virtual void DoBrowserLaunch(Profile* profile, 119 virtual void DoBrowserLaunch(Profile* profile,
119 LoginDisplayHost* login_host) OVERRIDE; 120 LoginDisplayHost* login_host) OVERRIDE;
120 virtual void PrepareProfile( 121 virtual void PrepareProfile(
121 const UserContext& user_context, 122 const UserContext& user_context,
122 const std::string& display_email, 123 const std::string& display_email,
123 bool using_oauth, 124 bool using_oauth,
124 bool has_cookies, 125 bool has_cookies,
125 bool has_active_session, 126 bool has_active_session,
126 LoginUtils::Delegate* delegate) OVERRIDE; 127 LoginUtils::Delegate* delegate) OVERRIDE;
127 virtual void DelegateDeleted(LoginUtils::Delegate* delegate) OVERRIDE; 128 virtual void DelegateDeleted(LoginUtils::Delegate* delegate) OVERRIDE;
128 virtual void CompleteOffTheRecordLogin(const GURL& start_url) OVERRIDE; 129 virtual void CompleteOffTheRecordLogin(const GURL& start_url) OVERRIDE;
129 virtual void SetFirstLoginPrefs(PrefService* prefs) OVERRIDE; 130 virtual void SetFirstLoginPrefs(PrefService* prefs) OVERRIDE;
130 virtual scoped_refptr<Authenticator> CreateAuthenticator( 131 virtual scoped_refptr<Authenticator> CreateAuthenticator(
131 LoginStatusConsumer* consumer) OVERRIDE; 132 LoginStatusConsumer* consumer) OVERRIDE;
132 virtual void RestoreAuthenticationSession(Profile* profile) OVERRIDE; 133 virtual void RestoreAuthenticationSession(Profile* profile) OVERRIDE;
133 virtual void InitRlzDelayed(Profile* user_profile) OVERRIDE; 134 virtual void InitRlzDelayed(Profile* user_profile) OVERRIDE;
134 135
135 // OAuth2LoginManager::Delegate overrides. 136 // OAuth2LoginManager::Observer overrides.
136 virtual void OnSessionRestoreStateChanged( 137 virtual void OnSessionRestoreStateChanged(
137 Profile* user_profile, 138 Profile* user_profile,
138 OAuth2LoginManager::SessionRestoreState state) OVERRIDE; 139 OAuth2LoginManager::SessionRestoreState state) OVERRIDE;
140 virtual void OnNewRefreshTokenAvaiable(Profile* user_profile) OVERRIDE;
139 virtual void OnSessionAuthenticated(Profile* user_profile) OVERRIDE; 141 virtual void OnSessionAuthenticated(Profile* user_profile) OVERRIDE;
140 142
141 // net::NetworkChangeNotifier::ConnectionTypeObserver overrides. 143 // net::NetworkChangeNotifier::ConnectionTypeObserver overrides.
142 virtual void OnConnectionTypeChanged( 144 virtual void OnConnectionTypeChanged(
143 net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; 145 net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
144 146
145 private: 147 private:
146 // Restarts OAuth session authentication check. 148 // Restarts OAuth session authentication check.
147 void KickStartAuthentication(Profile* profile); 149 void KickStartAuthentication(Profile* profile);
148 150
(...skipping 27 matching lines...) Expand all
176 // Restores GAIA auth cookies for the created user profile from OAuth2 token. 178 // Restores GAIA auth cookies for the created user profile from OAuth2 token.
177 void RestoreAuthSession(Profile* user_profile, 179 void RestoreAuthSession(Profile* user_profile,
178 bool restore_from_auth_cookies); 180 bool restore_from_auth_cookies);
179 181
180 // Initializes RLZ. If |disabled| is true, RLZ pings are disabled. 182 // Initializes RLZ. If |disabled| is true, RLZ pings are disabled.
181 void InitRlz(Profile* user_profile, bool disabled); 183 void InitRlz(Profile* user_profile, bool disabled);
182 184
183 // Starts signing related services. Initiates TokenService token retrieval. 185 // Starts signing related services. Initiates TokenService token retrieval.
184 void StartSignedInServices(Profile* profile); 186 void StartSignedInServices(Profile* profile);
185 187
188 // Attempts exiting browser process and esures this does not happen
189 // while we are still fetching new OAuth refresh tokens.
190 void AttemptExit(Profile* profile);
191
186 UserContext user_context_; 192 UserContext user_context_;
187 bool using_oauth_; 193 bool using_oauth_;
188 194
189 // True if the authentication profile's cookie jar should contain 195 // True if the authentication profile's cookie jar should contain
190 // authentication cookies from the authentication extension log in flow. 196 // authentication cookies from the authentication extension log in flow.
191 bool has_web_auth_cookies_; 197 bool has_web_auth_cookies_;
192 // Has to be scoped_refptr, see comment for CreateAuthenticator(...). 198 // Has to be scoped_refptr, see comment for CreateAuthenticator(...).
193 scoped_refptr<Authenticator> authenticator_; 199 scoped_refptr<Authenticator> authenticator_;
194 200
195 // Delegate to be fired when the profile will be prepared. 201 // Delegate to be fired when the profile will be prepared.
196 LoginUtils::Delegate* delegate_; 202 LoginUtils::Delegate* delegate_;
197 203
198 // True if should restore authentication session when notified about 204 // True if should restore authentication session when notified about
199 // online state change. 205 // online state change.
200 bool should_restore_auth_session_; 206 bool should_restore_auth_session_;
201 207
208 // True if we should restart chrome right after session restore.
209 bool exit_after_session_restore_;
210
202 // Sesion restore strategy. 211 // Sesion restore strategy.
203 OAuth2LoginManager::SessionRestoreStrategy session_restore_strategy_; 212 OAuth2LoginManager::SessionRestoreStrategy session_restore_strategy_;
204 // OAuth2 refresh token for session restore. 213 // OAuth2 refresh token for session restore.
205 std::string oauth2_refresh_token_; 214 std::string oauth2_refresh_token_;
206 215
207 DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl); 216 DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl);
208 }; 217 };
209 218
210 class LoginUtilsWrapper { 219 class LoginUtilsWrapper {
211 public: 220 public:
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 if (UserManager::Get()->GetLoggedInUsers().size() == 1 && 263 if (UserManager::Get()->GetLoggedInUsers().size() == 1 &&
255 !UserManager::Get()->IsLoggedInAsLocallyManagedUser() && 264 !UserManager::Get()->IsLoggedInAsLocallyManagedUser() &&
256 !about_flags::AreSwitchesIdenticalToCurrentCommandLine( 265 !about_flags::AreSwitchesIdenticalToCurrentCommandLine(
257 user_flags, *CommandLine::ForCurrentProcess())) { 266 user_flags, *CommandLine::ForCurrentProcess())) {
258 CommandLine::StringVector flags; 267 CommandLine::StringVector flags;
259 // argv[0] is the program name |CommandLine::NO_PROGRAM|. 268 // argv[0] is the program name |CommandLine::NO_PROGRAM|.
260 flags.assign(user_flags.argv().begin() + 1, user_flags.argv().end()); 269 flags.assign(user_flags.argv().begin() + 1, user_flags.argv().end());
261 VLOG(1) << "Restarting to apply per-session flags..."; 270 VLOG(1) << "Restarting to apply per-session flags...";
262 DBusThreadManager::Get()->GetSessionManagerClient()->SetFlagsForUser( 271 DBusThreadManager::Get()->GetSessionManagerClient()->SetFlagsForUser(
263 UserManager::Get()->GetActiveUser()->email(), flags); 272 UserManager::Get()->GetActiveUser()->email(), flags);
264 chrome::AttemptExit(); 273 AttemptExit(profile);
265 return; 274 return;
266 } 275 }
267 276
268 if (login_host) { 277 if (login_host) {
269 login_host->SetStatusAreaVisible(true); 278 login_host->SetStatusAreaVisible(true);
270 login_host->BeforeSessionStart(); 279 login_host->BeforeSessionStart();
271 } 280 }
272 281
273 BootTimesLoader::Get()->AddLoginTimeMarker("BrowserLaunched", false); 282 BootTimesLoader::Get()->AddLoginTimeMarker("BrowserLaunched", false);
274 283
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 void LoginUtilsImpl::RestoreAuthSession(Profile* user_profile, 478 void LoginUtilsImpl::RestoreAuthSession(Profile* user_profile,
470 bool restore_from_auth_cookies) { 479 bool restore_from_auth_cookies) {
471 CHECK((authenticator_.get() && authenticator_->authentication_profile()) || 480 CHECK((authenticator_.get() && authenticator_->authentication_profile()) ||
472 !restore_from_auth_cookies); 481 !restore_from_auth_cookies);
473 482
474 if (chrome::IsRunningInForcedAppMode() || 483 if (chrome::IsRunningInForcedAppMode() ||
475 CommandLine::ForCurrentProcess()->HasSwitch( 484 CommandLine::ForCurrentProcess()->HasSwitch(
476 chromeos::switches::kOobeSkipPostLogin)) 485 chromeos::switches::kOobeSkipPostLogin))
477 return; 486 return;
478 487
488 exit_after_session_restore_ = false;
479 // Remove legacy OAuth1 token if we have one. If it's valid, we should already 489 // Remove legacy OAuth1 token if we have one. If it's valid, we should already
480 // have OAuth2 refresh token in TokenService that could be used to retrieve 490 // have OAuth2 refresh token in TokenService that could be used to retrieve
481 // all other tokens and user_context. 491 // all other tokens and user_context.
482 OAuth2LoginManager* login_manager = 492 OAuth2LoginManager* login_manager =
483 OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile); 493 OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile);
484 login_manager->AddObserver(this); 494 login_manager->AddObserver(this);
485 login_manager->RestoreSession( 495 login_manager->RestoreSession(
486 authenticator_.get() && authenticator_->authentication_profile() 496 authenticator_.get() && authenticator_->authentication_profile()
487 ? authenticator_->authentication_profile()->GetRequestContext() 497 ? authenticator_->authentication_profile()->GetRequestContext()
488 : NULL, 498 : NULL,
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 // OnConnectionTypeChanged() call. Otherwise starting fetchers too early may 710 // OnConnectionTypeChanged() call. Otherwise starting fetchers too early may
701 // end up canceling all request when initial network connection type is 711 // end up canceling all request when initial network connection type is
702 // processed. See http://crbug.com/121643. 712 // processed. See http://crbug.com/121643.
703 should_restore_auth_session_ = true; 713 should_restore_auth_session_ = true;
704 } 714 }
705 } 715 }
706 716
707 void LoginUtilsImpl::OnSessionRestoreStateChanged( 717 void LoginUtilsImpl::OnSessionRestoreStateChanged(
708 Profile* user_profile, 718 Profile* user_profile,
709 OAuth2LoginManager::SessionRestoreState state) { 719 OAuth2LoginManager::SessionRestoreState state) {
720 User::OAuthTokenStatus user_status = User::OAUTH_TOKEN_STATUS_UNKNOWN;
710 OAuth2LoginManager* login_manager = 721 OAuth2LoginManager* login_manager =
711 OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile); 722 OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile);
712 switch (state) { 723 switch (state) {
713 case OAuth2LoginManager::SESSION_RESTORE_NOT_STARTED:
714 break;
715 case OAuth2LoginManager::SESSION_RESTORE_PREPARING:
716 break;
717 case OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS:
718 break;
719 case OAuth2LoginManager::SESSION_RESTORE_DONE: 724 case OAuth2LoginManager::SESSION_RESTORE_DONE:
720 UserManager::Get()->SaveUserOAuthStatus( 725 user_status = User::OAUTH2_TOKEN_STATUS_VALID;
721 UserManager::Get()->GetLoggedInUser()->email(),
722 User::OAUTH2_TOKEN_STATUS_VALID);
723 login_manager->RemoveObserver(this);
724 break; 726 break;
725 case OAuth2LoginManager::SESSION_RESTORE_FAILED: 727 case OAuth2LoginManager::SESSION_RESTORE_FAILED:
726 UserManager::Get()->SaveUserOAuthStatus( 728 user_status = User::OAUTH2_TOKEN_STATUS_INVALID;
727 UserManager::Get()->GetLoggedInUser()->email(),
728 User::OAUTH2_TOKEN_STATUS_INVALID);
729 login_manager->RemoveObserver(this);
730 break; 729 break;
730 case OAuth2LoginManager::SESSION_RESTORE_NOT_STARTED:
731 return;
732 case OAuth2LoginManager::SESSION_RESTORE_PREPARING:
733 return;
734 case OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS:
735 return;
731 } 736 }
737
738 // We are in one of "done" states here.
739 UserManager::Get()->SaveUserOAuthStatus(
740 UserManager::Get()->GetLoggedInUser()->email(),
741 user_status);
742 login_manager->RemoveObserver(this);
743 }
744
745 void LoginUtilsImpl::OnNewRefreshTokenAvaiable(Profile* user_profile) {
746 // Check if we were waiting to restart chrome.
747 if (!exit_after_session_restore_)
748 return;
749
750 OAuth2LoginManager* login_manager =
751 OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile);
752 login_manager->RemoveObserver(this);
753
754 // Mark user auth token status as valid.
755 UserManager::Get()->SaveUserOAuthStatus(
756 UserManager::Get()->GetLoggedInUser()->email(),
757 User::OAUTH2_TOKEN_STATUS_VALID);
758
759 LOG(WARNING) << "Exiting after new refresh token fetched";
760 // We need to exit cleanly in this case to make sure OAuth2 RT is actually
761 // saved.
762 chrome::ExitCleanly();
732 } 763 }
733 764
734 void LoginUtilsImpl::OnSessionAuthenticated(Profile* user_profile) { 765 void LoginUtilsImpl::OnSessionAuthenticated(Profile* user_profile) {
735 StartSignedInServices(user_profile); 766 StartSignedInServices(user_profile);
736 } 767 }
737 768
738 void LoginUtilsImpl::OnConnectionTypeChanged( 769 void LoginUtilsImpl::OnConnectionTypeChanged(
739 net::NetworkChangeNotifier::ConnectionType type) { 770 net::NetworkChangeNotifier::ConnectionType type) {
740 Profile* user_profile = ProfileManager::GetDefaultProfile(); 771 Profile* user_profile = ProfileManager::GetDefaultProfile();
741 OAuth2LoginManager* login_manager = 772 OAuth2LoginManager* login_manager =
742 OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile); 773 OAuth2LoginManagerFactory::GetInstance()->GetForProfile(user_profile);
743 774
744 if (type != net::NetworkChangeNotifier::CONNECTION_NONE && 775 if (type != net::NetworkChangeNotifier::CONNECTION_NONE &&
745 UserManager::Get()->IsUserLoggedIn()) { 776 UserManager::Get()->IsUserLoggedIn()) {
746 if (login_manager->state() == 777 if (login_manager->state() ==
747 OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS) { 778 OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS) {
748 // If we come online for the first time after successful offline login, 779 // If we come online for the first time after successful offline login,
749 // we need to kick off OAuth token verification process again. 780 // we need to kick off OAuth token verification process again.
750 login_manager->ContinueSessionRestore(); 781 login_manager->ContinueSessionRestore();
751 } else if (should_restore_auth_session_) { 782 } else if (should_restore_auth_session_) {
752 should_restore_auth_session_ = false; 783 should_restore_auth_session_ = false;
753 RestoreAuthSession(user_profile, has_web_auth_cookies_); 784 RestoreAuthSession(user_profile, has_web_auth_cookies_);
754 } 785 }
755 } 786 }
756 } 787 }
757 788
789 void LoginUtilsImpl::AttemptExit(Profile* profile) {
790 if (session_restore_strategy_ !=
791 OAuth2LoginManager::RESTORE_FROM_COOKIE_JAR) {
792 chrome::AttemptExit();
793 return;
794 }
795
796 // We can't really quit if the session restore process that mints new
797 // refresh token is still in progress.
798 OAuth2LoginManager* login_manager =
799 OAuth2LoginManagerFactory::GetInstance()->GetForProfile(profile);
800 if (login_manager->state() !=
801 OAuth2LoginManager::SESSION_RESTORE_PREPARING &&
802 login_manager->state() !=
803 OAuth2LoginManager::SESSION_RESTORE_IN_PROGRESS) {
804 chrome::AttemptExit();
805 return;
806 }
807
808 LOG(WARNING) << "Attempting browser restart during session restore.";
809 exit_after_session_restore_ = true;
810 }
811
758 // static 812 // static
759 void LoginUtils::RegisterPrefs(PrefRegistrySimple* registry) { 813 void LoginUtils::RegisterPrefs(PrefRegistrySimple* registry) {
760 registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false); 814 registry->RegisterBooleanPref(prefs::kFactoryResetRequested, false);
761 registry->RegisterStringPref(prefs::kRLZBrand, std::string()); 815 registry->RegisterStringPref(prefs::kRLZBrand, std::string());
762 registry->RegisterBooleanPref(prefs::kRLZDisabled, false); 816 registry->RegisterBooleanPref(prefs::kRLZDisabled, false);
763 } 817 }
764 818
765 // static 819 // static
766 LoginUtils* LoginUtils::Get() { 820 LoginUtils* LoginUtils::Get() {
767 return LoginUtilsWrapper::GetInstance()->get(); 821 return LoginUtilsWrapper::GetInstance()->get();
768 } 822 }
769 823
770 // static 824 // static
771 void LoginUtils::Set(LoginUtils* mock) { 825 void LoginUtils::Set(LoginUtils* mock) {
772 LoginUtilsWrapper::GetInstance()->reset(mock); 826 LoginUtilsWrapper::GetInstance()->reset(mock);
773 } 827 }
774 828
775 // static 829 // static
776 bool LoginUtils::IsWhitelisted(const std::string& username) { 830 bool LoginUtils::IsWhitelisted(const std::string& username) {
777 CrosSettings* cros_settings = CrosSettings::Get(); 831 CrosSettings* cros_settings = CrosSettings::Get();
778 bool allow_new_user = false; 832 bool allow_new_user = false;
779 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); 833 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
780 if (allow_new_user) 834 if (allow_new_user)
781 return true; 835 return true;
782 return cros_settings->FindEmailInList(kAccountsPrefUsers, username); 836 return cros_settings->FindEmailInList(kAccountsPrefUsers, username);
783 } 837 }
784 838
785 } // namespace chromeos 839 } // namespace chromeos
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/chromeos/login/oauth2_login_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698