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

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

Powered by Google App Engine
This is Rietveld 408576698