Home | History | Annotate | Download | only in login
      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
      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 #pragma once
      8 
      9 #include <string>
     10 
     11 #include "base/compiler_specific.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/string16.h"
     14 #include "base/task.h"
     15 #include "base/timer.h"
     16 #include "chrome/browser/chromeos/login/captcha_view.h"
     17 #include "chrome/browser/chromeos/login/login_display.h"
     18 #include "chrome/browser/chromeos/login/login_performer.h"
     19 #include "chrome/browser/chromeos/login/login_utils.h"
     20 #include "chrome/browser/chromeos/login/ownership_status_checker.h"
     21 #include "chrome/browser/chromeos/login/password_changed_view.h"
     22 #include "chrome/browser/chromeos/login/user_manager.h"
     23 #include "chrome/browser/chromeos/wm_message_listener.h"
     24 #include "content/common/notification_observer.h"
     25 #include "content/common/notification_registrar.h"
     26 #include "googleurl/src/gurl.h"
     27 #include "testing/gtest/include/gtest/gtest_prod.h"
     28 #include "ui/gfx/rect.h"
     29 
     30 namespace chromeos {
     31 
     32 class LoginDisplayHost;
     33 class UserCrosSettingsProvider;
     34 
     35 // ExistingUserController is used to handle login when someone has
     36 // already logged into the machine.
     37 // To use ExistingUserController create an instance of it and invoke Init.
     38 // When Init is called it creates LoginDisplay instance which encapsulates
     39 // all login UI implementation.
     40 // ExistingUserController maintains it's own life cycle and deletes itself when
     41 // the user logs in (or chooses to see other settings).
     42 class ExistingUserController : public LoginDisplay::Delegate,
     43                                public NotificationObserver,
     44                                public LoginPerformer::Delegate,
     45                                public LoginUtils::Delegate,
     46                                public CaptchaView::Delegate,
     47                                public PasswordChangedView::Delegate {
     48  public:
     49   // All UI initialization is deferred till Init() call.
     50   explicit ExistingUserController(LoginDisplayHost* host);
     51   ~ExistingUserController();
     52 
     53   // Returns the current existing user controller if it has been created.
     54   static ExistingUserController* current_controller() {
     55     return current_controller_;
     56   }
     57 
     58   // Creates and shows login UI for known users.
     59   void Init(const UserVector& users);
     60 
     61   // LoginDisplay::Delegate: implementation
     62   virtual void CreateAccount() OVERRIDE;
     63   virtual string16 GetConnectedNetworkName() OVERRIDE;
     64   virtual void FixCaptivePortal() OVERRIDE;
     65   virtual void Login(const std::string& username,
     66                      const std::string& password) OVERRIDE;
     67   virtual void LoginAsGuest() OVERRIDE;
     68   virtual void OnUserSelected(const std::string& username) OVERRIDE;
     69   virtual void OnStartEnterpriseEnrollment() OVERRIDE;
     70 
     71   // NotificationObserver implementation.
     72   virtual void Observe(NotificationType type,
     73                        const NotificationSource& source,
     74                        const NotificationDetails& details);
     75 
     76  private:
     77   friend class ExistingUserControllerTest;
     78   friend class MockLoginPerformerDelegate;
     79 
     80   // LoginPerformer::Delegate implementation:
     81   virtual void OnLoginFailure(const LoginFailure& error);
     82   virtual void OnLoginSuccess(
     83       const std::string& username,
     84       const std::string& password,
     85       const GaiaAuthConsumer::ClientLoginResult& credentials,
     86       bool pending_requests);
     87   virtual void OnOffTheRecordLoginSuccess();
     88   virtual void OnPasswordChangeDetected(
     89       const GaiaAuthConsumer::ClientLoginResult& credentials);
     90   virtual void WhiteListCheckFailed(const std::string& email);
     91 
     92   // LoginUtils::Delegate implementation:
     93   virtual void OnProfilePrepared(Profile* profile);
     94 
     95   // CaptchaView::Delegate:
     96   virtual void OnCaptchaEntered(const std::string& captcha);
     97 
     98   // PasswordChangedView::Delegate:
     99   virtual void RecoverEncryptedData(const std::string& old_password);
    100   virtual void ResyncEncryptedData();
    101 
    102   // Starts WizardController with the specified screen.
    103   void ActivateWizard(const std::string& screen_name);
    104 
    105   // Returns corresponding native window.
    106   gfx::NativeWindow GetNativeWindow() const;
    107 
    108   // Changes state of the status area. During login operation it's disabled.
    109   void SetStatusAreaEnabled(bool enable);
    110 
    111   // Show error message. |error_id| error message ID in resources.
    112   // If |details| string is not empty, it specify additional error text
    113   // provided by authenticator, it is not localized.
    114   void ShowError(int error_id, const std::string& details);
    115 
    116   // Handles result of ownership check and starts enterprise enrollment if
    117   // applicable.
    118   void OnEnrollmentOwnershipCheckCompleted(OwnershipService::Status status);
    119 
    120   void set_login_performer_delegate(LoginPerformer::Delegate* d) {
    121     login_performer_delegate_.reset(d);
    122   }
    123 
    124   // Used to execute login operations.
    125   scoped_ptr<LoginPerformer> login_performer_;
    126 
    127   // Login UI implementation instance.
    128   LoginDisplay* login_display_;
    129 
    130   // Delegate for login performer to be overridden by tests.
    131   // |this| is used if |login_performer_delegate_| is NULL.
    132   scoped_ptr<LoginPerformer::Delegate> login_performer_delegate_;
    133 
    134   // Username of the last login attempt.
    135   std::string last_login_attempt_username_;
    136 
    137   // OOBE/login display host.
    138   LoginDisplayHost* host_;
    139 
    140   // Number of login attempts. Used to show help link when > 1 unsuccessful
    141   // logins for the same user.
    142   size_t num_login_attempts_;
    143 
    144   // Pointer to the current instance of the controller to be used by
    145   // automation tests.
    146   static ExistingUserController* current_controller_;
    147 
    148   // Triggers prefetching of user settings.
    149   scoped_ptr<UserCrosSettingsProvider> user_settings_;
    150 
    151   // URL to append to start Guest mode with.
    152   GURL guest_mode_url_;
    153 
    154   // Used for user image changed notifications.
    155   NotificationRegistrar registrar_;
    156 
    157   // Factory of callbacks.
    158   ScopedRunnableMethodFactory<ExistingUserController> method_factory_;
    159 
    160   // Whether everything is ready to launch the browser.
    161   bool ready_for_browser_launch_;
    162 
    163   // Whether two factor credentials were used.
    164   bool two_factor_credentials_;
    165 
    166   // Used to verify ownership before starting enterprise enrollment.
    167   scoped_ptr<OwnershipStatusChecker> ownership_checker_;
    168 
    169   FRIEND_TEST_ALL_PREFIXES(ExistingUserControllerTest, NewUserLogin);
    170 
    171   DISALLOW_COPY_AND_ASSIGN(ExistingUserController);
    172 };
    173 
    174 }  // namespace chromeos
    175 
    176 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_EXISTING_USER_CONTROLLER_H_
    177