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