Home | History | Annotate | Download | only in login
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_EXISTING_USER_CONTROLLER_H_
      6 #define CHROME_BROWSER_CHROMEOS_LOGIN_EXISTING_USER_CONTROLLER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/callback_forward.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/gtest_prod_util.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/memory/weak_ptr.h"
     16 #include "base/strings/string16.h"
     17 #include "base/time/time.h"
     18 #include "base/timer/timer.h"
     19 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
     20 #include "chrome/browser/chromeos/login/login_display.h"
     21 #include "chrome/browser/chromeos/login/login_performer.h"
     22 #include "chrome/browser/chromeos/login/login_utils.h"
     23 #include "chrome/browser/chromeos/login/user.h"
     24 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     25 #include "content/public/browser/notification_observer.h"
     26 #include "content/public/browser/notification_registrar.h"
     27 #include "ui/gfx/rect.h"
     28 #include "url/gurl.h"
     29 
     30 namespace chromeos {
     31 
     32 class CrosSettings;
     33 class LoginDisplayHost;
     34 
     35 namespace login {
     36 class NetworkStateHelper;
     37 }
     38 
     39 // ExistingUserController is used to handle login when someone has
     40 // already logged into the machine.
     41 // To use ExistingUserController create an instance of it and invoke Init.
     42 // When Init is called it creates LoginDisplay instance which encapsulates
     43 // all login UI implementation.
     44 // ExistingUserController maintains it's own life cycle and deletes itself when
     45 // the user logs in (or chooses to see other settings).
     46 class ExistingUserController : public LoginDisplay::Delegate,
     47                                public content::NotificationObserver,
     48                                public LoginPerformer::Delegate,
     49                                public LoginUtils::Delegate {
     50  public:
     51   // All UI initialization is deferred till Init() call.
     52   explicit ExistingUserController(LoginDisplayHost* host);
     53   virtual ~ExistingUserController();
     54 
     55   // Returns the current existing user controller if it has been created.
     56   static ExistingUserController* current_controller() {
     57     return current_controller_;
     58   }
     59 
     60   // Creates and shows login UI for known users.
     61   void Init(const UserList& users);
     62 
     63   // Tells the controller to enter the Enterprise Enrollment screen when
     64   // appropriate.
     65   void DoAutoEnrollment();
     66 
     67   // Tells the controller to resume a pending login.
     68   void ResumeLogin();
     69 
     70   // Invoked to prepare for a kiosk app launch attempt.
     71   void PrepareKioskAppLaunch();
     72 
     73   // Start the public session auto-login timer.
     74   void StartPublicSessionAutoLoginTimer();
     75 
     76   // Stop the public session auto-login timer when a login attempt begins.
     77   void StopPublicSessionAutoLoginTimer();
     78 
     79   // LoginDisplay::Delegate: implementation
     80   virtual void CancelPasswordChangedFlow() OVERRIDE;
     81   virtual void CreateAccount() OVERRIDE;
     82   virtual void CompleteLogin(const UserContext& user_context) OVERRIDE;
     83   virtual string16 GetConnectedNetworkName() OVERRIDE;
     84   virtual bool IsSigninInProgress() const OVERRIDE;
     85   virtual void Login(const UserContext& user_context) OVERRIDE;
     86   virtual void MigrateUserData(const std::string& old_password) OVERRIDE;
     87   virtual void LoginAsRetailModeUser() OVERRIDE;
     88   virtual void LoginAsGuest() OVERRIDE;
     89   virtual void LoginAsPublicAccount(const std::string& username) OVERRIDE;
     90   virtual void OnSigninScreenReady() OVERRIDE;
     91   virtual void OnUserSelected(const std::string& username) OVERRIDE;
     92   virtual void OnStartEnterpriseEnrollment() OVERRIDE;
     93   virtual void OnStartKioskEnableScreen() OVERRIDE;
     94   virtual void OnStartDeviceReset() OVERRIDE;
     95   virtual void OnStartKioskAutolaunchScreen() OVERRIDE;
     96   virtual void ResetPublicSessionAutoLoginTimer() OVERRIDE;
     97   virtual void ResyncUserData() OVERRIDE;
     98   virtual void SetDisplayEmail(const std::string& email) OVERRIDE;
     99   virtual void ShowWrongHWIDScreen() OVERRIDE;
    100   virtual void Signout() OVERRIDE;
    101 
    102   // content::NotificationObserver implementation.
    103   virtual void Observe(int type,
    104                        const content::NotificationSource& source,
    105                        const content::NotificationDetails& details) OVERRIDE;
    106 
    107   // Set a delegate that we will pass LoginStatusConsumer events to.
    108   // Used for testing.
    109   void set_login_status_consumer(LoginStatusConsumer* consumer) {
    110     login_status_consumer_ = consumer;
    111   }
    112 
    113   // Returns the LoginDisplay created and owned by this controller.
    114   // Used for testing.
    115   LoginDisplay* login_display() {
    116     return login_display_.get();
    117   }
    118 
    119   // Returns the LoginDisplayHost for this controller.
    120   LoginDisplayHost* login_display_host() {
    121     return host_;
    122   }
    123 
    124  private:
    125   friend class ExistingUserControllerTest;
    126   friend class ExistingUserControllerAutoLoginTest;
    127   friend class ExistingUserControllerPublicSessionTest;
    128   friend class MockLoginPerformerDelegate;
    129 
    130   // Retrieve public session auto-login policy and update the timer.
    131   void ConfigurePublicSessionAutoLogin();
    132 
    133   // Trigger public session auto-login.
    134   void OnPublicSessionAutoLoginTimerFire();
    135 
    136   // LoginPerformer::Delegate implementation:
    137   virtual void OnLoginFailure(const LoginFailure& error) OVERRIDE;
    138   virtual void OnLoginSuccess(
    139       const UserContext& user_context,
    140       bool pending_requests,
    141       bool using_oauth) OVERRIDE;
    142   virtual void OnOffTheRecordLoginSuccess() OVERRIDE;
    143   virtual void OnPasswordChangeDetected() OVERRIDE;
    144   virtual void WhiteListCheckFailed(const std::string& email) OVERRIDE;
    145   virtual void PolicyLoadFailed() OVERRIDE;
    146   virtual void OnOnlineChecked(
    147       const std::string& username, bool success) OVERRIDE;
    148 
    149   // LoginUtils::Delegate implementation:
    150   virtual void OnProfilePrepared(Profile* profile) OVERRIDE;
    151 
    152   // Starts WizardController with the specified screen.
    153   void ActivateWizard(const std::string& screen_name);
    154 
    155   // Returns corresponding native window.
    156   gfx::NativeWindow GetNativeWindow() const;
    157 
    158   // Adds first-time login URLs.
    159   void InitializeStartUrls() const;
    160 
    161   // Show error message. |error_id| error message ID in resources.
    162   // If |details| string is not empty, it specify additional error text
    163   // provided by authenticator, it is not localized.
    164   void ShowError(int error_id, const std::string& details);
    165 
    166   // Shows Gaia page because password change was detected.
    167   void ShowGaiaPasswordChanged(const std::string& username);
    168 
    169   // Handles result of ownership check and starts enterprise or kiosk enrollment
    170   // if applicable.
    171   void OnEnrollmentOwnershipCheckCompleted(
    172       DeviceSettingsService::OwnershipStatus status,
    173       bool current_user_is_owner);
    174 
    175   // Handles result of consumer kiosk configurability check and starts
    176   // enable kiosk screen if applicable.
    177   void OnConsumerKioskModeCheckCompleted(
    178       KioskAppManager::ConsumerKioskModeStatus status);
    179 
    180   // Enters the enterprise enrollment screen. |forced| is true if this is the
    181   // result of an auto-enrollment check, and the user shouldn't be able to
    182   // easily cancel the enrollment. In that case, |user| is the user name that
    183   // first logged in.
    184   void ShowEnrollmentScreen(bool forced, const std::string& user);
    185 
    186   // Shows "reset device" screen.
    187   void ShowResetScreen();
    188 
    189   // Shows kiosk feature enable screen.
    190   void ShowKioskEnableScreen();
    191 
    192   // Shows "kiosk auto-launch permission" screen.
    193   void ShowKioskAutolaunchScreen();
    194 
    195   // Shows "critical TPM error" screen.
    196   void ShowTPMError();
    197 
    198   // Invoked to complete login. Login might be suspended if auto-enrollment
    199   // has to be performed, and will resume once auto-enrollment completes.
    200   void CompleteLoginInternal(
    201       const UserContext& user_context,
    202       DeviceSettingsService::OwnershipStatus ownership_status,
    203       bool is_owner);
    204 
    205   // Creates |login_performer_| if necessary and calls login() on it.
    206   // The string arguments aren't passed by const reference because this is
    207   // posted as |resume_login_callback_| and resets it.
    208   void PerformLogin(const UserContext& user_context,
    209                     LoginPerformer::AuthorizationMode auth_mode);
    210 
    211   void set_login_performer_delegate(LoginPerformer::Delegate* d) {
    212     login_performer_delegate_.reset(d);
    213   }
    214 
    215   // Updates the |login_display_| attached to this controller.
    216   void UpdateLoginDisplay(const UserList& users);
    217 
    218   // Public session auto-login timer.
    219   scoped_ptr<base::OneShotTimer<ExistingUserController> > auto_login_timer_;
    220 
    221   // Public session auto-login timeout, in milliseconds.
    222   int public_session_auto_login_delay_;
    223 
    224   // Username for public session auto-login.
    225   std::string public_session_auto_login_username_;
    226 
    227   // Used to execute login operations.
    228   scoped_ptr<LoginPerformer> login_performer_;
    229 
    230   // Delegate for login performer to be overridden by tests.
    231   // |this| is used if |login_performer_delegate_| is NULL.
    232   scoped_ptr<LoginPerformer::Delegate> login_performer_delegate_;
    233 
    234   // Delegate to forward all login status events to.
    235   // Tests can use this to receive login status events.
    236   LoginStatusConsumer* login_status_consumer_;
    237 
    238   // Username of the last login attempt.
    239   std::string last_login_attempt_username_;
    240 
    241   // OOBE/login display host.
    242   LoginDisplayHost* host_;
    243 
    244   // Login UI implementation instance.
    245   scoped_ptr<LoginDisplay> login_display_;
    246 
    247   // Number of login attempts. Used to show help link when > 1 unsuccessful
    248   // logins for the same user.
    249   size_t num_login_attempts_;
    250 
    251   // Pointer to the current instance of the controller to be used by
    252   // automation tests.
    253   static ExistingUserController* current_controller_;
    254 
    255   // Interface to the signed settings store.
    256   CrosSettings* cros_settings_;
    257 
    258   // URL to append to start Guest mode with.
    259   GURL guest_mode_url_;
    260 
    261   // Used for notifications during the login process.
    262   content::NotificationRegistrar registrar_;
    263 
    264   // Factory of callbacks.
    265   base::WeakPtrFactory<ExistingUserController> weak_factory_;
    266 
    267   // The displayed email for the next login attempt set by |SetDisplayEmail|.
    268   std::string display_email_;
    269 
    270   // Whether offline login attempt failed.
    271   bool offline_failed_;
    272 
    273   // Whether login attempt is running.
    274   bool is_login_in_progress_;
    275 
    276   // Whether online login attempt succeeded.
    277   std::string online_succeeded_for_;
    278 
    279   // True if password has been changed for user who is completing sign in.
    280   // Set in OnLoginSuccess. Before that use LoginPerformer::password_changed().
    281   bool password_changed_;
    282 
    283   // True if auto-enrollment should be performed before starting the user's
    284   // session.
    285   bool do_auto_enrollment_;
    286 
    287   // Whether the sign-in UI is finished loading.
    288   bool signin_screen_ready_;
    289 
    290   // The username used for auto-enrollment, if it was triggered.
    291   std::string auto_enrollment_username_;
    292 
    293   // Callback to invoke to resume login, after auto-enrollment has completed.
    294   base::Closure resume_login_callback_;
    295 
    296   // Time when the signin screen was first displayed. Used to measure the time
    297   // from showing the screen until a successful login is performed.
    298   base::Time time_init_;
    299 
    300   // Timer for the interval to wait for the reboot after TPM error UI was shown.
    301   base::OneShotTimer<ExistingUserController> reboot_timer_;
    302 
    303   scoped_ptr<login::NetworkStateHelper> network_state_helper_;
    304 
    305   FRIEND_TEST_ALL_PREFIXES(ExistingUserControllerTest, ExistingUserLogin);
    306 
    307   DISALLOW_COPY_AND_ASSIGN(ExistingUserController);
    308 };
    309 
    310 }  // namespace chromeos
    311 
    312 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_EXISTING_USER_CONTROLLER_H_
    313