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.
5 #include "chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "base/values.h"
9 #include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_flow.h"
10 #include "chrome/browser/chromeos/login/supervised_user_manager.h"
11 #include "chrome/browser/chromeos/login/user_manager.h"
12 #include "chrome/browser/chromeos/login/wallpaper_manager.h"
13 #include "chrome/browser/chromeos/settings/cros_settings.h"
14 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
15 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
16 #include "chrome/common/url_constants.h"
17 #include "google_apis/gaia/gaia_auth_util.h"
18 #include "grit/generated_resources.h"
19 #include "net/base/data_url.h"
20 #include "net/base/escape.h"
21 #include "ui/base/l10n/l10n_util.h"
23 const char kJsScreenPath[] = "login.LocallyManagedUserCreationScreen";
27 LocallyManagedUserCreationScreenHandler::
28 LocallyManagedUserCreationScreenHandler()
29 : BaseScreenHandler(kJsScreenPath),
33 LocallyManagedUserCreationScreenHandler::
34 ~LocallyManagedUserCreationScreenHandler() {
36 delegate_->OnActorDestroyed(this);
39 void LocallyManagedUserCreationScreenHandler::DeclareLocalizedValues(
40 LocalizedValuesBuilder* builder) {
42 "managedUserCreationFlowRetryButtonTitle",
43 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_ERROR_RETRY_BUTTON_TITLE);
45 "managedUserCreationFlowCancelButtonTitle",
46 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_ERROR_CANCEL_BUTTON_TITLE);
48 "managedUserCreationFlowGotitButtonTitle",
49 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_GOT_IT_BUTTON_TITLE);
51 builder->Add("createManagedUserIntroTextTitle",
52 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_TITLE);
53 builder->Add("createManagedUserIntroAlternateText",
54 IDS_CREATE_LOCALLY_MANAGED_INTRO_ALTERNATE_TEXT);
55 builder->Add("createManagedUserIntroText1",
56 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_1);
57 builder->Add("createManagedUserIntroManagerItem1",
58 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_1);
59 builder->Add("createManagedUserIntroManagerItem2",
60 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_2);
61 builder->Add("createManagedUserIntroManagerItem3",
62 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_3);
63 builder->Add("createManagedUserIntroText2",
64 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_2);
65 builder->AddF("createManagedUserIntroText3",
66 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_3,
67 base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL));
69 builder->Add("createManagedUserPickManagerTitle",
70 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PICK_MANAGER_TITLE);
71 builder->AddF("createManagedUserPickManagerTitleExplanation",
72 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PICK_MANAGER_EXPLANATION,
73 base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL));
74 builder->Add("createManagedUserManagerPasswordHint",
75 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_MANAGER_PASSWORD_HINT);
76 builder->Add("createManagedUserWrongManagerPasswordText",
77 IDS_CREATE_LOCALLY_MANAGED_USER_MANAGER_PASSWORD_ERROR);
79 builder->Add("createManagedUserNameTitle",
80 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ACCOUNT_NAME_TITLE);
81 builder->Add("createManagedUserNameExplanation",
82 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ACCOUNT_NAME_EXPLANATION);
83 builder->Add("createManagedUserPasswordTitle",
84 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_TITLE);
85 builder->Add("createManagedUserPasswordExplanation",
86 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_EXPLANATION);
87 builder->Add("createManagedUserPasswordHint",
88 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_HINT);
89 builder->Add("createManagedUserPasswordConfirmHint",
90 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_CONFIRM_HINT);
91 builder->Add("managedUserCreationFlowProceedButtonTitle",
92 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_CONTINUE_BUTTON_TEXT);
93 builder->Add("managedUserCreationFlowStartButtonTitle",
94 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_START_BUTTON_TEXT);
95 builder->Add("managedUserCreationFlowPrevButtonTitle",
96 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PREVIOUS_BUTTON_TEXT);
97 builder->Add("managedUserCreationFlowNextButtonTitle",
98 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_NEXT_BUTTON_TEXT);
99 builder->Add("managedUserCreationFlowHandleErrorButtonTitle",
100 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_HANDLE_ERROR_BUTTON_TEXT);
101 builder->Add("createManagedUserPasswordMismatchError",
102 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_MISMATCH_ERROR);
104 builder->Add("createManagedUserCreatedText1",
105 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_1);
106 builder->Add("createManagedUserCreatedText2",
107 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_2);
108 builder->Add("createManagedUserCreatedText3",
109 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_3);
111 builder->Add("importExistingSupervisedUserTitle",
112 IDS_IMPORT_EXISTING_MANAGED_USER_TITLE);
113 builder->Add("importExistingSupervisedUserText",
114 IDS_IMPORT_EXISTING_MANAGED_USER_TEXT);
115 builder->Add("managedUserCreationFlowImportButtonTitle",
116 IDS_IMPORT_EXISTING_MANAGED_USER_OK);
117 builder->Add("importSupervisedUserLink",
118 IDS_PROFILES_IMPORT_EXISTING_MANAGED_USER_LINK);
119 builder->Add("createSupervisedUserLink",
120 IDS_CREATE_NEW_USER_LINK);
121 builder->Add("importBubbleText", IDS_SUPERVISED_USER_IMPORT_BUBBLE_TEXT);
122 builder->Add("importUserExists", IDS_SUPERVISED_USER_IMPORT_USER_EXIST);
123 builder->Add("importUsernameExists",
124 IDS_SUPERVISED_USER_IMPORT_USERNAME_EXIST);
126 builder->Add("managementURL", chrome::kSupervisedUserManagementDisplayURL);
128 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
129 // It should be removed by issue 251179.
130 builder->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO);
131 builder->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO);
132 builder->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO);
135 void LocallyManagedUserCreationScreenHandler::Initialize() {}
137 void LocallyManagedUserCreationScreenHandler::RegisterMessages() {
138 AddCallback("finishLocalManagedUserCreation",
139 &LocallyManagedUserCreationScreenHandler::
140 HandleFinishLocalManagedUserCreation);
141 AddCallback("abortLocalManagedUserCreation",
142 &LocallyManagedUserCreationScreenHandler::
143 HandleAbortLocalManagedUserCreation);
144 AddCallback("checkLocallyManagedUserName",
145 &LocallyManagedUserCreationScreenHandler::
146 HandleCheckLocallyManagedUserName);
147 AddCallback("authenticateManagerInLocallyManagedUserCreationFlow",
148 &LocallyManagedUserCreationScreenHandler::
149 HandleAuthenticateManager);
150 AddCallback("specifyLocallyManagedUserCreationFlowUserData",
151 &LocallyManagedUserCreationScreenHandler::
152 HandleCreateManagedUser);
153 AddCallback("managerSelectedOnLocallyManagedUserCreationFlow",
154 &LocallyManagedUserCreationScreenHandler::
155 HandleManagerSelected);
156 AddCallback("userSelectedForImportInManagedUserCreationFlow",
157 &LocallyManagedUserCreationScreenHandler::
158 HandleImportUserSelected);
159 AddCallback("importSupervisedUser",
160 &LocallyManagedUserCreationScreenHandler::
161 HandleImportSupervisedUser);
162 AddCallback("importSupervisedUserWithPassword",
163 &LocallyManagedUserCreationScreenHandler::
164 HandleImportSupervisedUserWithPassword);
167 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
168 // It should be removed by issue 251179.
169 AddCallback("supervisedUserGetImages",
170 &LocallyManagedUserCreationScreenHandler::
173 AddCallback("supervisedUserPhotoTaken",
174 &LocallyManagedUserCreationScreenHandler::HandlePhotoTaken);
175 AddCallback("supervisedUserSelectImage",
176 &LocallyManagedUserCreationScreenHandler::HandleSelectImage);
177 AddCallback("supervisedUserCheckCameraPresence",
178 &LocallyManagedUserCreationScreenHandler::
179 HandleCheckCameraPresence);
180 AddCallback("currentSupervisedUserPage",
181 &LocallyManagedUserCreationScreenHandler::
182 HandleCurrentSupervisedUserPage);
185 void LocallyManagedUserCreationScreenHandler::PrepareToShow() {}
187 void LocallyManagedUserCreationScreenHandler::Show() {
188 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue());
189 scoped_ptr<base::ListValue> users_list(new base::ListValue());
190 const UserList& users = UserManager::Get()->GetUsers();
192 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
194 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) {
195 if ((*it)->GetType() != User::USER_TYPE_REGULAR)
197 bool is_owner = ((*it)->email() == owner);
198 base::DictionaryValue* user_dict = new base::DictionaryValue();
199 SigninScreenHandler::FillUserDictionary(*it,
201 false /* is_signin_to_add */,
203 users_list->Append(user_dict);
205 data->Set("managers", users_list.release());
206 ShowScreen(OobeUI::kScreenManagedUserCreationFlow, data.get());
210 delegate_->CheckCameraPresence();
213 void LocallyManagedUserCreationScreenHandler::Hide() {}
215 void LocallyManagedUserCreationScreenHandler::ShowIntroPage() {
216 CallJS("showIntroPage");
219 void LocallyManagedUserCreationScreenHandler::ShowManagerPasswordError() {
220 CallJS("showManagerPasswordError");
223 void LocallyManagedUserCreationScreenHandler::ShowStatusMessage(
225 const base::string16& message) {
227 CallJS("showProgress", message);
229 CallJS("showStatusError", message);
232 void LocallyManagedUserCreationScreenHandler::ShowUsernamePage() {
233 CallJS("showUsernamePage");
236 void LocallyManagedUserCreationScreenHandler::ShowTutorialPage() {
237 CallJS("showTutorialPage");
240 void LocallyManagedUserCreationScreenHandler::ShowErrorPage(
241 const base::string16& title,
242 const base::string16& message,
243 const base::string16& button_text) {
244 CallJS("showErrorPage", title, message, button_text);
247 void LocallyManagedUserCreationScreenHandler::SetDelegate(Delegate* delegate) {
248 delegate_ = delegate;
251 void LocallyManagedUserCreationScreenHandler::
252 HandleFinishLocalManagedUserCreation() {
253 delegate_->FinishFlow();
256 void LocallyManagedUserCreationScreenHandler::
257 HandleAbortLocalManagedUserCreation() {
258 delegate_->AbortFlow();
261 void LocallyManagedUserCreationScreenHandler::HandleManagerSelected(
262 const std::string& manager_id) {
265 WallpaperManager::Get()->SetUserWallpaperNow(manager_id);
268 void LocallyManagedUserCreationScreenHandler::HandleImportUserSelected(
269 const std::string& user_id) {
274 void LocallyManagedUserCreationScreenHandler::HandleCheckLocallyManagedUserName(
275 const base::string16& name) {
277 if (NULL != UserManager::Get()->GetSupervisedUserManager()->
278 FindByDisplayName(CollapseWhitespace(name, true))) {
279 CallJS("managedUserNameError", name,
280 l10n_util::GetStringUTF16(
281 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_USERNAME_ALREADY_EXISTS));
282 } else if (net::EscapeForHTML(name) != name) {
283 CallJS("managedUserNameError", name,
284 l10n_util::GetStringUTF16(
285 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ILLEGAL_USERNAME));
286 } else if (delegate_ && delegate_->FindUserByDisplayName(
287 CollapseWhitespace(name, true), &user_id)) {
288 CallJS("managedUserSuggestImport", name, user_id);
290 CallJS("managedUserNameOk", name);
294 void LocallyManagedUserCreationScreenHandler::HandleCreateManagedUser(
295 const base::string16& new_raw_user_name,
296 const std::string& new_user_password) {
299 const base::string16 new_user_name =
300 CollapseWhitespace(new_raw_user_name, true);
301 if (NULL != UserManager::Get()->GetSupervisedUserManager()->
302 FindByDisplayName(new_user_name)) {
303 CallJS("managedUserNameError", new_user_name,
304 l10n_util::GetStringFUTF16(
305 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_USERNAME_ALREADY_EXISTS,
309 if (net::EscapeForHTML(new_user_name) != new_user_name) {
310 CallJS("managedUserNameError", new_user_name,
311 l10n_util::GetStringUTF16(
312 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ILLEGAL_USERNAME));
316 if (new_user_password.length() == 0) {
317 CallJS("showPasswordError",
318 l10n_util::GetStringUTF16(
319 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_TOO_SHORT));
323 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
324 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
326 delegate_->CreateManagedUser(new_user_name, new_user_password);
329 void LocallyManagedUserCreationScreenHandler::HandleImportSupervisedUser(
330 const std::string& user_id) {
334 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
335 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
337 delegate_->ImportManagedUser(user_id);
340 void LocallyManagedUserCreationScreenHandler::
341 HandleImportSupervisedUserWithPassword(
342 const std::string& user_id,
343 const std::string& password) {
347 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
348 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
350 delegate_->ImportManagedUserWithPassword(user_id, password);
353 void LocallyManagedUserCreationScreenHandler::HandleAuthenticateManager(
354 const std::string& raw_manager_username,
355 const std::string& manager_password) {
356 const std::string manager_username =
357 gaia::SanitizeEmail(raw_manager_username);
359 UserFlow* flow = new LocallyManagedUserCreationFlow(manager_username);
360 UserManager::Get()->SetUserFlow(manager_username, flow);
362 delegate_->AuthenticateManager(manager_username, manager_password);
365 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
366 // It should be removed by issue 251179.
367 void LocallyManagedUserCreationScreenHandler::HandleGetImages() {
368 base::ListValue image_urls;
369 for (int i = kFirstDefaultImageIndex; i < kDefaultImagesCount; ++i) {
370 scoped_ptr<base::DictionaryValue> image_data(new base::DictionaryValue);
371 image_data->SetString("url", GetDefaultImageUrl(i));
372 image_data->SetString(
373 "author", l10n_util::GetStringUTF16(kDefaultImageAuthorIDs[i]));
374 image_data->SetString(
375 "website", l10n_util::GetStringUTF16(kDefaultImageWebsiteIDs[i]));
376 image_data->SetString("title", GetDefaultImageDescription(i));
377 image_urls.Append(image_data.release());
379 CallJS("setDefaultImages", image_urls);
382 void LocallyManagedUserCreationScreenHandler::HandlePhotoTaken
383 (const std::string& image_url) {
384 std::string mime_type, charset, raw_data;
385 if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data))
387 DCHECK_EQ("image/png", mime_type);
390 delegate_->OnPhotoTaken(raw_data);
393 void LocallyManagedUserCreationScreenHandler::HandleCheckCameraPresence() {
396 delegate_->CheckCameraPresence();
399 void LocallyManagedUserCreationScreenHandler::HandleSelectImage(
400 const std::string& image_url,
401 const std::string& image_type) {
403 delegate_->OnImageSelected(image_type, image_url);
406 void LocallyManagedUserCreationScreenHandler::HandleCurrentSupervisedUserPage(
407 const std::string& page) {
409 delegate_->OnPageSelected(page);
412 void LocallyManagedUserCreationScreenHandler::ShowPage(
413 const std::string& page) {
414 CallJS("showPage", page);
417 void LocallyManagedUserCreationScreenHandler::SetCameraPresent(bool present) {
418 CallJS("setCameraPresent", present);
421 void LocallyManagedUserCreationScreenHandler::ShowExistingManagedUsers(
422 const base::ListValue* users) {
423 CallJS("setExistingManagedUsers", *users);
426 } // namespace chromeos