profile_policy_connector_factory.cc revision f2477e01787aa58f445919b809d89e252beef54f
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/profile_policy_connector_factory.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/memory/singleton.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/profile_policy_connector.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "chrome/common/pref_names.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "components/user_prefs/pref_registry_syncable.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service_factory.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/login/user.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace policy {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnectorFactory* ProfilePolicyConnectorFactory::GetInstance() {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return Singleton<ProfilePolicyConnectorFactory>::get();
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnector* ProfilePolicyConnectorFactory::GetForProfile(
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile) {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return GetInstance()->GetForProfileInternal(profile);
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<ProfilePolicyConnector>
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)ProfilePolicyConnectorFactory::CreateForProfile(Profile* profile,
460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                                bool force_immediate_load) {
478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return GetInstance()->CreateForProfileInternal(profile, force_immediate_load);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfilePolicyConnectorFactory::SetServiceForTesting(
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile,
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProfilePolicyConnector* connector) {
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProfilePolicyConnector*& map_entry = connectors_[profile];
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(!map_entry);
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  map_entry = connector;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnectorFactory::ProfilePolicyConnectorFactory()
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : BrowserContextKeyedBaseFactory(
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        "ProfilePolicyConnector",
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        BrowserContextDependencyManager::GetInstance()) {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DependsOn(SchemaRegistryServiceFactory::GetInstance());
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DependsOn(UserCloudPolicyManagerFactoryChromeOS::GetInstance());
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DependsOn(UserCloudPolicyManagerFactory::GetInstance());
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnectorFactory::~ProfilePolicyConnectorFactory() {
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(connectors_.empty());
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnector*
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProfilePolicyConnectorFactory::GetForProfileInternal(Profile* profile) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get the connector for the original Profile, so that the incognito Profile
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // gets managed settings from the same PolicyService.
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ConnectorMap::const_iterator it =
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      connectors_.find(profile->GetOriginalProfile());
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(it != connectors_.end());
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return it->second;
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<ProfilePolicyConnector>
870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)ProfilePolicyConnectorFactory::CreateForProfileInternal(
880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    Profile* profile,
890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    bool force_immediate_load) {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(connectors_.find(profile) == connectors_.end());
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SchemaRegistry* schema_registry = NULL;
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CloudPolicyManager* user_cloud_policy_manager = NULL;
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  schema_registry = SchemaRegistryServiceFactory::GetForContext(profile);
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  chromeos::User* user = NULL;
1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!chromeos::ProfileHelper::IsSigninProfile(profile)) {
1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    chromeos::UserManager* user_manager = chromeos::UserManager::Get();
1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    user = user_manager->GetUserByProfile(profile);
1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CHECK(user);
1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  user_cloud_policy_manager =
1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      UserCloudPolicyManagerFactoryChromeOS::GetForProfile(profile);
1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#else
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  user_cloud_policy_manager =
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      UserCloudPolicyManagerFactory::GetForBrowserContext(profile);
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // defined(OS_CHROMEOS)
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // defined(ENABLE_CONFIGURATION_POLICY)
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfilePolicyConnector* connector = new ProfilePolicyConnector();
1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  connector->Init(force_immediate_load,
1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) && defined(OS_CHROMEOS)
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  user,
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  schema_registry,
1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  user_cloud_policy_manager);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connectors_[profile] = connector;
1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return make_scoped_ptr(connector);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ProfilePolicyConnectorFactory::BrowserContextShutdown(
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile = static_cast<Profile*>(context);
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (profile->IsOffTheRecord())
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ConnectorMap::iterator it = connectors_.find(profile);
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (it != connectors_.end())
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    it->second->Shutdown();
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ProfilePolicyConnectorFactory::BrowserContextDestroyed(
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ConnectorMap::iterator it = connectors_.find(static_cast<Profile*>(context));
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (it != connectors_.end())
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connectors_.erase(it);
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BrowserContextKeyedBaseFactory::BrowserContextDestroyed(context);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ProfilePolicyConnectorFactory::RegisterProfilePrefs(
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
144d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#if defined(OS_ANDROID)
145d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  registry->RegisterListPref(
146d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      prefs::kManagedBookmarks,
147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
148d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfilePolicyConnectorFactory::SetEmptyTestingFactory(
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {}
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfilePolicyConnectorFactory::CreateServiceNow(
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {}
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace policy
158