1 // Copyright 2014 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/supervised_user_creation_screen_handler.h"
7 #include "ash/audio/sounds.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/values.h"
10 #include "chrome/browser/chromeos/login/screens/user_selection_screen.h"
11 #include "chrome/browser/chromeos/login/supervised/supervised_user_creation_flow.h"
12 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
13 #include "chrome/browser/chromeos/login/users/supervised_user_manager.h"
14 #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
15 #include "chrome/browser/chromeos/settings/cros_settings.h"
16 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
17 #include "chrome/common/url_constants.h"
18 #include "chrome/grit/generated_resources.h"
19 #include "chromeos/audio/chromeos_sounds.h"
20 #include "components/login/localized_values_builder.h"
21 #include "components/user_manager/user_manager.h"
22 #include "components/user_manager/user_type.h"
23 #include "google_apis/gaia/gaia_auth_util.h"
24 #include "grit/browser_resources.h"
25 #include "net/base/data_url.h"
26 #include "net/base/escape.h"
27 #include "ui/base/l10n/l10n_util.h"
28 #include "ui/base/resource/resource_bundle.h"
30 const char kJsScreenPath
[] = "login.SupervisedUserCreationScreen";
34 SupervisedUserCreationScreenHandler::SupervisedUserCreationScreenHandler()
35 : BaseScreenHandler(kJsScreenPath
),
37 ui::ResourceBundle
& bundle
= ui::ResourceBundle::GetSharedInstance();
38 media::SoundsManager
* manager
= media::SoundsManager::Get();
39 manager
->Initialize(SOUND_OBJECT_DELETE
,
40 bundle
.GetRawDataResource(IDR_SOUND_OBJECT_DELETE_WAV
));
41 manager
->Initialize(SOUND_CAMERA_SNAP
,
42 bundle
.GetRawDataResource(IDR_SOUND_CAMERA_SNAP_WAV
));
45 SupervisedUserCreationScreenHandler::~SupervisedUserCreationScreenHandler() {
47 delegate_
->OnActorDestroyed(this);
51 void SupervisedUserCreationScreenHandler::DeclareLocalizedValues(
52 ::login::LocalizedValuesBuilder
* builder
) {
54 "supervisedUserCreationFlowRetryButtonTitle",
55 IDS_CREATE_SUPERVISED_USER_CREATION_ERROR_RETRY_BUTTON_TITLE
);
57 "supervisedUserCreationFlowCancelButtonTitle",
58 IDS_CREATE_SUPERVISED_USER_CREATION_ERROR_CANCEL_BUTTON_TITLE
);
60 "supervisedUserCreationFlowGotitButtonTitle",
61 IDS_CREATE_SUPERVISED_USER_CREATION_GOT_IT_BUTTON_TITLE
);
63 builder
->Add("createSupervisedUserIntroTextTitle",
64 IDS_CREATE_SUPERVISED_INTRO_TEXT_TITLE
);
65 builder
->Add("createSupervisedUserIntroAlternateText",
66 IDS_CREATE_SUPERVISED_INTRO_ALTERNATE_TEXT
);
67 builder
->Add("createSupervisedUserIntroText1",
68 IDS_CREATE_SUPERVISED_INTRO_TEXT_1
);
69 builder
->Add("createSupervisedUserIntroManagerItem1",
70 IDS_CREATE_SUPERVISED_INTRO_MANAGER_ITEM_1
);
71 builder
->Add("createSupervisedUserIntroManagerItem2",
72 IDS_CREATE_SUPERVISED_INTRO_MANAGER_ITEM_2
);
73 builder
->Add("createSupervisedUserIntroManagerItem3",
74 IDS_CREATE_SUPERVISED_INTRO_MANAGER_ITEM_3
);
75 builder
->Add("createSupervisedUserIntroText2",
76 IDS_CREATE_SUPERVISED_INTRO_TEXT_2
);
77 builder
->AddF("createSupervisedUserIntroText3",
78 IDS_CREATE_SUPERVISED_INTRO_TEXT_3
,
79 base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL
));
81 builder
->Add("createSupervisedUserPickManagerTitle",
82 IDS_CREATE_SUPERVISED_USER_CREATE_PICK_MANAGER_TITLE
);
83 builder
->AddF("createSupervisedUserPickManagerTitleExplanation",
84 IDS_CREATE_SUPERVISED_USER_CREATE_PICK_MANAGER_EXPLANATION
,
85 base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL
));
86 builder
->Add("createSupervisedUserManagerPasswordHint",
87 IDS_CREATE_SUPERVISED_USER_CREATE_MANAGER_PASSWORD_HINT
);
88 builder
->Add("createSupervisedUserWrongManagerPasswordText",
89 IDS_CREATE_SUPERVISED_USER_MANAGER_PASSWORD_ERROR
);
91 builder
->Add("createSupervisedUserNameTitle",
92 IDS_CREATE_SUPERVISED_USER_CREATE_ACCOUNT_NAME_TITLE
);
93 builder
->Add("createSupervisedUserNameAccessibleTitle",
94 IDS_CREATE_SUPERVISED_USER_SETUP_ACCESSIBLE_TITLE
);
95 builder
->Add("createSupervisedUserNameExplanation",
96 IDS_CREATE_SUPERVISED_USER_CREATE_ACCOUNT_NAME_EXPLANATION
);
97 builder
->Add("createSupervisedUserNameHint",
98 IDS_CREATE_SUPERVISED_USER_CREATE_ACCOUNT_NAME_HINT
);
99 builder
->Add("createSupervisedUserPasswordTitle",
100 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_TITLE
);
101 builder
->Add("createSupervisedUserPasswordExplanation",
102 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_EXPLANATION
);
103 builder
->Add("createSupervisedUserPasswordHint",
104 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_HINT
);
105 builder
->Add("createSupervisedUserPasswordConfirmHint",
106 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_CONFIRM_HINT
);
107 builder
->Add("supervisedUserCreationFlowProceedButtonTitle",
108 IDS_CREATE_SUPERVISED_USER_CREATE_CONTINUE_BUTTON_TEXT
);
109 builder
->Add("supervisedUserCreationFlowStartButtonTitle",
110 IDS_CREATE_SUPERVISED_USER_CREATE_START_BUTTON_TEXT
);
111 builder
->Add("supervisedUserCreationFlowPrevButtonTitle",
112 IDS_CREATE_SUPERVISED_USER_CREATE_PREVIOUS_BUTTON_TEXT
);
113 builder
->Add("supervisedUserCreationFlowNextButtonTitle",
114 IDS_CREATE_SUPERVISED_USER_CREATE_NEXT_BUTTON_TEXT
);
115 builder
->Add("supervisedUserCreationFlowHandleErrorButtonTitle",
116 IDS_CREATE_SUPERVISED_USER_CREATE_HANDLE_ERROR_BUTTON_TEXT
);
117 builder
->Add("createSupervisedUserPasswordMismatchError",
118 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_MISMATCH_ERROR
);
120 builder
->Add("createSupervisedUserCreatedText1",
121 IDS_CREATE_SUPERVISED_USER_CREATED_1_TEXT_1
);
122 builder
->Add("createSupervisedUserCreatedText2",
123 IDS_CREATE_SUPERVISED_USER_CREATED_1_TEXT_2
);
124 builder
->Add("createSupervisedUserCreatedText3",
125 IDS_CREATE_SUPERVISED_USER_CREATED_1_TEXT_3
);
127 builder
->Add("importExistingSupervisedUserTitle",
128 IDS_IMPORT_EXISTING_SUPERVISED_USER_TITLE
);
129 builder
->Add("importExistingSupervisedUserText",
130 IDS_IMPORT_EXISTING_SUPERVISED_USER_TEXT
);
131 builder
->Add("supervisedUserCreationFlowImportButtonTitle",
132 IDS_IMPORT_EXISTING_SUPERVISED_USER_OK
);
133 builder
->Add("importSupervisedUserLink",
134 IDS_PROFILES_IMPORT_EXISTING_SUPERVISED_USER_LINK
);
135 builder
->Add("createSupervisedUserLink",
136 IDS_CREATE_NEW_USER_LINK
);
137 builder
->Add("importBubbleText", IDS_SUPERVISED_USER_IMPORT_BUBBLE_TEXT
);
138 builder
->Add("importUserExists", IDS_SUPERVISED_USER_IMPORT_USER_EXIST
);
139 builder
->Add("importUsernameExists",
140 IDS_SUPERVISED_USER_IMPORT_USERNAME_EXIST
);
142 builder
->Add("managementURL", chrome::kSupervisedUserManagementDisplayURL
);
144 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
145 // It should be removed by issue 251179.
146 builder
->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO
);
147 builder
->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO
);
148 builder
->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO
);
149 builder
->Add("photoFlippedAccessibleText",
150 IDS_OPTIONS_PHOTO_FLIP_ACCESSIBLE_TEXT
);
151 builder
->Add("photoFlippedBackAccessibleText",
152 IDS_OPTIONS_PHOTO_FLIPBACK_ACCESSIBLE_TEXT
);
153 builder
->Add("photoCaptureAccessibleText",
154 IDS_OPTIONS_PHOTO_CAPTURE_ACCESSIBLE_TEXT
);
155 builder
->Add("photoDiscardAccessibleText",
156 IDS_OPTIONS_PHOTO_DISCARD_ACCESSIBLE_TEXT
);
159 void SupervisedUserCreationScreenHandler::Initialize() {}
161 void SupervisedUserCreationScreenHandler::RegisterMessages() {
162 AddCallback("finishLocalSupervisedUserCreation",
163 &SupervisedUserCreationScreenHandler::
164 HandleFinishLocalSupervisedUserCreation
);
165 AddCallback("abortLocalSupervisedUserCreation",
166 &SupervisedUserCreationScreenHandler::
167 HandleAbortLocalSupervisedUserCreation
);
168 AddCallback("checkSupervisedUserName",
169 &SupervisedUserCreationScreenHandler::
170 HandleCheckSupervisedUserName
);
171 AddCallback("authenticateManagerInSupervisedUserCreationFlow",
172 &SupervisedUserCreationScreenHandler::
173 HandleAuthenticateManager
);
174 AddCallback("specifySupervisedUserCreationFlowUserData",
175 &SupervisedUserCreationScreenHandler::
176 HandleCreateSupervisedUser
);
177 AddCallback("managerSelectedOnSupervisedUserCreationFlow",
178 &SupervisedUserCreationScreenHandler::
179 HandleManagerSelected
);
180 AddCallback("userSelectedForImportInSupervisedUserCreationFlow",
181 &SupervisedUserCreationScreenHandler::
182 HandleImportUserSelected
);
183 AddCallback("importSupervisedUser",
184 &SupervisedUserCreationScreenHandler::
185 HandleImportSupervisedUser
);
186 AddCallback("importSupervisedUserWithPassword",
187 &SupervisedUserCreationScreenHandler::
188 HandleImportSupervisedUserWithPassword
);
191 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
192 // It should be removed by issue 251179.
193 AddCallback("supervisedUserGetImages",
194 &SupervisedUserCreationScreenHandler::HandleGetImages
);
196 AddCallback("supervisedUserPhotoTaken",
197 &SupervisedUserCreationScreenHandler::HandlePhotoTaken
);
198 AddCallback("supervisedUserTakePhoto",
199 &SupervisedUserCreationScreenHandler::HandleTakePhoto
);
200 AddCallback("supervisedUserDiscardPhoto",
201 &SupervisedUserCreationScreenHandler::HandleDiscardPhoto
);
202 AddCallback("supervisedUserSelectImage",
203 &SupervisedUserCreationScreenHandler::HandleSelectImage
);
204 AddCallback("currentSupervisedUserPage",
205 &SupervisedUserCreationScreenHandler::
206 HandleCurrentSupervisedUserPage
);
209 void SupervisedUserCreationScreenHandler::PrepareToShow() {}
211 void SupervisedUserCreationScreenHandler::Show() {
212 scoped_ptr
<base::DictionaryValue
> data(new base::DictionaryValue());
213 scoped_ptr
<base::ListValue
> users_list(new base::ListValue());
214 const user_manager::UserList
& users
=
215 ChromeUserManager::Get()->GetUsersAllowedForSupervisedUsersCreation();
217 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner
, &owner
);
219 for (user_manager::UserList::const_iterator it
= users
.begin();
222 bool is_owner
= ((*it
)->email() == owner
);
223 base::DictionaryValue
* user_dict
= new base::DictionaryValue();
224 UserSelectionScreen::FillUserDictionary(
227 false, /* is_signin_to_add */
228 ScreenlockBridge::LockHandler::OFFLINE_PASSWORD
,
229 NULL
, /* public_session_recommended_locales */
231 users_list
->Append(user_dict
);
233 data
->Set("managers", users_list
.release());
234 ShowScreen(OobeUI::kScreenSupervisedUserCreationFlow
, data
.get());
240 void SupervisedUserCreationScreenHandler::Hide() {
243 void SupervisedUserCreationScreenHandler::ShowIntroPage() {
244 CallJS("showIntroPage");
247 void SupervisedUserCreationScreenHandler::ShowManagerPasswordError() {
248 CallJS("showManagerPasswordError");
251 void SupervisedUserCreationScreenHandler::ShowStatusMessage(
253 const base::string16
& message
) {
255 CallJS("showProgress", message
);
257 CallJS("showStatusError", message
);
260 void SupervisedUserCreationScreenHandler::ShowUsernamePage() {
261 CallJS("showUsernamePage");
264 void SupervisedUserCreationScreenHandler::ShowTutorialPage() {
265 CallJS("showTutorialPage");
268 void SupervisedUserCreationScreenHandler::ShowErrorPage(
269 const base::string16
& title
,
270 const base::string16
& message
,
271 const base::string16
& button_text
) {
272 CallJS("showErrorPage", title
, message
, button_text
);
275 void SupervisedUserCreationScreenHandler::SetDelegate(Delegate
* delegate
) {
276 delegate_
= delegate
;
279 void SupervisedUserCreationScreenHandler::
280 HandleFinishLocalSupervisedUserCreation() {
281 delegate_
->FinishFlow();
284 void SupervisedUserCreationScreenHandler::
285 HandleAbortLocalSupervisedUserCreation() {
286 delegate_
->AbortFlow();
289 void SupervisedUserCreationScreenHandler::HandleManagerSelected(
290 const std::string
& manager_id
) {
293 WallpaperManager::Get()->SetUserWallpaperNow(manager_id
);
296 void SupervisedUserCreationScreenHandler::HandleImportUserSelected(
297 const std::string
& user_id
) {
302 void SupervisedUserCreationScreenHandler::HandleCheckSupervisedUserName(
303 const base::string16
& name
) {
306 ChromeUserManager::Get()->GetSupervisedUserManager()->FindByDisplayName(
307 base::CollapseWhitespace(name
, true))) {
308 CallJS("supervisedUserNameError", name
,
309 l10n_util::GetStringUTF16(
310 IDS_CREATE_SUPERVISED_USER_CREATE_USERNAME_ALREADY_EXISTS
));
311 } else if (net::EscapeForHTML(name
) != name
) {
312 CallJS("supervisedUserNameError", name
,
313 l10n_util::GetStringUTF16(
314 IDS_CREATE_SUPERVISED_USER_CREATE_ILLEGAL_USERNAME
));
315 } else if (delegate_
&& delegate_
->FindUserByDisplayName(
316 base::CollapseWhitespace(name
, true), &user_id
)) {
317 CallJS("supervisedUserSuggestImport", name
, user_id
);
319 CallJS("supervisedUserNameOk", name
);
323 void SupervisedUserCreationScreenHandler::HandleCreateSupervisedUser(
324 const base::string16
& new_raw_user_name
,
325 const std::string
& new_user_password
) {
328 const base::string16 new_user_name
=
329 base::CollapseWhitespace(new_raw_user_name
, true);
331 ChromeUserManager::Get()->GetSupervisedUserManager()->FindByDisplayName(
333 CallJS("supervisedUserNameError", new_user_name
,
334 l10n_util::GetStringFUTF16(
335 IDS_CREATE_SUPERVISED_USER_CREATE_USERNAME_ALREADY_EXISTS
,
339 if (net::EscapeForHTML(new_user_name
) != new_user_name
) {
340 CallJS("supervisedUserNameError", new_user_name
,
341 l10n_util::GetStringUTF16(
342 IDS_CREATE_SUPERVISED_USER_CREATE_ILLEGAL_USERNAME
));
346 if (new_user_password
.length() == 0) {
347 CallJS("showPasswordError",
348 l10n_util::GetStringUTF16(
349 IDS_CREATE_SUPERVISED_USER_CREATE_PASSWORD_TOO_SHORT
));
353 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
354 IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE
));
356 delegate_
->CreateSupervisedUser(new_user_name
, new_user_password
);
359 void SupervisedUserCreationScreenHandler::HandleImportSupervisedUser(
360 const std::string
& user_id
) {
364 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
365 IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE
));
367 delegate_
->ImportSupervisedUser(user_id
);
370 void SupervisedUserCreationScreenHandler::
371 HandleImportSupervisedUserWithPassword(
372 const std::string
& user_id
,
373 const std::string
& password
) {
377 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
378 IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE
));
380 delegate_
->ImportSupervisedUserWithPassword(user_id
, password
);
383 void SupervisedUserCreationScreenHandler::HandleAuthenticateManager(
384 const std::string
& raw_manager_username
,
385 const std::string
& manager_password
) {
386 const std::string manager_username
=
387 gaia::SanitizeEmail(raw_manager_username
);
388 delegate_
->AuthenticateManager(manager_username
, manager_password
);
391 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
392 // It should be removed by issue 251179.
393 void SupervisedUserCreationScreenHandler::HandleGetImages() {
394 base::ListValue image_urls
;
395 for (int i
= user_manager::kFirstDefaultImageIndex
;
396 i
< user_manager::kDefaultImagesCount
;
398 scoped_ptr
<base::DictionaryValue
> image_data(new base::DictionaryValue
);
399 image_data
->SetString("url", user_manager::GetDefaultImageUrl(i
));
400 image_data
->SetString(
402 l10n_util::GetStringUTF16(user_manager::kDefaultImageAuthorIDs
[i
]));
403 image_data
->SetString(
405 l10n_util::GetStringUTF16(user_manager::kDefaultImageWebsiteIDs
[i
]));
406 image_data
->SetString("title", user_manager::GetDefaultImageDescription(i
));
407 image_urls
.Append(image_data
.release());
409 CallJS("setDefaultImages", image_urls
);
412 void SupervisedUserCreationScreenHandler::HandlePhotoTaken
413 (const std::string
& image_url
) {
414 std::string mime_type
, charset
, raw_data
;
415 if (!net::DataURL::Parse(GURL(image_url
), &mime_type
, &charset
, &raw_data
))
417 DCHECK_EQ("image/png", mime_type
);
420 delegate_
->OnPhotoTaken(raw_data
);
423 void SupervisedUserCreationScreenHandler::HandleTakePhoto() {
424 ash::PlaySystemSoundIfSpokenFeedback(SOUND_CAMERA_SNAP
);
427 void SupervisedUserCreationScreenHandler::HandleDiscardPhoto() {
428 ash::PlaySystemSoundIfSpokenFeedback(SOUND_OBJECT_DELETE
);
431 void SupervisedUserCreationScreenHandler::HandleSelectImage(
432 const std::string
& image_url
,
433 const std::string
& image_type
) {
435 delegate_
->OnImageSelected(image_type
, image_url
);
438 void SupervisedUserCreationScreenHandler::HandleCurrentSupervisedUserPage(
439 const std::string
& page
) {
441 delegate_
->OnPageSelected(page
);
444 void SupervisedUserCreationScreenHandler::ShowPage(
445 const std::string
& page
) {
446 CallJS("showPage", page
);
449 void SupervisedUserCreationScreenHandler::SetCameraPresent(bool present
) {
450 CallJS("setCameraPresent", present
);
453 void SupervisedUserCreationScreenHandler::ShowExistingSupervisedUsers(
454 const base::ListValue
* users
) {
455 CallJS("setExistingSupervisedUsers", *users
);
458 } // namespace chromeos