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 "ash/audio/sounds.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/values.h"
10 #include "chrome/browser/chromeos/camera_presence_notifier.h"
11 #include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_flow.h"
12 #include "chrome/browser/chromeos/login/supervised_user_manager.h"
13 #include "chrome/browser/chromeos/login/user_manager.h"
14 #include "chrome/browser/chromeos/login/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/browser/ui/webui/chromeos/login/signin_screen_handler.h"
18 #include "chrome/common/url_constants.h"
19 #include "chromeos/audio/chromeos_sounds.h"
20 #include "google_apis/gaia/gaia_auth_util.h"
21 #include "grit/browser_resources.h"
22 #include "grit/generated_resources.h"
23 #include "net/base/data_url.h"
24 #include "net/base/escape.h"
25 #include "ui/base/l10n/l10n_util.h"
26 #include "ui/base/resource/resource_bundle.h"
28 const char kJsScreenPath[] = "login.LocallyManagedUserCreationScreen";
32 LocallyManagedUserCreationScreenHandler::
33 LocallyManagedUserCreationScreenHandler()
34 : BaseScreenHandler(kJsScreenPath),
36 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
37 media::SoundsManager* manager = media::SoundsManager::Get();
38 manager->Initialize(SOUND_OBJECT_DELETE,
39 bundle.GetRawDataResource(IDR_SOUND_OBJECT_DELETE_WAV));
40 manager->Initialize(SOUND_CAMERA_SNAP,
41 bundle.GetRawDataResource(IDR_SOUND_CAMERA_SNAP_WAV));
44 LocallyManagedUserCreationScreenHandler::
45 ~LocallyManagedUserCreationScreenHandler() {
47 CameraPresenceNotifier::GetInstance()->RemoveObserver(delegate_);
48 delegate_->OnActorDestroyed(this);
52 void LocallyManagedUserCreationScreenHandler::DeclareLocalizedValues(
53 LocalizedValuesBuilder* builder) {
55 "managedUserCreationFlowRetryButtonTitle",
56 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_ERROR_RETRY_BUTTON_TITLE);
58 "managedUserCreationFlowCancelButtonTitle",
59 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_ERROR_CANCEL_BUTTON_TITLE);
61 "managedUserCreationFlowGotitButtonTitle",
62 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_GOT_IT_BUTTON_TITLE);
64 builder->Add("createManagedUserIntroTextTitle",
65 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_TITLE);
66 builder->Add("createManagedUserIntroAlternateText",
67 IDS_CREATE_LOCALLY_MANAGED_INTRO_ALTERNATE_TEXT);
68 builder->Add("createManagedUserIntroText1",
69 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_1);
70 builder->Add("createManagedUserIntroManagerItem1",
71 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_1);
72 builder->Add("createManagedUserIntroManagerItem2",
73 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_2);
74 builder->Add("createManagedUserIntroManagerItem3",
75 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_3);
76 builder->Add("createManagedUserIntroText2",
77 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_2);
78 builder->AddF("createManagedUserIntroText3",
79 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_3,
80 base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL));
82 builder->Add("createManagedUserPickManagerTitle",
83 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PICK_MANAGER_TITLE);
84 builder->AddF("createManagedUserPickManagerTitleExplanation",
85 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PICK_MANAGER_EXPLANATION,
86 base::UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL));
87 builder->Add("createManagedUserManagerPasswordHint",
88 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_MANAGER_PASSWORD_HINT);
89 builder->Add("createManagedUserWrongManagerPasswordText",
90 IDS_CREATE_LOCALLY_MANAGED_USER_MANAGER_PASSWORD_ERROR);
92 builder->Add("createManagedUserNameTitle",
93 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ACCOUNT_NAME_TITLE);
94 builder->Add("createManagedUserNameAccessibleTitle",
95 IDS_CREATE_LOCALLY_MANAGED_USER_SETUP_ACCESSIBLE_TITLE);
96 builder->Add("createManagedUserNameExplanation",
97 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ACCOUNT_NAME_EXPLANATION);
98 builder->Add("createManagedUserNameHint",
99 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ACCOUNT_NAME_HINT);
100 builder->Add("createManagedUserPasswordTitle",
101 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_TITLE);
102 builder->Add("createManagedUserPasswordExplanation",
103 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_EXPLANATION);
104 builder->Add("createManagedUserPasswordHint",
105 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_HINT);
106 builder->Add("createManagedUserPasswordConfirmHint",
107 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_CONFIRM_HINT);
108 builder->Add("managedUserCreationFlowProceedButtonTitle",
109 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_CONTINUE_BUTTON_TEXT);
110 builder->Add("managedUserCreationFlowStartButtonTitle",
111 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_START_BUTTON_TEXT);
112 builder->Add("managedUserCreationFlowPrevButtonTitle",
113 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PREVIOUS_BUTTON_TEXT);
114 builder->Add("managedUserCreationFlowNextButtonTitle",
115 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_NEXT_BUTTON_TEXT);
116 builder->Add("managedUserCreationFlowHandleErrorButtonTitle",
117 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_HANDLE_ERROR_BUTTON_TEXT);
118 builder->Add("createManagedUserPasswordMismatchError",
119 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_MISMATCH_ERROR);
121 builder->Add("createManagedUserCreatedText1",
122 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_1);
123 builder->Add("createManagedUserCreatedText2",
124 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_2);
125 builder->Add("createManagedUserCreatedText3",
126 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_3);
128 builder->Add("importExistingSupervisedUserTitle",
129 IDS_IMPORT_EXISTING_MANAGED_USER_TITLE);
130 builder->Add("importExistingSupervisedUserText",
131 IDS_IMPORT_EXISTING_MANAGED_USER_TEXT);
132 builder->Add("managedUserCreationFlowImportButtonTitle",
133 IDS_IMPORT_EXISTING_MANAGED_USER_OK);
134 builder->Add("importSupervisedUserLink",
135 IDS_PROFILES_IMPORT_EXISTING_MANAGED_USER_LINK);
136 builder->Add("createSupervisedUserLink",
137 IDS_CREATE_NEW_USER_LINK);
138 builder->Add("importBubbleText", IDS_SUPERVISED_USER_IMPORT_BUBBLE_TEXT);
139 builder->Add("importUserExists", IDS_SUPERVISED_USER_IMPORT_USER_EXIST);
140 builder->Add("importUsernameExists",
141 IDS_SUPERVISED_USER_IMPORT_USERNAME_EXIST);
143 builder->Add("managementURL", chrome::kSupervisedUserManagementDisplayURL);
145 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
146 // It should be removed by issue 251179.
147 builder->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO);
148 builder->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO);
149 builder->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO);
150 builder->Add("photoFlippedAccessibleText",
151 IDS_OPTIONS_PHOTO_FLIP_ACCESSIBLE_TEXT);
152 builder->Add("photoFlippedBackAccessibleText",
153 IDS_OPTIONS_PHOTO_FLIPBACK_ACCESSIBLE_TEXT);
154 builder->Add("photoCaptureAccessibleText",
155 IDS_OPTIONS_PHOTO_CAPTURE_ACCESSIBLE_TEXT);
156 builder->Add("photoDiscardAccessibleText",
157 IDS_OPTIONS_PHOTO_DISCARD_ACCESSIBLE_TEXT);
160 void LocallyManagedUserCreationScreenHandler::Initialize() {}
162 void LocallyManagedUserCreationScreenHandler::RegisterMessages() {
163 AddCallback("finishLocalManagedUserCreation",
164 &LocallyManagedUserCreationScreenHandler::
165 HandleFinishLocalManagedUserCreation);
166 AddCallback("abortLocalManagedUserCreation",
167 &LocallyManagedUserCreationScreenHandler::
168 HandleAbortLocalManagedUserCreation);
169 AddCallback("checkLocallyManagedUserName",
170 &LocallyManagedUserCreationScreenHandler::
171 HandleCheckLocallyManagedUserName);
172 AddCallback("authenticateManagerInLocallyManagedUserCreationFlow",
173 &LocallyManagedUserCreationScreenHandler::
174 HandleAuthenticateManager);
175 AddCallback("specifyLocallyManagedUserCreationFlowUserData",
176 &LocallyManagedUserCreationScreenHandler::
177 HandleCreateManagedUser);
178 AddCallback("managerSelectedOnLocallyManagedUserCreationFlow",
179 &LocallyManagedUserCreationScreenHandler::
180 HandleManagerSelected);
181 AddCallback("userSelectedForImportInManagedUserCreationFlow",
182 &LocallyManagedUserCreationScreenHandler::
183 HandleImportUserSelected);
184 AddCallback("importSupervisedUser",
185 &LocallyManagedUserCreationScreenHandler::
186 HandleImportSupervisedUser);
187 AddCallback("importSupervisedUserWithPassword",
188 &LocallyManagedUserCreationScreenHandler::
189 HandleImportSupervisedUserWithPassword);
192 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
193 // It should be removed by issue 251179.
194 AddCallback("supervisedUserGetImages",
195 &LocallyManagedUserCreationScreenHandler::
198 AddCallback("supervisedUserPhotoTaken",
199 &LocallyManagedUserCreationScreenHandler::HandlePhotoTaken);
200 AddCallback("supervisedUserTakePhoto",
201 &LocallyManagedUserCreationScreenHandler::HandleTakePhoto);
202 AddCallback("supervisedUserDiscardPhoto",
203 &LocallyManagedUserCreationScreenHandler::HandleDiscardPhoto);
204 AddCallback("supervisedUserSelectImage",
205 &LocallyManagedUserCreationScreenHandler::HandleSelectImage);
206 AddCallback("currentSupervisedUserPage",
207 &LocallyManagedUserCreationScreenHandler::
208 HandleCurrentSupervisedUserPage);
211 void LocallyManagedUserCreationScreenHandler::PrepareToShow() {}
213 void LocallyManagedUserCreationScreenHandler::Show() {
214 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue());
215 scoped_ptr<base::ListValue> users_list(new base::ListValue());
216 const UserList& users = UserManager::Get()->GetUsers();
218 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
220 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) {
221 if ((*it)->GetType() != User::USER_TYPE_REGULAR)
223 bool is_owner = ((*it)->email() == owner);
224 base::DictionaryValue* user_dict = new base::DictionaryValue();
225 SigninScreenHandler::FillUserDictionary(*it,
227 false /* is_signin_to_add */,
228 LoginDisplay::OFFLINE_PASSWORD,
230 users_list->Append(user_dict);
232 data->Set("managers", users_list.release());
233 ShowScreen(OobeUI::kScreenManagedUserCreationFlow, data.get());
237 CameraPresenceNotifier::GetInstance()->AddObserver(delegate_);
240 void LocallyManagedUserCreationScreenHandler::Hide() {
242 CameraPresenceNotifier::GetInstance()->RemoveObserver(delegate_);
245 void LocallyManagedUserCreationScreenHandler::ShowIntroPage() {
246 CallJS("showIntroPage");
249 void LocallyManagedUserCreationScreenHandler::ShowManagerPasswordError() {
250 CallJS("showManagerPasswordError");
253 void LocallyManagedUserCreationScreenHandler::ShowStatusMessage(
255 const base::string16& message) {
257 CallJS("showProgress", message);
259 CallJS("showStatusError", message);
262 void LocallyManagedUserCreationScreenHandler::ShowUsernamePage() {
263 CallJS("showUsernamePage");
266 void LocallyManagedUserCreationScreenHandler::ShowTutorialPage() {
267 CallJS("showTutorialPage");
270 void LocallyManagedUserCreationScreenHandler::ShowErrorPage(
271 const base::string16& title,
272 const base::string16& message,
273 const base::string16& button_text) {
274 CallJS("showErrorPage", title, message, button_text);
277 void LocallyManagedUserCreationScreenHandler::SetDelegate(Delegate* delegate) {
278 delegate_ = delegate;
281 void LocallyManagedUserCreationScreenHandler::
282 HandleFinishLocalManagedUserCreation() {
283 delegate_->FinishFlow();
286 void LocallyManagedUserCreationScreenHandler::
287 HandleAbortLocalManagedUserCreation() {
288 delegate_->AbortFlow();
291 void LocallyManagedUserCreationScreenHandler::HandleManagerSelected(
292 const std::string& manager_id) {
295 WallpaperManager::Get()->SetUserWallpaperNow(manager_id);
298 void LocallyManagedUserCreationScreenHandler::HandleImportUserSelected(
299 const std::string& user_id) {
304 void LocallyManagedUserCreationScreenHandler::HandleCheckLocallyManagedUserName(
305 const base::string16& name) {
307 if (NULL != UserManager::Get()->GetSupervisedUserManager()->
308 FindByDisplayName(base::CollapseWhitespace(name, true))) {
309 CallJS("managedUserNameError", name,
310 l10n_util::GetStringUTF16(
311 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_USERNAME_ALREADY_EXISTS));
312 } else if (net::EscapeForHTML(name) != name) {
313 CallJS("managedUserNameError", name,
314 l10n_util::GetStringUTF16(
315 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ILLEGAL_USERNAME));
316 } else if (delegate_ && delegate_->FindUserByDisplayName(
317 base::CollapseWhitespace(name, true), &user_id)) {
318 CallJS("managedUserSuggestImport", name, user_id);
320 CallJS("managedUserNameOk", name);
324 void LocallyManagedUserCreationScreenHandler::HandleCreateManagedUser(
325 const base::string16& new_raw_user_name,
326 const std::string& new_user_password) {
329 const base::string16 new_user_name =
330 base::CollapseWhitespace(new_raw_user_name, true);
331 if (NULL != UserManager::Get()->GetSupervisedUserManager()->
332 FindByDisplayName(new_user_name)) {
333 CallJS("managedUserNameError", new_user_name,
334 l10n_util::GetStringFUTF16(
335 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_USERNAME_ALREADY_EXISTS,
339 if (net::EscapeForHTML(new_user_name) != new_user_name) {
340 CallJS("managedUserNameError", new_user_name,
341 l10n_util::GetStringUTF16(
342 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ILLEGAL_USERNAME));
346 if (new_user_password.length() == 0) {
347 CallJS("showPasswordError",
348 l10n_util::GetStringUTF16(
349 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_TOO_SHORT));
353 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
354 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
356 delegate_->CreateManagedUser(new_user_name, new_user_password);
359 void LocallyManagedUserCreationScreenHandler::HandleImportSupervisedUser(
360 const std::string& user_id) {
364 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
365 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
367 delegate_->ImportManagedUser(user_id);
370 void LocallyManagedUserCreationScreenHandler::
371 HandleImportSupervisedUserWithPassword(
372 const std::string& user_id,
373 const std::string& password) {
377 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16(
378 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE));
380 delegate_->ImportManagedUserWithPassword(user_id, password);
383 void LocallyManagedUserCreationScreenHandler::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);
389 UserFlow* flow = new LocallyManagedUserCreationFlow(manager_username);
390 UserManager::Get()->SetUserFlow(manager_username, flow);
392 delegate_->AuthenticateManager(manager_username, manager_password);
395 // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
396 // It should be removed by issue 251179.
397 void LocallyManagedUserCreationScreenHandler::HandleGetImages() {
398 base::ListValue image_urls;
399 for (int i = kFirstDefaultImageIndex; i < kDefaultImagesCount; ++i) {
400 scoped_ptr<base::DictionaryValue> image_data(new base::DictionaryValue);
401 image_data->SetString("url", GetDefaultImageUrl(i));
402 image_data->SetString(
403 "author", l10n_util::GetStringUTF16(kDefaultImageAuthorIDs[i]));
404 image_data->SetString(
405 "website", l10n_util::GetStringUTF16(kDefaultImageWebsiteIDs[i]));
406 image_data->SetString("title", GetDefaultImageDescription(i));
407 image_urls.Append(image_data.release());
409 CallJS("setDefaultImages", image_urls);
412 void LocallyManagedUserCreationScreenHandler::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 LocallyManagedUserCreationScreenHandler::HandleTakePhoto() {
424 ash::PlaySystemSoundIfSpokenFeedback(SOUND_CAMERA_SNAP);
427 void LocallyManagedUserCreationScreenHandler::HandleDiscardPhoto() {
428 ash::PlaySystemSoundIfSpokenFeedback(SOUND_OBJECT_DELETE);
431 void LocallyManagedUserCreationScreenHandler::HandleSelectImage(
432 const std::string& image_url,
433 const std::string& image_type) {
435 delegate_->OnImageSelected(image_type, image_url);
438 void LocallyManagedUserCreationScreenHandler::HandleCurrentSupervisedUserPage(
439 const std::string& page) {
441 delegate_->OnPageSelected(page);
444 void LocallyManagedUserCreationScreenHandler::ShowPage(
445 const std::string& page) {
446 CallJS("showPage", page);
449 void LocallyManagedUserCreationScreenHandler::SetCameraPresent(bool present) {
450 CallJS("setCameraPresent", present);
453 void LocallyManagedUserCreationScreenHandler::ShowExistingManagedUsers(
454 const base::ListValue* users) {
455 CallJS("setExistingManagedUsers", *users);
458 } // namespace chromeos