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