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