Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_POLICY_CLOUD_POLICY_CACHE_BASE_H_ | 5 #ifndef CHROME_BROWSER_POLICY_CLOUD_POLICY_CACHE_BASE_H_ |
| 6 #define CHROME_BROWSER_POLICY_CLOUD_POLICY_CACHE_BASE_H_ | 6 #define CHROME_BROWSER_POLICY_CLOUD_POLICY_CACHE_BASE_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include "base/gtest_prod_util.h" | 9 #include "base/gtest_prod_util.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/memory/scoped_vector.h" | |
| 11 #include "base/observer_list.h" | 12 #include "base/observer_list.h" |
| 12 #include "base/threading/non_thread_safe.h" | 13 #include "base/threading/non_thread_safe.h" |
| 13 #include "base/time.h" | 14 #include "base/time.h" |
| 14 #include "chrome/browser/policy/cloud_policy_subsystem.h" | 15 #include "chrome/browser/policy/cloud_policy_subsystem.h" |
| 15 #include "chrome/browser/policy/configuration_policy_provider.h" | 16 #include "chrome/browser/policy/configuration_policy_provider.h" |
| 16 #include "chrome/browser/policy/policy_map.h" | 17 #include "chrome/browser/policy/policy_map.h" |
| 17 #include "chrome/browser/policy/proto/device_management_backend.pb.h" | 18 #include "chrome/browser/policy/proto/device_management_backend.pb.h" |
| 18 | 19 |
| 19 namespace policy { | 20 namespace policy { |
| 20 | 21 |
| 21 class PolicyMap; | 22 class PolicyMap; |
| 22 class PolicyNotifier; | 23 class PolicyNotifier; |
| 24 class CloudPolicyProvider; | |
| 23 | 25 |
| 24 namespace em = enterprise_management; | 26 namespace em = enterprise_management; |
| 25 | 27 |
| 26 // Caches policy information, as set by calls to |SetPolicy()|, persists | 28 // Caches policy information, as set by calls to |SetPolicy()|, persists |
| 27 // it to disk or session_manager (depending on subclass implementation), | 29 // it to disk or session_manager (depending on subclass implementation), |
| 28 // and makes it available via policy providers. | 30 // and makes it available via policy providers. |
| 29 class CloudPolicyCacheBase : public base::NonThreadSafe { | 31 class CloudPolicyCacheBase : public base::NonThreadSafe { |
| 30 public: | 32 public: |
| 31 // Used to distinguish mandatory from recommended policies. | 33 // Used to distinguish mandatory from recommended policies. |
| 32 enum PolicyLevel { | 34 enum PolicyLevel { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 60 // Returns the time at which the policy was last fetched. | 62 // Returns the time at which the policy was last fetched. |
| 61 base::Time last_policy_refresh_time() const { | 63 base::Time last_policy_refresh_time() const { |
| 62 return last_policy_refresh_time_; | 64 return last_policy_refresh_time_; |
| 63 } | 65 } |
| 64 | 66 |
| 65 // Get the version of the encryption key currently used for decoding policy. | 67 // Get the version of the encryption key currently used for decoding policy. |
| 66 // Returns true if the version is available, in which case |version| is filled | 68 // Returns true if the version is available, in which case |version| is filled |
| 67 // in. | 69 // in. |
| 68 bool GetPublicKeyVersion(int* version); | 70 bool GetPublicKeyVersion(int* version); |
| 69 | 71 |
| 72 void AddObserver(ConfigurationPolicyProvider::Observer* observer); | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
Reusing that observer interface seems odd, since y
sfeuz
2011/05/31 07:32:31
Created a seperate interface for CloudPolicyCacheB
| |
| 73 void RemoveObserver(ConfigurationPolicyProvider::Observer* observer); | |
| 74 | |
| 75 PolicyMap* mandatory_policy(); | |
| 76 PolicyMap* recommended_policy(); | |
| 77 | |
| 78 // See comment for |initialization_complete_|. | |
| 79 bool initialization_complete() { | |
| 80 return initialization_complete_; | |
| 81 } | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
newline before new visibility label
sfeuz
2011/05/31 07:32:31
Done.
| |
| 70 protected: | 82 protected: |
| 71 // Wraps public key version and validity. | 83 // Wraps public key version and validity. |
| 72 struct PublicKeyVersion { | 84 struct PublicKeyVersion { |
| 73 int version; | 85 int version; |
| 74 bool valid; | 86 bool valid; |
| 75 }; | 87 }; |
| 76 | 88 |
| 77 // Decodes the given |policy| using |DecodePolicyResponse()|, applies the | 89 // Decodes the given |policy| using |DecodePolicyResponse()|, applies the |
| 78 // contents to |{mandatory,recommended}_policy_|, and notifies observers. | 90 // contents to |{mandatory,recommended}_policy_|, and notifies observers. |
| 79 // |timestamp| returns the timestamp embedded in |policy|, callers can pass | 91 // |timestamp| returns the timestamp embedded in |policy|, callers can pass |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 96 // Also performs verification, returns NULL if any check fails. | 108 // Also performs verification, returns NULL if any check fails. |
| 97 bool DecodePolicyResponse(const em::PolicyFetchResponse& policy_response, | 109 bool DecodePolicyResponse(const em::PolicyFetchResponse& policy_response, |
| 98 PolicyMap* mandatory, | 110 PolicyMap* mandatory, |
| 99 PolicyMap* recommended, | 111 PolicyMap* recommended, |
| 100 base::Time* timestamp, | 112 base::Time* timestamp, |
| 101 PublicKeyVersion* public_key_version); | 113 PublicKeyVersion* public_key_version); |
| 102 | 114 |
| 103 void InformNotifier(CloudPolicySubsystem::PolicySubsystemState state, | 115 void InformNotifier(CloudPolicySubsystem::PolicySubsystemState state, |
| 104 CloudPolicySubsystem::ErrorDetails error_details); | 116 CloudPolicySubsystem::ErrorDetails error_details); |
| 105 | 117 |
| 106 // See comment for |initialization_complete_|. | |
| 107 bool initialization_complete() { | |
| 108 return initialization_complete_; | |
| 109 } | |
| 110 | |
| 111 void set_last_policy_refresh_time(base::Time timestamp) { | 118 void set_last_policy_refresh_time(base::Time timestamp) { |
| 112 last_policy_refresh_time_ = timestamp; | 119 last_policy_refresh_time_ = timestamp; |
| 113 } | 120 } |
| 114 | 121 |
| 115 private: | 122 private: |
| 116 class CloudPolicyProvider; | |
| 117 | |
| 118 friend class DevicePolicyCacheTest; | 123 friend class DevicePolicyCacheTest; |
| 119 friend class UserPolicyCacheTest; | 124 friend class UserPolicyCacheTest; |
| 120 | 125 |
| 121 // Policy key-value information. | 126 // Policy key-value information. |
| 122 PolicyMap mandatory_policy_; | 127 PolicyMap mandatory_policy_; |
| 123 PolicyMap recommended_policy_; | 128 PolicyMap recommended_policy_; |
| 124 | 129 |
| 125 // Policy providers. | |
| 126 scoped_ptr<ConfigurationPolicyProvider> managed_policy_provider_; | |
| 127 scoped_ptr<ConfigurationPolicyProvider> recommended_policy_provider_; | |
| 128 | |
| 129 PolicyNotifier* notifier_; | 130 PolicyNotifier* notifier_; |
| 130 | 131 |
| 131 // The time at which the policy was last refreshed. Is updated both upon | 132 // The time at which the policy was last refreshed. Is updated both upon |
| 132 // successful and unsuccessful refresh attempts. | 133 // successful and unsuccessful refresh attempts. |
| 133 base::Time last_policy_refresh_time_; | 134 base::Time last_policy_refresh_time_; |
| 134 | 135 |
| 135 // Whether initialization has been completed. This is the case when we have | 136 // Whether initialization has been completed. This is the case when we have |
| 136 // valid policy, learned that the device is unmanaged or ran into | 137 // valid policy, learned that the device is unmanaged or ran into |
| 137 // unrecoverable errors. | 138 // unrecoverable errors. |
| 138 bool initialization_complete_; | 139 bool initialization_complete_; |
| 139 | 140 |
| 140 // Whether the the server has indicated this device is unmanaged. | 141 // Whether the the server has indicated this device is unmanaged. |
| 141 bool is_unmanaged_; | 142 bool is_unmanaged_; |
| 142 | 143 |
| 143 // Currently used public key version, if available. | 144 // Currently used public key version, if available. |
| 144 PublicKeyVersion public_key_version_; | 145 PublicKeyVersion public_key_version_; |
| 145 | 146 |
| 146 // Provider observers that are registered with this cache's providers. | 147 // Provider observers that are registered with this provider. |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
CloudPolicyCacheBase is not a provider.
sfeuz
2011/05/31 07:32:31
Done.
| |
| 147 ObserverList<ConfigurationPolicyProvider::Observer, true> observer_list_; | 148 ObserverList<ConfigurationPolicyProvider::Observer, true> observer_list_; |
| 148 | 149 |
| 149 DISALLOW_COPY_AND_ASSIGN(CloudPolicyCacheBase); | 150 DISALLOW_COPY_AND_ASSIGN(CloudPolicyCacheBase); |
| 150 }; | 151 }; |
| 151 | 152 |
| 153 // A thin wrapper around CloudPolicyCacheBase. Proxies the notifications and | |
| 154 // delegates the actions to the underlying |cache_|. Also exposes the PolicyMap | |
| 155 // of |cache_|. | |
| 156 // The |cache_| is kept as a weak reference and can be exchanged at any point | |
| 157 // destroying the CloudPolicyProvider instance. | |
| 158 class CloudPolicyProvider : public ConfigurationPolicyProvider, | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
Seems like this should rather go into its own file
sfeuz
2011/05/31 07:32:31
I agree, split the CloudPolicyProvider+CombiningCl
| |
| 159 public ConfigurationPolicyProvider::Observer { | |
| 160 public: | |
| 161 CloudPolicyProvider(const PolicyDefinitionList* policy_list, | |
| 162 CloudPolicyCacheBase::PolicyLevel level); | |
| 163 virtual ~CloudPolicyProvider(); | |
| 164 | |
| 165 // ConfigurationPolicyProvider implementation. | |
| 166 virtual bool Provide(ConfigurationPolicyStoreInterface* store); | |
| 167 virtual bool IsInitializationComplete() const; | |
| 168 virtual void AddObserver(ConfigurationPolicyProvider::Observer* observer); | |
| 169 virtual void RemoveObserver(ConfigurationPolicyProvider::Observer* observer); | |
| 170 | |
| 171 // ConfigurationPolicyProvier::Observer implementation. | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
Provier -> Provider
sfeuz
2011/05/31 07:32:31
Done.
| |
| 172 virtual void OnUpdatePolicy(); | |
| 173 virtual void OnProviderGoingAway(); | |
| 174 | |
| 175 // Exposes |policy_map| of the underlying |cache_|. | |
| 176 PolicyMap* policy_map(); | |
| 177 | |
| 178 // Sets another backend. | |
| 179 void set_cache(CloudPolicyCacheBase* cache); | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
newline before visibility label
sfeuz
2011/05/31 07:32:31
Done.
| |
| 180 private: | |
| 181 // The underlying policy cache. Can be NULL if currently none is present. | |
| 182 CloudPolicyCacheBase* cache_; | |
| 183 // Policy level this provider will handle. | |
| 184 CloudPolicyCacheBase::PolicyLevel level_; | |
| 185 | |
| 186 // Provider observers that are registered with this provider. | |
| 187 ObserverList<ConfigurationPolicyProvider::Observer, true> observer_list_; | |
| 188 | |
| 189 DISALLOW_COPY_AND_ASSIGN(CloudPolicyProvider); | |
| 190 }; | |
| 191 | |
| 192 // Combines multiple CloudPolicyProviders and applies them in the given order. | |
| 193 class CombiningCloudPolicyProvider : public ConfigurationPolicyProvider { | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
It seems like this layering is overkill. Why not j
sfeuz
2011/05/31 07:32:31
Note that CloudPolicyProvider also keeps track of
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
Why would we want to combine recommended and manag
| |
| 194 public: | |
| 195 explicit CombiningCloudPolicyProvider( | |
| 196 const PolicyDefinitionList* policy_list); | |
| 197 virtual ~CombiningCloudPolicyProvider(); | |
| 198 | |
| 199 // ConfigurationPolicyProvier implementation. | |
| 200 // Applies policy by applying the policies of the underlying | |
| 201 // CloudPolicyProviders in |cloud_policy_providers_| in the | |
| 202 // order they appear there. Early elements in |cloud_policy_providers_| take | |
| 203 // precedence. Handles special case for Proxy policy by marking all | |
| 204 // Proxy-related policies as applied as soon as one of them is applied. | |
| 205 // Returns true if we could apply at least one policy. | |
| 206 bool Provide(ConfigurationPolicyStoreInterface* store) OVERRIDE; | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
newline before comment
sfeuz
2011/05/31 07:32:31
Done.
| |
| 207 // Returns true if at least one CloudPolicyProvider in | |
| 208 // |cloud_policy_providers_| is initialized. | |
| 209 bool IsInitializationComplete() const OVERRIDE; | |
| 210 void AddObserver(ConfigurationPolicyProvider::Observer* observer) OVERRIDE; | |
| 211 void RemoveObserver(ConfigurationPolicyProvider::Observer* observer) OVERRIDE; | |
| 212 | |
| 213 // Callbacks for CloudPolicyProviderWithObserver. | |
| 214 void OnUpdatePolicy(CloudPolicyProvider* cloud_policy_provider); | |
| 215 void OnProviderGoingAway(CloudPolicyProvider* cloud_policy_provider); | |
| 216 | |
| 217 // Adds a new CloudPolicyProvider to the end of |cloud_policy_providers_|. | |
| 218 // Does not take ownership of |cloud_policy_provider|. | |
| 219 void AddCloudPolicyProvider(CloudPolicyProvider* cloud_policy_provider); | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
newline before visibility label
sfeuz
2011/05/31 07:32:31
Done.
| |
| 220 private: | |
| 221 // Wrapper around a CloudPolicyProvider to include the source in the | |
| 222 // callbacks. We need that to figure out which element in | |
| 223 // |cloud_policy_providers_| to remove if a CloudPolicyProvider calls | |
| 224 // OnProviderGoingAway. | |
| 225 class CloudPolicyProviderWithObserver : | |
| 226 public ConfigurationPolicyProvider::Observer { | |
| 227 public: | |
| 228 CloudPolicyProviderWithObserver( | |
| 229 CombiningCloudPolicyProvider* combining_cloud_policy_provider, | |
| 230 CloudPolicyProvider* cloud_policy_provider) : | |
| 231 combining_cloud_policy_provider_(combining_cloud_policy_provider), | |
| 232 cloud_policy_provider_(cloud_policy_provider) { | |
| 233 DCHECK(combining_cloud_policy_provider_ && cloud_policy_provider_); | |
| 234 cloud_policy_provider_->AddObserver(this); | |
| 235 } | |
| 236 ~CloudPolicyProviderWithObserver() { | |
| 237 if (cloud_policy_provider_) { | |
| 238 cloud_policy_provider_->RemoveObserver(this); | |
| 239 cloud_policy_provider_ = NULL; | |
| 240 } | |
| 241 } | |
| 242 virtual void OnUpdatePolicy() { | |
| 243 combining_cloud_policy_provider_->OnUpdatePolicy( | |
| 244 cloud_policy_provider_); | |
| 245 } | |
| 246 virtual void OnProviderGoingAway() { | |
| 247 combining_cloud_policy_provider_->OnProviderGoingAway( | |
| 248 cloud_policy_provider_); | |
| 249 // Normally our dtor is called on removal from |cloud_policy_providers_|, | |
| 250 // but just in case we are still active remove us as Observer. | |
| 251 if (cloud_policy_provider_) { | |
| 252 cloud_policy_provider_->RemoveObserver(this); | |
| 253 cloud_policy_provider_ = NULL; | |
| 254 } | |
| 255 } | |
| 256 CloudPolicyProvider* cloud_policy_provider() const { | |
| 257 return cloud_policy_provider_; | |
| 258 } | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
newline
sfeuz
2011/05/31 07:32:31
Done.
| |
| 259 private: | |
| 260 CombiningCloudPolicyProvider* combining_cloud_policy_provider_; | |
| 261 CloudPolicyProvider* cloud_policy_provider_; | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
DISALLOW_COPY_AND_ASSIGN
sfeuz
2011/05/31 07:32:31
Done.
| |
| 262 }; | |
| 263 | |
| 264 // CloudPolicyProviders which are combined by this instance of | |
| 265 // CombiningCoudPolicyProvider. Order dependant. | |
| 266 typedef ScopedVector<CloudPolicyProviderWithObserver> ListType; | |
| 267 ListType cloud_policy_providers_; | |
| 268 | |
| 269 // Provider observers that are registered with this provider. | |
| 270 ObserverList<ConfigurationPolicyProvider::Observer, true> observer_list_; | |
| 271 | |
| 272 DISALLOW_COPY_AND_ASSIGN(CombiningCloudPolicyProvider); | |
| 273 }; | |
| 274 | |
|
Mattias Nissler (ping if slow)
2011/05/26 10:20:20
excess newline
sfeuz
2011/05/31 07:32:31
Done.
| |
| 275 | |
| 152 } // namespace policy | 276 } // namespace policy |
| 153 | 277 |
| 154 #endif // CHROME_BROWSER_POLICY_CLOUD_POLICY_CACHE_BASE_H_ | 278 #endif // CHROME_BROWSER_POLICY_CLOUD_POLICY_CACHE_BASE_H_ |
| OLD | NEW |