| Index: chrome/browser/policy/cloud_policy_cache.cc
|
| diff --git a/chrome/browser/policy/device_management_policy_cache.cc b/chrome/browser/policy/cloud_policy_cache.cc
|
| similarity index 67%
|
| rename from chrome/browser/policy/device_management_policy_cache.cc
|
| rename to chrome/browser/policy/cloud_policy_cache.cc
|
| index ef8e6e196d6c9bc666fcd85230582cd6ac8fb76c..b61f6203650e4bdf7128b832663740c54140ed5c 100644
|
| --- a/chrome/browser/policy/device_management_policy_cache.cc
|
| +++ b/chrome/browser/policy/cloud_policy_cache.cc
|
| @@ -1,8 +1,8 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "chrome/browser/policy/device_management_policy_cache.h"
|
| +#include "chrome/browser/policy/cloud_policy_cache.h"
|
|
|
| #include <limits>
|
| #include <string>
|
| @@ -12,6 +12,8 @@
|
| #include "base/task.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/browser_thread.h"
|
| +#include "chrome/browser/policy/configuration_policy_pref_store.h"
|
| +#include "chrome/browser/policy/configuration_policy_provider.h"
|
| #include "chrome/browser/policy/proto/device_management_constants.h"
|
| #include "chrome/browser/policy/proto/device_management_local.pb.h"
|
|
|
| @@ -20,6 +22,45 @@ using google::protobuf::RepeatedPtrField;
|
|
|
| namespace policy {
|
|
|
| +// A thin ConfigurationPolicyProvider implementation sitting on top of
|
| +// CloudPolicyCache for hooking up with ConfigurationPolicyPrefStore.
|
| +class CloudPolicyCache::CloudPolicyProvider
|
| + : public ConfigurationPolicyProvider {
|
| + public:
|
| + CloudPolicyProvider(const PolicyDefinitionList* policy_list,
|
| + CloudPolicyCache* cache,
|
| + CloudPolicyCache::PolicyLevel level)
|
| + : ConfigurationPolicyProvider(policy_list),
|
| + cache_(cache),
|
| + level_(level) {}
|
| + virtual ~CloudPolicyProvider() {}
|
| +
|
| + virtual bool Provide(ConfigurationPolicyStoreInterface* store) {
|
| + // TODO(mnissler) handle level once we have support for that in the cache.
|
| + DecodePolicyValueTree(cache_->policy_.get(), store);
|
| + return true;
|
| + }
|
| +
|
| + virtual bool IsInitializationComplete() const {
|
| + return cache_->initialization_complete_;
|
| + }
|
| +
|
| + virtual void AddObserver(ConfigurationPolicyProvider::Observer* observer) {
|
| + cache_->observer_list_.AddObserver(observer);
|
| + }
|
| + virtual void RemoveObserver(ConfigurationPolicyProvider::Observer* observer) {
|
| + cache_->observer_list_.RemoveObserver(observer);
|
| + }
|
| +
|
| + private:
|
| + // The underlying policy cache.
|
| + CloudPolicyCache* cache_;
|
| + // Policy level this provider will handle.
|
| + CloudPolicyCache::PolicyLevel level_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CloudPolicyProvider);
|
| +};
|
| +
|
| // Saves policy information to a file.
|
| class PersistPolicyTask : public Task {
|
| public:
|
| @@ -62,18 +103,31 @@ void PersistPolicyTask::Run() {
|
| }
|
| }
|
|
|
| -DeviceManagementPolicyCache::DeviceManagementPolicyCache(
|
| +CloudPolicyCache::CloudPolicyCache(
|
| const FilePath& backing_file_path)
|
| : backing_file_path_(backing_file_path),
|
| policy_(new DictionaryValue),
|
| - fresh_policy_(false),
|
| + initialization_complete_(false),
|
| is_device_unmanaged_(false) {
|
| + managed_policy_provider_.reset(
|
| + new CloudPolicyProvider(
|
| + ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
|
| + this,
|
| + POLICY_LEVEL_MANDATORY));
|
| + recommended_policy_provider_.reset(
|
| + new CloudPolicyProvider(
|
| + ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
|
| + this,
|
| + POLICY_LEVEL_RECOMMENDED));
|
| }
|
|
|
| -DeviceManagementPolicyCache::~DeviceManagementPolicyCache() {}
|
| +CloudPolicyCache::~CloudPolicyCache() {
|
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
|
| + observer_list_, OnProviderGoingAway());
|
| +}
|
|
|
| -void DeviceManagementPolicyCache::LoadPolicyFromFile() {
|
| - if (!file_util::PathExists(backing_file_path_) || fresh_policy_)
|
| +void CloudPolicyCache::LoadFromFile() {
|
| + if (!file_util::PathExists(backing_file_path_) || initialization_complete_)
|
| return;
|
|
|
| // Read the protobuf from the file.
|
| @@ -99,30 +153,30 @@ void DeviceManagementPolicyCache::LoadPolicyFromFile() {
|
| << ", file is from the future.";
|
| return;
|
| }
|
| - is_device_unmanaged_ = cached_policy.unmanaged();
|
|
|
| // Decode and swap in the new policy information.
|
| scoped_ptr<DictionaryValue> value(DecodePolicy(cached_policy.policy()));
|
| - {
|
| - base::AutoLock lock(lock_);
|
| - if (!fresh_policy_)
|
| - policy_.reset(value.release());
|
| - last_policy_refresh_time_ = timestamp;
|
| - }
|
| + initialization_complete_ = true;
|
| + is_device_unmanaged_ = cached_policy.unmanaged();
|
| + policy_.reset(value.release());
|
| + last_policy_refresh_time_ = timestamp;
|
| +
|
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
|
| + observer_list_, OnUpdatePolicy());
|
| }
|
|
|
| -bool DeviceManagementPolicyCache::SetPolicy(
|
| +bool CloudPolicyCache::SetPolicy(
|
| const em::DevicePolicyResponse& policy) {
|
| is_device_unmanaged_ = false;
|
| - DictionaryValue* value = DeviceManagementPolicyCache::DecodePolicy(policy);
|
| + DictionaryValue* value = CloudPolicyCache::DecodePolicy(policy);
|
| const bool new_policy_differs = !(value->Equals(policy_.get()));
|
| base::Time now(base::Time::NowFromSystemTime());
|
| - {
|
| - base::AutoLock lock(lock_);
|
| - policy_.reset(value);
|
| - fresh_policy_ = true;
|
| - last_policy_refresh_time_ = now;
|
| - }
|
| + policy_.reset(value);
|
| + initialization_complete_ = true;
|
| + last_policy_refresh_time_ = now;
|
| +
|
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
|
| + observer_list_, OnUpdatePolicy());
|
|
|
| em::DevicePolicyResponse* policy_copy = new em::DevicePolicyResponse;
|
| policy_copy->CopyFrom(policy);
|
| @@ -133,19 +187,23 @@ bool DeviceManagementPolicyCache::SetPolicy(
|
| return new_policy_differs;
|
| }
|
|
|
| -DictionaryValue* DeviceManagementPolicyCache::GetPolicy() {
|
| - base::AutoLock lock(lock_);
|
| - return policy_->DeepCopy();
|
| +ConfigurationPolicyProvider* CloudPolicyCache::GetManagedPolicyProvider() {
|
| + return managed_policy_provider_.get();
|
| +}
|
| +
|
| +ConfigurationPolicyProvider* CloudPolicyCache::GetRecommendedPolicyProvider() {
|
| + return recommended_policy_provider_.get();
|
| }
|
|
|
| -void DeviceManagementPolicyCache::SetDeviceUnmanaged() {
|
| +void CloudPolicyCache::SetDeviceUnmanaged() {
|
| is_device_unmanaged_ = true;
|
| base::Time now(base::Time::NowFromSystemTime());
|
| - {
|
| - base::AutoLock lock(lock_);
|
| - policy_.reset(new DictionaryValue);
|
| - last_policy_refresh_time_ = now;
|
| - }
|
| + policy_.reset(new DictionaryValue);
|
| + last_policy_refresh_time_ = now;
|
| +
|
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
|
| + observer_list_, OnUpdatePolicy());
|
| +
|
| BrowserThread::PostTask(
|
| BrowserThread::FILE,
|
| FROM_HERE,
|
| @@ -153,7 +211,7 @@ void DeviceManagementPolicyCache::SetDeviceUnmanaged() {
|
| }
|
|
|
| // static
|
| -Value* DeviceManagementPolicyCache::DecodeIntegerValue(
|
| +Value* CloudPolicyCache::DecodeIntegerValue(
|
| google::protobuf::int64 value) {
|
| if (value < std::numeric_limits<int>::min() ||
|
| value > std::numeric_limits<int>::max()) {
|
| @@ -166,7 +224,7 @@ Value* DeviceManagementPolicyCache::DecodeIntegerValue(
|
| }
|
|
|
| // static
|
| -Value* DeviceManagementPolicyCache::DecodeValue(const em::GenericValue& value) {
|
| +Value* CloudPolicyCache::DecodeValue(const em::GenericValue& value) {
|
| if (!value.has_value_type())
|
| return NULL;
|
|
|
| @@ -235,7 +293,7 @@ Value* DeviceManagementPolicyCache::DecodeValue(const em::GenericValue& value) {
|
| }
|
|
|
| // static
|
| -DictionaryValue* DeviceManagementPolicyCache::DecodePolicy(
|
| +DictionaryValue* CloudPolicyCache::DecodePolicy(
|
| const em::DevicePolicyResponse& policy) {
|
| DictionaryValue* result = new DictionaryValue;
|
| RepeatedPtrField<em::DevicePolicySetting>::const_iterator setting;
|
| @@ -258,7 +316,7 @@ DictionaryValue* DeviceManagementPolicyCache::DecodePolicy(
|
| ++named_value) {
|
| if (named_value->has_value()) {
|
| Value* decoded_value =
|
| - DeviceManagementPolicyCache::DecodeValue(named_value->value());
|
| + CloudPolicyCache::DecodeValue(named_value->value());
|
| if (decoded_value)
|
| result->Set(named_value->name(), decoded_value);
|
| }
|
|
|