browser_policy_connector_chromeos.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <string>
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/command_line.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file_path.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/path_service.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/sequenced_task_runner.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/app_pack_updater.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_network_configuration_updater.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_status_collector.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/policy/device_management_service_configuration.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/pref_names.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/chromeos_paths.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/chromeos_switches.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/cryptohome/system_salt_getter.h"
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/network/network_handler.h"
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/network/onc/onc_certificate_importer_impl.h"
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/settings/cros_settings_provider.h"
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/settings/timezone_settings.h"
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/system/statistics_provider.h"
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_client.h"
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h"
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/proxy_policy_provider.h"
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h"
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::BrowserThread;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace policy {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// TODO(davidyu): Update the URL to the real one once it is ready.
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// http://crbug.com/366491.
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu//
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// The URL for the consumer device management server.
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst char kDefaultConsumerDeviceManagementServerUrl[] =
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "https://m.google.com/devicemanagement/data/api";
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Install attributes for tests.
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)EnterpriseInstallAttributes* g_testing_install_attributes = NULL;
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper that returns a new SequencedTaskRunner backed by the blocking pool.
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Each SequencedTaskRunner returned is independent from the others.
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() {
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CHECK(pool);
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return pool->GetSequencedTaskRunnerWithShutdownBehavior(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pool->GetSequenceToken(), base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustd::string GetConsumerDeviceManagementServerUrl() {
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const CommandLine* command_line = CommandLine::ForCurrentProcess();
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (command_line->HasSwitch(
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          chromeos::switches::kConsumerDeviceManagementUrl)) {
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return command_line->GetSwitchValueASCII(
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        chromeos::switches::kConsumerDeviceManagementUrl);
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return kDefaultConsumerDeviceManagementServerUrl;
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserPolicyConnectorChromeOS::BrowserPolicyConnectorChromeOS()
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : device_cloud_policy_manager_(NULL),
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      global_user_cloud_policy_provider_(NULL),
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      weak_ptr_factory_(this) {
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (g_testing_install_attributes) {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    install_attributes_.reset(g_testing_install_attributes);
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    g_testing_install_attributes = NULL;
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SystemSaltGetter or DBusThreadManager may be uninitialized on unit tests.
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(satorux): Remove SystemSaltGetter::IsInitialized() when it's ready
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // (removing it now breaks tests). crbug.com/141016.
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (chromeos::SystemSaltGetter::IsInitialized() &&
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chromeos::DBusThreadManager::IsInitialized()) {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    chromeos::CryptohomeClient* cryptohome_client =
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        chromeos::DBusThreadManager::Get()->GetCryptohomeClient();
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!install_attributes_) {
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      install_attributes_.reset(
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          new EnterpriseInstallAttributes(cryptohome_client));
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath install_attrs_file;
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CHECK(PathService::Get(chromeos::FILE_INSTALL_ATTRIBUTES,
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           &install_attrs_file));
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    install_attributes_->ReadCacheFile(install_attrs_file);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<DeviceCloudPolicyStoreChromeOS> device_cloud_policy_store(
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new DeviceCloudPolicyStoreChromeOS(
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            chromeos::DeviceSettingsService::Get(),
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            install_attributes_.get(),
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetBackgroundTaskRunner()));
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    device_cloud_policy_manager_ =
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new DeviceCloudPolicyManagerChromeOS(device_cloud_policy_store.Pass(),
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             base::MessageLoopProxy::current(),
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             GetBackgroundTaskRunner(),
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             install_attributes_.get());
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AddPolicyProvider(
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scoped_ptr<ConfigurationPolicyProvider>(device_cloud_policy_manager_));
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  global_user_cloud_policy_provider_ = new ProxyPolicyProvider();
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddPolicyProvider(scoped_ptr<ConfigurationPolicyProvider>(
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      global_user_cloud_policy_provider_));
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)BrowserPolicyConnectorChromeOS::~BrowserPolicyConnectorChromeOS() {}
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnectorChromeOS::Init(
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefService* local_state,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context) {
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ChromeBrowserPolicyConnector::Init(local_state, request_context);
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<DeviceManagementService::Configuration> configuration(
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new DeviceManagementServiceConfiguration(
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          GetConsumerDeviceManagementServerUrl()));
1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  consumer_device_management_service_.reset(
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new DeviceManagementService(configuration.Pass()));
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  consumer_device_management_service_->ScheduleInitialization(
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      kServiceInitializationStartupDelay);
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (device_cloud_policy_manager_) {
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Note: for now the |device_cloud_policy_manager_| is using the global
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // schema registry. Eventually it will have its own registry, once device
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // cloud policy for extensions is introduced. That means it'd have to be
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // initialized from here instead of BrowserPolicyConnector::Init().
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<CloudPolicyClient::StatusProvider> status_provider(
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new DeviceStatusCollector(
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            local_state,
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            chromeos::system::StatisticsProvider::GetInstance(),
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            NULL));
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    device_cloud_policy_manager_->Connect(
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        local_state, device_management_service(), status_provider.Pass());
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  device_local_account_policy_service_.reset(
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      new DeviceLocalAccountPolicyService(
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          chromeos::DBusThreadManager::Get()->GetSessionManagerClient(),
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          chromeos::DeviceSettingsService::Get(),
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          chromeos::CrosSettings::Get(),
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          GetBackgroundTaskRunner(),
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          GetBackgroundTaskRunner(),
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          GetBackgroundTaskRunner(),
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          content::BrowserThread::GetMessageLoopProxyForThread(
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              content::BrowserThread::IO),
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          request_context));
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  device_local_account_policy_service_->Connect(device_management_service());
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // request_context is NULL in unit tests.
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (request_context && install_attributes_) {
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    app_pack_updater_.reset(
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new AppPackUpdater(request_context, install_attributes_.get()));
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetTimezoneIfPolicyAvailable();
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  network_configuration_updater_ =
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DeviceNetworkConfigurationUpdater::CreateForDevicePolicy(
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          GetPolicyService(),
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          chromeos::NetworkHandler::Get()
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ->managed_network_configuration_handler(),
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          chromeos::NetworkHandler::Get()->network_device_handler(),
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          chromeos::CrosSettings::Get());
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnectorChromeOS::Shutdown() {
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The AppPackUpdater may be observing the |device_cloud_policy_manager_|.
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Delete it first.
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  app_pack_updater_.reset();
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  network_configuration_updater_.reset();
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (device_local_account_policy_service_)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    device_local_account_policy_service_->Shutdown();
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ChromeBrowserPolicyConnector::Shutdown();
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool BrowserPolicyConnectorChromeOS::IsEnterpriseManaged() {
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return install_attributes_ && install_attributes_->IsEnterpriseDevice();
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string BrowserPolicyConnectorChromeOS::GetEnterpriseDomain() {
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return install_attributes_ ? install_attributes_->GetDomain() : std::string();
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DeviceMode BrowserPolicyConnectorChromeOS::GetDeviceMode() {
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return install_attributes_ ? install_attributes_->GetMode()
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             : DEVICE_MODE_NOT_SET;
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UserAffiliation BrowserPolicyConnectorChromeOS::GetUserAffiliation(
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& user_name) {
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // An empty username means incognito user in case of ChromiumOS and
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // no logged-in user in case of Chromium (SigninService). Many tests use
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // nonsense email addresses (e.g. 'test') so treat those as non-enterprise
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // users.
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (user_name.empty() || user_name.find('@') == std::string::npos)
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return USER_AFFILIATION_NONE;
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (install_attributes_ &&
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      (gaia::ExtractDomainName(gaia::CanonicalizeEmail(user_name)) ==
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           install_attributes_->GetDomain() ||
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       policy::IsDeviceLocalAccountUser(user_name, NULL))) {
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return USER_AFFILIATION_MANAGED;
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return USER_AFFILIATION_NONE;
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AppPackUpdater* BrowserPolicyConnectorChromeOS::GetAppPackUpdater() {
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return app_pack_updater_.get();
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnectorChromeOS::SetUserPolicyDelegate(
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ConfigurationPolicyProvider* user_policy_provider) {
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  global_user_cloud_policy_provider_->SetDelegate(user_policy_provider);
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnectorChromeOS::SetInstallAttributesForTesting(
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EnterpriseInstallAttributes* attributes) {
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!g_testing_install_attributes);
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_testing_install_attributes = attributes;
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid BrowserPolicyConnectorChromeOS::RemoveInstallAttributesForTesting() {
2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (g_testing_install_attributes) {
2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    delete g_testing_install_attributes;
2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    g_testing_install_attributes = NULL;
2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnectorChromeOS::RegisterPrefs(
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefRegistrySimple* registry) {
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry->RegisterIntegerPref(
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs::kDevicePolicyRefreshRate,
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs);
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserPolicyConnectorChromeOS::SetTimezoneIfPolicyAvailable() {
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef chromeos::CrosSettingsProvider Provider;
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Provider::TrustedStatus result =
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chromeos::CrosSettings::Get()->PrepareTrustedValues(base::Bind(
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &BrowserPolicyConnectorChromeOS::SetTimezoneIfPolicyAvailable,
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          weak_ptr_factory_.GetWeakPtr()));
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (result != Provider::TRUSTED)
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string timezone;
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (chromeos::CrosSettings::Get()->GetString(chromeos::kSystemTimezonePolicy,
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               &timezone) &&
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !timezone.empty()) {
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    chromeos::system::TimezoneSettings::GetInstance()->SetTimezoneFromID(
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF8ToUTF16(timezone));
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace policy
283