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