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

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: Removed the map wrapper and wrapped the javascript functions into an object. 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 PolicyStatusMapType;
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();
63
64 // Create a mapping from ConfigurationPolicyTypes to actual policy names.
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
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 {
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 =
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_)
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() const {
219 ListValue* result = new ListValue();
220 std::vector<PolicyStatusInfo> unsent_policies;
221
222 const PolicyDefinitionList* supported_policies =
223 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList();
224 const PolicyDefinitionList::Entry* policy = supported_policies->begin;
225 for ( ; policy != supported_policies->end; ++policy) {
226 if (!AddPolicyFromReaders(policy->policy_type, result)) {
227 PolicyStatusInfo info(ASCIIToUTF16(policy->name),
228 PolicyStatusInfo::SOURCE_TYPE_UNDEFINED,
229 PolicyStatusInfo::LEVEL_UNDEFINED,
230 Value::CreateNullValue(),
231 PolicyStatusInfo::STATUS_UNDEFINED,
232 string16());
233 unsent_policies.push_back(info);
234 }
235 }
236
237 // Add policies that weren't actually sent from providers to list.
238 std::vector<PolicyStatusInfo>::const_iterator info = unsent_policies.begin();
239 for ( ; info != unsent_policies.end(); ++info)
240 result->Append((*info).GetDictionaryValue());
241
242 unsent_policies.clear();
243 return result;
244 }
245
246 bool PolicyStatus::AddPolicyFromReaders(
247 ConfigurationPolicyType policy, ListValue* list) const {
248 DictionaryValue* mp_policy =
249 managed_platform_->GetPolicyStatus(policy);
250 DictionaryValue* mc_policy =
251 managed_cloud_->GetPolicyStatus(policy);
252 DictionaryValue* rp_policy =
253 recommended_platform_->GetPolicyStatus(policy);
254 DictionaryValue* rc_policy =
255 recommended_cloud_->GetPolicyStatus(policy);
256
257 bool added_policy = mp_policy || mc_policy || rp_policy || rc_policy;
258
259 if (mp_policy)
260 list->Append(mp_policy);
261 if (mc_policy)
262 list->Append(mc_policy);
263 if (rp_policy)
264 list->Append(rp_policy);
265 if (rc_policy)
266 list->Append(rc_policy);
267
268 return added_policy;
269 }
270
271 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698