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 <algorithm> | 7 #include <algorithm> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 #include "chrome/browser/about_flags.h" | 31 #include "chrome/browser/about_flags.h" |
| 32 #include "chrome/browser/app_mode/app_mode_utils.h" | 32 #include "chrome/browser/app_mode/app_mode_utils.h" |
| 33 #include "chrome/browser/browser_process.h" | 33 #include "chrome/browser/browser_process.h" |
| 34 #include "chrome/browser/browser_shutdown.h" | 34 #include "chrome/browser/browser_shutdown.h" |
| 35 #include "chrome/browser/chrome_notification_types.h" | 35 #include "chrome/browser/chrome_notification_types.h" |
| 36 #include "chrome/browser/chromeos/boot_times_loader.h" | 36 #include "chrome/browser/chromeos/boot_times_loader.h" |
| 37 #include "chrome/browser/chromeos/login/auth/parallel_authenticator.h" | 37 #include "chrome/browser/chromeos/login/auth/parallel_authenticator.h" |
| 38 #include "chrome/browser/chromeos/login/auth/user_context.h" | 38 #include "chrome/browser/chromeos/login/auth/user_context.h" |
| 39 #include "chrome/browser/chromeos/login/chrome_restart_request.h" | 39 #include "chrome/browser/chromeos/login/chrome_restart_request.h" |
| 40 #include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h" | 40 #include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h" |
| 41 #include "chrome/browser/chromeos/login/existing_user_controller.h" | |
| 41 #include "chrome/browser/chromeos/login/lock/screen_locker.h" | 42 #include "chrome/browser/chromeos/login/lock/screen_locker.h" |
| 42 #include "chrome/browser/chromeos/login/profile_auth_data.h" | 43 #include "chrome/browser/chromeos/login/profile_auth_data.h" |
| 43 #include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter.h" | 44 #include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter.h" |
| 44 #include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter_factory .h" | 45 #include "chrome/browser/chromeos/login/saml/saml_offline_signin_limiter_factory .h" |
| 45 #include "chrome/browser/chromeos/login/session/session_manager.h" | 46 #include "chrome/browser/chromeos/login/session/session_manager.h" |
| 46 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h" | 47 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h" |
| 47 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h" | 48 #include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h" |
| 48 #include "chrome/browser/chromeos/login/startup_utils.h" | 49 #include "chrome/browser/chromeos/login/startup_utils.h" |
| 49 #include "chrome/browser/chromeos/login/ui/input_events_blocker.h" | 50 #include "chrome/browser/chromeos/login/ui/input_events_blocker.h" |
| 50 #include "chrome/browser/chromeos/login/ui/login_display_host.h" | 51 #include "chrome/browser/chromeos/login/ui/login_display_host.h" |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 81 #include "google_apis/gaia/gaia_auth_consumer.h" | 82 #include "google_apis/gaia/gaia_auth_consumer.h" |
| 82 #include "net/base/network_change_notifier.h" | 83 #include "net/base/network_change_notifier.h" |
| 83 #include "net/url_request/url_request_context.h" | 84 #include "net/url_request/url_request_context.h" |
| 84 #include "net/url_request/url_request_context_getter.h" | 85 #include "net/url_request/url_request_context_getter.h" |
| 85 #include "url/gurl.h" | 86 #include "url/gurl.h" |
| 86 | 87 |
| 87 using content::BrowserThread; | 88 using content::BrowserThread; |
| 88 | 89 |
| 89 namespace chromeos { | 90 namespace chromeos { |
| 90 | 91 |
| 92 namespace { | |
| 93 | |
| 94 // Returns new CommandLine with per-user flags. | |
| 95 CommandLine CreatePerSessionCommandLine(Profile* profile) { | |
| 96 CommandLine user_flags(CommandLine::NO_PROGRAM); | |
| 97 about_flags::PrefServiceFlagsStorage flags_storage_(profile->GetPrefs()); | |
| 98 about_flags::ConvertFlagsToSwitches( | |
| 99 &flags_storage_, &user_flags, about_flags::kAddSentinels); | |
| 100 return user_flags; | |
| 101 } | |
| 102 | |
| 103 // Returns true if restart is needed to apply per-session flags. | |
| 104 bool NeedRestartToApplyPerSessionFlags(const CommandLine& user_flags) { | |
| 105 // Don't restart browser if it is not first profile in session. | |
| 106 if (UserManager::Get()->GetLoggedInUsers().size() != 1) | |
| 107 return false; | |
| 108 | |
| 109 // Only restart if needed and if not going into managed mode. | |
| 110 if (UserManager::Get()->IsLoggedInAsLocallyManagedUser()) | |
| 111 return false; | |
| 112 | |
| 113 if (about_flags::AreSwitchesIdenticalToCurrentCommandLine( | |
| 114 user_flags, *CommandLine::ForCurrentProcess())) { | |
| 115 return false; | |
| 116 } | |
| 117 | |
| 118 return true; | |
| 119 } | |
| 120 | |
| 121 bool CanPerformEarlyRestart() { | |
| 122 LOG(ERROR) << "CanPerformEarlyRestart(): called."; | |
| 123 const ExistingUserController* controller = | |
| 124 ExistingUserController::current_controller(); | |
| 125 if (!controller) | |
|
Nikita (slow)
2014/06/18 12:23:30
Could be simplified as
return !controller ||
Alexander Alekseev
2014/06/18 15:06:55
I decided to add comments here and rely on optimiz
| |
| 126 return true; | |
| 127 | |
| 128 // Early restart is possible only if user keys are up to date. | |
|
Nikita (slow)
2014/06/18 12:23:30
nit: I guess this should say "OAuth token is up to
Alexander Alekseev
2014/06/18 15:06:55
Done.
| |
| 129 | |
| 130 if (controller->password_changed()) | |
| 131 return false; | |
| 132 | |
| 133 if (controller->auth_mode() != LoginPerformer::AUTH_MODE_INTERNAL) | |
| 134 return false; | |
| 135 | |
| 136 return true; | |
| 137 } | |
| 138 | |
| 139 } // namespace | |
| 140 | |
| 91 struct DoBrowserLaunchOnLocaleLoadedData; | 141 struct DoBrowserLaunchOnLocaleLoadedData; |
| 92 | 142 |
| 93 class LoginUtilsImpl | 143 class LoginUtilsImpl |
| 94 : public LoginUtils, | 144 : public LoginUtils, |
| 95 public base::SupportsWeakPtr<LoginUtilsImpl>, | 145 public base::SupportsWeakPtr<LoginUtilsImpl>, |
| 96 public SessionManager::Delegate { | 146 public SessionManager::Delegate { |
| 97 public: | 147 public: |
| 98 LoginUtilsImpl() | 148 LoginUtilsImpl() |
| 99 : delegate_(NULL) { | 149 : delegate_(NULL) { |
| 100 } | 150 } |
| 101 | 151 |
| 102 virtual ~LoginUtilsImpl() { | 152 virtual ~LoginUtilsImpl() { |
| 103 } | 153 } |
| 104 | 154 |
| 105 // LoginUtils implementation: | 155 // LoginUtils implementation: |
| 106 virtual void DoBrowserLaunch(Profile* profile, | 156 virtual void DoBrowserLaunch(Profile* profile, |
| 107 LoginDisplayHost* login_host) OVERRIDE; | 157 LoginDisplayHost* login_host) OVERRIDE; |
| 108 virtual void PrepareProfile( | 158 virtual void PrepareProfile( |
| 109 const UserContext& user_context, | 159 const UserContext& user_context, |
| 110 bool has_cookies, | 160 bool has_cookies, |
| 111 bool has_active_session, | 161 bool has_active_session, |
| 112 LoginUtils::Delegate* delegate) OVERRIDE; | 162 LoginUtils::Delegate* delegate) OVERRIDE; |
| 113 virtual void DelegateDeleted(LoginUtils::Delegate* delegate) OVERRIDE; | 163 virtual void DelegateDeleted(LoginUtils::Delegate* delegate) OVERRIDE; |
| 114 virtual void CompleteOffTheRecordLogin(const GURL& start_url) OVERRIDE; | 164 virtual void CompleteOffTheRecordLogin(const GURL& start_url) OVERRIDE; |
| 115 virtual scoped_refptr<Authenticator> CreateAuthenticator( | 165 virtual scoped_refptr<Authenticator> CreateAuthenticator( |
| 116 LoginStatusConsumer* consumer) OVERRIDE; | 166 LoginStatusConsumer* consumer) OVERRIDE; |
| 167 virtual bool RestartToApplyPerSessionFlagsIfNeed(Profile* profile, | |
| 168 bool early_restart) OVERRIDE; | |
| 117 | 169 |
| 118 // SessionManager::Delegate implementation: | 170 // SessionManager::Delegate implementation: |
| 119 virtual void OnProfilePrepared(Profile* profile) OVERRIDE; | 171 virtual void OnProfilePrepared(Profile* profile) OVERRIDE; |
| 120 #if defined(ENABLE_RLZ) | 172 #if defined(ENABLE_RLZ) |
| 121 virtual void OnRlzInitialized() OVERRIDE; | 173 virtual void OnRlzInitialized() OVERRIDE; |
| 122 #endif | 174 #endif |
| 123 | 175 |
| 124 private: | 176 private: |
| 125 // DoBrowserLaunch is split into two parts. | 177 // DoBrowserLaunch is split into two parts. |
| 126 // This one is called after asynchronous locale switch. | 178 // This one is called after asynchronous locale switch. |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 205 // DoBrowserLaunchOnLocaleLoaded() depending on | 257 // DoBrowserLaunchOnLocaleLoaded() depending on |
| 206 // if locale switch was needed. | 258 // if locale switch was needed. |
| 207 void LoginUtilsImpl::DoBrowserLaunchOnLocaleLoadedImpl( | 259 void LoginUtilsImpl::DoBrowserLaunchOnLocaleLoadedImpl( |
| 208 Profile* profile, | 260 Profile* profile, |
| 209 LoginDisplayHost* login_host) { | 261 LoginDisplayHost* login_host) { |
| 210 if (!UserManager::Get()->GetCurrentUserFlow()->ShouldLaunchBrowser()) { | 262 if (!UserManager::Get()->GetCurrentUserFlow()->ShouldLaunchBrowser()) { |
| 211 UserManager::Get()->GetCurrentUserFlow()->LaunchExtraSteps(profile); | 263 UserManager::Get()->GetCurrentUserFlow()->LaunchExtraSteps(profile); |
| 212 return; | 264 return; |
| 213 } | 265 } |
| 214 | 266 |
| 215 CommandLine user_flags(CommandLine::NO_PROGRAM); | 267 if (RestartToApplyPerSessionFlagsIfNeed(profile, false)) |
| 216 about_flags::PrefServiceFlagsStorage flags_storage_(profile->GetPrefs()); | |
| 217 about_flags::ConvertFlagsToSwitches(&flags_storage_, &user_flags, | |
| 218 about_flags::kAddSentinels); | |
| 219 // Only restart if needed and if not going into managed mode. | |
| 220 // Don't restart browser if it is not first profile in session. | |
| 221 if (UserManager::Get()->GetLoggedInUsers().size() == 1 && | |
| 222 !UserManager::Get()->IsLoggedInAsLocallyManagedUser() && | |
| 223 !about_flags::AreSwitchesIdenticalToCurrentCommandLine( | |
| 224 user_flags, *CommandLine::ForCurrentProcess())) { | |
| 225 CommandLine::StringVector flags; | |
| 226 // argv[0] is the program name |CommandLine::NO_PROGRAM|. | |
| 227 flags.assign(user_flags.argv().begin() + 1, user_flags.argv().end()); | |
| 228 VLOG(1) << "Restarting to apply per-session flags..."; | |
| 229 DBusThreadManager::Get()->GetSessionManagerClient()->SetFlagsForUser( | |
| 230 UserManager::Get()->GetActiveUser()->email(), flags); | |
| 231 AttemptRestart(profile); | |
| 232 return; | 268 return; |
| 233 } | |
| 234 | 269 |
| 235 if (login_host) { | 270 if (login_host) { |
| 236 login_host->SetStatusAreaVisible(true); | 271 login_host->SetStatusAreaVisible(true); |
| 237 login_host->BeforeSessionStart(); | 272 login_host->BeforeSessionStart(); |
| 238 } | 273 } |
| 239 | 274 |
| 240 BootTimesLoader::Get()->AddLoginTimeMarker("BrowserLaunched", false); | 275 BootTimesLoader::Get()->AddLoginTimeMarker("BrowserLaunched", false); |
| 241 | 276 |
| 242 VLOG(1) << "Launching browser..."; | 277 VLOG(1) << "Launching browser..."; |
| 278 TRACE_EVENT0("login", "LaunchBrowser"); | |
| 243 StartupBrowserCreator browser_creator; | 279 StartupBrowserCreator browser_creator; |
| 244 int return_code; | 280 int return_code; |
| 245 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ? | 281 chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ? |
| 246 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN; | 282 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN; |
| 247 | 283 |
| 248 browser_creator.LaunchBrowser(*CommandLine::ForCurrentProcess(), | 284 browser_creator.LaunchBrowser(*CommandLine::ForCurrentProcess(), |
| 249 profile, | 285 profile, |
| 250 base::FilePath(), | 286 base::FilePath(), |
| 251 chrome::startup::IS_PROCESS_STARTUP, | 287 chrome::startup::IS_PROCESS_STARTUP, |
| 252 first_run, | 288 first_run, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 302 has_cookies, | 338 has_cookies, |
| 303 has_active_session, | 339 has_active_session, |
| 304 this); | 340 this); |
| 305 } | 341 } |
| 306 | 342 |
| 307 void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) { | 343 void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) { |
| 308 if (delegate_ == delegate) | 344 if (delegate_ == delegate) |
| 309 delegate_ = NULL; | 345 delegate_ = NULL; |
| 310 } | 346 } |
| 311 | 347 |
| 348 bool LoginUtilsImpl::RestartToApplyPerSessionFlagsIfNeed(Profile* profile, | |
| 349 bool early_restart) { | |
| 350 if (early_restart && !CanPerformEarlyRestart()) | |
| 351 return false; | |
| 352 | |
| 353 const CommandLine user_flags(CreatePerSessionCommandLine(profile)); | |
| 354 if (!NeedRestartToApplyPerSessionFlags(user_flags)) | |
| 355 return false; | |
| 356 | |
| 357 CommandLine::StringVector flags; | |
| 358 // argv[0] is the program name |CommandLine::NO_PROGRAM|. | |
| 359 flags.assign(user_flags.argv().begin() + 1, user_flags.argv().end()); | |
| 360 VLOG(1) << "Restarting to apply per-session flags..."; | |
| 361 DBusThreadManager::Get()->GetSessionManagerClient()->SetFlagsForUser( | |
| 362 UserManager::Get()->GetActiveUser()->email(), flags); | |
| 363 AttemptRestart(profile); | |
| 364 return true; | |
| 365 } | |
| 366 | |
| 312 void LoginUtilsImpl::CompleteOffTheRecordLogin(const GURL& start_url) { | 367 void LoginUtilsImpl::CompleteOffTheRecordLogin(const GURL& start_url) { |
| 313 VLOG(1) << "Completing incognito login"; | 368 VLOG(1) << "Completing incognito login"; |
| 314 | 369 |
| 315 // For guest session we ask session manager to restart Chrome with --bwsi | 370 // For guest session we ask session manager to restart Chrome with --bwsi |
| 316 // flag. We keep only some of the arguments of this process. | 371 // flag. We keep only some of the arguments of this process. |
| 317 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); | 372 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); |
| 318 CommandLine command_line(browser_command_line.GetProgram()); | 373 CommandLine command_line(browser_command_line.GetProgram()); |
| 319 std::string cmd_line_str = | 374 std::string cmd_line_str = |
| 320 GetOffTheRecordCommandLine(start_url, | 375 GetOffTheRecordCommandLine(start_url, |
| 321 StartupUtils::IsOobeCompleted(), | 376 StartupUtils::IsOobeCompleted(), |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 CrosSettings* cros_settings = CrosSettings::Get(); | 455 CrosSettings* cros_settings = CrosSettings::Get(); |
| 401 bool allow_new_user = false; | 456 bool allow_new_user = false; |
| 402 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); | 457 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); |
| 403 if (allow_new_user) | 458 if (allow_new_user) |
| 404 return true; | 459 return true; |
| 405 return cros_settings->FindEmailInList( | 460 return cros_settings->FindEmailInList( |
| 406 kAccountsPrefUsers, username, wildcard_match); | 461 kAccountsPrefUsers, username, wildcard_match); |
| 407 } | 462 } |
| 408 | 463 |
| 409 } // namespace chromeos | 464 } // namespace chromeos |
| OLD | NEW |