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