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

Side by Side Diff: chrome/browser/policy/configuration_policy_reader.cc

Issue 7585036: First CL for the about:policy page. This only implements the policy section of the page. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Please ignore previous patch. Created 9 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/policy/configuration_policy_reader.h"
6
7 #include <map>
8 #include <set>
9 #include <vector>
10
11 #include "base/utf_string_conversions.h"
12 #include "chrome/browser/browser_process.h"
13 #include "chrome/browser/policy/browser_policy_connector.h"
14 #include "chrome/browser/policy/configuration_policy_pref_store.h"
15 #include "chrome/browser/policy/configuration_policy_store_interface.h"
16
17 namespace policy {
18
19 // This class functions as a container for policy status information used by the
20 // ConfigurationPolicyReader class. It obtains policy values from a
21 // ConfigurationPolicyProvider and maps them to their status information.
22 class ConfigurationPolicyStatusKeeper
23 : public ConfigurationPolicyStoreInterface {
24 public:
25 ConfigurationPolicyStatusKeeper(ConfigurationPolicyProvider* provider,
26 PolicyStatusInfo::PolicyLevel policy_level);
27 virtual ~ConfigurationPolicyStatusKeeper();
28
29 // ConfigurationPolicyStoreInterface methods.
30 virtual void Apply(ConfigurationPolicyType policy, base::Value* value);
31
32 // Returns a pointer to a DictionaryValue containing the status information
33 // of the policy |policy|. The caller acquires ownership of the returned
34 // value. Returns NULL if no such policy is stored in this keeper.
35 DictionaryValue* GetPolicyStatus(ConfigurationPolicyType policy) const;
36
37 private:
38 typedef std::map<ConfigurationPolicyType, PolicyStatusInfo>
39 PolicyStatusMap;
40 typedef std::map<ConfigurationPolicyType, string16> PolicyNameMap;
41 typedef ConfigurationPolicyProvider::PolicyDefinitionList
42 PolicyDefinitionList;
43
44 // Mapping from ConfigurationPolicyType to PolicyStatusInfo.
45 PolicyStatusMap policy_map_;
46
47 // The level of the policies stored in this keeper (mandatory or
48 // recommended).
49 PolicyStatusInfo::PolicyLevel policy_level_;
50
51 DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyStatusKeeper);
52 };
53
54 // ConfigurationPolicyStatusKeeper
55 ConfigurationPolicyStatusKeeper::ConfigurationPolicyStatusKeeper(
56 ConfigurationPolicyProvider* provider,
57 PolicyStatusInfo::PolicyLevel policy_level) : policy_level_(policy_level) {
58
59 if (!provider->Provide(this))
60 LOG(WARNING) << "Failed to get policy from provider.";
61 }
62
63 ConfigurationPolicyStatusKeeper::~ConfigurationPolicyStatusKeeper() {
64 policy_map_.clear();
65 }
66
67 void ConfigurationPolicyStatusKeeper::Apply(
68 ConfigurationPolicyType policy, base::Value* value) {
69 string16 name = PolicyStatus::GetPolicyName(policy);
70
71 // This should never happen.
72 if (name == string16()) {
73 LOG(WARNING) << "Received unknown policy from provider.";
74 return;
75 }
76
77 // TODO(simo) actually determine whether the policy is a user or a device one
78 // and whether the policy could be enforced or not once this information
79 // is available.
80 PolicyStatusInfo info(name,
81 PolicyStatusInfo::USER,
82 policy_level_,
83 value,
84 PolicyStatusInfo::ENFORCED,
85 string16());
86 policy_map_[policy] = info;
87 }
88
89 DictionaryValue* ConfigurationPolicyStatusKeeper::GetPolicyStatus(
90 ConfigurationPolicyType policy) const {
91 PolicyStatusMap::const_iterator entry = policy_map_.find(policy);
92 return entry != policy_map_.end() ?
93 (entry->second).GetDictionaryValue() : NULL;
94 }
95
96 // ConfigurationPolicyReader
97 ConfigurationPolicyReader::~ConfigurationPolicyReader() {
98 }
99
100 void ConfigurationPolicyReader::OnUpdatePolicy() {
101 Refresh();
102 }
103
104 void ConfigurationPolicyReader::OnProviderGoingAway() {
105 provider_ = NULL;
106 }
107
108 // static
109 ConfigurationPolicyReader*
110 ConfigurationPolicyReader::CreateManagedPlatformPolicyReader(
111 PolicyStatusInfo::PolicyLevel policy_level) {
112 BrowserPolicyConnector* connector =
113 g_browser_process->browser_policy_connector();
114 return new ConfigurationPolicyReader(
115 connector->GetManagedPlatformProvider(), policy_level);
116 }
117
118 // static
119 ConfigurationPolicyReader*
120 ConfigurationPolicyReader::CreateManagedCloudPolicyReader(
121 PolicyStatusInfo::PolicyLevel policy_level) {
122 BrowserPolicyConnector* connector =
123 g_browser_process->browser_policy_connector();
124 return new ConfigurationPolicyReader(
125 connector->GetManagedCloudProvider(), policy_level);
126 }
127
128 // static
129 ConfigurationPolicyReader*
130 ConfigurationPolicyReader::CreateRecommendedPlatformPolicyReader(
131 PolicyStatusInfo::PolicyLevel policy_level) {
132 BrowserPolicyConnector* connector =
133 g_browser_process->browser_policy_connector();
134 return new ConfigurationPolicyReader(
135 connector->GetRecommendedPlatformProvider(), policy_level);
136 }
137
138 // static
139 ConfigurationPolicyReader*
140 ConfigurationPolicyReader::CreateRecommendedCloudPolicyReader(
141 PolicyStatusInfo::PolicyLevel policy_level) {
142 BrowserPolicyConnector* connector =
143 g_browser_process->browser_policy_connector();
144 return new ConfigurationPolicyReader(
145 connector->GetRecommendedCloudProvider(), policy_level);
146 }
147
148 DictionaryValue* ConfigurationPolicyReader::GetPolicyStatus(
149 ConfigurationPolicyType policy) const {
150 return policy_keeper_->GetPolicyStatus(policy);
151 }
152
153 ConfigurationPolicyReader::ConfigurationPolicyReader(
154 ConfigurationPolicyProvider* provider,
155 PolicyStatusInfo::PolicyLevel policy_level)
156 : provider_(provider),
157 policy_level_(policy_level) {
158 if (provider_) {
159 // Read initial policy.
160 policy_keeper_.reset(
161 new ConfigurationPolicyStatusKeeper(provider, policy_level));
162 registrar_.Init(provider_, this);
163 }
164 }
165
166 void ConfigurationPolicyReader::Refresh() {
167 if (!provider_)
168 return;
169
170 // Read policy state into a new keeper and swap out old keeper.
171 scoped_ptr<ConfigurationPolicyStatusKeeper> new_keeper(
172 new ConfigurationPolicyStatusKeeper(provider_, policy_level_));
173 policy_keeper_.reset(new_keeper.release());
174
175 // TODO(simo) create an observer class which PolicyStatus can implement so
176 // that it can be notified of changes.
177 }
178
179 // PolicyStatus
180 PolicyStatus::PolicyStatus() {
181 managed_platform_.reset(
182 ConfigurationPolicyReader::CreateManagedPlatformPolicyReader(
183 PolicyStatusInfo::MANDATORY));
184 managed_cloud_.reset(
185 ConfigurationPolicyReader::CreateManagedCloudPolicyReader(
186 PolicyStatusInfo::MANDATORY));
187 recommended_platform_.reset(
188 ConfigurationPolicyReader::CreateRecommendedPlatformPolicyReader(
189 PolicyStatusInfo::RECOMMENDED));
190 recommended_cloud_.reset(
191 ConfigurationPolicyReader::CreateRecommendedCloudPolicyReader(
192 PolicyStatusInfo::RECOMMENDED));
193 }
194
195 PolicyStatus::~PolicyStatus() {
196 }
197
198 ListValue* PolicyStatus::GetPolicyStatusList(bool& any_policies_sent) const {
199 ListValue* result = new ListValue();
200 std::vector<PolicyStatusInfo> unsent_policies;
201
202 any_policies_sent = false;
203 const PolicyDefinitionList* supported_policies =
204 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList();
205 const PolicyDefinitionList::Entry* policy = supported_policies->begin;
206 for ( ; policy != supported_policies->end; ++policy) {
207 if (!AddPolicyFromReaders(policy->policy_type, result)) {
208 PolicyStatusInfo info(ASCIIToUTF16(policy->name),
209 PolicyStatusInfo::SOURCE_TYPE_UNDEFINED,
210 PolicyStatusInfo::LEVEL_UNDEFINED,
211 Value::CreateNullValue(),
212 PolicyStatusInfo::STATUS_UNDEFINED,
213 string16());
214 unsent_policies.push_back(info);
215 } else {
216 any_policies_sent = true;
217 }
218 }
219
220 // Add policies that weren't actually sent from providers to list.
221 std::vector<PolicyStatusInfo>::const_iterator info = unsent_policies.begin();
222 for ( ; info != unsent_policies.end(); ++info)
223 result->Append((*info).GetDictionaryValue());
224
225 unsent_policies.clear();
226 return result;
227 }
228
229 // static
230 string16 PolicyStatus::GetPolicyName(ConfigurationPolicyType policy_type) {
231 static std::map<ConfigurationPolicyType, string16> name_map;
232 static const ConfigurationPolicyProvider::PolicyDefinitionList*
233 supported_policies;
234
235 if (!supported_policies) {
236 supported_policies =
237 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList();
238
239 // Create mapping from ConfigurationPolicyTypes to actual policy names.
240 const ConfigurationPolicyProvider::PolicyDefinitionList::Entry* entry =
241 supported_policies->begin;
242 for ( ; entry != supported_policies->end; ++entry)
243 name_map[entry->policy_type] = ASCIIToUTF16(entry->name);
244 }
245
246 std::map<ConfigurationPolicyType, string16>::const_iterator entry =
247 name_map.find(policy_type);
248
249 // This should never happen.
250 if (entry == name_map.end())
251 return string16();
252
253 return entry->second;
254 }
255
256 bool PolicyStatus::AddPolicyFromReaders(
257 ConfigurationPolicyType policy, ListValue* list) const {
258 DictionaryValue* mp_policy =
259 managed_platform_->GetPolicyStatus(policy);
260 DictionaryValue* mc_policy =
261 managed_cloud_->GetPolicyStatus(policy);
262 DictionaryValue* rp_policy =
263 recommended_platform_->GetPolicyStatus(policy);
264 DictionaryValue* rc_policy =
265 recommended_cloud_->GetPolicyStatus(policy);
266
267 bool added_policy = mp_policy || mc_policy || rp_policy || rc_policy;
268
269 if (mp_policy)
270 list->Append(mp_policy);
271 if (mc_policy)
272 list->Append(mc_policy);
273 if (rp_policy)
274 list->Append(rp_policy);
275 if (rc_policy)
276 list->Append(rc_policy);
277
278 return added_policy;
279 }
280
281 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698