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. 4 5 #include "chrome/browser/ui/webui/chromeos/login/locally_managed_user_creation_screen_handler.h" 6 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/user_manager.h" 11 #include "chrome/browser/chromeos/login/wallpaper_manager.h" 12 #include "chrome/browser/chromeos/settings/cros_settings.h" 13 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" 14 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" 15 #include "chrome/common/url_constants.h" 16 #include "google_apis/gaia/gaia_auth_util.h" 17 #include "grit/generated_resources.h" 18 #include "net/base/data_url.h" 19 #include "ui/base/l10n/l10n_util.h" 20 21 namespace { 22 23 const char kJsScreenPath[] = "login.LocallyManagedUserCreationScreen"; 24 25 // Locally managed user creation screen id. 26 const char kLocallyManagedUserCreationScreen[] = 27 "locally-managed-user-creation"; 28 29 } // namespace 30 31 namespace chromeos { 32 33 LocallyManagedUserCreationScreenHandler:: 34 LocallyManagedUserCreationScreenHandler() 35 : BaseScreenHandler(kJsScreenPath), 36 delegate_(NULL) { 37 } 38 39 LocallyManagedUserCreationScreenHandler:: 40 ~LocallyManagedUserCreationScreenHandler() {} 41 42 void LocallyManagedUserCreationScreenHandler::DeclareLocalizedValues( 43 LocalizedValuesBuilder* builder) { 44 builder->Add( 45 "managedUserCreationFlowRetryButtonTitle", 46 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_ERROR_RETRY_BUTTON_TITLE); 47 builder->Add( 48 "managedUserCreationFlowCancelButtonTitle", 49 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_ERROR_CANCEL_BUTTON_TITLE); 50 builder->Add( 51 "managedUserCreationFlowGotitButtonTitle", 52 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_GOT_IT_BUTTON_TITLE); 53 54 builder->Add("createManagedUserIntroTextTitle", 55 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_TITLE); 56 builder->Add("createManagedUserIntroAlternateText", 57 IDS_CREATE_LOCALLY_MANAGED_INTRO_ALTERNATE_TEXT); 58 builder->Add("createManagedUserIntroText1", 59 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_1); 60 builder->Add("createManagedUserIntroManagerItem1", 61 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_1); 62 builder->Add("createManagedUserIntroManagerItem2", 63 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_2); 64 builder->Add("createManagedUserIntroManagerItem3", 65 IDS_CREATE_LOCALLY_MANAGED_INTRO_MANAGER_ITEM_3); 66 builder->Add("createManagedUserIntroText2", 67 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_2); 68 builder->AddF("createManagedUserIntroText3", 69 IDS_CREATE_LOCALLY_MANAGED_INTRO_TEXT_3, 70 UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL)); 71 72 builder->Add("createManagedUserPickManagerTitle", 73 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PICK_MANAGER_TITLE); 74 builder->AddF("createManagedUserPickManagerTitleExplanation", 75 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PICK_MANAGER_EXPLANATION, 76 UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL)); 77 builder->Add("createManagedUserManagerPasswordHint", 78 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_MANAGER_PASSWORD_HINT); 79 builder->Add("createManagedUserWrongManagerPasswordText", 80 IDS_CREATE_LOCALLY_MANAGED_USER_MANAGER_PASSWORD_ERROR); 81 82 builder->Add("createManagedUserNameTitle", 83 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ACCOUNT_NAME_TITLE); 84 builder->Add("createManagedUserNameExplanation", 85 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_ACCOUNT_NAME_EXPLANATION); 86 builder->Add("createManagedUserPasswordTitle", 87 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_TITLE); 88 builder->Add("createManagedUserPasswordExplanation", 89 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_EXPLANATION); 90 builder->Add("createManagedUserPasswordHint", 91 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_HINT); 92 builder->Add("createManagedUserPasswordConfirmHint", 93 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_CONFIRM_HINT); 94 builder->Add("managedUserCreationFlowProceedButtonTitle", 95 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_CONTINUE_BUTTON_TEXT); 96 builder->Add("managedUserCreationFlowStartButtonTitle", 97 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_START_BUTTON_TEXT); 98 builder->Add("managedUserCreationFlowPrevButtonTitle", 99 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PREVIOUS_BUTTON_TEXT); 100 builder->Add("managedUserCreationFlowNextButtonTitle", 101 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_NEXT_BUTTON_TEXT); 102 builder->Add("managedUserCreationFlowHandleErrorButtonTitle", 103 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_HANDLE_ERROR_BUTTON_TEXT); 104 builder->Add("createManagedUserPasswordMismatchError", 105 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_MISMATCH_ERROR); 106 107 builder->Add("createManagedUserCreated1Text1", 108 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_1); 109 builder->Add("createManagedUserCreated1Text2", 110 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_2); 111 builder->Add("createManagedUserCreated1Text3", 112 IDS_CREATE_LOCALLY_MANAGED_USER_CREATED_1_TEXT_3); 113 114 builder->Add("managementURL", chrome::kSupervisedUserManagementDisplayURL); 115 116 // TODO(antrim) : this is an explicit code duplications with UserImageScreen. 117 // It should be removed by issue 251179. 118 builder->Add("takePhoto", IDS_OPTIONS_CHANGE_PICTURE_TAKE_PHOTO); 119 builder->Add("discardPhoto", IDS_OPTIONS_CHANGE_PICTURE_DISCARD_PHOTO); 120 builder->Add("flipPhoto", IDS_OPTIONS_CHANGE_PICTURE_FLIP_PHOTO); 121 } 122 123 void LocallyManagedUserCreationScreenHandler::Initialize() {} 124 125 void LocallyManagedUserCreationScreenHandler::RegisterMessages() { 126 AddCallback("finishLocalManagedUserCreation", 127 &LocallyManagedUserCreationScreenHandler:: 128 HandleFinishLocalManagedUserCreation); 129 AddCallback("abortLocalManagedUserCreation", 130 &LocallyManagedUserCreationScreenHandler:: 131 HandleAbortLocalManagedUserCreation); 132 AddCallback("checkLocallyManagedUserName", 133 &LocallyManagedUserCreationScreenHandler:: 134 HandleCheckLocallyManagedUserName); 135 AddCallback("authenticateManagerInLocallyManagedUserCreationFlow", 136 &LocallyManagedUserCreationScreenHandler:: 137 HandleAuthenticateManager); 138 AddCallback("specifyLocallyManagedUserCreationFlowUserData", 139 &LocallyManagedUserCreationScreenHandler:: 140 HandleCreateManagedUser); 141 AddCallback("managerSelectedOnLocallyManagedUserCreationFlow", 142 &LocallyManagedUserCreationScreenHandler:: 143 HandleManagerSelected); 144 145 // TODO(antrim) : this is an explicit code duplications with UserImageScreen. 146 // It should be removed by issue 251179. 147 AddCallback("supervisedUserGetImages", 148 &LocallyManagedUserCreationScreenHandler:: 149 HandleGetImages); 150 151 AddCallback("supervisedUserPhotoTaken", 152 &LocallyManagedUserCreationScreenHandler::HandlePhotoTaken); 153 AddCallback("supervisedUserSelectImage", 154 &LocallyManagedUserCreationScreenHandler::HandleSelectImage); 155 AddCallback("supervisedUserCheckCameraPresence", 156 &LocallyManagedUserCreationScreenHandler:: 157 HandleCheckCameraPresence); 158 } 159 160 void LocallyManagedUserCreationScreenHandler::PrepareToShow() {} 161 162 void LocallyManagedUserCreationScreenHandler::Show() { 163 scoped_ptr<DictionaryValue> data(new base::DictionaryValue()); 164 scoped_ptr<ListValue> users_list(new base::ListValue()); 165 const UserList& users = UserManager::Get()->GetUsers(); 166 std::string owner; 167 chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner); 168 169 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { 170 if ((*it)->GetType() != User::USER_TYPE_REGULAR) 171 continue; 172 bool is_owner = ((*it)->email() == owner); 173 DictionaryValue* user_dict = new DictionaryValue(); 174 SigninScreenHandler::FillUserDictionary(*it, is_owner, user_dict); 175 users_list->Append(user_dict); 176 } 177 data->Set("managers", users_list.release()); 178 ShowScreen(OobeUI::kScreenManagedUserCreationFlow, data.get()); 179 180 if (!delegate_) 181 return; 182 delegate_->CheckCameraPresence(); 183 } 184 185 void LocallyManagedUserCreationScreenHandler::Hide() {} 186 187 void LocallyManagedUserCreationScreenHandler::ShowIntroPage() { 188 CallJS("showIntroPage"); 189 } 190 191 void LocallyManagedUserCreationScreenHandler::ShowManagerPasswordError() { 192 CallJS("showManagerPasswordError"); 193 } 194 195 void LocallyManagedUserCreationScreenHandler::ShowStatusMessage( 196 bool is_progress, 197 const string16& message) { 198 if (is_progress) 199 CallJS("showProgress", message); 200 else 201 CallJS("showStatusError", message); 202 } 203 204 void LocallyManagedUserCreationScreenHandler::ShowUsernamePage() { 205 CallJS("showUsernamePage"); 206 } 207 208 void LocallyManagedUserCreationScreenHandler::ShowTutorialPage() { 209 CallJS("showTutorialPage"); 210 } 211 212 void LocallyManagedUserCreationScreenHandler::ShowErrorPage( 213 const string16& title, 214 const string16& message, 215 const string16& button_text) { 216 CallJS("showErrorPage", title, message, button_text); 217 } 218 219 void LocallyManagedUserCreationScreenHandler::SetDelegate(Delegate* delegate) { 220 delegate_ = delegate; 221 } 222 223 void LocallyManagedUserCreationScreenHandler:: 224 HandleFinishLocalManagedUserCreation() { 225 delegate_->FinishFlow(); 226 } 227 228 void LocallyManagedUserCreationScreenHandler:: 229 HandleAbortLocalManagedUserCreation() { 230 delegate_->AbortFlow(); 231 } 232 233 void LocallyManagedUserCreationScreenHandler::HandleManagerSelected( 234 const std::string& manager_id) { 235 if (!delegate_) 236 return; 237 WallpaperManager::Get()->SetUserWallpaper(manager_id); 238 } 239 240 void LocallyManagedUserCreationScreenHandler::HandleCheckLocallyManagedUserName( 241 const string16& name) { 242 if (NULL != UserManager::Get()-> 243 FindLocallyManagedUser(CollapseWhitespace(name, true))) { 244 CallJS("managedUserNameError", name, 245 l10n_util::GetStringUTF16( 246 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_USERNAME_ALREADY_EXISTS)); 247 } else { 248 CallJS("managedUserNameOk", name); 249 } 250 } 251 252 void LocallyManagedUserCreationScreenHandler::HandleCreateManagedUser( 253 const string16& new_raw_user_name, 254 const std::string& new_user_password) { 255 if (!delegate_) 256 return; 257 const string16 new_user_name = CollapseWhitespace(new_raw_user_name, true); 258 if (NULL != UserManager::Get()->FindLocallyManagedUser(new_user_name)) { 259 CallJS("managedUserNameError", new_user_name, 260 l10n_util::GetStringFUTF16( 261 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_USERNAME_ALREADY_EXISTS, 262 new_user_name)); 263 return; 264 } 265 266 // TODO(antrim): Any other password checks here? 267 if (new_user_password.length() == 0) { 268 CallJS("showPasswordError", 269 l10n_util::GetStringUTF16( 270 IDS_CREATE_LOCALLY_MANAGED_USER_CREATE_PASSWORD_TOO_SHORT)); 271 return; 272 } 273 274 ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16( 275 IDS_CREATE_LOCALLY_MANAGED_USER_CREATION_CREATION_PROGRESS_MESSAGE)); 276 277 delegate_->CreateManagedUser(new_user_name, new_user_password); 278 } 279 280 void LocallyManagedUserCreationScreenHandler::HandleAuthenticateManager( 281 const std::string& raw_manager_username, 282 const std::string& manager_password) { 283 const std::string manager_username = 284 gaia::SanitizeEmail(raw_manager_username); 285 286 UserFlow* flow = new LocallyManagedUserCreationFlow(manager_username); 287 UserManager::Get()->SetUserFlow(manager_username, flow); 288 289 delegate_->AuthenticateManager(manager_username, manager_password); 290 } 291 292 // TODO(antrim) : this is an explicit code duplications with UserImageScreen. 293 // It should be removed by issue 251179. 294 void LocallyManagedUserCreationScreenHandler::HandleGetImages() { 295 base::ListValue image_urls; 296 for (int i = kFirstDefaultImageIndex; i < kDefaultImagesCount; ++i) { 297 scoped_ptr<base::DictionaryValue> image_data(new base::DictionaryValue); 298 image_data->SetString("url", GetDefaultImageUrl(i)); 299 image_data->SetString( 300 "author", l10n_util::GetStringUTF16(kDefaultImageAuthorIDs[i])); 301 image_data->SetString( 302 "website", l10n_util::GetStringUTF16(kDefaultImageWebsiteIDs[i])); 303 image_data->SetString("title", GetDefaultImageDescription(i)); 304 image_urls.Append(image_data.release()); 305 } 306 CallJS("setDefaultImages", image_urls); 307 } 308 309 void LocallyManagedUserCreationScreenHandler::HandlePhotoTaken 310 (const std::string& image_url) { 311 std::string mime_type, charset, raw_data; 312 if (!net::DataURL::Parse(GURL(image_url), &mime_type, &charset, &raw_data)) 313 NOTREACHED(); 314 DCHECK_EQ("image/png", mime_type); 315 316 if (delegate_) 317 delegate_->OnPhotoTaken(raw_data); 318 } 319 320 void LocallyManagedUserCreationScreenHandler::HandleCheckCameraPresence() { 321 if (!delegate_) 322 return; 323 delegate_->CheckCameraPresence(); 324 } 325 326 void LocallyManagedUserCreationScreenHandler::HandleSelectImage( 327 const std::string& image_url, 328 const std::string& image_type) { 329 if (delegate_) 330 delegate_->OnImageSelected(image_type, image_url); 331 } 332 333 void LocallyManagedUserCreationScreenHandler::SetCameraPresent(bool present) { 334 CallJS("setCameraPresent", present); 335 } 336 337 } // namespace chromeos 338