• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/policy/schema_registry_service_factory.h"
6 
7 #include "base/logging.h"
8 #include "chrome/browser/policy/schema_registry_service.h"
9 #include "components/keyed_service/content/browser_context_dependency_manager.h"
10 #include "components/policy/core/common/schema.h"
11 #include "components/policy/core/common/schema_registry.h"
12 #include "content/public/browser/browser_context.h"
13 
14 #if defined(OS_CHROMEOS)
15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/browser_process_platform_part_chromeos.h"
17 #include "chrome/browser/chromeos/login/users/user.h"
18 #include "chrome/browser/chromeos/login/users/user_manager.h"
19 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
20 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
21 #include "chrome/browser/chromeos/profiles/profile_helper.h"
22 #include "chrome/browser/profiles/profile.h"
23 #endif
24 
25 namespace policy {
26 
27 #if defined(OS_CHROMEOS)
28 namespace {
29 
GetBroker(content::BrowserContext * context)30 DeviceLocalAccountPolicyBroker* GetBroker(content::BrowserContext* context) {
31   Profile* profile = Profile::FromBrowserContext(context);
32 
33   if (chromeos::ProfileHelper::IsSigninProfile(profile))
34     return NULL;
35 
36   if (!chromeos::UserManager::IsInitialized()) {
37     // Bail out in unit tests that don't have a UserManager.
38     return NULL;
39   }
40 
41   chromeos::UserManager* user_manager = chromeos::UserManager::Get();
42   chromeos::User* user = user_manager->GetUserByProfile(profile);
43   if (!user)
44     return NULL;
45 
46   BrowserPolicyConnectorChromeOS* connector =
47       g_browser_process->platform_part()->browser_policy_connector_chromeos();
48   DeviceLocalAccountPolicyService* service =
49       connector->GetDeviceLocalAccountPolicyService();
50   if (!service)
51     return NULL;
52 
53   return service->GetBrokerForUser(user->email());
54 }
55 
56 }  // namespace
57 #endif  // OS_CHROMEOS
58 
59 // static
GetInstance()60 SchemaRegistryServiceFactory* SchemaRegistryServiceFactory::GetInstance() {
61   return Singleton<SchemaRegistryServiceFactory>::get();
62 }
63 
64 // static
GetForContext(content::BrowserContext * context)65 SchemaRegistryService* SchemaRegistryServiceFactory::GetForContext(
66     content::BrowserContext* context) {
67   return GetInstance()->GetForContextInternal(context);
68 }
69 
70 // static
71 scoped_ptr<SchemaRegistryService>
CreateForContext(content::BrowserContext * context,const Schema & chrome_schema,CombinedSchemaRegistry * global_registry)72 SchemaRegistryServiceFactory::CreateForContext(
73     content::BrowserContext* context,
74     const Schema& chrome_schema,
75     CombinedSchemaRegistry* global_registry) {
76   return GetInstance()->CreateForContextInternal(
77       context, chrome_schema, global_registry);
78 }
79 
SchemaRegistryServiceFactory()80 SchemaRegistryServiceFactory::SchemaRegistryServiceFactory()
81     : BrowserContextKeyedBaseFactory(
82           "SchemaRegistryService",
83           BrowserContextDependencyManager::GetInstance()) {}
84 
~SchemaRegistryServiceFactory()85 SchemaRegistryServiceFactory::~SchemaRegistryServiceFactory() {}
86 
GetForContextInternal(content::BrowserContext * context)87 SchemaRegistryService* SchemaRegistryServiceFactory::GetForContextInternal(
88     content::BrowserContext* context) {
89   // Off-the-record Profiles get their policy from the main Profile's
90   // PolicyService, and don't need their own SchemaRegistry nor any policy
91   // providers.
92   if (context->IsOffTheRecord())
93     return NULL;
94   RegistryMap::const_iterator it = registries_.find(context);
95   CHECK(it != registries_.end());
96   return it->second;
97 }
98 
99 scoped_ptr<SchemaRegistryService>
CreateForContextInternal(content::BrowserContext * context,const Schema & chrome_schema,CombinedSchemaRegistry * global_registry)100 SchemaRegistryServiceFactory::CreateForContextInternal(
101     content::BrowserContext* context,
102     const Schema& chrome_schema,
103     CombinedSchemaRegistry* global_registry) {
104   DCHECK(!context->IsOffTheRecord());
105   DCHECK(registries_.find(context) == registries_.end());
106 
107   scoped_ptr<SchemaRegistry> registry;
108 
109 #if defined(OS_CHROMEOS)
110   DeviceLocalAccountPolicyBroker* broker = GetBroker(context);
111   if (broker) {
112     // The SchemaRegistry for a device-local account is owned by its
113     // DeviceLocalAccountPolicyBroker, which uses the registry to fetch and
114     // cache policy even if there is no active session for that account.
115     // Use a ForwardingSchemaRegistry that wraps this SchemaRegistry.
116     registry.reset(new ForwardingSchemaRegistry(broker->schema_registry()));
117   }
118 #endif
119 
120   if (!registry)
121     registry.reset(new SchemaRegistry);
122 
123   scoped_ptr<SchemaRegistryService> service(new SchemaRegistryService(
124       registry.Pass(), chrome_schema, global_registry));
125   registries_[context] = service.get();
126   return service.Pass();
127 }
128 
BrowserContextShutdown(content::BrowserContext * context)129 void SchemaRegistryServiceFactory::BrowserContextShutdown(
130     content::BrowserContext* context) {
131   if (context->IsOffTheRecord())
132     return;
133   RegistryMap::iterator it = registries_.find(context);
134   if (it != registries_.end())
135     it->second->Shutdown();
136   else
137     NOTREACHED();
138 }
139 
BrowserContextDestroyed(content::BrowserContext * context)140 void SchemaRegistryServiceFactory::BrowserContextDestroyed(
141     content::BrowserContext* context) {
142   registries_.erase(context);
143   BrowserContextKeyedBaseFactory::BrowserContextDestroyed(context);
144 }
145 
SetEmptyTestingFactory(content::BrowserContext * context)146 void SchemaRegistryServiceFactory::SetEmptyTestingFactory(
147     content::BrowserContext* context) {}
148 
HasTestingFactory(content::BrowserContext * context)149 bool SchemaRegistryServiceFactory::HasTestingFactory(
150     content::BrowserContext* context) {
151   return false;
152 }
153 
CreateServiceNow(content::BrowserContext * context)154 void SchemaRegistryServiceFactory::CreateServiceNow(
155     content::BrowserContext* context) {}
156 
157 }  // namespace policy
158