Home | History | Annotate | Download | only in login
      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