user_cloud_policy_manager_factory.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/files/file_path.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/sequenced_task_runner.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_store.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/policy/schema_registry_service_factory.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_dependency_manager.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_keyed_service.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_external_data_manager.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/browser_context.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Directory inside the profile directory where policy-related resources are 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// stored. 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const base::FilePath::CharType kPolicy[] = FILE_PATH_LITERAL("Policy"); 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Directory under kPolicy, in the user's profile dir, where policy for 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// components is cached. 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const base::FilePath::CharType kComponentsDir[] = 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FILE_PATH_LITERAL("Components"); 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// A BrowserContextKeyedService that wraps a UserCloudPolicyManager. 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class UserCloudPolicyManagerFactory::ManagerWrapper 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : public BrowserContextKeyedService { 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) explicit ManagerWrapper(UserCloudPolicyManager* manager) 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : manager_(manager) {} 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~ManagerWrapper() {} 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void Shutdown() OVERRIDE { 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager_->Shutdown(); 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserCloudPolicyManager* manager() { return manager_; } 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserCloudPolicyManager* manager_; 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ManagerWrapper); 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserCloudPolicyManagerFactory* UserCloudPolicyManagerFactory::GetInstance() { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Singleton<UserCloudPolicyManagerFactory>::get(); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager* UserCloudPolicyManagerFactory::GetForBrowserContext( 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetInstance()->GetManagerForBrowserContext(context); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<UserCloudPolicyManager> 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::CreateForOriginalBrowserContext( 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context, 708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool force_immediate_load, 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& file_task_runner, 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) { 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetInstance()->CreateManagerForOriginalBrowserContext( 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) context, 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) force_immediate_load, 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) background_task_runner, 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_task_runner, 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) io_task_runner); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// static 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager* 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::RegisterForOffTheRecordBrowserContext( 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* original_context, 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* off_the_record_context) { 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetInstance()->RegisterManagerForOffTheRecordBrowserContext( 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) original_context, off_the_record_context); 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserCloudPolicyManagerFactory::RegisterForTesting( 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::BrowserContext* context, 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserCloudPolicyManager* manager) { 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ManagerWrapper*& manager_wrapper = manager_wrappers_[context]; 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delete manager_wrapper; 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager_wrapper = new ManagerWrapper(manager); 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserCloudPolicyManagerFactory::UserCloudPolicyManagerFactory() 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : BrowserContextKeyedBaseFactory( 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "UserCloudPolicyManager", 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserContextDependencyManager::GetInstance()) { 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DependsOn(SchemaRegistryServiceFactory::GetInstance()); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UserCloudPolicyManagerFactory::~UserCloudPolicyManagerFactory() { 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(manager_wrappers_.empty()); 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager* 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::GetManagerForBrowserContext( 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // In case |context| is an incognito Profile/Context, |manager_wrappers_| 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // will have a matching entry pointing to the manager of the original context. 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ManagerWrapperMap::const_iterator it = manager_wrappers_.find(context); 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return it != manager_wrappers_.end() ? it->second->manager() : NULL; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<UserCloudPolicyManager> 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::CreateManagerForOriginalBrowserContext( 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context, 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool force_immediate_load, 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& file_task_runner, 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) { 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!context->IsOffTheRecord()); 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<UserCloudPolicyStore> store( 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UserCloudPolicyStore::Create(context->GetPath(), background_task_runner)); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (force_immediate_load) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) store->LoadImmediately(); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::FilePath component_policy_cache_dir = 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) context->GetPath().Append(kPolicy).Append(kComponentsDir); 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<UserCloudPolicyManager> manager( 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new UserCloudPolicyManager(store.Pass(), 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) component_policy_cache_dir, 139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<CloudExternalDataManager>(), 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoopProxy::current(), 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_task_runner, 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) io_task_runner)); 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manager->Init(SchemaRegistryServiceFactory::GetForContext(context)); 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager_wrappers_[context] = new ManagerWrapper(manager.get()); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return manager.Pass(); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManager* 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UserCloudPolicyManagerFactory::RegisterManagerForOffTheRecordBrowserContext( 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* original_context, 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* off_the_record_context) { 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Register the UserCloudPolicyManager of the original context for the 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // respective incognito context. See also GetManagerForBrowserContext. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UserCloudPolicyManager* manager = 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetManagerForBrowserContext(original_context); 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager_wrappers_[off_the_record_context] = new ManagerWrapper(manager); 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return manager; 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void UserCloudPolicyManagerFactory::BrowserContextShutdown( 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::BrowserContext* context) { 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (context->IsOffTheRecord()) 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ManagerWrapperMap::iterator it = manager_wrappers_.find(context); 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // E.g. for a TestingProfile there might not be a manager created. 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (it != manager_wrappers_.end()) 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) it->second->Shutdown(); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserCloudPolicyManagerFactory::BrowserContextDestroyed( 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* context) { 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ManagerWrapperMap::iterator it = manager_wrappers_.find(context); 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (it != manager_wrappers_.end()) { 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The manager is not owned by the factory, so it's not deleted here. 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delete it->second; 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager_wrappers_.erase(it); 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserCloudPolicyManagerFactory::SetEmptyTestingFactory( 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::BrowserContext* context) {} 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UserCloudPolicyManagerFactory::CreateServiceNow( 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::BrowserContext* context) {} 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace policy 187