Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2696)

Unified Diff: chrome/browser/policy/cloud_policy_cache_base.cc

Issue 6979011: Move user cloud policy to BrowserProcess. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/policy/cloud_policy_cache_base.cc
diff --git a/chrome/browser/policy/cloud_policy_cache_base.cc b/chrome/browser/policy/cloud_policy_cache_base.cc
index 5fdf08ed3fa60c3ac5e8efd23457681e151f8e03..81937e75c4eaf354541591b1ef02fdb39fc23e4f 100644
--- a/chrome/browser/policy/cloud_policy_cache_base.cc
+++ b/chrome/browser/policy/cloud_policy_cache_base.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/policy/cloud_policy_cache_base.h"
+#include <set>
#include <string>
#include "base/logging.h"
@@ -13,62 +14,182 @@
namespace policy {
-// A thin ConfigurationPolicyProvider implementation sitting on top of
-// CloudPolicyCacheBase for hooking up with ConfigurationPolicyPrefStore.
-class CloudPolicyCacheBase::CloudPolicyProvider
- : public ConfigurationPolicyProvider {
- public:
- CloudPolicyProvider(const PolicyDefinitionList* policy_list,
- CloudPolicyCacheBase* cache,
- CloudPolicyCacheBase::PolicyLevel level)
- : ConfigurationPolicyProvider(policy_list),
- cache_(cache),
- level_(level) {}
- virtual ~CloudPolicyProvider() {}
-
- virtual bool Provide(ConfigurationPolicyStoreInterface* store) {
- if (level_ == POLICY_LEVEL_MANDATORY)
- ApplyPolicyMap(&cache_->mandatory_policy_, store);
- else if (level_ == POLICY_LEVEL_RECOMMENDED)
- ApplyPolicyMap(&cache_->recommended_policy_, store);
- return true;
- }
+CloudPolicyProvider::CloudPolicyProvider(
+ const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list,
+ CloudPolicyCacheBase::PolicyLevel level)
+ : ConfigurationPolicyProvider(policy_list),
+ cache_(NULL),
+ level_(level) {}
- virtual bool IsInitializationComplete() const {
- return cache_->initialization_complete_;
- }
+CloudPolicyProvider::~CloudPolicyProvider() {
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
+ observer_list_, OnProviderGoingAway());
+ if (cache_)
+ cache_->RemoveObserver(this);
+}
+
+void CloudPolicyProvider::set_cache(CloudPolicyCacheBase* cache) {
+ cache_ = cache;
+ cache_->AddObserver(this);
+}
+
+bool CloudPolicyProvider::Provide(ConfigurationPolicyStoreInterface* store) {
+ if (!cache_)
+ return false;
+ if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_MANDATORY)
+ ApplyPolicyMap(cache_->mandatory_policy(), store);
+ else if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED)
+ ApplyPolicyMap(cache_->recommended_policy(), store);
+ return true;
+}
+
+bool CloudPolicyProvider::IsInitializationComplete() const {
+ return cache_ && cache_->initialization_complete();
+}
+
+void CloudPolicyProvider::AddObserver(
+ ConfigurationPolicyProvider::Observer* observer) {
+ observer_list_.AddObserver(observer);
+}
+void CloudPolicyProvider::RemoveObserver(
+ ConfigurationPolicyProvider::Observer* observer) {
+ observer_list_.RemoveObserver(observer);
+}
+
+void CloudPolicyProvider::OnUpdatePolicy() {
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
+ observer_list_, OnUpdatePolicy());
+}
+
+void CloudPolicyProvider::OnProviderGoingAway() {
+ cache_->RemoveObserver(this);
+ cache_ = NULL;
+}
+
+PolicyMap* CloudPolicyProvider::policy_map() {
+ if (!cache_)
+ return NULL;
+ if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_MANDATORY)
+ return cache_->mandatory_policy();
+ else if (level_ == CloudPolicyCacheBase::POLICY_LEVEL_RECOMMENDED)
+ return cache_->recommended_policy();
+ NOTREACHED();
+ return NULL;
+}
+
+CombiningCloudPolicyProvider::CombiningCloudPolicyProvider(
+ const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list)
+ : ConfigurationPolicyProvider(policy_list) {}
+
+CombiningCloudPolicyProvider::~CombiningCloudPolicyProvider() {
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
+ observer_list_, OnProviderGoingAway());
+}
- virtual void AddObserver(ConfigurationPolicyProvider::Observer* observer) {
- cache_->observer_list_.AddObserver(observer);
+void CombiningCloudPolicyProvider::AddCloudPolicyProvider(
+ CloudPolicyProvider* cloud_policy_provider) {
+ cloud_policy_providers_.push_back(
+ new CloudPolicyProviderWithObserver(this,
+ cloud_policy_provider));
+}
+
+bool CombiningCloudPolicyProvider::Provide(
+ ConfigurationPolicyStoreInterface* store) {
+ typedef std::set<ConfigurationPolicyType> PolicySet;
+ PolicySet already_applied;
+ PolicySet newly_applied;
+ for (ListType::iterator i = cloud_policy_providers_.begin();
+ i != cloud_policy_providers_.end(); ++i) {
+ if ((*i)->cloud_policy_provider() &&
+ (*i)->cloud_policy_provider()->IsInitializationComplete()) {
+ PolicyMap* policy_map = (*i)->cloud_policy_provider()->policy_map();
+ if (policy_map) {
+ const PolicyDefinitionList* policy_list(policy_definition_list());
+ for (const PolicyDefinitionList::Entry* j = policy_list->begin;
+ j != policy_list->end; ++j) {
+ // Already applied by a CloudProvider which takes precedence.
+ if (already_applied.find(j->policy_type)!=already_applied.end())
+ continue;
+ const Value* value = policy_map->Get(j->policy_type);
+ if (value && value->IsType(j->value_type)) {
+ newly_applied.insert(j->policy_type);
+ store->Apply(j->policy_type, value->DeepCopy());
+ }
+ }
+ // Update the already_applied PolicySet
+ for (PolicySet::iterator policy = newly_applied.begin();
+ policy != newly_applied.end(); ++policy) {
+ already_applied.insert(*policy);
+ // In case that one Proxy Policy got applied, we want to set all of
+ // them as applied. We need that in order not to end up with an
+ // inconsistend Proxy-state in case that the different Policy-related
+ // Policies got set by different CloudPolicyProviders.
+ if (*policy == kPolicyProxyMode ||
+ *policy == kPolicyProxyServerMode ||
+ *policy == kPolicyProxyServer ||
+ *policy == kPolicyProxyPacUrl ||
+ *policy == kPolicyProxyBypassList) {
+ already_applied.insert(kPolicyProxyMode);
+ already_applied.insert(kPolicyProxyServerMode);
+ already_applied.insert(kPolicyProxyServer);
+ already_applied.insert(kPolicyProxyPacUrl);
+ already_applied.insert(kPolicyProxyBypassList);
+ }
+ }
+ }
+ }
}
- virtual void RemoveObserver(ConfigurationPolicyProvider::Observer* observer) {
- cache_->observer_list_.RemoveObserver(observer);
+ // Return true if we could apply at least one policy.
+ return !already_applied.empty();
+}
+
+bool CombiningCloudPolicyProvider::IsInitializationComplete() const {
+ bool initialization_complete = false;
+ for (ListType::const_iterator i = cloud_policy_providers_.begin();
+ i != cloud_policy_providers_.end(); ++i) {
+ initialization_complete = initialization_complete ||
+ ((*i)->cloud_policy_provider() &&
+ (*i)->cloud_policy_provider()->IsInitializationComplete());
}
+ return initialization_complete;
+}
+
+void CombiningCloudPolicyProvider::AddObserver(
+ ConfigurationPolicyProvider::Observer* observer) {
+ observer_list_.AddObserver(observer);
+}
- private:
- // The underlying policy cache.
- CloudPolicyCacheBase* cache_;
- // Policy level this provider will handle.
- CloudPolicyCacheBase::PolicyLevel level_;
+void CombiningCloudPolicyProvider::RemoveObserver(
+ ConfigurationPolicyProvider::Observer* observer) {
+ observer_list_.RemoveObserver(observer);
+}
- DISALLOW_COPY_AND_ASSIGN(CloudPolicyProvider);
-};
+// Note: we are triggering updates even though the change might not actually be
+// visible to the outside.
+void CombiningCloudPolicyProvider::OnUpdatePolicy(
+ CloudPolicyProvider* cloud_policy_provider) {
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
+ observer_list_, OnUpdatePolicy());
+}
+
+// Removes the going-away CloudPolicyProvider from |cloud_policy_providers_|.
+void CombiningCloudPolicyProvider::OnProviderGoingAway(
+ CloudPolicyProvider* cloud_policy_provider) {
+ ListType::iterator i;
+ for (i = cloud_policy_providers_.begin();
+ i != cloud_policy_providers_.end(); ++i) {
+ if ((*i)->cloud_policy_provider() == cloud_policy_provider) {
+ cloud_policy_providers_.erase(i);
+ return;
+ }
+ }
+}
CloudPolicyCacheBase::CloudPolicyCacheBase()
: notifier_(NULL),
initialization_complete_(false),
is_unmanaged_(false) {
public_key_version_.valid = 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));
}
CloudPolicyCacheBase::~CloudPolicyCacheBase() {
@@ -76,6 +197,24 @@ CloudPolicyCacheBase::~CloudPolicyCacheBase() {
observer_list_, OnProviderGoingAway());
}
+void CloudPolicyCacheBase::AddObserver(
+ ConfigurationPolicyProvider::Observer* observer) {
+ observer_list_.AddObserver(observer);
+}
+
+void CloudPolicyCacheBase::RemoveObserver(
+ ConfigurationPolicyProvider::Observer* observer) {
+ observer_list_.RemoveObserver(observer);
+}
+
+PolicyMap* CloudPolicyCacheBase::mandatory_policy() {
+ return &mandatory_policy_;
+}
+
+PolicyMap* CloudPolicyCacheBase::recommended_policy() {
+ return &recommended_policy_;
+}
+
bool CloudPolicyCacheBase::GetPublicKeyVersion(int* version) {
if (public_key_version_.valid)
*version = public_key_version_.version;
@@ -139,17 +278,6 @@ void CloudPolicyCacheBase::SetUnmanagedInternal(const base::Time& timestamp) {
observer_list_, OnUpdatePolicy());
}
-ConfigurationPolicyProvider* CloudPolicyCacheBase::GetManagedPolicyProvider() {
- DCHECK(CalledOnValidThread());
- return managed_policy_provider_.get();
-}
-
-ConfigurationPolicyProvider*
- CloudPolicyCacheBase::GetRecommendedPolicyProvider() {
- DCHECK(CalledOnValidThread());
- return recommended_policy_provider_.get();
-}
-
bool CloudPolicyCacheBase::DecodePolicyResponse(
const em::PolicyFetchResponse& policy_response,
PolicyMap* mandatory,

Powered by Google App Engine
This is Rietveld 408576698