| 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_performer.h" | 5 #include "chrome/browser/chromeos/login/login_performer.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
| 15 #include "chrome/browser/browser_process.h" | 15 #include "chrome/browser/browser_process.h" |
| 16 #include "chrome/browser/chromeos/boot_times_loader.h" | 16 #include "chrome/browser/chromeos/boot_times_loader.h" |
| 17 #include "chrome/browser/chromeos/cros/cros_library.h" | 17 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 18 #include "chrome/browser/chromeos/cros/screen_lock_library.h" | 18 #include "chrome/browser/chromeos/cros/screen_lock_library.h" |
| 19 #include "chrome/browser/chromeos/cros_settings.h" |
| 19 #include "chrome/browser/chromeos/cros_settings_names.h" | 20 #include "chrome/browser/chromeos/cros_settings_names.h" |
| 20 #include "chrome/browser/chromeos/login/login_utils.h" | 21 #include "chrome/browser/chromeos/login/login_utils.h" |
| 21 #include "chrome/browser/chromeos/login/screen_locker.h" | 22 #include "chrome/browser/chromeos/login/screen_locker.h" |
| 22 #include "chrome/browser/chromeos/user_cros_settings_provider.h" | |
| 23 #include "chrome/browser/prefs/pref_service.h" | 23 #include "chrome/browser/prefs/pref_service.h" |
| 24 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
| 25 #include "chrome/browser/profiles/profile_manager.h" | 25 #include "chrome/browser/profiles/profile_manager.h" |
| 26 #include "chrome/common/chrome_notification_types.h" | 26 #include "chrome/common/chrome_notification_types.h" |
| 27 #include "chrome/common/chrome_switches.h" | 27 #include "chrome/common/chrome_switches.h" |
| 28 #include "chrome/common/pref_names.h" | 28 #include "chrome/common/pref_names.h" |
| 29 #include "content/browser/user_metrics.h" | 29 #include "content/browser/user_metrics.h" |
| 30 #include "content/public/browser/browser_thread.h" | 30 #include "content/public/browser/browser_thread.h" |
| 31 #include "content/public/browser/notification_service.h" | 31 #include "content/public/browser/notification_service.h" |
| 32 #include "content/public/browser/notification_types.h" | 32 #include "content/public/browser/notification_types.h" |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 last_login_failure_ = | 215 last_login_failure_ = |
| 216 LoginFailure::FromNetworkAuthFailure(GoogleServiceAuthError( | 216 LoginFailure::FromNetworkAuthFailure(GoogleServiceAuthError( |
| 217 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); | 217 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)); |
| 218 password_changed_ = true; | 218 password_changed_ = true; |
| 219 DVLOG(1) << "Password change detected - locking screen."; | 219 DVLOG(1) << "Password change detected - locking screen."; |
| 220 RequestScreenLock(); | 220 RequestScreenLock(); |
| 221 } | 221 } |
| 222 } | 222 } |
| 223 | 223 |
| 224 //////////////////////////////////////////////////////////////////////////////// | 224 //////////////////////////////////////////////////////////////////////////////// |
| 225 // LoginPerformer, SignedSettingsHelper::Callback implementation: | |
| 226 | |
| 227 void LoginPerformer::OnCheckWhitelistCompleted(SignedSettings::ReturnCode code, | |
| 228 const std::string& email) { | |
| 229 if (code == SignedSettings::SUCCESS) { | |
| 230 // Whitelist check passed, continue with authentication. | |
| 231 if (auth_mode_ == AUTH_MODE_EXTENSION) { | |
| 232 StartLoginCompletion(); | |
| 233 } else { | |
| 234 StartAuthentication(); | |
| 235 } | |
| 236 } else { | |
| 237 if (delegate_) | |
| 238 delegate_->WhiteListCheckFailed(email); | |
| 239 else | |
| 240 NOTREACHED(); | |
| 241 } | |
| 242 } | |
| 243 | |
| 244 //////////////////////////////////////////////////////////////////////////////// | |
| 245 // LoginPerformer, content::NotificationObserver implementation: | 225 // LoginPerformer, content::NotificationObserver implementation: |
| 246 // | 226 // |
| 247 | 227 |
| 248 void LoginPerformer::Observe(int type, | 228 void LoginPerformer::Observe(int type, |
| 249 const content::NotificationSource& source, | 229 const content::NotificationSource& source, |
| 250 const content::NotificationDetails& details) { | 230 const content::NotificationDetails& details) { |
| 251 if (type != chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED) | 231 if (type != chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED) |
| 252 return; | 232 return; |
| 253 | 233 |
| 254 bool is_screen_locked = *content::Details<bool>(details).ptr(); | 234 bool is_screen_locked = *content::Details<bool>(details).ptr(); |
| 255 if (is_screen_locked) { | 235 if (is_screen_locked) { |
| 256 if (screen_lock_requested_) { | 236 if (screen_lock_requested_) { |
| 257 screen_lock_requested_ = false; | 237 screen_lock_requested_ = false; |
| 258 ResolveScreenLocked(); | 238 ResolveScreenLocked(); |
| 259 } | 239 } |
| 260 } else { | 240 } else { |
| 261 ResolveScreenUnlocked(); | 241 ResolveScreenUnlocked(); |
| 262 } | 242 } |
| 263 } | 243 } |
| 264 | 244 |
| 265 //////////////////////////////////////////////////////////////////////////////// | 245 //////////////////////////////////////////////////////////////////////////////// |
| 266 // LoginPerformer, public: | 246 // LoginPerformer, public: |
| 267 void LoginPerformer::CompleteLogin(const std::string& username, | 247 void LoginPerformer::CompleteLogin(const std::string& username, |
| 268 const std::string& password) { | 248 const std::string& password) { |
| 269 auth_mode_ = AUTH_MODE_EXTENSION; | 249 auth_mode_ = AUTH_MODE_EXTENSION; |
| 270 username_ = username; | 250 username_ = username; |
| 271 password_ = password; | 251 password_ = password; |
| 252 |
| 253 CrosSettings* cros_settings = CrosSettings::Get(); |
| 254 |
| 272 // Whitelist check is always performed during initial login and | 255 // Whitelist check is always performed during initial login and |
| 273 // should not be performed when ScreenLock is active (pending online auth). | 256 // should not be performed when ScreenLock is active (pending online auth). |
| 274 if (!ScreenLocker::default_screen_locker()) { | 257 if (!ScreenLocker::default_screen_locker()) { |
| 275 // Must not proceed without signature verification. | 258 // Must not proceed without signature verification or valid user list. |
| 276 UserCrosSettingsProvider user_settings; | 259 bool trusted_settings_available = |
| 277 bool trusted_setting_available = user_settings.RequestTrustedAllowNewUser( | 260 cros_settings->GetTrusted( |
| 278 base::Bind(&LoginPerformer::CompleteLogin, weak_factory_.GetWeakPtr(), | 261 kAccountsPrefAllowNewUser, |
| 279 username, password)); | 262 base::Bind(&LoginPerformer::CompleteLogin, |
| 280 if (!trusted_setting_available) { | 263 weak_factory_.GetWeakPtr(), |
| 264 username, password)); |
| 265 if (!trusted_settings_available) { |
| 281 // Value of AllowNewUser setting is still not verified. | 266 // Value of AllowNewUser setting is still not verified. |
| 282 // Another attempt will be invoked after verification completion. | 267 // Another attempt will be invoked after verification completion. |
| 283 return; | 268 return; |
| 284 } | 269 } |
| 285 } | 270 } |
| 286 | 271 |
| 287 if (ScreenLocker::default_screen_locker() || | 272 bool allow_new_user = false; |
| 288 UserCrosSettingsProvider::cached_allow_new_user()) { | 273 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); |
| 274 if (ScreenLocker::default_screen_locker() || allow_new_user) { |
| 289 // Starts authentication if guest login is allowed or online auth pending. | 275 // Starts authentication if guest login is allowed or online auth pending. |
| 290 StartLoginCompletion(); | 276 StartLoginCompletion(); |
| 291 } else { | 277 } else { |
| 292 // Otherwise, do whitelist check first. | 278 // Otherwise, do whitelist check first. |
| 293 PrefService* local_state = g_browser_process->local_state(); | 279 const base::ListValue *user_list; |
| 294 CHECK(local_state); | 280 base::StringValue username_value(username); |
| 295 if (local_state->IsManagedPreference(kAccountsPrefUsers)) { | 281 if (cros_settings->GetList(kAccountsPrefUsers, &user_list) && |
| 296 if (UserCrosSettingsProvider::IsEmailInCachedWhitelist(username)) { | 282 user_list->Find(username_value) != user_list->end()) { |
| 297 StartLoginCompletion(); | 283 StartLoginCompletion(); |
| 298 } else { | |
| 299 if (delegate_) | |
| 300 delegate_->WhiteListCheckFailed(username); | |
| 301 else | |
| 302 NOTREACHED(); | |
| 303 } | |
| 304 } else { | 284 } else { |
| 305 // In case of signed settings: with current implementation we do not | 285 if (delegate_) |
| 306 // trust whitelist returned by PrefService. So make separate check. | 286 delegate_->WhiteListCheckFailed(username); |
| 307 SignedSettingsHelper::Get()->StartCheckWhitelistOp( | 287 else |
| 308 username, this); | 288 NOTREACHED(); |
| 309 } | 289 } |
| 310 } | 290 } |
| 311 } | 291 } |
| 312 | 292 |
| 313 void LoginPerformer::Login(const std::string& username, | 293 void LoginPerformer::Login(const std::string& username, |
| 314 const std::string& password) { | 294 const std::string& password) { |
| 315 auth_mode_ = AUTH_MODE_INTERNAL; | 295 auth_mode_ = AUTH_MODE_INTERNAL; |
| 316 username_ = username; | 296 username_ = username; |
| 317 password_ = password; | 297 password_ = password; |
| 318 | 298 |
| 299 CrosSettings* cros_settings = CrosSettings::Get(); |
| 300 |
| 319 // Whitelist check is always performed during initial login and | 301 // Whitelist check is always performed during initial login and |
| 320 // should not be performed when ScreenLock is active (pending online auth). | 302 // should not be performed when ScreenLock is active (pending online auth). |
| 321 if (!ScreenLocker::default_screen_locker()) { | 303 if (!ScreenLocker::default_screen_locker()) { |
| 322 // Must not proceed without signature verification. | 304 // Must not proceed without signature verification. |
| 323 UserCrosSettingsProvider user_settings; | 305 bool trusted_settings_available = |
| 324 bool trusted_setting_available = user_settings.RequestTrustedAllowNewUser( | 306 cros_settings->GetTrusted( |
| 325 base::Bind(&LoginPerformer::Login, weak_factory_.GetWeakPtr(), username, | 307 kAccountsPrefAllowNewUser, |
| 326 password)); | 308 base::Bind(&LoginPerformer::Login, |
| 327 if (!trusted_setting_available) { | 309 weak_factory_.GetWeakPtr(), |
| 310 username, password)); |
| 311 if (!trusted_settings_available) { |
| 328 // Value of AllowNewUser setting is still not verified. | 312 // Value of AllowNewUser setting is still not verified. |
| 329 // Another attempt will be invoked after verification completion. | 313 // Another attempt will be invoked after verification completion. |
| 330 return; | 314 return; |
| 331 } | 315 } |
| 332 } | 316 } |
| 333 | 317 |
| 334 if (ScreenLocker::default_screen_locker() || | 318 bool allow_new_user = false; |
| 335 UserCrosSettingsProvider::cached_allow_new_user()) { | 319 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); |
| 320 if (ScreenLocker::default_screen_locker() || allow_new_user) { |
| 336 // Starts authentication if guest login is allowed or online auth pending. | 321 // Starts authentication if guest login is allowed or online auth pending. |
| 337 StartAuthentication(); | 322 StartAuthentication(); |
| 338 } else { | 323 } else { |
| 339 // Otherwise, do whitelist check first. | 324 const base::ListValue *user_list; |
| 340 PrefService* local_state = g_browser_process->local_state(); | 325 base::StringValue username_value(username); |
| 341 CHECK(local_state); | 326 if (cros_settings->GetList(kAccountsPrefUsers, &user_list) && |
| 342 if (local_state->IsManagedPreference(kAccountsPrefUsers)) { | 327 user_list->Find(username_value) != user_list->end()) { |
| 343 if (UserCrosSettingsProvider::IsEmailInCachedWhitelist(username)) { | 328 StartAuthentication(); |
| 344 StartAuthentication(); | |
| 345 } else { | |
| 346 if (delegate_) | |
| 347 delegate_->WhiteListCheckFailed(username); | |
| 348 else | |
| 349 NOTREACHED(); | |
| 350 } | |
| 351 } else { | 329 } else { |
| 352 // In case of signed settings: with current implementation we do not | 330 if (delegate_) |
| 353 // trust whitelist returned by PrefService. So make separate check. | 331 delegate_->WhiteListCheckFailed(username); |
| 354 SignedSettingsHelper::Get()->StartCheckWhitelistOp( | 332 else |
| 355 username, this); | 333 NOTREACHED(); |
| 356 } | 334 } |
| 357 } | 335 } |
| 358 } | 336 } |
| 359 | 337 |
| 360 void LoginPerformer::LoginOffTheRecord() { | 338 void LoginPerformer::LoginOffTheRecord() { |
| 361 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); | 339 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); |
| 362 BrowserThread::PostTask( | 340 BrowserThread::PostTask( |
| 363 BrowserThread::UI, FROM_HERE, | 341 BrowserThread::UI, FROM_HERE, |
| 364 base::Bind(&Authenticator::LoginOffTheRecord, authenticator_.get())); | 342 base::Bind(&Authenticator::LoginOffTheRecord, authenticator_.get())); |
| 365 } | 343 } |
| 366 | 344 |
| 367 void LoginPerformer::RecoverEncryptedData(const std::string& old_password) { | 345 void LoginPerformer::RecoverEncryptedData(const std::string& old_password) { |
| 368 BrowserThread::PostTask( | 346 BrowserThread::PostTask( |
| 369 BrowserThread::UI, FROM_HERE, | 347 BrowserThread::UI, FROM_HERE, |
| 370 base::Bind(&Authenticator::RecoverEncryptedData, authenticator_.get(), | 348 base::Bind(&Authenticator::RecoverEncryptedData, authenticator_.get(), |
| 371 old_password, cached_credentials_)); | 349 old_password, |
| 350 cached_credentials_)); |
| 372 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); | 351 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); |
| 373 } | 352 } |
| 374 | 353 |
| 375 void LoginPerformer::ResyncEncryptedData() { | 354 void LoginPerformer::ResyncEncryptedData() { |
| 376 BrowserThread::PostTask( | 355 BrowserThread::PostTask( |
| 377 BrowserThread::UI, FROM_HERE, | 356 BrowserThread::UI, FROM_HERE, |
| 378 base::Bind(&Authenticator::ResyncEncryptedData, authenticator_.get(), | 357 base::Bind(&Authenticator::ResyncEncryptedData, authenticator_.get(), |
| 379 cached_credentials_)); | 358 cached_credentials_)); |
| 380 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); | 359 cached_credentials_ = GaiaAuthConsumer::ClientLoginResult(); |
| 381 } | 360 } |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 } | 511 } |
| 533 | 512 |
| 534 void LoginPerformer::StartLoginCompletion() { | 513 void LoginPerformer::StartLoginCompletion() { |
| 535 DVLOG(1) << "Login completion started"; | 514 DVLOG(1) << "Login completion started"; |
| 536 BootTimesLoader::Get()->AddLoginTimeMarker("AuthStarted", false); | 515 BootTimesLoader::Get()->AddLoginTimeMarker("AuthStarted", false); |
| 537 Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile(); | 516 Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile(); |
| 538 | 517 |
| 539 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); | 518 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); |
| 540 BrowserThread::PostTask( | 519 BrowserThread::PostTask( |
| 541 BrowserThread::UI, FROM_HERE, | 520 BrowserThread::UI, FROM_HERE, |
| 542 base::Bind(&Authenticator::CompleteLogin, authenticator_.get(), profile, | 521 base::Bind(&Authenticator::CompleteLogin, authenticator_.get(), |
| 543 username_, password_)); | 522 profile, |
| 523 username_, |
| 524 password_)); |
| 544 | 525 |
| 545 password_.clear(); | 526 password_.clear(); |
| 546 } | 527 } |
| 547 | 528 |
| 548 void LoginPerformer::StartAuthentication() { | 529 void LoginPerformer::StartAuthentication() { |
| 549 DVLOG(1) << "Auth started"; | 530 DVLOG(1) << "Auth started"; |
| 550 BootTimesLoader::Get()->AddLoginTimeMarker("AuthStarted", false); | 531 BootTimesLoader::Get()->AddLoginTimeMarker("AuthStarted", false); |
| 551 Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile(); | 532 Profile* profile = g_browser_process->profile_manager()->GetDefaultProfile(); |
| 552 if (delegate_) { | 533 if (delegate_) { |
| 553 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); | 534 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); |
| 554 BrowserThread::PostTask( | 535 BrowserThread::PostTask( |
| 555 BrowserThread::UI, FROM_HERE, | 536 BrowserThread::UI, FROM_HERE, |
| 556 base::Bind(&Authenticator::AuthenticateToLogin, authenticator_.get(), | 537 base::Bind(&Authenticator::AuthenticateToLogin, authenticator_.get(), |
| 557 profile, username_, password_, captcha_token_, captcha_)); | 538 profile, |
| 539 username_, |
| 540 password_, |
| 541 captcha_token_, |
| 542 captcha_)); |
| 558 } else { | 543 } else { |
| 559 DCHECK(authenticator_.get()) | 544 DCHECK(authenticator_.get()) |
| 560 << "Authenticator instance doesn't exist for login attempt retry."; | 545 << "Authenticator instance doesn't exist for login attempt retry."; |
| 561 // At this point offline auth has been successful, | 546 // At this point offline auth has been successful, |
| 562 // retry online auth, using existing Authenticator instance. | 547 // retry online auth, using existing Authenticator instance. |
| 563 BrowserThread::PostTask( | 548 BrowserThread::PostTask( |
| 564 BrowserThread::UI, FROM_HERE, | 549 BrowserThread::UI, FROM_HERE, |
| 565 base::Bind(&Authenticator::RetryAuth, authenticator_.get(), profile, | 550 base::Bind(&Authenticator::RetryAuth, authenticator_.get(), |
| 566 username_, password_, captcha_token_, captcha_)); | 551 profile, |
| 552 username_, |
| 553 password_, |
| 554 captcha_token_, |
| 555 captcha_)); |
| 567 } | 556 } |
| 568 password_.clear(); | 557 password_.clear(); |
| 569 } | 558 } |
| 570 | 559 |
| 571 } // namespace chromeos | 560 } // namespace chromeos |
| OLD | NEW |