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 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 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<DictionaryValue> data(new base::DictionaryValue());
189 scoped_ptr<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 DictionaryValue* user_dict = new DictionaryValue();
199 SigninScreenHandler::FillUserDictionary(*it, is_owner, user_dict);
200 users_list->Append(user_dict);
202 data->Set("managers", users_list.release());
203 ShowScreen(OobeUI::kScreenManagedUserCreationFlow, data.get());
207 delegate_->CheckCameraPresence();
210 void LocallyManagedUserCreationScreenHandler::Hide() {}
212 void LocallyManagedUserCreationScreenHandler::ShowIntroPage() {
213 CallJS("showIntroPage");
216 void LocallyManagedUserCreationScreenHandler::ShowManagerPasswordError() {
217 CallJS("showManagerPasswordError");
220 void LocallyManagedUserCreationScreenHandler::ShowStatusMessage(
222 const string16& message) {
224 CallJS("showProgress", message);
226 CallJS("showStatusError", message);
229 void LocallyManagedUserCreationScreenHandler::ShowUsernamePage() {
230 CallJS("showUsernamePage");
233 void LocallyManagedUserCreationScreenHandler::ShowTutorialPage() {
234 CallJS("showTutorialPage");
237 void LocallyManagedUserCreationScreenHandler::ShowErrorPage(
238 const string16& title,
239 const string16& message,
240 const string16& button_text) {
241 CallJS("showErrorPage", title, message, button_text);
244 void LocallyManagedUserCreationScreenHandler::SetDelegate(Delegate* delegate) {
245 delegate_ = delegate;
248 void LocallyManagedUserCreationScreenHandler::
249 HandleFinishLocalManagedUserCreation() {
250 delegate_->FinishFlow();
253 void LocallyManagedUserCreationScreenHandler::
254 HandleAbortLocalManagedUserCreation() {
255 delegate_->AbortFlow();
258 void LocallyManagedUserCreationScreenHandler::HandleManagerSelected(
259 const std::string& manager_id) {
262 WallpaperManager::Get()->SetUserWallpaper(manager_id);
265 void LocallyManagedUserCreationScreenHandler::HandleImportUserSelected(
266 const std::string& user_id) {
271 void LocallyManagedUserCreationScreenHandler::HandleCheckLocallyManagedUserName(
272 const string16& name) {
274 if (NULL != UserManager::Get()->GetSupervisedUserManager()->
275 FindByDisplayName(CollapseWhitespace(name, true))) {
276 CallJS("managedUserNameError", name,
277 l10n_util::GetStringUTF16(
278 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_USERNAME_ALREADY_EXISTS));
279 } else if (net::EscapeForHTML(name) != name) {
280 CallJS("managedUserNameError", name,
281 l10n_util::GetStringUTF16(
282 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ILLEGAL_USERNAME));
283 } else if (delegate_ && delegate_->FindUserByDisplayName(
284 CollapseWhitespace(name, true), &user_id)) {
285 CallJS("managedUserSuggestImport", name, user_id);
287 CallJS("managedUserNameOk", name);
291 void LocallyManagedUserCreationScreenHandler::HandleCreateManagedUser(
292 const string16& new_raw_user_name,
293 const std::string& new_user_password) {
296 const string16 new_user_name = CollapseWhitespace(new_raw_user_name, true);
297 if (NULL != UserManager::Get()->GetSupervisedUserManager()->
298 FindByDisplayName(new_user_name)) {
299 CallJS("managedUserNameError", new_user_name,
300 l10n_util::GetStringFUTF16(
301 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_USERNAME_ALREADY_EXISTS,
305 if (net::EscapeForHTML(new_user_name) != new_user_name) {
306 CallJS("managedUserNameError", new_user_name,
307 l10n_util::GetStringUTF16(
308 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ILLEGAL_USERNAME));
312 if (new_user_password.length() == 0) {
313 CallJS("showPasswordError",
314 l10n_util::GetStringUTF16(
315 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_TOO_SHORT));
319 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
320 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
322 delegate_->CreateManagedUser(new_user_name, new_user_password);
325 void LocallyManagedUserCreationScreenHandler::HandleImportSupervisedUser(
326 const std::string& user_id) {
330 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
331 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
333 delegate_->ImportManagedUser(user_id);
336 void LocallyManagedUserCreationScreenHandler::
337 HandleImportSupervisedUserWithPassword(
338 const std::string& user_id,
339 const std::string& password) {
343 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
344 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
346 delegate_->ImportManagedUserWithPassword(user_id, password);
349 void LocallyManagedUserCreationScreenHandler::HandleAuthenticateManager(
350 const std::string& raw_manager_username,
351 const std::string& manager_password) {
352 const std::string manager_username =
353 gaia::SanitizeEmail(raw_manager_username);
355 UserFlow* flow = new LocallyManagedUserCreationFlow(manager_username);
356 UserManager::Get()->SetUserFlow(manager_username, flow);
358 delegate_->AuthenticateManager(manager_username, manager_password);
361 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
362 // It should be removed by issue 251179.
363 void LocallyManagedUserCreationScreenHandler::HandleGetImages() {
364 base::ListValue image_urls;
365 for (int i = kFirstDefaultImageIndex; i < kDefaultImagesCount; ++i) {
366 scoped_ptr<base::DictionaryValue> image_data(new base::DictionaryValue);
367 image_data->SetString("url", GetDefaultImageUrl(i));
368 image_data->SetString(
369 "author", l10n_util::GetStringUTF16(kDefaultImageAuthorIDs[i]));
370 image_data->SetString(
371 "website", l10n_util::GetStringUTF16(kDefaultImageWebsiteIDs[i]));
372 image_data->SetString("title", GetDefaultImageDescription(i));
373 image_urls.Append(image_data.release());
375 CallJS("setDefaultImages", image_urls);
378 void LocallyManagedUserCreationScreenHandler::HandlePhotoTaken
379 (const std::string& image_url) {
380 std::string mime_type, charset, raw_data;
381 if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data))
383 DCHECK_EQ("image/png", mime_type);
386 delegate_->OnPhotoTaken(raw_data);
389 void LocallyManagedUserCreationScreenHandler::HandleCheckCameraPresence() {
392 delegate_->CheckCameraPresence();
395 void LocallyManagedUserCreationScreenHandler::HandleSelectImage(
396 const std::string& image_url,
397 const std::string& image_type) {
399 delegate_->OnImageSelected(image_type, image_url);
402 void LocallyManagedUserCreationScreenHandler::HandleCurrentSupervisedUserPage(
403 const std::string& page) {
405 delegate_->OnPageSelected(page);
408 void LocallyManagedUserCreationScreenHandler::ShowPage(
409 const std::string& page) {
410 CallJS("showPage", page);
413 void LocallyManagedUserCreationScreenHandler::SetCameraPresent(bool present) {
414 CallJS("setCameraPresent", present);
417 void LocallyManagedUserCreationScreenHandler::ShowExistingManagedUsers(
418 const base::ListValue* users) {
419 CallJS("setExistingManagedUsers", *users);
422 } // namespace chromeos