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