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/screen_locker.h" | 5 #include "chrome/browser/chromeos/login/screen_locker.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "ash/ash_switches.h" | 10 #include "ash/ash_switches.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 | 62 |
| 63 namespace chromeos { | 63 namespace chromeos { |
| 64 | 64 |
| 65 namespace { | 65 namespace { |
| 66 | 66 |
| 67 // Timeout for unlock animation guard - some animations may be required to run | 67 // Timeout for unlock animation guard - some animations may be required to run |
| 68 // on successful authentication before unlocking, but we want to be sure that | 68 // on successful authentication before unlocking, but we want to be sure that |
| 69 // unlock happens even if animations are broken. | 69 // unlock happens even if animations are broken. |
| 70 const int kUnlockGuardTimeoutMs = 400; | 70 const int kUnlockGuardTimeoutMs = 400; |
| 71 | 71 |
| 72 // Observer to start ScreenLocker when the screen lock | 72 // Observer to start ScreenLocker when locking the screen is requested. |
| 73 class ScreenLockObserver : public SessionManagerClient::Observer, | 73 class ScreenLockObserver : public SessionManagerClient::StubDelegate, |
| 74 public content::NotificationObserver, | 74 public content::NotificationObserver, |
| 75 public UserAddingScreen::Observer { | 75 public UserAddingScreen::Observer { |
| 76 public: | 76 public: |
| 77 ScreenLockObserver() : session_started_(false) { | 77 ScreenLockObserver() : session_started_(false) { |
| 78 registrar_.Add(this, | 78 registrar_.Add(this, |
| 79 chrome::NOTIFICATION_LOGIN_USER_CHANGED, | |
| 80 content::NotificationService::AllSources()); | |
| 81 registrar_.Add(this, | |
| 82 chrome::NOTIFICATION_SESSION_STARTED, | 79 chrome::NOTIFICATION_SESSION_STARTED, |
| 83 content::NotificationService::AllSources()); | 80 content::NotificationService::AllSources()); |
| 81 DBusThreadManager::Get()->GetSessionManagerClient()->SetStubDelegate(this); | |
| 82 } | |
| 83 | |
| 84 ~ScreenLockObserver() { | |
| 85 if (DBusThreadManager::IsInitialized()) { | |
| 86 DBusThreadManager::Get()->GetSessionManagerClient()->SetStubDelegate( | |
| 87 NULL); | |
| 88 } | |
| 84 } | 89 } |
| 85 | 90 |
| 86 bool session_started() const { return session_started_; } | 91 bool session_started() const { return session_started_; } |
| 87 | 92 |
| 93 // SessionManagerClient::StubDelegate overrides: | |
| 94 virtual void LockScreenForStub() OVERRIDE { | |
| 95 ScreenLocker::HandleLockScreenRequest(); | |
| 96 } | |
| 97 | |
| 88 // NotificationObserver overrides: | 98 // NotificationObserver overrides: |
| 89 virtual void Observe(int type, | 99 virtual void Observe(int type, |
| 90 const content::NotificationSource& source, | 100 const content::NotificationSource& source, |
| 91 const content::NotificationDetails& details) OVERRIDE { | 101 const content::NotificationDetails& details) OVERRIDE { |
| 92 switch (type) { | 102 if (type == chrome::NOTIFICATION_SESSION_STARTED) |
| 93 case chrome::NOTIFICATION_LOGIN_USER_CHANGED: { | 103 session_started_ = true; |
| 94 // Register Screen Lock only after a user has logged in. | 104 else |
| 95 SessionManagerClient* session_manager = | 105 NOTREACHED() << "Unexpected notification " << type; |
| 96 DBusThreadManager::Get()->GetSessionManagerClient(); | |
| 97 if (!session_manager->HasObserver(this)) | |
| 98 session_manager->AddObserver(this); | |
| 99 break; | |
| 100 } | |
| 101 | |
| 102 case chrome::NOTIFICATION_SESSION_STARTED: { | |
| 103 session_started_ = true; | |
| 104 break; | |
| 105 } | |
| 106 | |
| 107 default: | |
| 108 NOTREACHED(); | |
| 109 } | |
| 110 } | 106 } |
| 111 | 107 |
| 112 // TODO(derat): Remove this once the session manager is calling the LockScreen | 108 // UserAddingScreen::Observer overrides: |
| 113 // method instead of emitting a signal. | 109 virtual void OnUserAddingFinished() OVERRIDE { |
| 114 virtual void LockScreen() OVERRIDE { | 110 UserAddingScreen::Get()->RemoveObserver(this); |
| 115 VLOG(1) << "Received LockScreen D-Bus signal from session manager"; | |
| 116 ScreenLocker::HandleLockScreenRequest(); | 111 ScreenLocker::HandleLockScreenRequest(); |
| 117 } | 112 } |
| 118 | 113 |
| 119 virtual void OnUserAddingFinished() OVERRIDE { | |
| 120 UserAddingScreen::Get()->RemoveObserver(this); | |
| 121 LockScreen(); | |
| 122 } | |
| 123 | |
| 124 private: | 114 private: |
| 125 bool session_started_; | 115 bool session_started_; |
| 126 content::NotificationRegistrar registrar_; | 116 content::NotificationRegistrar registrar_; |
| 127 | 117 |
| 128 DISALLOW_COPY_AND_ASSIGN(ScreenLockObserver); | 118 DISALLOW_COPY_AND_ASSIGN(ScreenLockObserver); |
| 129 }; | 119 }; |
| 130 | 120 |
| 131 static base::LazyInstance<ScreenLockObserver> g_screen_lock_observer = | 121 ScreenLockObserver* g_screen_lock_observer = NULL; |
| 132 LAZY_INSTANCE_INITIALIZER; | |
| 133 | 122 |
| 134 } // namespace | 123 } // namespace |
| 135 | 124 |
| 136 // static | 125 // static |
| 137 ScreenLocker* ScreenLocker::screen_locker_ = NULL; | 126 ScreenLocker* ScreenLocker::screen_locker_ = NULL; |
| 138 | 127 |
| 139 ////////////////////////////////////////////////////////////////////////////// | 128 ////////////////////////////////////////////////////////////////////////////// |
| 140 // ScreenLocker, public: | 129 // ScreenLocker, public: |
| 141 | 130 |
| 142 ScreenLocker::ScreenLocker(const UserList& users) | 131 ScreenLocker::ScreenLocker(const UserList& users) |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 delegate_->ShowErrorMessage(error_msg_id, help_topic_id); | 357 delegate_->ShowErrorMessage(error_msg_id, help_topic_id); |
| 369 } | 358 } |
| 370 | 359 |
| 371 void ScreenLocker::SetLoginStatusConsumer( | 360 void ScreenLocker::SetLoginStatusConsumer( |
| 372 chromeos::LoginStatusConsumer* consumer) { | 361 chromeos::LoginStatusConsumer* consumer) { |
| 373 login_status_consumer_ = consumer; | 362 login_status_consumer_ = consumer; |
| 374 } | 363 } |
| 375 | 364 |
| 376 // static | 365 // static |
| 377 void ScreenLocker::InitClass() { | 366 void ScreenLocker::InitClass() { |
| 378 g_screen_lock_observer.Get(); | 367 DCHECK(!g_screen_lock_observer); |
| 368 g_screen_lock_observer = new ScreenLockObserver; | |
| 369 } | |
| 370 | |
| 371 // static | |
| 372 void ScreenLocker::ShutDownClass() { | |
| 373 DCHECK(g_screen_lock_observer); | |
| 374 delete g_screen_lock_observer; | |
| 375 g_screen_lock_observer = NULL; | |
| 379 } | 376 } |
| 380 | 377 |
| 381 // static | 378 // static |
| 382 void ScreenLocker::HandleLockScreenRequest() { | 379 void ScreenLocker::HandleLockScreenRequest() { |
| 383 VLOG(1) << "Received LockScreen request from session manager"; | 380 VLOG(1) << "Received LockScreen request from session manager"; |
| 381 DCHECK(g_screen_lock_observer); | |
| 384 if (UserAddingScreen::Get()->IsRunning()) { | 382 if (UserAddingScreen::Get()->IsRunning()) { |
| 385 VLOG(1) << "Waiting for user adding screen to stop"; | 383 VLOG(1) << "Waiting for user adding screen to stop"; |
| 386 UserAddingScreen::Get()->AddObserver(g_screen_lock_observer.Pointer()); | 384 UserAddingScreen::Get()->AddObserver(g_screen_lock_observer); |
| 387 UserAddingScreen::Get()->Cancel(); | 385 UserAddingScreen::Get()->Cancel(); |
| 388 return; | 386 return; |
| 389 } | 387 } |
| 390 if (g_screen_lock_observer.Get().session_started() && | 388 if (g_screen_lock_observer->session_started() && |
| 391 UserManager::Get()->CanCurrentUserLock()) { | 389 UserManager::Get()->CanCurrentUserLock()) { |
| 392 ScreenLocker::Show(); | 390 ScreenLocker::Show(); |
| 391 ash::Shell::GetInstance()->lock_state_controller()->OnStartingLock(); | |
|
Daniel Erat
2014/03/12 00:30:44
note that this was previously getting called uncon
| |
| 393 } else { | 392 } else { |
| 394 // If the current user's session cannot be locked or the user has not | 393 // If the current user's session cannot be locked or the user has not |
| 395 // completed all sign-in steps yet, log out instead. The latter is done to | 394 // completed all sign-in steps yet, log out instead. The latter is done to |
| 396 // avoid complications with displaying the lock screen over the login | 395 // avoid complications with displaying the lock screen over the login |
| 397 // screen while remaining secure in the case the user walks away during | 396 // screen while remaining secure in the case the user walks away during |
| 398 // the sign-in steps. See crbug.com/112225 and crbug.com/110933. | 397 // the sign-in steps. See crbug.com/112225 and crbug.com/110933. |
| 399 VLOG(1) << "Calling session manager's StopSession D-Bus method"; | 398 VLOG(1) << "Calling session manager's StopSession D-Bus method"; |
| 400 DBusThreadManager::Get()->GetSessionManagerClient()->StopSession(); | 399 DBusThreadManager::Get()->GetSessionManagerClient()->StopSession(); |
| 401 } | 400 } |
| 402 } | 401 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 485 desktop_background_controller()->MoveDesktopToUnlockedContainer(); | 484 desktop_background_controller()->MoveDesktopToUnlockedContainer(); |
| 486 | 485 |
| 487 screen_locker_ = NULL; | 486 screen_locker_ = NULL; |
| 488 bool state = false; | 487 bool state = false; |
| 489 VLOG(1) << "Emitting SCREEN_LOCK_STATE_CHANGED with state=" << state; | 488 VLOG(1) << "Emitting SCREEN_LOCK_STATE_CHANGED with state=" << state; |
| 490 content::NotificationService::current()->Notify( | 489 content::NotificationService::current()->Notify( |
| 491 chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, | 490 chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, |
| 492 content::Source<ScreenLocker>(this), | 491 content::Source<ScreenLocker>(this), |
| 493 content::Details<bool>(&state)); | 492 content::Details<bool>(&state)); |
| 494 VLOG(1) << "Calling session manager's HandleLockScreenDismissed D-Bus method"; | 493 VLOG(1) << "Calling session manager's HandleLockScreenDismissed D-Bus method"; |
| 494 | |
| 495 DBusThreadManager::Get()->GetSessionManagerClient()-> | 495 DBusThreadManager::Get()->GetSessionManagerClient()-> |
| 496 NotifyLockScreenDismissed(); | 496 NotifyLockScreenDismissed(); |
| 497 } | 497 } |
| 498 | 498 |
| 499 void ScreenLocker::SetAuthenticator(Authenticator* authenticator) { | 499 void ScreenLocker::SetAuthenticator(Authenticator* authenticator) { |
| 500 authenticator_ = authenticator; | 500 authenticator_ = authenticator; |
| 501 } | 501 } |
| 502 | 502 |
| 503 void ScreenLocker::ScreenLockReady() { | 503 void ScreenLocker::ScreenLockReady() { |
| 504 locked_ = true; | 504 locked_ = true; |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 527 | 527 |
| 528 bool ScreenLocker::IsUserLoggedIn(const std::string& username) { | 528 bool ScreenLocker::IsUserLoggedIn(const std::string& username) { |
| 529 for (UserList::const_iterator it = users_.begin(); it != users_.end(); ++it) { | 529 for (UserList::const_iterator it = users_.begin(); it != users_.end(); ++it) { |
| 530 if ((*it)->email() == username) | 530 if ((*it)->email() == username) |
| 531 return true; | 531 return true; |
| 532 } | 532 } |
| 533 return false; | 533 return false; |
| 534 } | 534 } |
| 535 | 535 |
| 536 } // namespace chromeos | 536 } // namespace chromeos |
| OLD | NEW |