15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/chromeos/accounts_options_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/ui_account_tweaks.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds specified user to the whitelist. Returns false if that user is already
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the whitelist.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WhitelistUser(const std::string& username) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (cros_settings->FindEmailInList(kAccountsPrefUsers, username, NULL))
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue username_value(username);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_settings->AppendToList(kAccountsPrefUsers, &username_value);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace options {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccountsOptionsHandler::AccountsOptionsHandler() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AccountsOptionsHandler::~AccountsOptionsHandler() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountsOptionsHandler::RegisterMessages() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("whitelistUser",
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&AccountsOptionsHandler::HandleWhitelistUser,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("unwhitelistUser",
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&AccountsOptionsHandler::HandleUnwhitelistUser,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("whitelistExistingUsers",
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&AccountsOptionsHandler::HandleWhitelistExistingUsers,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountsOptionsHandler::GetLocalizedValues(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* localized_strings) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(localized_strings);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "accountsPage",
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_OPTIONS_ACCOUNTS_TAB_LABEL);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("allow_BWSI", l10n_util::GetStringUTF16(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_OPTIONS_ACCOUNTS_ALLOW_BWSI_DESCRIPTION));
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  localized_strings->SetString(
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      "allow_supervised_users",
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_ACCOUNTS_ENABLE_SUPERVISED_USERS));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("use_whitelist", l10n_util::GetStringUTF16(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_OPTIONS_ACCOUNTS_USE_WHITELIST_DESCRIPTION));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("show_user_on_signin", l10n_util::GetStringUTF16(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_OPTIONS_ACCOUNTS_SHOW_USER_NAMES_ON_SINGIN_DESCRIPTION));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("username_edit_hint", l10n_util::GetStringUTF16(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_OPTIONS_ACCOUNTS_USERNAME_EDIT_HINT));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("username_format", l10n_util::GetStringUTF16(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_OPTIONS_ACCOUNTS_USERNAME_FORMAT));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("add_users", l10n_util::GetStringUTF16(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_OPTIONS_ACCOUNTS_ADD_USERS));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("owner_only", l10n_util::GetStringUTF16(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_OPTIONS_ACCOUNTS_OWNER_ONLY));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetBoolean("whitelist_is_managed",
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                connector->IsEnterpriseManaged());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddAccountUITweaksLocalizedValues(localized_strings,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    Profile::FromWebUI(web_ui()));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountsOptionsHandler::HandleWhitelistUser(const base::ListValue* args) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string typed_email;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &typed_email) ||
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(1, &name)) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WhitelistUser(gaia::CanonicalizeEmail(typed_email));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountsOptionsHandler::HandleUnwhitelistUser(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::ListValue* args) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string email;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &email)) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue canonical_email(gaia::CanonicalizeEmail(email));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings::Get()->RemoveFromList(kAccountsPrefUsers, &canonical_email);
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager::Get()->RemoveUser(email, NULL);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AccountsOptionsHandler::HandleWhitelistExistingUsers(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::ListValue* args) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(args && args->empty());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates one list to set. This is needed because user white list update is
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // asynchronous and sequential. Before previous write comes back, cached list
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is stale and should not be used for appending. See http://crbug.com/127215
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::ListValue> new_list;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::ListValue* existing = NULL;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cros_settings->GetList(kAccountsPrefUsers, &existing) && existing)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_list.reset(existing->DeepCopy());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_list.reset(new base::ListValue);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const user_manager::UserList& users =
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetUsers();
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (user_manager::UserList::const_iterator it = users.begin();
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       it < users.end();
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ++it)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_list->AppendIfNotPresent(new base::StringValue((*it)->email()));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_settings->Set(kAccountsPrefUsers, *new_list.get());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace options
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
150