1// Copyright 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_GAIA_SCREEN_HANDLER_H_
6#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_GAIA_SCREEN_HANDLER_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/command_line.h"
12#include "base/memory/ref_counted.h"
13#include "chrome/browser/chromeos/login/screens/core_oobe_actor.h"
14#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
15#include "net/base/net_errors.h"
16
17namespace policy {
18class ConsumerManagementService;
19}
20
21namespace chromeos {
22
23class SigninScreenHandler;
24
25// A class that's used to specify the way how Gaia should be loaded.
26struct GaiaContext {
27  GaiaContext();
28
29  // Forces Gaia to reload.
30  bool force_reload;
31
32  // Whether local verison of Gaia is used.
33  bool is_local;
34
35  // True if password was changed for the current user.
36  bool password_changed;
37
38  // True if user pods can be displyed.
39  bool show_users;
40
41  // Whether Gaia should be loaded in offline mode.
42  bool use_offline;
43
44  // True if user list is non-empty.
45  bool has_users;
46
47  // Email of current user.
48  std::string email;
49
50  // Whether consumer management enrollment is in progress.
51  bool is_enrolling_consumer_management;
52};
53
54// A class that handles WebUI hooks in Gaia screen.
55class GaiaScreenHandler : public BaseScreenHandler {
56 public:
57  enum FrameState {
58    FRAME_STATE_UNKNOWN = 0,
59    FRAME_STATE_LOADING,
60    FRAME_STATE_LOADED,
61    FRAME_STATE_ERROR
62  };
63
64  GaiaScreenHandler(
65      CoreOobeActor* core_oobe_actor,
66      const scoped_refptr<NetworkStateInformer>& network_state_informer,
67      policy::ConsumerManagementService* consumer_management);
68  virtual ~GaiaScreenHandler();
69
70  void LoadGaia(const GaiaContext& context);
71  void UpdateGaia(const GaiaContext& context);
72
73  // Sends request to reload Gaia. If |force_reload| is true, request
74  // will be sent in any case, otherwise it will be sent only when Gaia is
75  // not loading right now.
76  void ReloadGaia(bool force_reload);
77
78  FrameState frame_state() const { return frame_state_; }
79  net::Error frame_error() const { return frame_error_; }
80
81 private:
82  // TODO (ygorshenin@): remove this dependency.
83  friend class SigninScreenHandler;
84
85  // BaseScreenHandler implementation:
86  virtual void DeclareLocalizedValues(LocalizedValuesBuilder* builder) OVERRIDE;
87  virtual void Initialize() OVERRIDE;
88
89  // WebUIMessageHandler implementation:
90  virtual void RegisterMessages() OVERRIDE;
91
92  // WebUI message handlers.
93  void HandleFrameLoadingCompleted(int status);
94  void HandleCompleteAuthentication(const std::string& email,
95                                    const std::string& password,
96                                    const std::string& auth_code);
97  void HandleCompleteLogin(const std::string& typed_email,
98                           const std::string& password,
99                           bool using_saml);
100
101  void HandleUsingSAMLAPI();
102  void HandleScrapedPasswordCount(int password_count);
103  void HandleScrapedPasswordVerificationFailed();
104
105  void HandleGaiaUIReady();
106
107  // This is called when ConsumerManagementService::SetOwner() returns.
108  void OnSetOwnerDone(const std::string& typed_email,
109                      const std::string& password,
110                      bool using_saml,
111                      bool success);
112
113  // Really handles the complete login message.
114  void DoCompleteLogin(const std::string& typed_email,
115                       const std::string& password,
116                       bool using_saml);
117
118  // Fill GAIA user name.
119  void PopulateEmail(const std::string& user_id);
120
121  // Mark user as having password changed:
122  void PasswordChangedFor(const std::string& user_id);
123
124  // Kick off cookie / local storage cleanup.
125  void StartClearingCookies(const base::Closure& on_clear_callback);
126  void OnCookiesCleared(const base::Closure& on_clear_callback);
127
128  // Kick off DNS cache flushing.
129  void StartClearingDnsCache();
130  void OnDnsCleared();
131
132  // Show sign-in screen for the given credentials.
133  virtual void ShowSigninScreenForCreds(const std::string& username,
134                                        const std::string& password);
135  // Attempts login for test.
136  void SubmitLoginFormForTest();
137
138  // Updates the member variable and UMA histogram indicating whether the
139  // principals API was used during SAML login.
140  void SetSAMLPrincipalsAPIUsed(bool api_used);
141
142  void ShowGaia(bool is_enrolling_consumer_management);
143
144  // Shows signin screen after dns cache and cookie cleanup operations finish.
145  void ShowGaiaScreenIfReady();
146
147  // Decides whether an auth extension should be pre-loaded. If it should,
148  // pre-loads it.
149  void MaybePreloadAuthExtension();
150
151  // Tells webui to load authentication extension. |force| is used to force the
152  // extension reloading, if it has already been loaded. |silent_load| is true
153  // for cases when extension should be loaded in the background and it
154  // shouldn't grab the focus. |offline| is true when offline version of the
155  // extension should be used.
156  void LoadAuthExtension(bool force, bool silent_load, bool offline);
157
158  // TODO (ygorshenin@): GaiaScreenHandler should implement
159  // NetworkStateInformer::Observer.
160  void UpdateState(ErrorScreenActor::ErrorReason reason);
161
162  // TODO (ygorshenin@): remove this dependency.
163  void SetSigninScreenHandler(SigninScreenHandler* handler);
164
165  SigninScreenHandlerDelegate* Delegate();
166
167  // Current state of Gaia frame.
168  FrameState frame_state_;
169
170  // Latest Gaia frame error.
171  net::Error frame_error_;
172
173  // Network state informer used to keep signin screen up.
174  scoped_refptr<NetworkStateInformer> network_state_informer_;
175
176  // Consumer management service for checking if enrollment is in progress.
177  policy::ConsumerManagementService* consumer_management_;
178
179  CoreOobeActor* core_oobe_actor_;
180
181  // Email to pre-populate with.
182  std::string populated_email_;
183
184  // Emails of the users, whose passwords have recently been changed.
185  std::set<std::string> password_changed_for_;
186
187  // True if dns cache cleanup is done.
188  bool dns_cleared_;
189
190  // True if DNS cache task is already running.
191  bool dns_clear_task_running_;
192
193  // True if cookie jar cleanup is done.
194  bool cookies_cleared_;
195
196  // Is focus still stolen from Gaia page?
197  bool focus_stolen_;
198
199  // Has Gaia page silent load been started for the current sign-in attempt?
200  bool gaia_silent_load_;
201
202  // The active network at the moment when Gaia page was preloaded.
203  std::string gaia_silent_load_network_;
204
205  // If the user authenticated via SAML, this indicates whether the principals
206  // API was used.
207  bool using_saml_api_;
208
209  // Whether consumer management enrollment is in progress.
210  bool is_enrolling_consumer_management_;
211
212  // Test credentials.
213  std::string test_user_;
214  std::string test_pass_;
215  bool test_expects_complete_login_;
216
217  // Non-owning ptr to SigninScreenHandler instance. Should not be used
218  // in dtor.
219  // TODO (ygorshenin@): GaiaScreenHandler shouldn't communicate with
220  // signin_screen_handler directly.
221  SigninScreenHandler* signin_screen_handler_;
222
223  base::WeakPtrFactory<GaiaScreenHandler> weak_factory_;
224
225  DISALLOW_COPY_AND_ASSIGN(GaiaScreenHandler);
226};
227
228}  // namespace chromeos
229
230#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_GAIA_SCREEN_HANDLER_H_
231