• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 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_UI_WEBUI_CHROMEOS_LOGIN_SIGNIN_SCREEN_HANDLER_H_
6 #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SIGNIN_SCREEN_HANDLER_H_
7 
8 #include <map>
9 #include <set>
10 #include <string>
11 
12 #include "base/basictypes.h"
13 #include "base/callback.h"
14 #include "base/compiler_specific.h"
15 #include "base/containers/hash_tables.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/memory/scoped_ptr.h"
18 #include "base/memory/weak_ptr.h"
19 #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h"
20 #include "chrome/browser/chromeos/login/screens/error_screen_actor.h"
21 #include "chrome/browser/chromeos/login/ui/login_display.h"
22 #include "chrome/browser/chromeos/login/users/user_manager.h"
23 #include "chrome/browser/chromeos/net/network_portal_detector.h"
24 #include "chrome/browser/chromeos/settings/cros_settings.h"
25 #include "chrome/browser/signin/screenlock_bridge.h"
26 #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
27 #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
28 #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
29 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
30 #include "chromeos/ime/ime_keyboard.h"
31 #include "content/public/browser/notification_observer.h"
32 #include "content/public/browser/notification_registrar.h"
33 #include "content/public/browser/web_ui.h"
34 #include "net/base/net_errors.h"
35 #include "ui/events/event_handler.h"
36 
37 namespace base {
38 class DictionaryValue;
39 class ListValue;
40 }
41 
42 namespace chromeos {
43 
44 class AuthenticatedUserEmailRetriever;
45 class CaptivePortalWindowProxy;
46 class CoreOobeActor;
47 class GaiaScreenHandler;
48 class LocallyManagedUserCreationScreenHandler;
49 class NativeWindowDelegate;
50 class User;
51 class UserContext;
52 
53 // Helper class to pass initial parameters to the login screen.
54 class LoginScreenContext {
55  public:
56   LoginScreenContext();
57   explicit LoginScreenContext(const base::ListValue* args);
58 
set_email(const std::string & email)59   void set_email(const std::string& email) { email_ = email; }
email()60   const std::string& email() const { return email_; }
61 
set_oobe_ui(bool oobe_ui)62   void set_oobe_ui(bool oobe_ui) { oobe_ui_ = oobe_ui; }
oobe_ui()63   bool oobe_ui() const { return oobe_ui_; }
64 
65  private:
66   void Init();
67 
68   std::string email_;
69   bool oobe_ui_;
70 };
71 
72 // An interface for WebUILoginDisplay to call SigninScreenHandler.
73 class LoginDisplayWebUIHandler {
74  public:
75   virtual void ClearAndEnablePassword() = 0;
76   virtual void ClearUserPodPassword() = 0;
77   virtual void OnUserRemoved(const std::string& username) = 0;
78   virtual void OnUserImageChanged(const User& user) = 0;
79   virtual void OnPreferencesChanged() = 0;
80   virtual void ResetSigninScreenHandlerDelegate() = 0;
81   virtual void ShowError(int login_attempts,
82                          const std::string& error_text,
83                          const std::string& help_link_text,
84                          HelpAppLauncher::HelpTopic help_topic_id) = 0;
85   virtual void ShowErrorScreen(LoginDisplay::SigninError error_id) = 0;
86   virtual void ShowGaiaPasswordChanged(const std::string& username) = 0;
87   virtual void ShowSigninUI(const std::string& email) = 0;
88   virtual void ShowPasswordChangedDialog(bool show_password_error) = 0;
89   // Show sign-in screen for the given credentials.
90   virtual void ShowSigninScreenForCreds(const std::string& username,
91                                         const std::string& password) = 0;
92   virtual void LoadUsers(const base::ListValue& users_list,
93                          bool animated,
94                          bool show_guest) = 0;
95 
96  protected:
~LoginDisplayWebUIHandler()97   virtual ~LoginDisplayWebUIHandler() {}
98 };
99 
100 // An interface for SigninScreenHandler to call WebUILoginDisplay.
101 class SigninScreenHandlerDelegate {
102  public:
103   // Cancels current password changed flow.
104   virtual void CancelPasswordChangedFlow() = 0;
105 
106   // Cancels user adding.
107   virtual void CancelUserAdding() = 0;
108 
109   // Create a new Google account.
110   virtual void CreateAccount() = 0;
111 
112   // Confirms sign up by provided credentials in |user_context|.
113   // Used for new user login via GAIA extension.
114   virtual void CompleteLogin(const UserContext& user_context) = 0;
115 
116   // Sign in using username and password specified as a part of |user_context|.
117   // Used for both known and new users.
118   virtual void Login(const UserContext& user_context) = 0;
119 
120   // Sign in into a retail mode session.
121   virtual void LoginAsRetailModeUser() = 0;
122 
123   // Sign in into guest session.
124   virtual void LoginAsGuest() = 0;
125 
126   // Sign in into the public account identified by |username|.
127   virtual void LoginAsPublicAccount(const std::string& username) = 0;
128 
129   // Decrypt cryptohome using user provided |old_password|
130   // and migrate to new password.
131   virtual void MigrateUserData(const std::string& old_password) = 0;
132 
133   // Load wallpaper for given |username|.
134   virtual void LoadWallpaper(const std::string& username) = 0;
135 
136   // Loads the default sign-in wallpaper.
137   virtual void LoadSigninWallpaper() = 0;
138 
139   // Notify the delegate when the sign-in UI is finished loading.
140   virtual void OnSigninScreenReady() = 0;
141 
142   // Attempts to remove given user.
143   virtual void RemoveUser(const std::string& username) = 0;
144 
145   // Ignore password change, remove existing cryptohome and
146   // force full sync of user data.
147   virtual void ResyncUserData() = 0;
148 
149   // Shows Enterprise Enrollment screen.
150   virtual void ShowEnterpriseEnrollmentScreen() = 0;
151 
152   // Shows Kiosk Enable screen.
153   virtual void ShowKioskEnableScreen() = 0;
154 
155   // Shows Reset screen.
156   virtual void ShowKioskAutolaunchScreen() = 0;
157 
158   // Show wrong hwid screen.
159   virtual void ShowWrongHWIDScreen() = 0;
160 
161   // Let the delegate know about the handler it is supposed to be using.
162   virtual void SetWebUIHandler(LoginDisplayWebUIHandler* webui_handler) = 0;
163 
164   // Returns users list to be shown.
165   virtual const UserList& GetUsers() const = 0;
166 
167   // Whether login as guest is available.
168   virtual bool IsShowGuest() const = 0;
169 
170   // Weather to show the user pods or only GAIA sign in.
171   // Public sessions are always shown.
172   virtual bool IsShowUsers() const = 0;
173 
174   // Returns true if sign in is in progress.
175   virtual bool IsSigninInProgress() const = 0;
176 
177   // Whether user sign in has completed.
178   virtual bool IsUserSigninCompleted() const = 0;
179 
180   // Sets the displayed email for the next login attempt. If it succeeds,
181   // user's displayed email value will be updated to |email|.
182   virtual void SetDisplayEmail(const std::string& email) = 0;
183 
184   // Signs out if the screen is currently locked.
185   virtual void Signout() = 0;
186 
187   // Login to kiosk mode for app with |app_id|.
188   virtual void LoginAsKioskApp(const std::string& app_id,
189                                bool diagnostic_mode) = 0;
190 
191   // Request to (re)load user list.
192   virtual void HandleGetUsers() = 0;
193 
194   // Set authentication type (for easier unlocking).
195   virtual void SetAuthType(
196       const std::string& username,
197       ScreenlockBridge::LockHandler::AuthType auth_type) = 0;
198 
199   // Get authentication type (for easier unlocking).
200   virtual ScreenlockBridge::LockHandler::AuthType GetAuthType(
201       const std::string& username) const = 0;
202 
203  protected:
~SigninScreenHandlerDelegate()204   virtual ~SigninScreenHandlerDelegate() {}
205 };
206 
207 // A class that handles the WebUI hooks in sign-in screen in OobeDisplay
208 // and LoginDisplay.
209 class SigninScreenHandler
210     : public BaseScreenHandler,
211       public LoginDisplayWebUIHandler,
212       public content::NotificationObserver,
213       public ScreenlockBridge::LockHandler,
214       public NetworkStateInformer::NetworkStateInformerObserver,
215       public input_method::ImeKeyboard::Observer {
216  public:
217   SigninScreenHandler(
218       const scoped_refptr<NetworkStateInformer>& network_state_informer,
219       ErrorScreenActor* error_screen_actor,
220       CoreOobeActor* core_oobe_actor,
221       GaiaScreenHandler* gaia_screen_handler);
222   virtual ~SigninScreenHandler();
223 
224   // Shows the sign in screen.
225   void Show(const LoginScreenContext& context);
226 
227   // Shows the login spinner UI for retail mode logins.
228   void ShowRetailModeLoginSpinner();
229 
230   // Sets delegate to be used by the handler. It is guaranteed that valid
231   // delegate is set before Show() method will be called.
232   void SetDelegate(SigninScreenHandlerDelegate* delegate);
233 
234   void SetNativeWindowDelegate(NativeWindowDelegate* native_window_delegate);
235 
236   // NetworkStateInformer::NetworkStateInformerObserver implementation:
237   virtual void OnNetworkReady() OVERRIDE;
238   virtual void UpdateState(ErrorScreenActor::ErrorReason reason) OVERRIDE;
239 
240   // Required Local State preferences.
241   static void RegisterPrefs(PrefRegistrySimple* registry);
242 
set_kiosk_enable_flow_aborted_callback_for_test(const base::Closure & callback)243   void set_kiosk_enable_flow_aborted_callback_for_test(
244       const base::Closure& callback) {
245     kiosk_enable_flow_aborted_callback_for_test_ = callback;
246   }
247 
248  private:
249   enum UIState {
250     UI_STATE_UNKNOWN = 0,
251     UI_STATE_GAIA_SIGNIN,
252     UI_STATE_ACCOUNT_PICKER,
253   };
254 
255   friend class GaiaScreenHandler;
256   friend class LocallyManagedUserCreationScreenHandler;
257   friend class ReportDnsCacheClearedOnUIThread;
258 
259   void ShowImpl();
260 
261   // Updates current UI of the signin screen according to |ui_state|
262   // argument.  Optionally it can pass screen initialization data via
263   // |params| argument.
264   void UpdateUIState(UIState ui_state, base::DictionaryValue* params);
265 
266   void UpdateStateInternal(ErrorScreenActor::ErrorReason reason,
267                            bool force_update);
268   void SetupAndShowOfflineMessage(NetworkStateInformer::State state,
269                                   ErrorScreenActor::ErrorReason reason);
270   void HideOfflineMessage(NetworkStateInformer::State state,
271                           ErrorScreenActor::ErrorReason reason);
272   void ReloadGaiaScreen();
273 
274   // BaseScreenHandler implementation:
275   virtual void DeclareLocalizedValues(LocalizedValuesBuilder* builder) OVERRIDE;
276   virtual void Initialize() OVERRIDE;
277   virtual gfx::NativeWindow GetNativeWindow() OVERRIDE;
278 
279   // WebUIMessageHandler implementation:
280   virtual void RegisterMessages() OVERRIDE;
281 
282   // LoginDisplayWebUIHandler implementation:
283   virtual void ClearAndEnablePassword() OVERRIDE;
284   virtual void ClearUserPodPassword() OVERRIDE;
285   virtual void OnUserRemoved(const std::string& username) OVERRIDE;
286   virtual void OnUserImageChanged(const User& user) OVERRIDE;
287   virtual void OnPreferencesChanged() OVERRIDE;
288   virtual void ResetSigninScreenHandlerDelegate() OVERRIDE;
289   virtual void ShowError(int login_attempts,
290                          const std::string& error_text,
291                          const std::string& help_link_text,
292                          HelpAppLauncher::HelpTopic help_topic_id) OVERRIDE;
293   virtual void ShowGaiaPasswordChanged(const std::string& username) OVERRIDE;
294   virtual void ShowSigninUI(const std::string& email) OVERRIDE;
295   virtual void ShowPasswordChangedDialog(bool show_password_error) OVERRIDE;
296   virtual void ShowErrorScreen(LoginDisplay::SigninError error_id) OVERRIDE;
297   virtual void ShowSigninScreenForCreds(const std::string& username,
298                                         const std::string& password) OVERRIDE;
299   virtual void LoadUsers(const base::ListValue& users_list,
300                          bool animated,
301                          bool show_guest) OVERRIDE;
302 
303   // content::NotificationObserver implementation:
304   virtual void Observe(int type,
305                        const content::NotificationSource& source,
306                        const content::NotificationDetails& details) OVERRIDE;
307 
308   // ScreenlockBridge::LockHandler implementation:
309   virtual void ShowBannerMessage(const std::string& message) OVERRIDE;
310   virtual void ShowUserPodCustomIcon(const std::string& username,
311                                      const gfx::Image& icon) OVERRIDE;
312   virtual void HideUserPodCustomIcon(const std::string& username) OVERRIDE;
313   virtual void EnableInput() OVERRIDE;
314   virtual void SetAuthType(const std::string& username,
315                            ScreenlockBridge::LockHandler::AuthType auth_type,
316                            const std::string& initial_value) OVERRIDE;
317   virtual ScreenlockBridge::LockHandler::AuthType GetAuthType(
318       const std::string& username) const OVERRIDE;
319   virtual void Unlock(const std::string& user_email) OVERRIDE;
320 
321   // Updates authentication extension. Called when device settings that affect
322   // sign-in (allow BWSI and allow whitelist) are changed.
323   void UserSettingsChanged();
324   void UpdateAddButtonStatus();
325 
326   // Restore input focus to current user pod.
327   void RefocusCurrentPod();
328 
329   // WebUI message handlers.
330   void HandleGetUsers();
331   void HandleAuthenticateUser(const std::string& username,
332                               const std::string& password);
333   void HandleAttemptUnlock(const std::string& username);
334   void HandleLaunchDemoUser();
335   void HandleLaunchIncognito();
336   void HandleLaunchPublicAccount(const std::string& username);
337   void HandleOfflineLogin(const base::ListValue* args);
338   void HandleShutdownSystem();
339   void HandleLoadWallpaper(const std::string& email);
340   void HandleRebootSystem();
341   void HandleRemoveUser(const std::string& email);
342   void HandleShowAddUser(const base::ListValue* args);
343   void HandleToggleEnrollmentScreen();
344   void HandleToggleKioskEnableScreen();
345   void HandleToggleResetScreen();
346   void HandleToggleKioskAutolaunchScreen();
347   void HandleCreateAccount();
348   void HandleAccountPickerReady();
349   void HandleWallpaperReady();
350   void HandleSignOutUser();
351   void HandleOpenProxySettings();
352   void HandleLoginVisible(const std::string& source);
353   void HandleCancelPasswordChangedFlow();
354   void HandleCancelUserAdding();
355   void HandleMigrateUserData(const std::string& password);
356   void HandleResyncUserData();
357   void HandleLoginUIStateChanged(const std::string& source, bool new_value);
358   void HandleUnlockOnLoginSuccess();
359   void HandleLoginScreenUpdate();
360   void HandleShowLoadingTimeoutError();
361   void HandleUpdateOfflineLogin(bool offline_login_active);
362   void HandleShowLocallyManagedUserCreationScreen();
363   void HandleFocusPod(const std::string& user_id);
364   void HandleLaunchKioskApp(const std::string& app_id, bool diagnostic_mode);
365   void HandleRetrieveAuthenticatedUserEmail(double attempt_token);
366 
367 
368   // Returns true iff
369   // (i)   log in is restricted to some user list,
370   // (ii)  all users in the restricted list are present.
371   bool AllWhitelistedUsersPresent();
372 
373   // Cancels password changed flow - switches back to login screen.
374   // Called as a callback after cookies are cleared.
375   void CancelPasswordChangedFlowInternal();
376 
377   // Returns current visible screen.
378   OobeUI::Screen GetCurrentScreen() const;
379 
380   // Returns true if current visible screen is the Gaia sign-in page.
381   bool IsGaiaVisible() const;
382 
383   // Returns true if current visible screen is the error screen over
384   // Gaia sign-in page.
385   bool IsGaiaHiddenByError() const;
386 
387   // Returns true if current screen is the error screen over signin
388   // screen.
389   bool IsSigninScreenHiddenByError() const;
390 
391   // Returns true if guest signin is allowed.
392   bool IsGuestSigninAllowed() const;
393 
394   // Returns true if offline login is allowed.
395   bool IsOfflineLoginAllowed() const;
396 
397   bool ShouldLoadGaia() const;
398 
399   // Update current input method (namely keyboard layout) to LRU by this user.
400   void SetUserInputMethod(const std::string& username);
401 
402   // Invoked when auto enrollment check progresses to decide whether to
403   // continue kiosk enable flow. Kiosk enable flow is resumed when
404   // |state| indicates that enrollment is not applicable.
405   void ContinueKioskEnableFlow(policy::AutoEnrollmentState state);
406 
407   // Shows signin.
408   void OnShowAddUser();
409 
410   GaiaScreenHandler::FrameState FrameState() const;
411   net::Error FrameError() const;
412 
413   // input_method::ImeKeyboard::Observer implementation:
414   virtual void OnCapsLockChanged(bool enabled) OVERRIDE;
415 
416   // Current UI state of the signin screen.
417   UIState ui_state_;
418 
419   // A delegate that glues this handler with backend LoginDisplay.
420   SigninScreenHandlerDelegate* delegate_;
421 
422   // A delegate used to get gfx::NativeWindow.
423   NativeWindowDelegate* native_window_delegate_;
424 
425   // Whether screen should be shown right after initialization.
426   bool show_on_init_;
427 
428   // Keeps whether screen should be shown for OOBE.
429   bool oobe_ui_;
430 
431   // Is account picker being shown for the first time.
432   bool is_account_picker_showing_first_time_;
433 
434   // Network state informer used to keep signin screen up.
435   scoped_refptr<NetworkStateInformer> network_state_informer_;
436 
437   // Set to true once |LOGIN_WEBUI_VISIBLE| notification is observed.
438   bool webui_visible_;
439   bool preferences_changed_delayed_;
440 
441   ErrorScreenActor* error_screen_actor_;
442   CoreOobeActor* core_oobe_actor_;
443 
444   bool is_first_update_state_call_;
445   bool offline_login_active_;
446   NetworkStateInformer::State last_network_state_;
447 
448   base::CancelableClosure update_state_closure_;
449   base::CancelableClosure connecting_closure_;
450 
451   content::NotificationRegistrar registrar_;
452 
453   // Whether there is an auth UI pending. This flag is set on receiving
454   // NOTIFICATION_AUTH_NEEDED and reset on either NOTIFICATION_AUTH_SUPPLIED or
455   // NOTIFICATION_AUTH_CANCELLED.
456   bool has_pending_auth_ui_;
457 
458   scoped_ptr<AutoEnrollmentController::ProgressCallbackList::Subscription>
459       auto_enrollment_progress_subscription_;
460 
461   bool caps_lock_enabled_;
462 
463   base::Closure kiosk_enable_flow_aborted_callback_for_test_;
464 
465   // Non-owning ptr.
466   // TODO (ygorshenin@): remove this dependency.
467   GaiaScreenHandler* gaia_screen_handler_;
468 
469   // Helper that retrieves the authenticated user's e-mail address.
470   scoped_ptr<AuthenticatedUserEmailRetriever> email_retriever_;
471 
472   base::WeakPtrFactory<SigninScreenHandler> weak_factory_;
473 
474   DISALLOW_COPY_AND_ASSIGN(SigninScreenHandler);
475 };
476 
477 }  // namespace chromeos
478 
479 #endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_SIGNIN_SCREEN_HANDLER_H_
480