1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_SCREEN_LOCKER_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_SCREEN_LOCKER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback_forward.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/auth/login_status_consumer.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/auth/user_context.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/help_app_launcher.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/lock/screen_locker_delegate.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display.h" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebUI; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gfx { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Image; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Authenticator; 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class ExtendedAuthenticator; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoginFailure; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ScreenlockIconProvider; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenLockerTester; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenLockerViewsTester; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIScreenLockerTester; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScreenLocker creates a ScreenLockerDelegate which will display the lock UI. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// As well, it takes care of authenticating the user and managing a global 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instance of itself which will be deleted when the system is unlocked. 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ScreenLocker : public LoginStatusConsumer { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) explicit ScreenLocker(const UserList& users); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the default instance if it has been created. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ScreenLocker* default_screen_locker() { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return screen_locker_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool locked() const { return locked_; } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize and show the screen locker. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // LoginStatusConsumer: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLoginFailure(const chromeos::LoginFailure& error) OVERRIDE; 648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void OnLoginSuccess(const UserContext& user_context) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does actual unlocking once authentication is successful and all blocking 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // animations are done. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnlockOnLoginSuccess(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Authenticates the user with given |user_context|. 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void Authenticate(const UserContext& user_context); 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close message bubble to clear error messages. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearErrors(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exit the chrome, which will sign out the current session. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Signout(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // (Re)enable input field. 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void EnableInput(); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disables all UI needed and shows error bubble with |message|. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |sign_out_only| is true then all other input except "Sign Out" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // button is blocked. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShowErrorMessage(int error_msg_id, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HelpAppLauncher::HelpTopic help_topic_id, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool sign_out_only); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the screen locker's delegate. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenLockerDelegate* delegate() const { return delegate_.get(); } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns the users to authenticate. 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const UserList& users() const { return users_; } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow a LoginStatusConsumer to listen for 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same login events that ScreenLocker does. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLoginStatusConsumer(chromeos::LoginStatusConsumer* consumer); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns WebUI associated with screen locker implementation or NULL if 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // there isn't one. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUI* GetAssociatedWebUI(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Initialize or uninitialize the ScreenLocker class. It listens to 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // NOTIFICATION_SESSION_STARTED so that the screen locker accepts lock 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // requests only after a user has logged in. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void InitClass(); 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void ShutDownClass(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Handles a request from the session manager to lock the screen. 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void HandleLockScreenRequest(); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show the screen locker. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Show(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hide the screen locker. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Hide(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the tester 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static test::ScreenLockerTester* GetTester(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::DeleteHelper<ScreenLocker>; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class test::ScreenLockerTester; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class test::ScreenLockerViewsTester; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class test::WebUIScreenLockerTester; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ScreenLockerDelegate; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AuthenticationParametersCapture { 1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) UserContext user_context; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ScreenLocker(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the authenticator. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetAuthenticator(Authenticator* authenticator); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the screen lock is ready. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScreenLockReady(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when screen locker is safe to delete. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ScheduleDeletion(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns true if |username| is found among logged in users. 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool IsUserLoggedIn(const std::string& username); 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Looks up user in unlock user list. 14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const User* FindUnlockUser(const std::string& user_id); 14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ScreenLockerDelegate instance in use. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScreenLockerDelegate> delegate_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Users that can unlock the device. 153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) UserList users_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to authenticate the user to unlock. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Authenticator> authenticator_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Used to authenticate the user to unlock supervised users. 15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_refptr<ExtendedAuthenticator> extended_authenticator_; 16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the screen is locked, or false otherwise. This changes 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from false to true, but will never change from true to 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // false. Instead, ScreenLocker object gets deleted when unlocked. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool locked_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reference to the single instance of the screen locker object. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is used to make sure there is only one screen locker instance. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ScreenLocker* screen_locker_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time when the screen locker object is created. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time start_time_; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time when the authentication is started. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time authentication_start_time_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate to forward all login status events to. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests can use this to receive login status events. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoginStatusConsumer* login_status_consumer_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Number of bad login attempts in a row. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int incorrect_passwords_count_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy of parameters passed to last call of OnLoginSuccess for usage in 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UnlockOnLoginSuccess(). 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AuthenticationParametersCapture> authentication_capture_; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Provider for button icon set by the screenlockPrivate API. 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ScreenlockIconProvider> screenlock_icon_provider_; 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<ScreenLocker> weak_factory_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScreenLocker); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_LOGIN_LOCK_SCREEN_LOCKER_H_ 197