device_settings_provider.cc revision 3551c9c881056c480085172ff9840cab31610854
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/cros_settings_names.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_cache.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_constants.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/options/options_util.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_settings.h"
27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/device_state.h"
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/network_device_handler.h"
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/network_event_log.h"
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/network_handler.h"
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using google::protobuf::RepeatedField;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using google::protobuf::RepeatedPtrField;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace em = enterprise_management;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// List of settings handled by the DeviceSettingsProvider.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kKnownSettings[] = {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefAllowGuest,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefAllowNewUser,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccounts,
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginDelay,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginId,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefEphemeralUsersEnabled,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefShowUserNamesOnSignIn,
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  kAccountsPrefSupervisedUsersEnabled,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefUsers,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAllowRedeemChromeOsRegistrationOffers,
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  kAllowedConnectionTypesForUpdate,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAppPack,
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kAttestationForContentProtectionEnabled,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kDeviceAttestationEnabled,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kDeviceOwner,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kIdleLogoutTimeout,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kIdleLogoutWarningDuration,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kPolicyMissingMitigationMode,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReleaseChannel,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReleaseChannelDelegated,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceActivityTimes,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceBootMode,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceLocation,
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  kReportDeviceNetworkInterfaces,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceVersionInfo,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kScreenSaverExtensionId,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kScreenSaverTimeout,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSignedDataRoamingEnabled,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kStartUpFlags,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kStartUpUrls,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kStatsReportingPref,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSystemTimezonePolicy,
79bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  kSystemUse24HourClock,
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  kUpdateDisabled,
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kVariationsRestrictParameter,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Legacy policy file location. Used to detect migration from pre v12 ChromeOS.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLegacyPolicyFile[] = "/var/lib/whitelist/preferences";
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasOldMetricsFile() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once migration is not needed anymore.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the value is not set we should try to migrate legacy consent file.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loading consent file state causes us to do blocking IO on UI thread.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily allow it until we fix http://crbug.com/62626
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowIO allow_io;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GoogleUpdateSettings::GetCollectStatsConsent();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void LogShillError(
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const std::string& name,
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> error_data) {
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  NET_LOG_ERROR("Shill error: " + name, "Network operation failed.");
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::DeviceSettingsProvider(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NotifyObserversCallback& notify_cb,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeviceSettingsService* device_settings_service)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : CrosSettingsProvider(notify_cb),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings_service_(device_settings_service),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_(TEMPORARILY_UNTRUSTED),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ownership_status_(device_settings_service_->GetOwnershipStatus()),
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      store_callback_factory_(this) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_service_->AddObserver(this);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!UpdateFromService()) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we have at least the cache data immediately.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RetrieveCachedData();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::~DeviceSettingsProvider() {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_service_->RemoveObserver(this);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DeviceSettingsProvider::IsDeviceSetting(const std::string& name) {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char** end = kKnownSettings + arraysize(kKnownSettings);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::find(kKnownSettings, end, name) != end;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DoSet(const std::string& path,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::Value& in_value) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that either the current user is the device owner or the
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // device doesn't have an owner yet.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!(device_settings_service_->HasPrivateOwnerKey() ||
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Changing settings from non-owner, setting=" << path;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Revert UI change.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyObservers(path);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsDeviceSetting(path)) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_changes_.push_back(PendingQueueElement(path, in_value.DeepCopy()));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!store_callback_factory_.HasWeakPtrs())
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetInPolicy();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Try to set unhandled cros setting " << path;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::OwnershipStatusChanged() {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeviceSettingsService::OwnershipStatus new_ownership_status =
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings_service_->GetOwnershipStatus();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the device just became owned, write the settings accumulated in the
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cache to device settings proper. It is important that writing only happens
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in this case, as during normal operation, the contents of the cache should
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // never overwrite actual device settings.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_ownership_status == DeviceSettingsService::OWNERSHIP_TAKEN &&
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE &&
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings_service_->HasPrivateOwnerKey()) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There shouldn't be any pending writes, since the cache writes are all
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // immediate.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!store_callback_factory_.HasWeakPtrs());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Apply the locally-accumulated device settings on top of the initial
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // settings from the service and write back the result.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (device_settings_service_->device_settings()) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      em::ChromeDeviceSettingsProto new_settings(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          *device_settings_service_->device_settings());
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_settings.MergeFrom(device_settings_);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_settings_.Swap(&new_settings);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StoreDeviceSettings();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The owner key might have become available, allowing migration to happen.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AttemptMigration();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ownership_status_ = new_ownership_status;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DeviceSettingsUpdated() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!store_callback_factory_.HasWeakPtrs())
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateAndProceedStoring();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::RetrieveCachedData() {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  em::PolicyData policy_data;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!device_settings_cache::Retrieve(&policy_data,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       g_browser_process->local_state()) ||
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !device_settings_.ParseFromString(policy_data.policy_value())) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "Can't retrieve temp store, possibly not created yet.";
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateValuesCache(policy_data, device_settings_, trusted_status_);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::SetInPolicy() {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_changes_.empty()) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (RequestTrustedEntity() != TRUSTED) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Re-sync device settings before proceeding.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_settings_service_->Load();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string prop(pending_changes_.front().first);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> value(pending_changes_.front().second);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_changes_.pop_front();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trusted_status_ = TEMPORARILY_UNTRUSTED;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prop == kAccountsPrefAllowNewUser) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::AllowNewUsersProto* allow =
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_allow_new_users();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool allow_value;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&allow_value))
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allow->set_allow_new_users(allow_value);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefAllowGuest) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::GuestModeEnabledProto* guest =
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_guest_mode_enabled();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool guest_value;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&guest_value))
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      guest->set_guest_mode_enabled(guest_value);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefShowUserNamesOnSignIn) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::ShowUserNamesOnSigninProto* show =
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_show_user_names();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool show_value;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&show_value))
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show->set_show_user_names(show_value);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccounts) {
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    device_local_accounts->clear_account();
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::ListValue* accounts_list = NULL;
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&accounts_list)) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator entry(accounts_list->begin());
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           entry != accounts_list->end(); ++entry) {
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const base::DictionaryValue* entry_dict = NULL;
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if ((*entry)->GetAsDictionary(&entry_dict)) {
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          em::DeviceLocalAccountInfoProto* account =
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              device_local_accounts->add_account();
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string account_id;
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetStringWithoutPathExpansion(
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyId, &account_id)) {
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->set_account_id(account_id);
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          int type;
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetIntegerWithoutPathExpansion(
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyType, &type)) {
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->set_type(
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                static_cast<em::DeviceLocalAccountInfoProto::AccountType>(
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    type));
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string kiosk_app_id;
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetStringWithoutPathExpansion(
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  &kiosk_app_id)) {
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->mutable_kiosk_app()->set_app_id(kiosk_app_id);
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string kiosk_app_update_url;
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetStringWithoutPathExpansion(
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyKioskAppUpdateURL,
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  &kiosk_app_update_url)) {
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->mutable_kiosk_app()->set_update_url(kiosk_app_update_url);
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        } else {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NOTREACHED();
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginId) {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string id;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsString(&id))
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_local_accounts->set_auto_login_id(id);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginDelay) {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int delay;
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsInteger(&delay))
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_local_accounts->set_auto_login_delay(delay);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled) {
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool enabled;
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (value->GetAsBoolean(&enabled))
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      device_local_accounts->set_enable_auto_login_bailout(enabled);
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kSignedDataRoamingEnabled) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::DataRoamingEnabledProto* roam =
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_data_roaming_enabled();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool roaming_value = false;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&roaming_value))
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      roam->set_data_roaming_enabled(roaming_value);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyRoamingSetting(roaming_value);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kReleaseChannel) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::ReleaseChannelProto* release_channel =
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_release_channel();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string channel_value;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsString(&channel_value))
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      release_channel->set_release_channel(channel_value);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kStatsReportingPref) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::MetricsEnabledProto* metrics =
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_metrics_enabled();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool metrics_value = false;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&metrics_value))
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      metrics->set_metrics_enabled(metrics_value);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(false, metrics_value);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefUsers) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::UserWhitelistProto* whitelist_proto =
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_user_whitelist();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    whitelist_proto->clear_user_whitelist();
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::ListValue* users;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&users)) {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator i = users->begin();
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i != users->end(); ++i) {
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string email;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if ((*i)->GetAsString(&email))
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          whitelist_proto->add_user_whitelist(email);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefEphemeralUsersEnabled) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::EphemeralUsersEnabledProto* ephemeral_users_enabled =
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_ephemeral_users_enabled();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ephemeral_users_enabled_value = false;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&ephemeral_users_enabled_value)) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ephemeral_users_enabled->set_ephemeral_users_enabled(
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ephemeral_users_enabled_value);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAllowRedeemChromeOsRegistrationOffers) {
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::AllowRedeemChromeOsRegistrationOffersProto* allow_redeem_offers =
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_allow_redeem_offers();
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool allow_redeem_offers_value;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsBoolean(&allow_redeem_offers_value)) {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      allow_redeem_offers->set_allow_redeem_offers(
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          allow_redeem_offers_value);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kStartUpFlags) {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::StartUpFlagsProto* flags_proto =
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_start_up_flags();
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    flags_proto->Clear();
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::ListValue* flags;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&flags)) {
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator i = flags->begin();
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i != flags->end(); ++i) {
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string flag;
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if ((*i)->GetAsString(&flag))
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          flags_proto->add_flags(flag);
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
380bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  } else if (prop == kSystemUse24HourClock) {
381bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    em::SystemUse24HourClockProto* use_24hour_clock_proto =
382bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        device_settings_.mutable_use_24hour_clock();
383bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    use_24hour_clock_proto->Clear();
384bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    bool use_24hour_clock_value;
385bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (value->GetAsBoolean(&use_24hour_clock_value)) {
386bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      use_24hour_clock_proto->set_use_24hour_clock(use_24hour_clock_value);
387bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    } else {
388bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      NOTREACHED();
389bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    }
3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (prop == kAttestationForContentProtectionEnabled) {
3913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    em::AttestationSettingsProto* attestation_settings =
3923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        device_settings_.mutable_attestation_settings();
3933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool setting_enabled;
3943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (value->GetAsBoolean(&setting_enabled)) {
3953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      attestation_settings->set_content_protection_enabled(setting_enabled);
3963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    } else {
3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      NOTREACHED();
3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The remaining settings don't support Set(), since they are not
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // intended to be customizable by the user:
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    //   kAccountsPrefSupervisedUsersEnabled
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kAppPack
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //   kDeviceAttestationEnabled
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kDeviceOwner
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kIdleLogoutTimeout
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kIdleLogoutWarningDuration
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReleaseChannelDelegated
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceActivityTimes
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceBootMode
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceLocation
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    //   kReportDeviceVersionInfo
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    //   kReportDeviceNetworkInterfaces
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kScreenSaverExtensionId
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kScreenSaverTimeout
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kStartUpUrls
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kSystemTimezonePolicy
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //   kVariationsRestrictParameter
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(FATAL) << "Device setting " << prop << " is read-only.";
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  em::PolicyData data;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.set_username(device_settings_service_->GetUsername());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(device_settings_.SerializeToString(data.mutable_policy_value()));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the cache to the updated value.
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateValuesCache(data, device_settings_, trusted_status_);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ownership_status_ == DeviceSettingsService::OWNERSHIP_TAKEN) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StoreDeviceSettings();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!device_settings_cache::Store(data, g_browser_process->local_state()))
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LOG(ERROR) << "Couldn't store to the temp storage.";
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // OnStorePolicyCompleted won't get called in this case so proceed with any
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pending operations immediately.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pending_changes_.empty())
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetInPolicy();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeLoginPolicies(
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For all our boolean settings the following is applicable:
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true is default permissive value and false is safe prohibitive value.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exceptions:
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   kSignedDataRoamingEnabled has a default value of false.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   kAccountsPrefEphemeralUsersEnabled has a default value of false.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_allow_new_users() &&
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      policy.allow_new_users().has_allow_new_users()) {
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (policy.allow_new_users().allow_new_users()) {
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // New users allowed, user whitelist ignored.
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_values_cache->SetBoolean(kAccountsPrefAllowNewUser, true);
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // New users not allowed, enforce user whitelist if present.
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_values_cache->SetBoolean(kAccountsPrefAllowNewUser,
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   !policy.has_user_whitelist());
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // No configured allow-new-users value, enforce whitelist if non-empty.
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new_values_cache->SetBoolean(
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kAccountsPrefAllowNewUser,
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        policy.user_whitelist().user_whitelist_size() == 0);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccountsPrefAllowGuest,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.has_guest_mode_enabled() ||
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.guest_mode_enabled().has_guest_mode_enabled() ||
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.guest_mode_enabled().guest_mode_enabled());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccountsPrefShowUserNamesOnSignIn,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.has_show_user_names() ||
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.show_user_names().has_show_user_names() ||
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.show_user_names().show_user_names());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccountsPrefEphemeralUsersEnabled,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.has_ephemeral_users_enabled() &&
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.ephemeral_users_enabled().has_ephemeral_users_enabled() &&
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.ephemeral_users_enabled().ephemeral_users_enabled());
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  new_values_cache->SetBoolean(
487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      kAccountsPrefSupervisedUsersEnabled,
488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      policy.has_supervised_users_settings() &&
489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      policy.supervised_users_settings().supervised_users_enabled());
490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ListValue* list = new base::ListValue();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const em::UserWhitelistProto& whitelist_proto = policy.user_whitelist();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const RepeatedPtrField<std::string>& whitelist =
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      whitelist_proto.user_whitelist();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != whitelist.end(); ++it) {
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    list->Append(new base::StringValue(*it));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetValue(kAccountsPrefUsers, list);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::ListValue> account_list(new base::ListValue());
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!command_line->HasSwitch(switches::kDisableLocalAccounts)) {
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const em::DeviceLocalAccountsProto device_local_accounts_proto =
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        policy.device_local_accounts();
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RepeatedPtrField<em::DeviceLocalAccountInfoProto>& accounts =
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_local_accounts_proto.account();
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RepeatedPtrField<em::DeviceLocalAccountInfoProto>::const_iterator entry;
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (entry = accounts.begin(); entry != accounts.end(); ++entry) {
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<base::DictionaryValue> entry_dict(new base::DictionaryValue());
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (entry->has_type()) {
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (entry->has_account_id()) {
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          entry_dict->SetStringWithoutPathExpansion(
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              kAccountsPrefDeviceLocalAccountsKeyId, entry->account_id());
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry_dict->SetIntegerWithoutPathExpansion(
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            kAccountsPrefDeviceLocalAccountsKeyType, entry->type());
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (entry->kiosk_app().has_app_id()) {
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          entry_dict->SetStringWithoutPathExpansion(
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              entry->kiosk_app().app_id());
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (entry->kiosk_app().has_update_url()) {
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          entry_dict->SetStringWithoutPathExpansion(
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              kAccountsPrefDeviceLocalAccountsKeyKioskAppUpdateURL,
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              entry->kiosk_app().update_url());
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
528b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      } else if (entry->has_deprecated_public_session_id()) {
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Deprecated public session specification.
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry_dict->SetStringWithoutPathExpansion(
531b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            kAccountsPrefDeviceLocalAccountsKeyId,
532b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            entry->deprecated_public_session_id());
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry_dict->SetIntegerWithoutPathExpansion(
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            kAccountsPrefDeviceLocalAccountsKeyType,
53590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION);
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      account_list->Append(entry_dict.release());
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  new_values_cache->SetValue(kAccountsPrefDeviceLocalAccounts,
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             account_list.release());
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (policy.has_device_local_accounts()) {
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (policy.device_local_accounts().has_auto_login_id()) {
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_values_cache->SetString(
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          kAccountsPrefDeviceLocalAccountAutoLoginId,
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          policy.device_local_accounts().auto_login_id());
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (policy.device_local_accounts().has_auto_login_delay()) {
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_values_cache->SetInteger(
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          kAccountsPrefDeviceLocalAccountAutoLoginDelay,
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          policy.device_local_accounts().auto_login_delay());
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  new_values_cache->SetBoolean(
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      policy.device_local_accounts().enable_auto_login_bailout());
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (policy.has_start_up_flags()) {
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::ListValue* list = new base::ListValue();
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const em::StartUpFlagsProto& flags_proto = policy.start_up_flags();
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const RepeatedPtrField<std::string>& flags = flags_proto.flags();
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (RepeatedPtrField<std::string>::const_iterator it = flags.begin();
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         it != flags.end(); ++it) {
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      list->Append(new base::StringValue(*it));
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new_values_cache->SetValue(kStartUpFlags, list);
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeKioskPolicies(
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_forced_logout_timeouts()) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.forced_logout_timeouts().has_idle_logout_timeout()) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetInteger(
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kIdleLogoutTimeout,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.forced_logout_timeouts().idle_logout_timeout());
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.forced_logout_timeouts().has_idle_logout_warning_duration()) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetInteger(
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kIdleLogoutWarningDuration,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.forced_logout_timeouts().idle_logout_warning_duration());
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_login_screen_saver()) {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.login_screen_saver().has_screen_saver_timeout()) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetInteger(
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kScreenSaverTimeout,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.login_screen_saver().screen_saver_timeout());
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.login_screen_saver().has_screen_saver_extension_id()) {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetString(
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kScreenSaverExtensionId,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.login_screen_saver().screen_saver_extension_id());
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_app_pack()) {
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef RepeatedPtrField<em::AppPackEntryProto> proto_type;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* list = new base::ListValue;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const proto_type& app_pack = policy.app_pack().app_pack();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (proto_type::const_iterator it = app_pack.begin();
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != app_pack.end(); ++it) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::DictionaryValue* entry = new base::DictionaryValue;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it->has_extension_id()) {
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry->SetStringWithoutPathExpansion(kAppPackKeyExtensionId,
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                             it->extension_id());
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (it->has_update_url()) {
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        entry->SetStringWithoutPathExpansion(kAppPackKeyUpdateUrl,
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                             it->update_url());
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      list->Append(entry);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetValue(kAppPack, list);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_start_up_urls()) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ListValue* list = new base::ListValue();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::StartUpUrlsProto& urls_proto = policy.start_up_urls();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const RepeatedPtrField<std::string>& urls = urls_proto.start_up_urls();
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (RepeatedPtrField<std::string>::const_iterator it = urls.begin();
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != urls.end(); ++it) {
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      list->Append(new base::StringValue(*it));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetValue(kStartUpUrls, list);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeNetworkPolicies(
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSignedDataRoamingEnabled,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.has_data_roaming_enabled() &&
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.data_roaming_enabled().has_data_roaming_enabled() &&
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.data_roaming_enabled().data_roaming_enabled());
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void DeviceSettingsProvider::DecodeAutoUpdatePolicies(
646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
647868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
6487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (policy.has_auto_update_settings()) {
6497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const em::AutoUpdateSettingsProto& au_settings_proto =
6507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        policy.auto_update_settings();
6517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (au_settings_proto.has_update_disabled()) {
6527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new_values_cache->SetBoolean(kUpdateDisabled,
6537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   au_settings_proto.update_disabled());
6547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
6557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const RepeatedField<int>& allowed_connection_types =
6567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        au_settings_proto.allowed_connection_types();
6577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::ListValue* list = new base::ListValue();
6587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for (RepeatedField<int>::const_iterator i(allowed_connection_types.begin());
6597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch         i != allowed_connection_types.end(); ++i) {
6607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      list->Append(new base::FundamentalValue(*i));
6617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
6627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    new_values_cache->SetValue(kAllowedConnectionTypesForUpdate, list);
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeReportingPolicies(
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_device_reporting()) {
6707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const em::DeviceReportingProto& reporting_policy =
6717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        policy.device_reporting();
6727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (reporting_policy.has_report_version_info()) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetBoolean(
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kReportDeviceVersionInfo,
6757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          reporting_policy.report_version_info());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (reporting_policy.has_report_activity_times()) {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetBoolean(
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kReportDeviceActivityTimes,
6807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          reporting_policy.report_activity_times());
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (reporting_policy.has_report_boot_mode()) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetBoolean(
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kReportDeviceBootMode,
6857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          reporting_policy.report_boot_mode());
6867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
6877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (reporting_policy.has_report_network_interfaces()) {
6887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new_values_cache->SetBoolean(
6897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          kReportDeviceNetworkInterfaces,
6907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          reporting_policy.report_network_interfaces());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::DecodeGenericPolicies(
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& policy,
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap* new_values_cache) const {
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_metrics_enabled()) {
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetBoolean(kStatsReportingPref,
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 policy.metrics_enabled().metrics_enabled());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetBoolean(kStatsReportingPref, HasOldMetricsFile());
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!policy.has_release_channel() ||
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !policy.release_channel().has_release_channel()) {
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Default to an invalid channel (will be ignored).
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetString(kReleaseChannel, "");
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache->SetString(kReleaseChannel,
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                policy.release_channel().release_channel());
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_values_cache->SetBoolean(
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kReleaseChannelDelegated,
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.has_release_channel() &&
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.release_channel().has_release_channel_delegated() &&
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      policy.release_channel().release_channel_delegated());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy.has_system_timezone()) {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (policy.system_timezone().has_timezone()) {
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_values_cache->SetString(
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          kSystemTimezonePolicy,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy.system_timezone().timezone());
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
728bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (policy.has_use_24hour_clock()) {
729bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (policy.use_24hour_clock().has_use_24hour_clock()) {
730bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      new_values_cache->SetBoolean(
731bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch          kSystemUse24HourClock, policy.use_24hour_clock().use_24hour_clock());
732bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    }
733bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  }
734bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (policy.has_allow_redeem_offers()) {
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_values_cache->SetBoolean(
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kAllowRedeemChromeOsRegistrationOffers,
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        policy.allow_redeem_offers().allow_redeem_offers());
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_values_cache->SetBoolean(
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kAllowRedeemChromeOsRegistrationOffers,
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        true);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (policy.has_variations_parameter()) {
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new_values_cache->SetString(
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        kVariationsRestrictParameter,
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        policy.variations_parameter().parameter());
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  new_values_cache->SetBoolean(
752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kDeviceAttestationEnabled,
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      policy.attestation_settings().attestation_enabled());
7543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_values_cache->SetBoolean(
7563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kAttestationForContentProtectionEnabled,
7573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      !(policy.has_attestation_settings() &&
7583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        policy.attestation_settings().has_content_protection_enabled() &&
7593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        policy.attestation_settings().content_protection_enabled()));
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::UpdateValuesCache(
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::PolicyData& policy_data,
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const em::ChromeDeviceSettingsProto& settings,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TrustedStatus trusted_status) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefValueMap new_values_cache;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy_data.has_username() && !policy_data.has_request_token())
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache.SetString(kDeviceOwner, policy_data.username());
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeLoginPolicies(settings, &new_values_cache);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeKioskPolicies(settings, &new_values_cache);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeNetworkPolicies(settings, &new_values_cache);
774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DecodeAutoUpdatePolicies(settings, &new_values_cache);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeReportingPolicies(settings, &new_values_cache);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeGenericPolicies(settings, &new_values_cache);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collect all notifications but send them only after we have swapped the
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cache so that if somebody actually reads the cache will be already valid.
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> notifications;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Go through the new values and verify in the old ones.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefValueMap::iterator iter = new_values_cache.begin();
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; iter != new_values_cache.end(); ++iter) {
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* old_value;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!values_cache_.GetValue(iter->first, &old_value) ||
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !old_value->Equals(iter->second)) {
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications.push_back(iter->first);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now check for values that have been removed from the policy blob.
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iter = values_cache_.begin(); iter != values_cache_.end(); ++iter) {
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* value;
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!new_values_cache.GetValue(iter->first, &value))
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications.push_back(iter->first);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Swap and notify.
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values_cache_.Swap(&new_values_cache);
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  trusted_status_ = trusted_status;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < notifications.size(); ++i)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyObservers(notifications[i]);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::ApplyMetricsSetting(bool use_file,
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 bool new_value) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once migration is not needed anymore.
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the value is not set we should try to migrate legacy consent file.
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_file) {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_value = HasOldMetricsFile();
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the values will get eventually written to the policy file.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    migration_values_.SetValue(kStatsReportingPref,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               base::Value::CreateBooleanValue(new_value));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AttemptMigration();
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "No metrics policy set will revert to checking "
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << "consent file which is "
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << (new_value ? "on." : "off.");
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("DeviceSettings.MetricsMigrated", 1);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Metrics policy is being set to : " << new_value
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "(use file : " << use_file << ")";
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once we don't need to regenerate the
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // consent file for the GUID anymore.
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OptionsUtil::ResolveMetricsReportingEnabled(new_value);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::ApplyRoamingSetting(bool new_value) {
826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // TODO(armansito): Look up the device by explicitly using the device path.
827a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const DeviceState* cellular =
828a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      NetworkHandler::Get()->network_state_handler()->
829a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          GetDeviceStateByType(flimflam::kTypeCellular);
830a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!cellular) {
831a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    NET_LOG_DEBUG("No cellular device is available",
832a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                  "Roaming is only supported by cellular devices.");
833a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool current_value;
836a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!cellular->properties().GetBooleanWithoutPathExpansion(
837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          flimflam::kCellularAllowRoamingProperty, &current_value)) {
838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    NET_LOG_ERROR("Could not get \"allow roaming\" property from cellular "
839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                  "device.", cellular->path());
840a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
842a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Only set the value if the current value is different from |new_value|.
844a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // If roaming is required by the provider, always try to set to true.
845a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  new_value = (cellular->provider_requires_roaming() ? true : new_value);
846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (new_value == current_value)
847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
848a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  NetworkHandler::Get()->network_device_handler()->SetDeviceProperty(
850a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cellular->path(),
851a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      flimflam::kCellularAllowRoamingProperty,
852a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::FundamentalValue(new_value),
853a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&base::DoNothing),
854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::Bind(&LogShillError));
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::ApplySideEffects(
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& settings) {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First migrate metrics settings as needed.
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.has_metrics_enabled())
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(false, settings.metrics_enabled().metrics_enabled());
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(true, false);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Next set the roaming setting as needed.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ApplyRoamingSetting(
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings.has_data_roaming_enabled() ?
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          settings.data_roaming_enabled().data_roaming_enabled() :
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false);
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::MitigateMissingPolicy() {
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First check if the device has been owned already and if not exit
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately.
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (g_browser_process->browser_policy_connector()->GetDeviceMode() !=
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          policy::DEVICE_MODE_CONSUMER) {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are here the policy file were corrupted or missing. This can happen
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because we are migrating Pre R11 device to the new secure policies or there
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was an attempt to circumvent policy system. In this case we should populate
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the policy cache with "safe-mode" defaults which should allow the owner to
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // log in but lock the device for anyone else until the policy blob has been
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recreated by the session manager.
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "Corruption of the policy data has been detected."
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "Switching to \"safe-mode\" policies until the owner logs in "
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "to regenerate the policy data.";
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.Clear();
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.mutable_allow_new_users()->set_allow_new_users(true);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.mutable_guest_mode_enabled()->set_guest_mode_enabled(true);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  em::PolicyData empty_policy_data;
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateValuesCache(empty_policy_data, device_settings_, TRUSTED);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values_cache_.SetBoolean(kPolicyMissingMitigationMode, true);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::Value* DeviceSettingsProvider::Get(const std::string& path) const {
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsDeviceSetting(path)) {
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* value;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (values_cache_.GetValue(path, &value))
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Trying to get non cros setting.";
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::TrustedStatus
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeviceSettingsProvider::PrepareTrustedValues(const base::Closure& cb) {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrustedStatus status = RequestTrustedEntity();
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == TEMPORARILY_UNTRUSTED && !cb.is_null())
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks_.push_back(cb);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::HandlesSetting(const std::string& path) const {
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsDeviceSetting(path);
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::TrustedStatus
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeviceSettingsProvider::RequestTrustedEntity() {
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRUSTED;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return trusted_status_;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::UpdateAndProceedStoring() {
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-sync the cache from the service.
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateFromService();
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trigger the next change if necessary.
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (trusted_status_ == TRUSTED && !pending_changes_.empty())
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInPolicy();
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::UpdateFromService() {
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool settings_loaded = false;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (device_settings_service_->status()) {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_SUCCESS: {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const em::PolicyData* policy_data =
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          device_settings_service_->policy_data();
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const em::ChromeDeviceSettingsProto* device_settings =
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          device_settings_service_->device_settings();
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (policy_data && device_settings) {
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!device_settings_cache::Store(*policy_data,
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          g_browser_process->local_state())) {
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          LOG(ERROR) << "Couldn't update the local state cache.";
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        UpdateValuesCache(*policy_data, *device_settings, TRUSTED);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_ = *device_settings;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(pastarmovj): Make those side effects responsibility of the
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // respective subsystems.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ApplySideEffects(*device_settings);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings_loaded = true;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Initial policy load is still pending.
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        trusted_status_ = TEMPORARILY_UNTRUSTED;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_NO_POLICY:
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (MitigateMissingPolicy())
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // fall through.
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_KEY_UNAVAILABLE:
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "No policies present yet, will use the temp storage.";
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_POLICY_ERROR:
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_VALIDATION_ERROR:
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_INVALID_POLICY:
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_OPERATION_FAILED:
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to retrieve cros policies. Reason: "
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << device_settings_service_->status();
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR:
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The policy has failed to validate due to temporary error but it might
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // take a long time until we recover so behave as it is a permanent error.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to retrieve cros policies because a temporary "
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "validation error has occurred. Retrying might succeed.";
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the observers we are done.
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<base::Closure> callbacks;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callbacks.swap(callbacks_);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < callbacks.size(); ++i)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks[i].Run();
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return settings_loaded;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::StoreDeviceSettings() {
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mute all previous callbacks to guarantee the |pending_changes_| queue is
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // processed serially.
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_callback_factory_.InvalidateWeakPtrs();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_service_->SignAndStore(
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<em::ChromeDeviceSettingsProto>(
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new em::ChromeDeviceSettingsProto(device_settings_)),
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DeviceSettingsProvider::UpdateAndProceedStoring,
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 store_callback_factory_.GetWeakPtr()));
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::AttemptMigration() {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (device_settings_service_->HasPrivateOwnerKey()) {
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap::const_iterator i;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = migration_values_.begin(); i != migration_values_.end(); ++i)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DoSet(i->first, *i->second);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    migration_values_.Clear();
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1023