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