browser_policy_connector_chromeos.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// Copyright 2014 The Chromium Authors. All rights reserved. 2f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// Use of this source code is governed by a BSD-style license that can be 3f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// found in the LICENSE file. 4f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 5f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 6f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 7f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "base/command_line.h" 8f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "base/files/file_path.h" 9f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "base/logging.h" 10f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "base/message_loop/message_loop_proxy.h" 11f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "base/path_service.h" 124f3d8a644043f85063ef7aac1ff87bfd4d83ca4cTom Stellard#include "base/prefs/pref_registry_simple.h" 134f3d8a644043f85063ef7aac1ff87bfd4d83ca4cTom Stellard#include "base/sequenced_task_runner.h" 14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "base/strings/utf_string_conversions.h" 15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "base/threading/sequenced_worker_pool.h" 16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/policy/app_pack_updater.h" 17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" 18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h" 1958a2cbef4aac9ee7d530dfb690c78d6fc11a2371Chandler Carruth#include "chrome/browser/chromeos/policy/device_local_account.h" 20f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/policy/device_local_account_policy_service.h" 21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h" 22f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/policy/device_status_collector.h" 23f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/policy/enterprise_install_attributes.h" 24f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/settings/cros_settings.h" 25f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/browser/chromeos/settings/device_settings_service.h" 26f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chrome/common/pref_names.h" 27f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chromeos/chromeos_paths.h" 28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chromeos/chromeos_switches.h" 29f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chromeos/cryptohome/system_salt_getter.h" 30f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chromeos/dbus/dbus_thread_manager.h" 31f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chromeos/network/network_handler.h" 32f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chromeos/network/onc/onc_certificate_importer_impl.h" 33a39058aaed4540fc37681cad728b99546595b2e8David Blaikie#include "chromeos/settings/cros_settings_names.h" 34a39058aaed4540fc37681cad728b99546595b2e8David Blaikie#include "chromeos/settings/cros_settings_provider.h" 35f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chromeos/settings/timezone_settings.h" 36f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "chromeos/system/statistics_provider.h" 37f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "components/policy/core/common/cloud/cloud_policy_client.h" 38f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h" 39f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "components/policy/core/common/proxy_policy_provider.h" 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "content/public/browser/browser_thread.h" 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "google_apis/gaia/gaia_auth_util.h" 42f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "net/url_request/url_request_context_getter.h" 43f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing content::BrowserThread; 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesnamespace policy { 47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 48f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardnamespace { 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Install attributes for tests. 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesEnterpriseInstallAttributes* g_testing_install_attributes = NULL; 52f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 53f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// Helper that returns a new SequencedTaskRunner backed by the blocking pool. 54f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// Each SequencedTaskRunner returned is independent from the others. 55f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardscoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() { 56f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool(); 57f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard CHECK(pool); 58f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard return pool->GetSequencedTaskRunnerWithShutdownBehavior( 59f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard pool->GetSequenceToken(), base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); 60f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} 61f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 62f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} // namespace 63f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 64f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardBrowserPolicyConnectorChromeOS::BrowserPolicyConnectorChromeOS() 65f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard : device_cloud_policy_manager_(NULL), 66f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard global_user_cloud_policy_provider_(NULL), 67f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard weak_ptr_factory_(this) { 68f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard if (g_testing_install_attributes) 69f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard install_attributes_.reset(g_testing_install_attributes); 70f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 71f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard // SystemSaltGetter or DBusThreadManager may be uninitialized on unit tests. 72f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard // TODO(satorux): Remove SystemSaltGetter::IsInitialized() when it's ready 74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard // (removing it now breaks tests). crbug.com/141016. 75f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard if (chromeos::SystemSaltGetter::IsInitialized() && 76f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard chromeos::DBusThreadManager::IsInitialized()) { 77f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard chromeos::CryptohomeClient* cryptohome_client = 78f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard chromeos::DBusThreadManager::Get()->GetCryptohomeClient(); 79f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard if (!g_testing_install_attributes) { 80f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard install_attributes_.reset( 81f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard new EnterpriseInstallAttributes(cryptohome_client)); 82f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard } 83f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard base::FilePath install_attrs_file; 8434f533a6c351d8b255810c9b4b8713700e66ee88Tom Stellard CHECK(PathService::Get(chromeos::FILE_INSTALL_ATTRIBUTES, 8534f533a6c351d8b255810c9b4b8713700e66ee88Tom Stellard &install_attrs_file)); 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines install_attributes_->ReadCacheFile(install_attrs_file); 87f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 88f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard scoped_ptr<DeviceCloudPolicyStoreChromeOS> device_cloud_policy_store( 89f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard new DeviceCloudPolicyStoreChromeOS( 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines chromeos::DeviceSettingsService::Get(), 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines install_attributes_.get(), 9232c76107d029c1cad5935d08cdcde6139cf874bbTom Stellard GetBackgroundTaskRunner())); 9332c76107d029c1cad5935d08cdcde6139cf874bbTom Stellard device_cloud_policy_manager_ = 94b6379de427c009284d47c5fc764f11bbd2bf2484Vincent Lejeune new DeviceCloudPolicyManagerChromeOS(device_cloud_policy_store.Pass(), 952c836f84dba99e7b041909160c739db779760b79Vincent Lejeune base::MessageLoopProxy::current(), 96f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard GetBackgroundTaskRunner(), 97f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard install_attributes_.get()); 98f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard AddPolicyProvider( 9932c76107d029c1cad5935d08cdcde6139cf874bbTom Stellard scoped_ptr<ConfigurationPolicyProvider>(device_cloud_policy_manager_)); 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10132c76107d029c1cad5935d08cdcde6139cf874bbTom Stellard 102d6055262d23b1a8f2b5c74ab94fc6c143aca1c45Tom Stellard global_user_cloud_policy_provider_ = new ProxyPolicyProvider(); 103d6055262d23b1a8f2b5c74ab94fc6c143aca1c45Tom Stellard AddPolicyProvider(scoped_ptr<ConfigurationPolicyProvider>( 104d6055262d23b1a8f2b5c74ab94fc6c143aca1c45Tom Stellard global_user_cloud_policy_provider_)); 10532c76107d029c1cad5935d08cdcde6139cf874bbTom Stellard} 10632c76107d029c1cad5935d08cdcde6139cf874bbTom Stellard 10732c76107d029c1cad5935d08cdcde6139cf874bbTom StellardBrowserPolicyConnectorChromeOS::~BrowserPolicyConnectorChromeOS() {} 1082134219b654641a7e813d593f4491ad18133963cRafael Espindola 10932c76107d029c1cad5935d08cdcde6139cf874bbTom Stellardvoid BrowserPolicyConnectorChromeOS::Init( 110d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune PrefService* local_state, 111d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune scoped_refptr<net::URLRequestContextGetter> request_context) { 112eee6cdd7819b66e0d95a7a18337569b981374937Rafael Espindola ChromeBrowserPolicyConnector::Init(local_state, request_context); 113d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune 114d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune if (device_cloud_policy_manager_) { 115d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune // Note: for now the |device_cloud_policy_manager_| is using the global 116d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune // schema registry. Eventually it will have its own registry, once device 117d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune // cloud policy for extensions is introduced. That means it'd have to be 1187eac03220344d1b558ea6690cf73d2b76c7e551eRafael Espindola // initialized from here instead of BrowserPolicyConnector::Init(). 119d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune 120d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune scoped_ptr<CloudPolicyClient::StatusProvider> status_provider( 121d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune new DeviceStatusCollector( 122d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune local_state, 123d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune chromeos::system::StatisticsProvider::GetInstance(), 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines NULL)); 125d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune device_cloud_policy_manager_->Connect( 126d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune local_state, device_management_service(), status_provider.Pass()); 127d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune } 128d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune 129d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune CommandLine* command_line = CommandLine::ForCurrentProcess(); 130d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune if (!command_line->HasSwitch(chromeos::switches::kDisableLocalAccounts)) { 131d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune device_local_account_policy_service_.reset( 1322134219b654641a7e813d593f4491ad18133963cRafael Espindola new DeviceLocalAccountPolicyService( 133f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard chromeos::DBusThreadManager::Get()->GetSessionManagerClient(), 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines chromeos::DeviceSettingsService::Get(), 1350976e3c6d9b1bfaea1267188e6a20dc41318832aTom Stellard chromeos::CrosSettings::Get(), 1360976e3c6d9b1bfaea1267188e6a20dc41318832aTom Stellard GetBackgroundTaskRunner(), 1370976e3c6d9b1bfaea1267188e6a20dc41318832aTom Stellard GetBackgroundTaskRunner(), 1380976e3c6d9b1bfaea1267188e6a20dc41318832aTom Stellard GetBackgroundTaskRunner(), 1390976e3c6d9b1bfaea1267188e6a20dc41318832aTom Stellard content::BrowserThread::GetMessageLoopProxyForThread( 1400976e3c6d9b1bfaea1267188e6a20dc41318832aTom Stellard content::BrowserThread::IO), 1410976e3c6d9b1bfaea1267188e6a20dc41318832aTom Stellard request_context)); 14232c76107d029c1cad5935d08cdcde6139cf874bbTom Stellard device_local_account_policy_service_->Connect(device_management_service()); 143f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard } 144f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 145f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard // request_context is NULL in unit tests. 146f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard if (request_context && install_attributes_) { 147f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard app_pack_updater_.reset( 148f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard new AppPackUpdater(request_context, install_attributes_.get())); 149f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard } 150f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 151f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard SetTimezoneIfPolicyAvailable(); 152f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 153f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard network_configuration_updater_ = 154f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard DeviceNetworkConfigurationUpdater::CreateForDevicePolicy( 155f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard GetPolicyService(), 156f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard chromeos::NetworkHandler::Get() 157f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard ->managed_network_configuration_handler(), 158f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard chromeos::NetworkHandler::Get()->network_device_handler(), 159f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard chromeos::CrosSettings::Get()); 160f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard} 161f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 162f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid BrowserPolicyConnectorChromeOS::Shutdown() { 163f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard // The AppPackUpdater may be observing the |device_cloud_policy_manager_|. 164f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard // Delete it first. 165f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard app_pack_updater_.reset(); 166f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 167f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard network_configuration_updater_.reset(); 168f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 169f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard if (device_local_account_policy_service_) 170f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard device_local_account_policy_service_->Shutdown(); 171f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ChromeBrowserPolicyConnector::Shutdown(); 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 174f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 175cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool BrowserPolicyConnectorChromeOS::IsEnterpriseManaged() { 176f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard return install_attributes_ && install_attributes_->IsEnterpriseDevice(); 177cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 178f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 179cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstd::string BrowserPolicyConnectorChromeOS::GetEnterpriseDomain() { 180cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return install_attributes_ ? install_attributes_->GetDomain() : std::string(); 181cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 182f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard 183f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardDeviceMode BrowserPolicyConnectorChromeOS::GetDeviceMode() { 184f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard return install_attributes_ ? install_attributes_->GetMode() 185 : DEVICE_MODE_NOT_SET; 186} 187 188UserAffiliation BrowserPolicyConnectorChromeOS::GetUserAffiliation( 189 const std::string& user_name) { 190 // An empty username means incognito user in case of ChromiumOS and 191 // no logged-in user in case of Chromium (SigninService). Many tests use 192 // nonsense email addresses (e.g. 'test') so treat those as non-enterprise 193 // users. 194 if (user_name.empty() || user_name.find('@') == std::string::npos) 195 return USER_AFFILIATION_NONE; 196 197 if (install_attributes_ && 198 (gaia::ExtractDomainName(gaia::CanonicalizeEmail(user_name)) == 199 install_attributes_->GetDomain() || 200 policy::IsDeviceLocalAccountUser(user_name, NULL))) { 201 return USER_AFFILIATION_MANAGED; 202 } 203 204 return USER_AFFILIATION_NONE; 205} 206 207AppPackUpdater* BrowserPolicyConnectorChromeOS::GetAppPackUpdater() { 208 return app_pack_updater_.get(); 209} 210 211void BrowserPolicyConnectorChromeOS::SetUserPolicyDelegate( 212 ConfigurationPolicyProvider* user_policy_provider) { 213 global_user_cloud_policy_provider_->SetDelegate(user_policy_provider); 214} 215 216void BrowserPolicyConnectorChromeOS::SetInstallAttributesForTesting( 217 EnterpriseInstallAttributes* attributes) { 218 DCHECK(!g_testing_install_attributes); 219 g_testing_install_attributes = attributes; 220} 221 222// static 223void BrowserPolicyConnectorChromeOS::RegisterPrefs( 224 PrefRegistrySimple* registry) { 225 registry->RegisterIntegerPref( 226 prefs::kDevicePolicyRefreshRate, 227 CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs); 228} 229 230void BrowserPolicyConnectorChromeOS::SetTimezoneIfPolicyAvailable() { 231 typedef chromeos::CrosSettingsProvider Provider; 232 Provider::TrustedStatus result = 233 chromeos::CrosSettings::Get()->PrepareTrustedValues(base::Bind( 234 &BrowserPolicyConnectorChromeOS::SetTimezoneIfPolicyAvailable, 235 weak_ptr_factory_.GetWeakPtr())); 236 237 if (result != Provider::TRUSTED) 238 return; 239 240 std::string timezone; 241 if (chromeos::CrosSettings::Get()->GetString(chromeos::kSystemTimezonePolicy, 242 &timezone) && 243 !timezone.empty()) { 244 chromeos::system::TimezoneSettings::GetInstance()->SetTimezoneFromID( 245 base::UTF8ToUTF16(timezone)); 246 } 247} 248 249} // namespace policy 250