device_settings_provider.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_cache.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/metrics/metrics_reporting_state.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_settings.h"
23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chromeos/dbus/cryptohome_client.h"
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/device_management_backend.pb.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)using google::protobuf::RepeatedField;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using google::protobuf::RepeatedPtrField;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace em = enterprise_management;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// List of settings handled by the DeviceSettingsProvider.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kKnownSettings[] = {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefAllowGuest,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefAllowNewUser,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccounts,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginDelay,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAccountsPrefDeviceLocalAccountAutoLoginId,
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  kAccountsPrefDeviceLocalAccountPromptForNetworkWhenOffline,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefEphemeralUsersEnabled,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefShowUserNamesOnSignIn,
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  kAccountsPrefSupervisedUsersEnabled,
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  kAccountsPrefTransferSAMLCookies,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAccountsPrefUsers,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kAllowRedeemChromeOsRegistrationOffers,
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  kAllowedConnectionTypesForUpdate,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kAppPack,
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kAttestationForContentProtectionEnabled,
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kDeviceAttestationEnabled,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kDeviceOwner,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kIdleLogoutTimeout,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kIdleLogoutWarningDuration,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kPolicyMissingMitigationMode,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReleaseChannel,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReleaseChannelDelegated,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceActivityTimes,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceBootMode,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceLocation,
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  kReportDeviceNetworkInterfaces,
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  kReportDeviceUsers,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kReportDeviceVersionInfo,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kScreenSaverExtensionId,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kScreenSaverTimeout,
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  kServiceAccountIdentity,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSignedDataRoamingEnabled,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kStartUpFlags,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kStartUpUrls,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kStatsReportingPref,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kSystemTimezonePolicy,
77bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  kSystemUse24HourClock,
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  kUpdateDisabled,
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kVariationsRestrictParameter,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasOldMetricsFile() {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once migration is not needed anymore.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the value is not set we should try to migrate legacy consent file.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loading consent file state causes us to do blocking IO on UI thread.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily allow it until we fix http://crbug.com/62626
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowIO allow_io;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GoogleUpdateSettings::GetCollectStatsConsent();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DecodeLoginPolicies(
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::ChromeDeviceSettingsProto& policy,
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefValueMap* new_values_cache) {
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // For all our boolean settings the following is applicable:
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // true is default permissive value and false is safe prohibitive value.
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Exceptions:
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //   kAccountsPrefEphemeralUsersEnabled has a default value of false.
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //   kAccountsPrefSupervisedUsersEnabled has a default value of false
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //     for enterprise devices and true for consumer devices.
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //   kAccountsPrefTransferSAMLCookies has a default value of false.
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_allow_new_users() &&
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.allow_new_users().has_allow_new_users()) {
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.allow_new_users().allow_new_users()) {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // New users allowed, user whitelist ignored.
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(kAccountsPrefAllowNewUser, true);
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } else {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // New users not allowed, enforce user whitelist if present.
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(kAccountsPrefAllowNewUser,
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   !policy.has_user_whitelist());
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // No configured allow-new-users value, enforce whitelist if non-empty.
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetBoolean(
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kAccountsPrefAllowNewUser,
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.user_whitelist().user_whitelist_size() == 0);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kAccountsPrefAllowGuest,
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !policy.has_guest_mode_enabled() ||
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !policy.guest_mode_enabled().has_guest_mode_enabled() ||
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.guest_mode_enabled().guest_mode_enabled());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  policy::BrowserPolicyConnectorChromeOS* connector =
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      g_browser_process->platform_part()->browser_policy_connector_chromeos();
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool supervised_users_enabled = false;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (connector->IsEnterpriseManaged()) {
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    supervised_users_enabled =
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.has_supervised_users_settings() &&
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.supervised_users_settings().has_supervised_users_enabled() &&
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.supervised_users_settings().supervised_users_enabled();
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    supervised_users_enabled =
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !policy.has_supervised_users_settings() ||
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !policy.supervised_users_settings().has_supervised_users_enabled() ||
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.supervised_users_settings().supervised_users_enabled();
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kAccountsPrefSupervisedUsersEnabled, supervised_users_enabled);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kAccountsPrefShowUserNamesOnSignIn,
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !policy.has_show_user_names() ||
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !policy.show_user_names().has_show_user_names() ||
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.show_user_names().show_user_names());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kAccountsPrefEphemeralUsersEnabled,
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.has_ephemeral_users_enabled() &&
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.ephemeral_users_enabled().has_ephemeral_users_enabled() &&
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.ephemeral_users_enabled().ephemeral_users_enabled());
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ListValue* list = new base::ListValue();
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const em::UserWhitelistProto& whitelist_proto = policy.user_whitelist();
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const RepeatedPtrField<std::string>& whitelist =
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      whitelist_proto.user_whitelist();
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin();
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != whitelist.end(); ++it) {
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    list->Append(new base::StringValue(*it));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetValue(kAccountsPrefUsers, list);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::ListValue> account_list(new base::ListValue());
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const em::DeviceLocalAccountsProto device_local_accounts_proto =
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.device_local_accounts();
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const RepeatedPtrField<em::DeviceLocalAccountInfoProto>& accounts =
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      device_local_accounts_proto.account();
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RepeatedPtrField<em::DeviceLocalAccountInfoProto>::const_iterator entry;
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (entry = accounts.begin(); entry != accounts.end(); ++entry) {
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<base::DictionaryValue> entry_dict(new base::DictionaryValue());
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (entry->has_type()) {
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (entry->has_account_id()) {
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entry_dict->SetStringWithoutPathExpansion(
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            kAccountsPrefDeviceLocalAccountsKeyId, entry->account_id());
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      entry_dict->SetIntegerWithoutPathExpansion(
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kAccountsPrefDeviceLocalAccountsKeyType, entry->type());
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (entry->kiosk_app().has_app_id()) {
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entry_dict->SetStringWithoutPathExpansion(
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            entry->kiosk_app().app_id());
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } else if (entry->has_deprecated_public_session_id()) {
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Deprecated public session specification.
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      entry_dict->SetStringWithoutPathExpansion(
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kAccountsPrefDeviceLocalAccountsKeyId,
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          entry->deprecated_public_session_id());
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      entry_dict->SetIntegerWithoutPathExpansion(
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kAccountsPrefDeviceLocalAccountsKeyType,
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION);
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    account_list->Append(entry_dict.release());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetValue(kAccountsPrefDeviceLocalAccounts,
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             account_list.release());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_device_local_accounts()) {
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.device_local_accounts().has_auto_login_id()) {
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetString(
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kAccountsPrefDeviceLocalAccountAutoLoginId,
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy.device_local_accounts().auto_login_id());
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.device_local_accounts().has_auto_login_delay()) {
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetInteger(
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kAccountsPrefDeviceLocalAccountAutoLoginDelay,
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy.device_local_accounts().auto_login_delay());
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.device_local_accounts().enable_auto_login_bailout());
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kAccountsPrefDeviceLocalAccountPromptForNetworkWhenOffline,
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.device_local_accounts().prompt_for_network_when_offline());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_start_up_flags()) {
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ListValue* list = new base::ListValue();
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::StartUpFlagsProto& flags_proto = policy.start_up_flags();
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const RepeatedPtrField<std::string>& flags = flags_proto.flags();
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (RepeatedPtrField<std::string>::const_iterator it = flags.begin();
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         it != flags.end(); ++it) {
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      list->Append(new base::StringValue(*it));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetValue(kStartUpFlags, list);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_saml_settings()) {
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetBoolean(
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kAccountsPrefTransferSAMLCookies,
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.saml_settings().transfer_saml_cookies());
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DecodeKioskPolicies(
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::ChromeDeviceSettingsProto& policy,
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefValueMap* new_values_cache) {
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_forced_logout_timeouts()) {
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.forced_logout_timeouts().has_idle_logout_timeout()) {
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetInteger(
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kIdleLogoutTimeout,
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy.forced_logout_timeouts().idle_logout_timeout());
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.forced_logout_timeouts().has_idle_logout_warning_duration()) {
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetInteger(
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kIdleLogoutWarningDuration,
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy.forced_logout_timeouts().idle_logout_warning_duration());
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_login_screen_saver()) {
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.login_screen_saver().has_screen_saver_timeout()) {
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetInteger(
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kScreenSaverTimeout,
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy.login_screen_saver().screen_saver_timeout());
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.login_screen_saver().has_screen_saver_extension_id()) {
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetString(
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kScreenSaverExtensionId,
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy.login_screen_saver().screen_saver_extension_id());
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_app_pack()) {
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    typedef RepeatedPtrField<em::AppPackEntryProto> proto_type;
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ListValue* list = new base::ListValue;
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const proto_type& app_pack = policy.app_pack().app_pack();
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (proto_type::const_iterator it = app_pack.begin();
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         it != app_pack.end(); ++it) {
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::DictionaryValue* entry = new base::DictionaryValue;
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (it->has_extension_id()) {
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entry->SetStringWithoutPathExpansion(kAppPackKeyExtensionId,
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             it->extension_id());
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (it->has_update_url()) {
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        entry->SetStringWithoutPathExpansion(kAppPackKeyUpdateUrl,
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             it->update_url());
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      list->Append(entry);
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetValue(kAppPack, list);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_start_up_urls()) {
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ListValue* list = new base::ListValue();
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::StartUpUrlsProto& urls_proto = policy.start_up_urls();
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const RepeatedPtrField<std::string>& urls = urls_proto.start_up_urls();
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (RepeatedPtrField<std::string>::const_iterator it = urls.begin();
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         it != urls.end(); ++it) {
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      list->Append(new base::StringValue(*it));
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetValue(kStartUpUrls, list);
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DecodeNetworkPolicies(
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::ChromeDeviceSettingsProto& policy,
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefValueMap* new_values_cache) {
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // kSignedDataRoamingEnabled has a default value of false.
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kSignedDataRoamingEnabled,
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.has_data_roaming_enabled() &&
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.data_roaming_enabled().has_data_roaming_enabled() &&
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.data_roaming_enabled().data_roaming_enabled());
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DecodeAutoUpdatePolicies(
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::ChromeDeviceSettingsProto& policy,
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefValueMap* new_values_cache) {
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_auto_update_settings()) {
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::AutoUpdateSettingsProto& au_settings_proto =
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.auto_update_settings();
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (au_settings_proto.has_update_disabled()) {
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(kUpdateDisabled,
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   au_settings_proto.update_disabled());
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const RepeatedField<int>& allowed_connection_types =
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        au_settings_proto.allowed_connection_types();
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::ListValue* list = new base::ListValue();
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (RepeatedField<int>::const_iterator i(allowed_connection_types.begin());
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         i != allowed_connection_types.end(); ++i) {
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      list->Append(new base::FundamentalValue(*i));
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetValue(kAllowedConnectionTypesForUpdate, list);
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DecodeReportingPolicies(
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::ChromeDeviceSettingsProto& policy,
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefValueMap* new_values_cache) {
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_device_reporting()) {
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::DeviceReportingProto& reporting_policy =
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.device_reporting();
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (reporting_policy.has_report_version_info()) {
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kReportDeviceVersionInfo,
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reporting_policy.report_version_info());
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (reporting_policy.has_report_activity_times()) {
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kReportDeviceActivityTimes,
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reporting_policy.report_activity_times());
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (reporting_policy.has_report_boot_mode()) {
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kReportDeviceBootMode,
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reporting_policy.report_boot_mode());
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (reporting_policy.has_report_network_interfaces()) {
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kReportDeviceNetworkInterfaces,
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reporting_policy.report_network_interfaces());
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (reporting_policy.has_report_users()) {
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kReportDeviceUsers,
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          reporting_policy.report_users());
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DecodeGenericPolicies(
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const em::ChromeDeviceSettingsProto& policy,
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefValueMap* new_values_cache) {
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_metrics_enabled()) {
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetBoolean(kStatsReportingPref,
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 policy.metrics_enabled().metrics_enabled());
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetBoolean(kStatsReportingPref, HasOldMetricsFile());
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!policy.has_release_channel() ||
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !policy.release_channel().has_release_channel()) {
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Default to an invalid channel (will be ignored).
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetString(kReleaseChannel, "");
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetString(kReleaseChannel,
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                policy.release_channel().release_channel());
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kReleaseChannelDelegated,
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.has_release_channel() &&
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.release_channel().has_release_channel_delegated() &&
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.release_channel().release_channel_delegated());
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_system_timezone()) {
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.system_timezone().has_timezone()) {
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetString(
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kSystemTimezonePolicy,
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          policy.system_timezone().timezone());
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_use_24hour_clock()) {
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (policy.use_24hour_clock().has_use_24hour_clock()) {
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_values_cache->SetBoolean(
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kSystemUse24HourClock, policy.use_24hour_clock().use_24hour_clock());
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_allow_redeem_offers()) {
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetBoolean(
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kAllowRedeemChromeOsRegistrationOffers,
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.allow_redeem_offers().allow_redeem_offers());
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetBoolean(
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kAllowRedeemChromeOsRegistrationOffers,
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        true);
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_variations_parameter()) {
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetString(
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kVariationsRestrictParameter,
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.variations_parameter().parameter());
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_values_cache->SetBoolean(
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kDeviceAttestationEnabled,
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.attestation_settings().attestation_enabled());
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (policy.has_attestation_settings() &&
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      policy.attestation_settings().has_content_protection_enabled()) {
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetBoolean(
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kAttestationForContentProtectionEnabled,
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        policy.attestation_settings().content_protection_enabled());
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    new_values_cache->SetBoolean(kAttestationForContentProtectionEnabled, true);
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDeviceSettingsProvider::DeviceSettingsProvider(
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const NotifyObserversCallback& notify_cb,
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DeviceSettingsService* device_settings_service)
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : CrosSettingsProvider(notify_cb),
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      device_settings_service_(device_settings_service),
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      trusted_status_(TEMPORARILY_UNTRUSTED),
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ownership_status_(device_settings_service_->GetOwnershipStatus()),
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      store_callback_factory_(this) {
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  device_settings_service_->AddObserver(this);
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!UpdateFromService()) {
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Make sure we have at least the cache data immediately.
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    RetrieveCachedData();
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDeviceSettingsProvider::~DeviceSettingsProvider() {
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  device_settings_service_->RemoveObserver(this);
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool DeviceSettingsProvider::IsDeviceSetting(const std::string& name) {
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char** end = kKnownSettings + arraysize(kKnownSettings);
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return std::find(kKnownSettings, end, name) != end;
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DeviceSettingsProvider::DoSet(const std::string& path,
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   const base::Value& in_value) {
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Make sure that either the current user is the device owner or the
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // device doesn't have an owner yet.
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!(device_settings_service_->HasPrivateOwnerKey() ||
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)) {
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOG(WARNING) << "Changing settings from non-owner, setting=" << path;
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Revert UI change.
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NotifyObservers(path);
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (IsDeviceSetting(path)) {
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pending_changes_.push_back(PendingQueueElement(path, in_value.DeepCopy()));
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!store_callback_factory_.HasWeakPtrs())
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SetInPolicy();
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED() << "Try to set unhandled cros setting " << path;
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DeviceSettingsProvider::OwnershipStatusChanged() {
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DeviceSettingsService::OwnershipStatus new_ownership_status =
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      device_settings_service_->GetOwnershipStatus();
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If the device just became owned, write the settings accumulated in the
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // cache to device settings proper. It is important that writing only happens
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // in this case, as during normal operation, the contents of the cache should
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // never overwrite actual device settings.
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (new_ownership_status == DeviceSettingsService::OWNERSHIP_TAKEN &&
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE &&
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      device_settings_service_->HasPrivateOwnerKey()) {
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // There shouldn't be any pending writes, since the cache writes are all
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // immediate.
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(!store_callback_factory_.HasWeakPtrs());
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    trusted_status_ = TEMPORARILY_UNTRUSTED;
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Apply the locally-accumulated device settings on top of the initial
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // settings from the service and write back the result.
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (device_settings_service_->device_settings()) {
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      em::ChromeDeviceSettingsProto new_settings(
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *device_settings_service_->device_settings());
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_settings.MergeFrom(device_settings_);
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      device_settings_.Swap(&new_settings);
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    StoreDeviceSettings();
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The owner key might have become available, allowing migration to happen.
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AttemptMigration();
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ownership_status_ = new_ownership_status;
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DeviceSettingsProvider::DeviceSettingsUpdated() {
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!store_callback_factory_.HasWeakPtrs())
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateAndProceedStoring();
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DeviceSettingsProvider::RetrieveCachedData() {
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  em::PolicyData policy_data;
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!device_settings_cache::Retrieve(&policy_data,
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       g_browser_process->local_state()) ||
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !device_settings_.ParseFromString(policy_data.policy_value())) {
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    VLOG(1) << "Can't retrieve temp store, possibly not created yet.";
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UpdateValuesCache(policy_data, device_settings_, trusted_status_);
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DeviceSettingsProvider::SetInPolicy() {
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pending_changes_.empty()) {
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (RequestTrustedEntity() != TRUSTED) {
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Re-sync device settings before proceeding.
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    device_settings_service_->Load();
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string prop(pending_changes_.front().first);
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::Value> value(pending_changes_.front().second);
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pending_changes_.pop_front();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trusted_status_ = TEMPORARILY_UNTRUSTED;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prop == kAccountsPrefAllowNewUser) {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::AllowNewUsersProto* allow =
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_allow_new_users();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool allow_value;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&allow_value))
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allow->set_allow_new_users(allow_value);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefAllowGuest) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::GuestModeEnabledProto* guest =
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_guest_mode_enabled();
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool guest_value;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&guest_value))
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      guest->set_guest_mode_enabled(guest_value);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
56546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else if (prop == kAccountsPrefSupervisedUsersEnabled) {
56646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    em::SupervisedUsersSettingsProto* supervised =
56746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        device_settings_.mutable_supervised_users_settings();
56846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool supervised_value;
56946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (value->GetAsBoolean(&supervised_value))
57046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      supervised->set_supervised_users_enabled(supervised_value);
57146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    else
57246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      NOTREACHED();
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefShowUserNamesOnSignIn) {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::ShowUserNamesOnSigninProto* show =
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_show_user_names();
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool show_value;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&show_value))
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show->set_show_user_names(show_value);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccounts) {
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    device_local_accounts->clear_account();
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::ListValue* accounts_list = NULL;
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&accounts_list)) {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator entry(accounts_list->begin());
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           entry != accounts_list->end(); ++entry) {
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const base::DictionaryValue* entry_dict = NULL;
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if ((*entry)->GetAsDictionary(&entry_dict)) {
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          em::DeviceLocalAccountInfoProto* account =
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              device_local_accounts->add_account();
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string account_id;
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetStringWithoutPathExpansion(
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyId, &account_id)) {
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->set_account_id(account_id);
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          int type;
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetIntegerWithoutPathExpansion(
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyType, &type)) {
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->set_type(
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                static_cast<em::DeviceLocalAccountInfoProto::AccountType>(
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    type));
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string kiosk_app_id;
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          if (entry_dict->GetStringWithoutPathExpansion(
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  kAccountsPrefDeviceLocalAccountsKeyKioskAppId,
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  &kiosk_app_id)) {
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            account->mutable_kiosk_app()->set_app_id(kiosk_app_id);
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        } else {
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NOTREACHED();
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginId) {
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string id;
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsString(&id))
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_local_accounts->set_auto_login_id(id);
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginDelay) {
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int delay;
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsInteger(&delay))
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_local_accounts->set_auto_login_delay(delay);
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (prop == kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled) {
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        device_settings_.mutable_device_local_accounts();
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool enabled;
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (value->GetAsBoolean(&enabled))
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      device_local_accounts->set_enable_auto_login_bailout(enabled);
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTREACHED();
642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else if (prop ==
643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)             kAccountsPrefDeviceLocalAccountPromptForNetworkWhenOffline) {
644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    em::DeviceLocalAccountsProto* device_local_accounts =
645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        device_settings_.mutable_device_local_accounts();
646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool should_prompt;
647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (value->GetAsBoolean(&should_prompt))
648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      device_local_accounts->set_prompt_for_network_when_offline(should_prompt);
649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    else
650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      NOTREACHED();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kSignedDataRoamingEnabled) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::DataRoamingEnabledProto* roam =
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_data_roaming_enabled();
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool roaming_value = false;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&roaming_value))
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      roam->set_data_roaming_enabled(roaming_value);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kReleaseChannel) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::ReleaseChannelProto* release_channel =
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_release_channel();
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string channel_value;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsString(&channel_value))
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      release_channel->set_release_channel(channel_value);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kStatsReportingPref) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::MetricsEnabledProto* metrics =
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_metrics_enabled();
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool metrics_value = false;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&metrics_value))
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      metrics->set_metrics_enabled(metrics_value);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(false, metrics_value);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefUsers) {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::UserWhitelistProto* whitelist_proto =
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_user_whitelist();
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    whitelist_proto->clear_user_whitelist();
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::ListValue* users;
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&users)) {
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator i = users->begin();
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i != users->end(); ++i) {
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string email;
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if ((*i)->GetAsString(&email))
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          whitelist_proto->add_user_whitelist(email);
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (prop == kAccountsPrefEphemeralUsersEnabled) {
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    em::EphemeralUsersEnabledProto* ephemeral_users_enabled =
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_.mutable_ephemeral_users_enabled();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ephemeral_users_enabled_value = false;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value->GetAsBoolean(&ephemeral_users_enabled_value)) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ephemeral_users_enabled->set_ephemeral_users_enabled(
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ephemeral_users_enabled_value);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kAllowRedeemChromeOsRegistrationOffers) {
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::AllowRedeemChromeOsRegistrationOffersProto* allow_redeem_offers =
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_allow_redeem_offers();
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool allow_redeem_offers_value;
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsBoolean(&allow_redeem_offers_value)) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      allow_redeem_offers->set_allow_redeem_offers(
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          allow_redeem_offers_value);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (prop == kStartUpFlags) {
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    em::StartUpFlagsProto* flags_proto =
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_settings_.mutable_start_up_flags();
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    flags_proto->Clear();
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::ListValue* flags;
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (value->GetAsList(&flags)) {
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (base::ListValue::const_iterator i = flags->begin();
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           i != flags->end(); ++i) {
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string flag;
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if ((*i)->GetAsString(&flag))
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          flags_proto->add_flags(flag);
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
722bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  } else if (prop == kSystemUse24HourClock) {
723bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    em::SystemUse24HourClockProto* use_24hour_clock_proto =
724bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        device_settings_.mutable_use_24hour_clock();
725bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    use_24hour_clock_proto->Clear();
726bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    bool use_24hour_clock_value;
727bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (value->GetAsBoolean(&use_24hour_clock_value)) {
728bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      use_24hour_clock_proto->set_use_24hour_clock(use_24hour_clock_value);
729bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    } else {
730bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      NOTREACHED();
731bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    }
7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (prop == kAttestationForContentProtectionEnabled) {
7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    em::AttestationSettingsProto* attestation_settings =
7343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        device_settings_.mutable_attestation_settings();
7353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool setting_enabled;
7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (value->GetAsBoolean(&setting_enabled)) {
7373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      attestation_settings->set_content_protection_enabled(setting_enabled);
7383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    } else {
7393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      NOTREACHED();
7403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The remaining settings don't support Set(), since they are not
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // intended to be customizable by the user:
7445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    //   kAccountsPrefTransferSAMLCookies
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kAppPack
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //   kDeviceAttestationEnabled
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kDeviceOwner
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kIdleLogoutTimeout
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kIdleLogoutWarningDuration
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReleaseChannelDelegated
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceActivityTimes
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceBootMode
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kReportDeviceLocation
754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    //   kReportDeviceVersionInfo
7557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    //   kReportDeviceNetworkInterfaces
7561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    //   kReportDeviceUsers
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kScreenSaverExtensionId
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kScreenSaverTimeout
759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    //   kServiceAccountIdentity
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kStartUpUrls
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   kSystemTimezonePolicy
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //   kVariationsRestrictParameter
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(FATAL) << "Device setting " << prop << " is read-only.";
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  em::PolicyData data;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.set_username(device_settings_service_->GetUsername());
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(device_settings_.SerializeToString(data.mutable_policy_value()));
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the cache to the updated value.
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateValuesCache(data, device_settings_, trusted_status_);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ownership_status_ == DeviceSettingsService::OWNERSHIP_TAKEN) {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StoreDeviceSettings();
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!device_settings_cache::Store(data, g_browser_process->local_state()))
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LOG(ERROR) << "Couldn't store to the temp storage.";
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // OnStorePolicyCompleted won't get called in this case so proceed with any
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pending operations immediately.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!pending_changes_.empty())
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetInPolicy();
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::UpdateValuesCache(
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::PolicyData& policy_data,
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const em::ChromeDeviceSettingsProto& settings,
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TrustedStatus trusted_status) {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefValueMap new_values_cache;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (policy_data.has_username() && !policy_data.has_request_token())
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_values_cache.SetString(kDeviceOwner, policy_data.username());
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (policy_data.has_service_account_identity()) {
797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    new_values_cache.SetString(kServiceAccountIdentity,
798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               policy_data.service_account_identity());
799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeLoginPolicies(settings, &new_values_cache);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeKioskPolicies(settings, &new_values_cache);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeNetworkPolicies(settings, &new_values_cache);
804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DecodeAutoUpdatePolicies(settings, &new_values_cache);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeReportingPolicies(settings, &new_values_cache);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecodeGenericPolicies(settings, &new_values_cache);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collect all notifications but send them only after we have swapped the
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cache so that if somebody actually reads the cache will be already valid.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> notifications;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Go through the new values and verify in the old ones.
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefValueMap::iterator iter = new_values_cache.begin();
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; iter != new_values_cache.end(); ++iter) {
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* old_value;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!values_cache_.GetValue(iter->first, &old_value) ||
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !old_value->Equals(iter->second)) {
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications.push_back(iter->first);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now check for values that have been removed from the policy blob.
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (iter = values_cache_.begin(); iter != values_cache_.end(); ++iter) {
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* value;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!new_values_cache.GetValue(iter->first, &value))
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications.push_back(iter->first);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Swap and notify.
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values_cache_.Swap(&new_values_cache);
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  trusted_status_ = trusted_status;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < notifications.size(); ++i)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyObservers(notifications[i]);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::ApplyMetricsSetting(bool use_file,
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 bool new_value) {
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once migration is not needed anymore.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the value is not set we should try to migrate legacy consent file.
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_file) {
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_value = HasOldMetricsFile();
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure the values will get eventually written to the policy file.
840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    migration_values_.SetBoolean(kStatsReportingPref, new_value);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AttemptMigration();
842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    VLOG(1) << "No metrics policy set will revert to checking "
843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            << "consent file which is "
844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            << (new_value ? "on." : "off.");
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("DeviceSettings.MetricsMigrated", 1);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Metrics policy is being set to : " << new_value
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "(use file : " << use_file << ")";
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(pastarmovj): Remove this once we don't need to regenerate the
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // consent file for the GUID anymore.
8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InitiateMetricsReportingChange(new_value, OnMetricsReportingCallbackType());
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::ApplySideEffects(
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const em::ChromeDeviceSettingsProto& settings) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First migrate metrics settings as needed.
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.has_metrics_enabled())
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(false, settings.metrics_enabled().metrics_enabled());
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ApplyMetricsSetting(true, false);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::MitigateMissingPolicy() {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First check if the device has been owned already and if not exit
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immediately.
8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (connector->GetDeviceMode() != policy::DEVICE_MODE_CONSUMER)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are here the policy file were corrupted or missing. This can happen
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because we are migrating Pre R11 device to the new secure policies or there
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was an attempt to circumvent policy system. In this case we should populate
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the policy cache with "safe-mode" defaults which should allow the owner to
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // log in but lock the device for anyone else until the policy blob has been
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recreated by the session manager.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "Corruption of the policy data has been detected."
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "Switching to \"safe-mode\" policies until the owner logs in "
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << "to regenerate the policy data.";
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.Clear();
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.mutable_allow_new_users()->set_allow_new_users(true);
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_.mutable_guest_mode_enabled()->set_guest_mode_enabled(true);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  em::PolicyData empty_policy_data;
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateValuesCache(empty_policy_data, device_settings_, TRUSTED);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values_cache_.SetBoolean(kPolicyMissingMitigationMode, true);
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::Value* DeviceSettingsProvider::Get(const std::string& path) const {
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsDeviceSetting(path)) {
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Value* value;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (values_cache_.GetValue(path, &value))
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Trying to get non cros setting.";
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::TrustedStatus
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeviceSettingsProvider::PrepareTrustedValues(const base::Closure& cb) {
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrustedStatus status = RequestTrustedEntity();
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == TEMPORARILY_UNTRUSTED && !cb.is_null())
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks_.push_back(cb);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::HandlesSetting(const std::string& path) const {
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsDeviceSetting(path);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceSettingsProvider::TrustedStatus
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeviceSettingsProvider::RequestTrustedEntity() {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRUSTED;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return trusted_status_;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::UpdateAndProceedStoring() {
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-sync the cache from the service.
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateFromService();
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Trigger the next change if necessary.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (trusted_status_ == TRUSTED && !pending_changes_.empty())
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInPolicy();
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceSettingsProvider::UpdateFromService() {
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool settings_loaded = false;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (device_settings_service_->status()) {
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_SUCCESS: {
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const em::PolicyData* policy_data =
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          device_settings_service_->policy_data();
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const em::ChromeDeviceSettingsProto* device_settings =
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          device_settings_service_->device_settings();
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (policy_data && device_settings) {
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!device_settings_cache::Store(*policy_data,
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          g_browser_process->local_state())) {
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          LOG(ERROR) << "Couldn't update the local state cache.";
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        UpdateValuesCache(*policy_data, *device_settings, TRUSTED);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        device_settings_ = *device_settings;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(pastarmovj): Make those side effects responsibility of the
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // respective subsystems.
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ApplySideEffects(*device_settings);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        settings_loaded = true;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Initial policy load is still pending.
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        trusted_status_ = TEMPORARILY_UNTRUSTED;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_NO_POLICY:
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (MitigateMissingPolicy())
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // fall through.
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_KEY_UNAVAILABLE:
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << "No policies present yet, will use the temp storage.";
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_POLICY_ERROR:
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_VALIDATION_ERROR:
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_INVALID_POLICY:
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_OPERATION_FAILED:
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to retrieve cros policies. Reason: "
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << device_settings_service_->status();
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR:
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The policy has failed to validate due to temporary error but it might
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // take a long time until we recover so behave as it is a permanent error.
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(ERROR) << "Failed to retrieve cros policies because a temporary "
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "validation error has occurred. Retrying might succeed.";
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trusted_status_ = PERMANENTLY_UNTRUSTED;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the observers we are done.
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<base::Closure> callbacks;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callbacks.swap(callbacks_);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < callbacks.size(); ++i)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbacks[i].Run();
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return settings_loaded;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::StoreDeviceSettings() {
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mute all previous callbacks to guarantee the |pending_changes_| queue is
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // processed serially.
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store_callback_factory_.InvalidateWeakPtrs();
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  device_settings_service_->SignAndStore(
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<em::ChromeDeviceSettingsProto>(
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new em::ChromeDeviceSettingsProto(device_settings_)),
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&DeviceSettingsProvider::UpdateAndProceedStoring,
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 store_callback_factory_.GetWeakPtr()));
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceSettingsProvider::AttemptMigration() {
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (device_settings_service_->HasPrivateOwnerKey()) {
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefValueMap::const_iterator i;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (i = migration_values_.begin(); i != migration_values_.end(); ++i)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DoSet(i->first, *i->second);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    migration_values_.Clear();
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1014