device_settings_provider.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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/chromeos/settings/device_settings_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_cache.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_constants.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/options/options_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_settings.h"
26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/device_state.h"
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/network_device_handler.h"
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/network_event_log.h"
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/network_handler.h"
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/network/shill_property_util.h"
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using google::protobuf::RepeatedField;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using google::protobuf::RepeatedPtrField;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace em = enterprise_management;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// List of settings handled by the DeviceSettingsProvider.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kKnownSettings[] = {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefAllowGuest,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefAllowNewUser,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccounts,
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginDelay,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginId,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefEphemeralUsersEnabled,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefShowUserNamesOnSignIn,
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  kAccountsPrefSupervisedUsersEnabled,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefUsers,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAllowRedeemChromeOsRegistrationOffers,
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  kAllowedConnectionTypesForUpdate,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAppPack,
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kAttestationForContentProtectionEnabled,
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kDeviceAttestationEnabled,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kDeviceOwner,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kIdleLogoutTimeout,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kIdleLogoutWarningDuration,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kPolicyMissingMitigationMode,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReleaseChannel,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReleaseChannelDelegated,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceActivityTimes,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceBootMode,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceLocation,
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  kReportDeviceNetworkInterfaces,
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  kReportDeviceUsers,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceVersionInfo,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kScreenSaverExtensionId,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kScreenSaverTimeout,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSignedDataRoamingEnabled,
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kStartUpFlags,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kStartUpUrls,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kStatsReportingPref,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSystemTimezonePolicy,
81bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  kSystemUse24HourClock,
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  kUpdateDisabled,
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kVariationsRestrictParameter,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasOldMetricsFile() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once migration is not needed anymore.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the value is not set we should try to migrate legacy consent file.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loading consent file state causes us to do blocking IO on UI thread.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily allow it until we fix http://crbug.com/62626
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowIO allow_io;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GoogleUpdateSettings::GetCollectStatsConsent();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LogShillError(
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const std::string& name,
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> error_data) {
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  NET_LOG_ERROR("Shill error: " + name, "Network operation failed.");
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::DeviceSettingsProvider(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NotifyObserversCallback& notify_cb,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeviceSettingsService* device_settings_service)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : CrosSettingsProvider(notify_cb),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings_service_(device_settings_service),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_(TEMPORARILY_UNTRUSTED),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ownership_status_(device_settings_service_->GetOwnershipStatus()),
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      store_callback_factory_(this) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_service_->AddObserver(this);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!UpdateFromService()) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we have at least the cache data immediately.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RetrieveCachedData();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::~DeviceSettingsProvider() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_service_->RemoveObserver(this);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeviceSettingsProvider::IsDeviceSetting(const std::string& name) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char** end = kKnownSettings + arraysize(kKnownSettings);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::find(kKnownSettings, end, name) != end;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DoSet(const std::string& path,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::Value& in_value) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that either the current user is the device owner or the
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // device doesn't have an owner yet.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!(device_settings_service_->HasPrivateOwnerKey() ||
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Changing settings from non-owner, setting=" << path;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Revert UI change.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyObservers(path);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsDeviceSetting(path)) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_changes_.push_back(PendingQueueElement(path, in_value.DeepCopy()));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!store_callback_factory_.HasWeakPtrs())
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetInPolicy();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Try to set unhandled cros setting " << path;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::OwnershipStatusChanged() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeviceSettingsService::OwnershipStatus new_ownership_status =
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings_service_->GetOwnershipStatus();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the device just became owned, write the settings accumulated in the
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cache to device settings proper. It is important that writing only happens
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in this case, as during normal operation, the contents of the cache should
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // never overwrite actual device settings.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_ownership_status == DeviceSettingsService::OWNERSHIP_TAKEN &&
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE &&
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings_service_->HasPrivateOwnerKey()) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There shouldn't be any pending writes, since the cache writes are all
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // immediate.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!store_callback_factory_.HasWeakPtrs());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Apply the locally-accumulated device settings on top of the initial
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // settings from the service and write back the result.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (device_settings_service_->device_settings()) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      em::ChromeDeviceSettingsProto new_settings(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *device_settings_service_->device_settings());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_settings.MergeFrom(device_settings_);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings_.Swap(&new_settings);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StoreDeviceSettings();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The owner key might have become available, allowing migration to happen.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AttemptMigration();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ownership_status_ = new_ownership_status;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DeviceSettingsUpdated() {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!store_callback_factory_.HasWeakPtrs())
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateAndProceedStoring();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::RetrieveCachedData() {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  em::PolicyData policy_data;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!device_settings_cache::Retrieve(&policy_data,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       g_browser_process->local_state()) ||
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !device_settings_.ParseFromString(policy_data.policy_value())) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "Can't retrieve temp store, possibly not created yet.";
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateValuesCache(policy_data, device_settings_, trusted_status_);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::SetInPolicy() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_changes_.empty()) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (RequestTrustedEntity() != TRUSTED) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Re-sync device settings before proceeding.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_settings_service_->Load();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string prop(pending_changes_.front().first);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> value(pending_changes_.front().second);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_changes_.pop_front();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trusted_status_ = TEMPORARILY_UNTRUSTED;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prop == kAccountsPrefAllowNewUser) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::AllowNewUsersProto* allow =
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_allow_new_users();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool allow_value;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&allow_value))
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allow->set_allow_new_users(allow_value);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefAllowGuest) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::GuestModeEnabledProto* guest =
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_guest_mode_enabled();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool guest_value;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&guest_value))
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      guest->set_guest_mode_enabled(guest_value);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefShowUserNamesOnSignIn) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::ShowUserNamesOnSigninProto* show =
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_show_user_names();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool show_value;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&show_value))
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show->set_show_user_names(show_value);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccounts) {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    device_local_accounts->clear_account();
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::ListValue* accounts_list = NULL;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&accounts_list)) {
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator entry(accounts_list->begin());
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           entry != accounts_list->end(); ++entry) {
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const base::DictionaryValue* entry_dict = NULL;
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if ((*entry)->GetAsDictionary(&entry_dict)) {
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          em::DeviceLocalAccountInfoProto* account =
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              device_local_accounts->add_account();
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string account_id;
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetStringWithoutPathExpansion(
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyId, &account_id)) {
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->set_account_id(account_id);
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          int type;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetIntegerWithoutPathExpansion(
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyType, &type)) {
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->set_type(
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                static_cast<em::DeviceLocalAccountInfoProto::AccountType>(
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    type));
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string kiosk_app_id;
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetStringWithoutPathExpansion(
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  &kiosk_app_id)) {
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->mutable_kiosk_app()->set_app_id(kiosk_app_id);
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        } else {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NOTREACHED();
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginId) {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string id;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsString(&id))
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_local_accounts->set_auto_login_id(id);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginDelay) {
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int delay;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsInteger(&delay))
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_local_accounts->set_auto_login_delay(delay);
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled) {
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool enabled;
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (value->GetAsBoolean(&enabled))
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      device_local_accounts->set_enable_auto_login_bailout(enabled);
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kSignedDataRoamingEnabled) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::DataRoamingEnabledProto* roam =
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_data_roaming_enabled();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool roaming_value = false;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&roaming_value))
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      roam->set_data_roaming_enabled(roaming_value);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyRoamingSetting(roaming_value);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kReleaseChannel) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::ReleaseChannelProto* release_channel =
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_release_channel();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string channel_value;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsString(&channel_value))
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      release_channel->set_release_channel(channel_value);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kStatsReportingPref) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::MetricsEnabledProto* metrics =
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_metrics_enabled();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool metrics_value = false;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&metrics_value))
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      metrics->set_metrics_enabled(metrics_value);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(false, metrics_value);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefUsers) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::UserWhitelistProto* whitelist_proto =
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_user_whitelist();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    whitelist_proto->clear_user_whitelist();
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::ListValue* users;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&users)) {
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator i = users->begin();
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i != users->end(); ++i) {
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string email;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if ((*i)->GetAsString(&email))
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          whitelist_proto->add_user_whitelist(email);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefEphemeralUsersEnabled) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::EphemeralUsersEnabledProto* ephemeral_users_enabled =
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_ephemeral_users_enabled();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ephemeral_users_enabled_value = false;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&ephemeral_users_enabled_value)) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ephemeral_users_enabled->set_ephemeral_users_enabled(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ephemeral_users_enabled_value);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAllowRedeemChromeOsRegistrationOffers) {
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::AllowRedeemChromeOsRegistrationOffersProto* allow_redeem_offers =
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_allow_redeem_offers();
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool allow_redeem_offers_value;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsBoolean(&allow_redeem_offers_value)) {
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      allow_redeem_offers->set_allow_redeem_offers(
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          allow_redeem_offers_value);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kStartUpFlags) {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::StartUpFlagsProto* flags_proto =
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_start_up_flags();
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    flags_proto->Clear();
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::ListValue* flags;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&flags)) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator i = flags->begin();
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i != flags->end(); ++i) {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string flag;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if ((*i)->GetAsString(&flag))
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          flags_proto->add_flags(flag);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
373bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  } else if (prop == kSystemUse24HourClock) {
374bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    em::SystemUse24HourClockProto* use_24hour_clock_proto =
375bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        device_settings_.mutable_use_24hour_clock();
376bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    use_24hour_clock_proto->Clear();
377bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    bool use_24hour_clock_value;
378bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (value->GetAsBoolean(&use_24hour_clock_value)) {
379bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      use_24hour_clock_proto->set_use_24hour_clock(use_24hour_clock_value);
380bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    } else {
381bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      NOTREACHED();
382bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    }
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (prop == kAttestationForContentProtectionEnabled) {
3843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    em::AttestationSettingsProto* attestation_settings =
3853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        device_settings_.mutable_attestation_settings();
3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool setting_enabled;
3873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (value->GetAsBoolean(&setting_enabled)) {
3883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      attestation_settings->set_content_protection_enabled(setting_enabled);
3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    } else {
3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      NOTREACHED();
3913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The remaining settings don't support Set(), since they are not
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // intended to be customizable by the user:
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    //   kAccountsPrefSupervisedUsersEnabled
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kAppPack
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //   kDeviceAttestationEnabled
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kDeviceOwner
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kIdleLogoutTimeout
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kIdleLogoutWarningDuration
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReleaseChannelDelegated
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceActivityTimes
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceBootMode
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceLocation
405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    //   kReportDeviceVersionInfo
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    //   kReportDeviceNetworkInterfaces
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    //   kReportDeviceUsers
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kScreenSaverExtensionId
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kScreenSaverTimeout
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kStartUpUrls
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kSystemTimezonePolicy
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //   kVariationsRestrictParameter
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(FATAL) << "Device setting " << prop << " is read-only.";
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  em::PolicyData data;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.set_username(device_settings_service_->GetUsername());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(device_settings_.SerializeToString(data.mutable_policy_value()));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the cache to the updated value.
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateValuesCache(data, device_settings_, trusted_status_);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ownership_status_ == DeviceSettingsService::OWNERSHIP_TAKEN) {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StoreDeviceSettings();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!device_settings_cache::Store(data, g_browser_process->local_state()))
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LOG(ERROR) << "Couldn't store to the temp storage.";
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // OnStorePolicyCompleted won't get called in this case so proceed with any
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pending operations immediately.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pending_changes_.empty())
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetInPolicy();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeLoginPolicies(
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For all our boolean settings the following is applicable:
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true is default permissive value and false is safe prohibitive value.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exceptions:
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   kSignedDataRoamingEnabled has a default value of false.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   kAccountsPrefEphemeralUsersEnabled has a default value of false.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_allow_new_users() &&
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      policy.allow_new_users().has_allow_new_users()) {
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (policy.allow_new_users().allow_new_users()) {
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // New users allowed, user whitelist ignored.
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_values_cache->SetBoolean(kAccountsPrefAllowNewUser, true);
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // New users not allowed, enforce user whitelist if present.
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_values_cache->SetBoolean(kAccountsPrefAllowNewUser,
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   !policy.has_user_whitelist());
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // No configured allow-new-users value, enforce whitelist if non-empty.
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new_values_cache->SetBoolean(
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kAccountsPrefAllowNewUser,
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        policy.user_whitelist().user_whitelist_size() == 0);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccountsPrefAllowGuest,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.has_guest_mode_enabled() ||
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.guest_mode_enabled().has_guest_mode_enabled() ||
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.guest_mode_enabled().guest_mode_enabled());
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccountsPrefShowUserNamesOnSignIn,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.has_show_user_names() ||
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.show_user_names().has_show_user_names() ||
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.show_user_names().show_user_names());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccountsPrefEphemeralUsersEnabled,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.has_ephemeral_users_enabled() &&
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.ephemeral_users_enabled().has_ephemeral_users_enabled() &&
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.ephemeral_users_enabled().ephemeral_users_enabled());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  new_values_cache->SetBoolean(
481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kAccountsPrefSupervisedUsersEnabled,
482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      policy.has_supervised_users_settings() &&
483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      policy.supervised_users_settings().supervised_users_enabled());
484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* list = new base::ListValue();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const em::UserWhitelistProto& whitelist_proto = policy.user_whitelist();
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const RepeatedPtrField<std::string>& whitelist =
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      whitelist_proto.user_whitelist();
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != whitelist.end(); ++it) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    list->Append(new base::StringValue(*it));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetValue(kAccountsPrefUsers, list);
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::ListValue> account_list(new base::ListValue());
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!command_line->HasSwitch(switches::kDisableLocalAccounts)) {
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const em::DeviceLocalAccountsProto device_local_accounts_proto =
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        policy.device_local_accounts();
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RepeatedPtrField<em::DeviceLocalAccountInfoProto>& accounts =
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_local_accounts_proto.account();
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RepeatedPtrField<em::DeviceLocalAccountInfoProto>::const_iterator entry;
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (entry = accounts.begin(); entry != accounts.end(); ++entry) {
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<base::DictionaryValue> entry_dict(new base::DictionaryValue());
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (entry->has_type()) {
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (entry->has_account_id()) {
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          entry_dict->SetStringWithoutPathExpansion(
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              kAccountsPrefDeviceLocalAccountsKeyId, entry->account_id());
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry_dict->SetIntegerWithoutPathExpansion(
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            kAccountsPrefDeviceLocalAccountsKeyType, entry->type());
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (entry->kiosk_app().has_app_id()) {
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          entry_dict->SetStringWithoutPathExpansion(
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              entry->kiosk_app().app_id());
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
517b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      } else if (entry->has_deprecated_public_session_id()) {
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Deprecated public session specification.
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry_dict->SetStringWithoutPathExpansion(
520b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            kAccountsPrefDeviceLocalAccountsKeyId,
521b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            entry->deprecated_public_session_id());
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry_dict->SetIntegerWithoutPathExpansion(
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            kAccountsPrefDeviceLocalAccountsKeyType,
52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION);
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      account_list->Append(entry_dict.release());
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  new_values_cache->SetValue(kAccountsPrefDeviceLocalAccounts,
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             account_list.release());
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (policy.has_device_local_accounts()) {
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (policy.device_local_accounts().has_auto_login_id()) {
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_values_cache->SetString(
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          kAccountsPrefDeviceLocalAccountAutoLoginId,
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          policy.device_local_accounts().auto_login_id());
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (policy.device_local_accounts().has_auto_login_delay()) {
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_values_cache->SetInteger(
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          kAccountsPrefDeviceLocalAccountAutoLoginDelay,
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          policy.device_local_accounts().auto_login_delay());
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  new_values_cache->SetBoolean(
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      policy.device_local_accounts().enable_auto_login_bailout());
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (policy.has_start_up_flags()) {
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::ListValue* list = new base::ListValue();
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const em::StartUpFlagsProto& flags_proto = policy.start_up_flags();
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const RepeatedPtrField<std::string>& flags = flags_proto.flags();
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (RepeatedPtrField<std::string>::const_iterator it = flags.begin();
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         it != flags.end(); ++it) {
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      list->Append(new base::StringValue(*it));
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new_values_cache->SetValue(kStartUpFlags, list);
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeKioskPolicies(
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_forced_logout_timeouts()) {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.forced_logout_timeouts().has_idle_logout_timeout()) {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetInteger(
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kIdleLogoutTimeout,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.forced_logout_timeouts().idle_logout_timeout());
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.forced_logout_timeouts().has_idle_logout_warning_duration()) {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetInteger(
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kIdleLogoutWarningDuration,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.forced_logout_timeouts().idle_logout_warning_duration());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_login_screen_saver()) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.login_screen_saver().has_screen_saver_timeout()) {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetInteger(
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kScreenSaverTimeout,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.login_screen_saver().screen_saver_timeout());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.login_screen_saver().has_screen_saver_extension_id()) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetString(
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kScreenSaverExtensionId,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.login_screen_saver().screen_saver_extension_id());
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_app_pack()) {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef RepeatedPtrField<em::AppPackEntryProto> proto_type;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* list = new base::ListValue;
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const proto_type& app_pack = policy.app_pack().app_pack();
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (proto_type::const_iterator it = app_pack.begin();
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != app_pack.end(); ++it) {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::DictionaryValue* entry = new base::DictionaryValue;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it->has_extension_id()) {
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry->SetStringWithoutPathExpansion(kAppPackKeyExtensionId,
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                             it->extension_id());
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (it->has_update_url()) {
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry->SetStringWithoutPathExpansion(kAppPackKeyUpdateUrl,
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                             it->update_url());
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append(entry);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetValue(kAppPack, list);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_start_up_urls()) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* list = new base::ListValue();
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::StartUpUrlsProto& urls_proto = policy.start_up_urls();
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const RepeatedPtrField<std::string>& urls = urls_proto.start_up_urls();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (RepeatedPtrField<std::string>::const_iterator it = urls.begin();
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != urls.end(); ++it) {
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      list->Append(new base::StringValue(*it));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetValue(kStartUpUrls, list);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeNetworkPolicies(
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSignedDataRoamingEnabled,
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.has_data_roaming_enabled() &&
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.data_roaming_enabled().has_data_roaming_enabled() &&
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.data_roaming_enabled().data_roaming_enabled());
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void DeviceSettingsProvider::DecodeAutoUpdatePolicies(
635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
6377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (policy.has_auto_update_settings()) {
6387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const em::AutoUpdateSettingsProto& au_settings_proto =
6397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        policy.auto_update_settings();
6407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (au_settings_proto.has_update_disabled()) {
6417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new_values_cache->SetBoolean(kUpdateDisabled,
6427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   au_settings_proto.update_disabled());
6437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
6447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const RepeatedField<int>& allowed_connection_types =
6457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        au_settings_proto.allowed_connection_types();
6467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::ListValue* list = new base::ListValue();
6477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for (RepeatedField<int>::const_iterator i(allowed_connection_types.begin());
6487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch         i != allowed_connection_types.end(); ++i) {
6497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      list->Append(new base::FundamentalValue(*i));
6507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
6517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    new_values_cache->SetValue(kAllowedConnectionTypesForUpdate, list);
652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeReportingPolicies(
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_device_reporting()) {
6597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const em::DeviceReportingProto& reporting_policy =
6607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        policy.device_reporting();
6617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (reporting_policy.has_report_version_info()) {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetBoolean(
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kReportDeviceVersionInfo,
6647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          reporting_policy.report_version_info());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (reporting_policy.has_report_activity_times()) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetBoolean(
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kReportDeviceActivityTimes,
6697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          reporting_policy.report_activity_times());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (reporting_policy.has_report_boot_mode()) {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetBoolean(
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kReportDeviceBootMode,
6747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          reporting_policy.report_boot_mode());
6757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
6767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (reporting_policy.has_report_network_interfaces()) {
6777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new_values_cache->SetBoolean(
6787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          kReportDeviceNetworkInterfaces,
6797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          reporting_policy.report_network_interfaces());
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (reporting_policy.has_report_users()) {
6821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new_values_cache->SetBoolean(
6831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          kReportDeviceUsers,
6841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          reporting_policy.report_users());
6851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeGenericPolicies(
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_metrics_enabled()) {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetBoolean(kStatsReportingPref,
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 policy.metrics_enabled().metrics_enabled());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetBoolean(kStatsReportingPref, HasOldMetricsFile());
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!policy.has_release_channel() ||
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.release_channel().has_release_channel()) {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default to an invalid channel (will be ignored).
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetString(kReleaseChannel, "");
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetString(kReleaseChannel,
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                policy.release_channel().release_channel());
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kReleaseChannelDelegated,
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.has_release_channel() &&
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.release_channel().has_release_channel_delegated() &&
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.release_channel().release_channel_delegated());
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_system_timezone()) {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.system_timezone().has_timezone()) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetString(
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kSystemTimezonePolicy,
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.system_timezone().timezone());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (policy.has_use_24hour_clock()) {
723bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (policy.use_24hour_clock().has_use_24hour_clock()) {
724bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      new_values_cache->SetBoolean(
725bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch          kSystemUse24HourClock, policy.use_24hour_clock().use_24hour_clock());
726bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    }
727bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  }
728bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (policy.has_allow_redeem_offers()) {
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_values_cache->SetBoolean(
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kAllowRedeemChromeOsRegistrationOffers,
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        policy.allow_redeem_offers().allow_redeem_offers());
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_values_cache->SetBoolean(
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kAllowRedeemChromeOsRegistrationOffers,
736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        true);
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (policy.has_variations_parameter()) {
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new_values_cache->SetString(
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kVariationsRestrictParameter,
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        policy.variations_parameter().parameter());
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  new_values_cache->SetBoolean(
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDeviceAttestationEnabled,
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      policy.attestation_settings().attestation_enabled());
7483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (policy.has_attestation_settings() &&
7504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      policy.attestation_settings().has_content_protection_enabled()) {
7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    new_values_cache->SetBoolean(
7524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        kAttestationForContentProtectionEnabled,
7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        policy.attestation_settings().content_protection_enabled());
7544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
7554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    new_values_cache->SetBoolean(kAttestationForContentProtectionEnabled, true);
7564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::UpdateValuesCache(
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::PolicyData& policy_data,
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const em::ChromeDeviceSettingsProto& settings,
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TrustedStatus trusted_status) {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefValueMap new_values_cache;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy_data.has_username() && !policy_data.has_request_token())
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache.SetString(kDeviceOwner, policy_data.username());
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeLoginPolicies(settings, &new_values_cache);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeKioskPolicies(settings, &new_values_cache);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeNetworkPolicies(settings, &new_values_cache);
771868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DecodeAutoUpdatePolicies(settings, &new_values_cache);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeReportingPolicies(settings, &new_values_cache);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeGenericPolicies(settings, &new_values_cache);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collect all notifications but send them only after we have swapped the
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cache so that if somebody actually reads the cache will be already valid.
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> notifications;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Go through the new values and verify in the old ones.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefValueMap::iterator iter = new_values_cache.begin();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; iter != new_values_cache.end(); ++iter) {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* old_value;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!values_cache_.GetValue(iter->first, &old_value) ||
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !old_value->Equals(iter->second)) {
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications.push_back(iter->first);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now check for values that have been removed from the policy blob.
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iter = values_cache_.begin(); iter != values_cache_.end(); ++iter) {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* value;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!new_values_cache.GetValue(iter->first, &value))
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications.push_back(iter->first);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Swap and notify.
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values_cache_.Swap(&new_values_cache);
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  trusted_status_ = trusted_status;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < notifications.size(); ++i)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyObservers(notifications[i]);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::ApplyMetricsSetting(bool use_file,
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 bool new_value) {
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once migration is not needed anymore.
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the value is not set we should try to migrate legacy consent file.
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_file) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_value = HasOldMetricsFile();
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the values will get eventually written to the policy file.
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    migration_values_.SetValue(kStatsReportingPref,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               base::Value::CreateBooleanValue(new_value));
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AttemptMigration();
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "No metrics policy set will revert to checking "
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << "consent file which is "
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << (new_value ? "on." : "off.");
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("DeviceSettings.MetricsMigrated", 1);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Metrics policy is being set to : " << new_value
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "(use file : " << use_file << ")";
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once we don't need to regenerate the
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // consent file for the GUID anymore.
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OptionsUtil::ResolveMetricsReportingEnabled(new_value);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::ApplyRoamingSetting(bool new_value) {
823a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(armansito): Look up the device by explicitly using the device path.
824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const DeviceState* cellular =
82558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NetworkHandler::Get()->network_state_handler()->GetDeviceStateByType(
82658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          NetworkTypePattern::Cellular());
827a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!cellular) {
828a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    NET_LOG_DEBUG("No cellular device is available",
829a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                  "Roaming is only supported by cellular devices.");
830a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
832a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool current_value;
833a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!cellular->properties().GetBooleanWithoutPathExpansion(
83468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          shill::kCellularAllowRoamingProperty, &current_value)) {
835a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    NET_LOG_ERROR("Could not get \"allow roaming\" property from cellular "
836a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                  "device.", cellular->path());
837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
840a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Only set the value if the current value is different from |new_value|.
841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // If roaming is required by the provider, always try to set to true.
842a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  new_value = (cellular->provider_requires_roaming() ? true : new_value);
843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (new_value == current_value)
844a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
845a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  NetworkHandler::Get()->network_device_handler()->SetDeviceProperty(
847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cellular->path(),
84868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      shill::kCellularAllowRoamingProperty,
849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::FundamentalValue(new_value),
850a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&base::DoNothing),
851a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&LogShillError));
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::ApplySideEffects(
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& settings) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First migrate metrics settings as needed.
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.has_metrics_enabled())
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(false, settings.metrics_enabled().metrics_enabled());
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(true, false);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Next set the roaming setting as needed.
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ApplyRoamingSetting(
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings.has_data_roaming_enabled() ?
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          settings.data_roaming_enabled().data_roaming_enabled() :
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::MitigateMissingPolicy() {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First check if the device has been owned already and if not exit
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately.
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (g_browser_process->browser_policy_connector()->GetDeviceMode() !=
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy::DEVICE_MODE_CONSUMER) {
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are here the policy file were corrupted or missing. This can happen
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because we are migrating Pre R11 device to the new secure policies or there
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was an attempt to circumvent policy system. In this case we should populate
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the policy cache with "safe-mode" defaults which should allow the owner to
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // log in but lock the device for anyone else until the policy blob has been
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recreated by the session manager.
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "Corruption of the policy data has been detected."
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "Switching to \"safe-mode\" policies until the owner logs in "
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "to regenerate the policy data.";
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.Clear();
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.mutable_allow_new_users()->set_allow_new_users(true);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.mutable_guest_mode_enabled()->set_guest_mode_enabled(true);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  em::PolicyData empty_policy_data;
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateValuesCache(empty_policy_data, device_settings_, TRUSTED);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values_cache_.SetBoolean(kPolicyMissingMitigationMode, true);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::Value* DeviceSettingsProvider::Get(const std::string& path) const {
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsDeviceSetting(path)) {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* value;
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (values_cache_.GetValue(path, &value))
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value;
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Trying to get non cros setting.";
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::TrustedStatus
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeviceSettingsProvider::PrepareTrustedValues(const base::Closure& cb) {
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrustedStatus status = RequestTrustedEntity();
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == TEMPORARILY_UNTRUSTED && !cb.is_null())
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks_.push_back(cb);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::HandlesSetting(const std::string& path) const {
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsDeviceSetting(path);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::TrustedStatus
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeviceSettingsProvider::RequestTrustedEntity() {
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRUSTED;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return trusted_status_;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::UpdateAndProceedStoring() {
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-sync the cache from the service.
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateFromService();
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trigger the next change if necessary.
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (trusted_status_ == TRUSTED && !pending_changes_.empty())
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInPolicy();
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::UpdateFromService() {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool settings_loaded = false;
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (device_settings_service_->status()) {
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_SUCCESS: {
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const em::PolicyData* policy_data =
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          device_settings_service_->policy_data();
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const em::ChromeDeviceSettingsProto* device_settings =
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          device_settings_service_->device_settings();
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (policy_data && device_settings) {
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!device_settings_cache::Store(*policy_data,
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          g_browser_process->local_state())) {
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          LOG(ERROR) << "Couldn't update the local state cache.";
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        UpdateValuesCache(*policy_data, *device_settings, TRUSTED);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_ = *device_settings;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(pastarmovj): Make those side effects responsibility of the
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // respective subsystems.
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ApplySideEffects(*device_settings);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings_loaded = true;
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Initial policy load is still pending.
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        trusted_status_ = TEMPORARILY_UNTRUSTED;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_NO_POLICY:
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (MitigateMissingPolicy())
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // fall through.
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_KEY_UNAVAILABLE:
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "No policies present yet, will use the temp storage.";
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_POLICY_ERROR:
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_VALIDATION_ERROR:
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_INVALID_POLICY:
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_OPERATION_FAILED:
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to retrieve cros policies. Reason: "
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << device_settings_service_->status();
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR:
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The policy has failed to validate due to temporary error but it might
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // take a long time until we recover so behave as it is a permanent error.
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to retrieve cros policies because a temporary "
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "validation error has occurred. Retrying might succeed.";
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the observers we are done.
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<base::Closure> callbacks;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callbacks.swap(callbacks_);
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < callbacks.size(); ++i)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks[i].Run();
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return settings_loaded;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::StoreDeviceSettings() {
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mute all previous callbacks to guarantee the |pending_changes_| queue is
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // processed serially.
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_callback_factory_.InvalidateWeakPtrs();
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_service_->SignAndStore(
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<em::ChromeDeviceSettingsProto>(
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new em::ChromeDeviceSettingsProto(device_settings_)),
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DeviceSettingsProvider::UpdateAndProceedStoring,
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 store_callback_factory_.GetWeakPtr()));
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::AttemptMigration() {
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (device_settings_service_->HasPrivateOwnerKey()) {
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap::const_iterator i;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = migration_values_.begin(); i != migration_values_.end(); ++i)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DoSet(i->first, *i->second);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    migration_values_.Clear();
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1020