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