Chromium Code Reviews| Index: chrome/browser/policy/cloud_policy_cache.cc |
| diff --git a/chrome/browser/policy/cloud_policy_cache.cc b/chrome/browser/policy/cloud_policy_cache.cc |
| index 37f0f7e834dec1cf26f8a454e2a8204123449f25..76c64669e9402ac13dc6bf002ae28ae3a67eb546 100644 |
| --- a/chrome/browser/policy/cloud_policy_cache.cc |
| +++ b/chrome/browser/policy/cloud_policy_cache.cc |
| @@ -11,8 +11,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/proto/cloud_policy.pb.h" |
| -#include "chrome/browser/policy/proto/device_management_backend.pb.h" |
| #include "chrome/browser/policy/proto/device_management_constants.h" |
| #include "chrome/browser/policy/proto/device_management_local.pb.h" |
| @@ -27,6 +27,51 @@ 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) { |
| + if (cache_->has_device_policy()) { |
|
gfeher
2011/02/14 17:28:50
Shouldn't this be has_cloud_policy() ?
Jakob Kummerow
2011/02/21 12:12:15
Done. Good catch!
|
| + if (level_ == POLICY_LEVEL_MANDATORY) |
| + ApplyPolicyMap(&cache_->mandatory_policy_, store); |
| + else if (level_ == POLICY_LEVEL_RECOMMENDED) |
| + ApplyPolicyMap(&cache_->recommended_policy_, store); |
| + } else { |
| + ApplyPolicyValueTree(cache_->device_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: |
| @@ -79,17 +124,30 @@ CloudPolicyCache::CloudPolicyCache( |
| const FilePath& backing_file_path) |
| : backing_file_path_(backing_file_path), |
| device_policy_(new DictionaryValue), |
| - fresh_policy_(false), |
| + initialization_complete_(false), |
| is_unmanaged_(false), |
| has_device_policy_(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)); |
| } |
| -CloudPolicyCache::~CloudPolicyCache() {} |
| +CloudPolicyCache::~CloudPolicyCache() { |
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
| + observer_list_, OnProviderGoingAway()); |
| +} |
| -void CloudPolicyCache::LoadPolicyFromFile() { |
| +void CloudPolicyCache::LoadFromFile() { |
| // TODO(jkummerow): This method is doing file IO during browser startup. In |
| // the long run it would be better to delay this until the FILE thread exists. |
| - if (!file_util::PathExists(backing_file_path_) || fresh_policy_) { |
| + if (!file_util::PathExists(backing_file_path_) || initialization_complete_) { |
| return; |
| } |
| @@ -130,32 +188,25 @@ void CloudPolicyCache::LoadPolicyFromFile() { |
| return; |
| } |
| // Swap in the new policy information. |
| - if (is_unmanaged_) { |
| - base::AutoLock lock(lock_); |
| - last_policy_refresh_time_ = timestamp; |
| - return; |
| - } else if (cached_response.has_cloud_policy()) { |
| - if (!fresh_policy_) { |
| - base::AutoLock lock(lock_); |
| - mandatory_policy_.swap(mandatory_policy); |
| - recommended_policy_.swap(recommended_policy); |
| - last_policy_refresh_time_ = timestamp; |
| - has_device_policy_ = false; |
| - } |
| + if (cached_response.has_cloud_policy()) { |
| + mandatory_policy_.swap(mandatory_policy); |
| + recommended_policy_.swap(recommended_policy); |
| + has_device_policy_ = false; |
| } else if (cached_response.has_device_policy()) { |
| scoped_ptr<DictionaryValue> value( |
| DecodeDevicePolicy(cached_response.device_policy())); |
| - if (!fresh_policy_) { |
| - base::AutoLock lock(lock_); |
| - device_policy_.reset(value.release()); |
| - last_policy_refresh_time_ = timestamp; |
| - has_device_policy_ = true; |
| - } |
| + device_policy_.reset(value.release()); |
| + has_device_policy_ = true; |
| } |
| + last_policy_refresh_time_ = timestamp; |
| + initialization_complete_ = true; |
| + |
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
| + observer_list_, OnUpdatePolicy()); |
| } |
| bool CloudPolicyCache::SetPolicy(const em::CloudPolicyResponse& policy) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(CalledOnValidThread()); |
| is_unmanaged_ = false; |
| base::Time timestamp; |
| PolicyMapType mandatory_policy; |
| @@ -163,20 +214,20 @@ bool CloudPolicyCache::SetPolicy(const em::CloudPolicyResponse& policy) { |
| bool ok = DecodePolicyResponse(policy, &mandatory_policy, &recommended_policy, |
| ×tamp); |
| if (!ok) { |
| - // TODO(jkummerow): Signal error to PolicyProvider. |
| + // TODO(jkummerow): Signal error to CloudPolicyController. |
| return false; |
| } |
| const bool new_policy_differs = |
| !Equals(mandatory_policy, mandatory_policy_) || |
| !Equals(recommended_policy, recommended_policy_); |
| - { |
| - base::AutoLock lock(lock_); |
| - mandatory_policy_.swap(mandatory_policy); |
| - recommended_policy_.swap(recommended_policy); |
| - fresh_policy_ = true; |
| - last_policy_refresh_time_ = timestamp; |
| - has_device_policy_ = false; |
| - } |
| + mandatory_policy_.swap(mandatory_policy); |
| + recommended_policy_.swap(recommended_policy); |
| + initialization_complete_ = true; |
| + last_policy_refresh_time_ = timestamp; |
| + has_device_policy_ = false; |
| + |
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
| + observer_list_, OnUpdatePolicy()); |
| em::CloudPolicyResponse* policy_copy = new em::CloudPolicyResponse; |
| policy_copy->CopyFrom(policy); |
| @@ -188,18 +239,18 @@ bool CloudPolicyCache::SetPolicy(const em::CloudPolicyResponse& policy) { |
| } |
| bool CloudPolicyCache::SetDevicePolicy(const em::DevicePolicyResponse& policy) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(CalledOnValidThread()); |
| is_unmanaged_ = false; |
| DictionaryValue* value = DecodeDevicePolicy(policy); |
| const bool new_policy_differs = !(value->Equals(device_policy_.get())); |
| base::Time now(base::Time::NowFromSystemTime()); |
| - { |
| - base::AutoLock lock(lock_); |
| - device_policy_.reset(value); |
| - fresh_policy_ = true; |
| - last_policy_refresh_time_ = now; |
| - has_device_policy_ = true; |
| - } |
| + device_policy_.reset(value); |
| + initialization_complete_ = true; |
| + last_policy_refresh_time_ = now; |
| + has_device_policy_ = true; |
| + |
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
| + observer_list_, OnUpdatePolicy()); |
| em::DevicePolicyResponse* policy_copy = new em::DevicePolicyResponse; |
| policy_copy->CopyFrom(policy); |
| @@ -210,34 +261,27 @@ bool CloudPolicyCache::SetDevicePolicy(const em::DevicePolicyResponse& policy) { |
| return new_policy_differs; |
| } |
| -DictionaryValue* CloudPolicyCache::GetDevicePolicy() { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - base::AutoLock lock(lock_); |
| - return device_policy_->DeepCopy(); |
| +ConfigurationPolicyProvider* CloudPolicyCache::GetManagedPolicyProvider() { |
| + DCHECK(CalledOnValidThread()); |
| + return managed_policy_provider_.get(); |
| } |
| -const CloudPolicyCache::PolicyMapType* |
| - CloudPolicyCache::GetMandatoryPolicy() const { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - return &mandatory_policy_; |
| -} |
| - |
| -const CloudPolicyCache::PolicyMapType* |
| - CloudPolicyCache::GetRecommendedPolicy() const { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - return &recommended_policy_; |
| +ConfigurationPolicyProvider* CloudPolicyCache::GetRecommendedPolicyProvider() { |
| + DCHECK(CalledOnValidThread()); |
| + return recommended_policy_provider_.get(); |
| } |
| void CloudPolicyCache::SetUnmanaged() { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(CalledOnValidThread()); |
| is_unmanaged_ = true; |
| - { |
| - base::AutoLock lock(lock_); |
| - mandatory_policy_.clear(); |
| - recommended_policy_.clear(); |
| - device_policy_.reset(new DictionaryValue); |
| - last_policy_refresh_time_ = base::Time::NowFromSystemTime(); |
| - } |
| + mandatory_policy_.clear(); |
| + recommended_policy_.clear(); |
| + device_policy_.reset(new DictionaryValue); |
| + last_policy_refresh_time_ = base::Time::NowFromSystemTime(); |
| + |
| + FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
| + observer_list_, OnUpdatePolicy()); |
| + |
| BrowserThread::PostTask( |
| BrowserThread::FILE, |
| FROM_HERE, |