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"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/policy/core/common/policy_service.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service_factory.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/policy/core/common/policy_service_impl.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace policy {
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnectorFactory* ProfilePolicyConnectorFactory::GetInstance() {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return Singleton<ProfilePolicyConnectorFactory>::get();
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnector* ProfilePolicyConnectorFactory::GetForProfile(
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return GetInstance()->GetForProfileInternal(profile);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<ProfilePolicyConnector>
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)ProfilePolicyConnectorFactory::CreateForProfile(Profile* profile,
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                                bool force_immediate_load) {
468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return GetInstance()->CreateForProfileInternal(profile, force_immediate_load);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfilePolicyConnectorFactory::SetServiceForTesting(
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* profile,
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProfilePolicyConnector* connector) {
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProfilePolicyConnector*& map_entry = connectors_[profile];
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(!map_entry);
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  map_entry = connector;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_CONFIGURATION_POLICY)
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ProfilePolicyConnectorFactory::PushProviderForTesting(
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ConfigurationPolicyProvider* provider) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_providers_.push_back(provider);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnectorFactory::ProfilePolicyConnectorFactory()
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : BrowserContextKeyedBaseFactory(
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        "ProfilePolicyConnector",
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        BrowserContextDependencyManager::GetInstance()) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DependsOn(SchemaRegistryServiceFactory::GetInstance());
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DependsOn(UserCloudPolicyManagerFactoryChromeOS::GetInstance());
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DependsOn(UserCloudPolicyManagerFactory::GetInstance());
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnectorFactory::~ProfilePolicyConnectorFactory() {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(connectors_.empty());
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ProfilePolicyConnector*
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProfilePolicyConnectorFactory::GetForProfileInternal(Profile* profile) {
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get the connector for the original Profile, so that the incognito Profile
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // gets managed settings from the same PolicyService.
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ConnectorMap::const_iterator it =
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      connectors_.find(profile->GetOriginalProfile());
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(it != connectors_.end());
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return it->second;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<ProfilePolicyConnector>
930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)ProfilePolicyConnectorFactory::CreateForProfileInternal(
940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    Profile* profile,
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    bool force_immediate_load) {
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(connectors_.find(profile) == connectors_.end());
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SchemaRegistry* schema_registry = NULL;
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CloudPolicyManager* user_cloud_policy_manager = NULL;
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  schema_registry =
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      SchemaRegistryServiceFactory::GetForContext(profile)->registry();
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  user_manager::User* user = NULL;
1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!chromeos::ProfileHelper::IsSigninProfile(profile)) {
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    user = chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CHECK(user);
1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  user_cloud_policy_manager =
1120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      UserCloudPolicyManagerFactoryChromeOS::GetForProfile(profile);
1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#else
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  user_cloud_policy_manager =
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      UserCloudPolicyManagerFactory::GetForBrowserContext(profile);
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // defined(OS_CHROMEOS)
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // defined(ENABLE_CONFIGURATION_POLICY)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ProfilePolicyConnector* connector = new ProfilePolicyConnector();
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_CONFIGURATION_POLICY)
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (test_providers_.empty()) {
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connector->Init(force_immediate_load,
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    user,
1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    schema_registry,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    user_cloud_policy_manager);
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PolicyServiceImpl::Providers providers;
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    providers.push_back(test_providers_.front());
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_providers_.pop_front();
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<PolicyService> service(new PolicyServiceImpl(providers));
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connector->InitForTesting(service.Pass());
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  connector->Init(false, NULL, NULL);
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connectors_[profile] = connector;
1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return make_scoped_ptr(connector);
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ProfilePolicyConnectorFactory::BrowserContextShutdown(
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile = static_cast<Profile*>(context);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (profile->IsOffTheRecord())
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ConnectorMap::iterator it = connectors_.find(profile);
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (it != connectors_.end())
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    it->second->Shutdown();
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ProfilePolicyConnectorFactory::BrowserContextDestroyed(
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ConnectorMap::iterator it = connectors_.find(static_cast<Profile*>(context));
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (it != connectors_.end())
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connectors_.erase(it);
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BrowserContextKeyedBaseFactory::BrowserContextDestroyed(context);
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfilePolicyConnectorFactory::SetEmptyTestingFactory(
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {}
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ProfilePolicyConnectorFactory::HasTestingFactory(
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::BrowserContext* context) {
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ProfilePolicyConnectorFactory::CreateServiceNow(
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) {}
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace policy
174