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

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

Powered by Google App Engine
This is Rietveld 408576698