1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service_factory.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_dependency_manager.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema_registry.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_context.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(OS_CHROMEOS)
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/browser_process.h"
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/browser_process_platform_part_chromeos.h"
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace policy {
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(OS_CHROMEOS)
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace {
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)DeviceLocalAccountPolicyBroker* GetBroker(content::BrowserContext* context) {
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(context);
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (chromeos::ProfileHelper::IsSigninProfile(profile))
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return NULL;
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!user_manager::UserManager::IsInitialized()) {
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Bail out in unit tests that don't have a UserManager.
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return NULL;
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  user_manager::User* user =
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!user)
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return NULL;
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  BrowserPolicyConnectorChromeOS* connector =
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DeviceLocalAccountPolicyService* service =
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      connector->GetDeviceLocalAccountPolicyService();
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!service)
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return NULL;
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return service->GetBrokerForUser(user->email());
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif  // OS_CHROMEOS
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SchemaRegistryServiceFactory* SchemaRegistryServiceFactory::GetInstance() {
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return Singleton<SchemaRegistryServiceFactory>::get();
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SchemaRegistryService* SchemaRegistryServiceFactory::GetForContext(
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetInstance()->GetForContextInternal(context);
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<SchemaRegistryService>
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SchemaRegistryServiceFactory::CreateForContext(
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context,
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const Schema& chrome_schema,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CombinedSchemaRegistry* global_registry) {
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return GetInstance()->CreateForContextInternal(
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context, chrome_schema, global_registry);
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SchemaRegistryServiceFactory::SchemaRegistryServiceFactory()
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : BrowserContextKeyedBaseFactory(
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          "SchemaRegistryService",
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          BrowserContextDependencyManager::GetInstance()) {}
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SchemaRegistryServiceFactory::~SchemaRegistryServiceFactory() {}
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SchemaRegistryService* SchemaRegistryServiceFactory::GetForContextInternal(
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Off-the-record Profiles get their policy from the main Profile's
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // PolicyService, and don't need their own SchemaRegistry nor any policy
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // providers.
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (context->IsOffTheRecord())
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return NULL;
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RegistryMap::const_iterator it = registries_.find(context);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CHECK(it != registries_.end());
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return it->second;
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<SchemaRegistryService>
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SchemaRegistryServiceFactory::CreateForContextInternal(
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context,
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const Schema& chrome_schema,
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CombinedSchemaRegistry* global_registry) {
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(!context->IsOffTheRecord());
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(registries_.find(context) == registries_.end());
1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<SchemaRegistry> registry;
1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#if defined(OS_CHROMEOS)
1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  DeviceLocalAccountPolicyBroker* broker = GetBroker(context);
1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (broker) {
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // The SchemaRegistry for a device-local account is owned by its
1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // DeviceLocalAccountPolicyBroker, which uses the registry to fetch and
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // cache policy even if there is no active session for that account.
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Use a ForwardingSchemaRegistry that wraps this SchemaRegistry.
1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    registry.reset(new ForwardingSchemaRegistry(broker->schema_registry()));
1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!registry)
1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    registry.reset(new SchemaRegistry);
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_ptr<SchemaRegistryService> service(new SchemaRegistryService(
1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      registry.Pass(), chrome_schema, global_registry));
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  registries_[context] = service.get();
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return service.Pass();
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SchemaRegistryServiceFactory::BrowserContextShutdown(
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (context->IsOffTheRecord())
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RegistryMap::iterator it = registries_.find(context);
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (it != registries_.end())
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    it->second->Shutdown();
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  else
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NOTREACHED();
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SchemaRegistryServiceFactory::BrowserContextDestroyed(
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  registries_.erase(context);
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserContextKeyedBaseFactory::BrowserContextDestroyed(context);
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SchemaRegistryServiceFactory::SetEmptyTestingFactory(
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {}
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool SchemaRegistryServiceFactory::HasTestingFactory(
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::BrowserContext* context) {
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SchemaRegistryServiceFactory::CreateServiceNow(
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    content::BrowserContext* context) {}
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace policy
158