15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind_helpers.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/sequenced_task_runner.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_external_data_manager.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_constants.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_service.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/cloud/user_cloud_policy_store.h"
148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "components/policy/core/common/policy_pref_names.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace em = enterprise_management;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserCloudPolicyManager::UserCloudPolicyManager(
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scoped_ptr<UserCloudPolicyStore> store,
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::FilePath& component_policy_cache_path,
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scoped_ptr<CloudExternalDataManager> external_data_manager,
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& file_task_runner,
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& io_task_runner)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : CloudPolicyManager(
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          PolicyNamespaceKey(GetChromeUserPolicyType(), std::string()),
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          store.get(),
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          task_runner,
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          file_task_runner,
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          io_task_runner),
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      store_(store.Pass()),
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      component_policy_cache_path_(component_policy_cache_path),
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      external_data_manager_(external_data_manager.Pass()) {}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)UserCloudPolicyManager::~UserCloudPolicyManager() {}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void UserCloudPolicyManager::Shutdown() {
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (external_data_manager_)
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    external_data_manager_->Disconnect();
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  CloudPolicyManager::Shutdown();
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void UserCloudPolicyManager::SetSigninUsername(const std::string& username) {
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  store_->SetSigninUsername(username);
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserCloudPolicyManager::Connect(
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    PrefService* local_state,
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context,
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scoped_ptr<CloudPolicyClient> client) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  core()->Connect(client.Pass());
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  core()->StartRefreshScheduler();
578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  core()->TrackRefreshDelayPref(local_state,
588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                policy_prefs::kUserPolicyRefreshRate);
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (external_data_manager_)
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    external_data_manager_->Connect(request_context);
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CreateComponentCloudPolicyService(component_policy_cache_path_,
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    request_context);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<CloudPolicyClient>
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserCloudPolicyManager::CreateCloudPolicyClient(
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DeviceManagementService* device_management_service,
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> request_context) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return make_scoped_ptr(
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new CloudPolicyClient(
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          std::string(),
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          std::string(),
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          kPolicyVerificationKeyHash,
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          USER_AFFILIATION_NONE,
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          NULL,
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          device_management_service,
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          request_context)).Pass();
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserCloudPolicyManager::DisconnectAndRemovePolicy() {
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (external_data_manager_)
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    external_data_manager_->Disconnect();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  core()->Disconnect();
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // store_->Clear() will publish the updated, empty policy. The component
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // policy service must be cleared before OnStoreLoaded() is issued, so that
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // component policies are also empty at CheckAndPublishPolicy().
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ClearAndDestroyComponentCloudPolicyService();
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // When the |store_| is cleared, it informs the |external_data_manager_| that
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // all external data references have been removed, causing the
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // |external_data_manager_| to clear its cache as well.
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_->Clear();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool UserCloudPolicyManager::IsClientRegistered() const {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return client() && client()->is_registered();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace policy
103