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