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

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, 3 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/stl_util.h"
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*> 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 STLDeleteContainerPairSecondPointers(policy_map_.begin(), policy_map_.end());
64 policy_map_.clear();
65 }
66
67 void ConfigurationPolicyStatusKeeper::Apply(
68 ConfigurationPolicyType policy, base::Value* value) {
69 string16 name = PolicyStatus::GetPolicyName(policy);
70
71 if (name == string16()) {
72 NOTREACHED();
73 }
74
75 // TODO(simo) actually determine whether the policy is a user or a device one
76 // and whether the policy could be enforced or not once this information
77 // is available.
78 PolicyStatusInfo* info = new PolicyStatusInfo(name,
79 PolicyStatusInfo::USER,
80 policy_level_,
81 value,
82 PolicyStatusInfo::ENFORCED,
83 string16());
84 policy_map_[policy] = info;
85 }
86
87 DictionaryValue* ConfigurationPolicyStatusKeeper::GetPolicyStatus(
88 ConfigurationPolicyType policy) const {
89 PolicyStatusMap::const_iterator entry = policy_map_.find(policy);
90 return entry != policy_map_.end() ?
91 (entry->second)->GetDictionaryValue() : NULL;
92 }
93
94 // ConfigurationPolicyReader
95 ConfigurationPolicyReader::~ConfigurationPolicyReader() {
96 }
97
98 void ConfigurationPolicyReader::OnUpdatePolicy() {
99 Refresh();
100 }
101
102 void ConfigurationPolicyReader::OnProviderGoingAway() {
103 provider_ = NULL;
104 }
105
106 // static
107 ConfigurationPolicyReader*
108 ConfigurationPolicyReader::CreateManagedPlatformPolicyReader() {
109 BrowserPolicyConnector* connector =
110 g_browser_process->browser_policy_connector();
111 return new ConfigurationPolicyReader(
112 connector->GetManagedPlatformProvider(), PolicyStatusInfo::MANDATORY);
113 }
114
115 // static
116 ConfigurationPolicyReader*
117 ConfigurationPolicyReader::CreateManagedCloudPolicyReader() {
118 BrowserPolicyConnector* connector =
119 g_browser_process->browser_policy_connector();
120 return new ConfigurationPolicyReader(
121 connector->GetManagedCloudProvider(), PolicyStatusInfo::MANDATORY);
122 }
123
124 // static
125 ConfigurationPolicyReader*
126 ConfigurationPolicyReader::CreateRecommendedPlatformPolicyReader() {
127 BrowserPolicyConnector* connector =
128 g_browser_process->browser_policy_connector();
129 return new ConfigurationPolicyReader(
130 connector->GetRecommendedPlatformProvider(),
131 PolicyStatusInfo::RECOMMENDED);
132 }
133
134 // static
135 ConfigurationPolicyReader*
136 ConfigurationPolicyReader::CreateRecommendedCloudPolicyReader() {
137 BrowserPolicyConnector* connector =
138 g_browser_process->browser_policy_connector();
139 return new ConfigurationPolicyReader(
140 connector->GetRecommendedCloudProvider(), PolicyStatusInfo::RECOMMENDED);
141 }
142
143 DictionaryValue* ConfigurationPolicyReader::GetPolicyStatus(
144 ConfigurationPolicyType policy) const {
145 return policy_keeper_->GetPolicyStatus(policy);
146 }
147
148 ConfigurationPolicyReader::ConfigurationPolicyReader(
149 ConfigurationPolicyProvider* provider,
150 PolicyStatusInfo::PolicyLevel policy_level)
151 : provider_(provider),
152 policy_level_(policy_level) {
153 if (provider_) {
154 // Read initial policy.
155 policy_keeper_.reset(
156 new ConfigurationPolicyStatusKeeper(provider, policy_level));
157 registrar_.Init(provider_, this);
158 }
159 }
160
161 ConfigurationPolicyReader::ConfigurationPolicyReader()
162 : provider_(NULL),
163 policy_level_(PolicyStatusInfo::LEVEL_UNDEFINED),
164 policy_keeper_(NULL) {
165 }
166
167 void ConfigurationPolicyReader::Refresh() {
168 if (!provider_)
169 return;
170
171 // Read policy state into a new keeper and swap out old keeper.
172 scoped_ptr<ConfigurationPolicyStatusKeeper> new_keeper(
173 new ConfigurationPolicyStatusKeeper(provider_, policy_level_));
174 policy_keeper_.reset(new_keeper.release());
175 }
176
177 // PolicyStatus
178 PolicyStatus::PolicyStatus(ConfigurationPolicyReader* managed_platform,
179 ConfigurationPolicyReader* managed_cloud,
180 ConfigurationPolicyReader* recommended_platform,
181 ConfigurationPolicyReader* recommended_cloud)
182 : managed_platform_(managed_platform),
183 managed_cloud_(managed_cloud),
184 recommended_platform_(recommended_platform),
185 recommended_cloud_(recommended_cloud) {
186 }
187
188 PolicyStatus::~PolicyStatus() {
189 }
190
191 ListValue* PolicyStatus::GetPolicyStatusList(bool* any_policies_sent) const {
192 ListValue* result = new ListValue();
193 std::vector<DictionaryValue*> unsent_policies;
194
195 *any_policies_sent = false;
196 const PolicyDefinitionList* supported_policies =
197 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList();
198 const PolicyDefinitionList::Entry* policy = supported_policies->begin;
199 for ( ; policy != supported_policies->end; ++policy) {
200 if (!AddPolicyFromReaders(policy->policy_type, result)) {
201 PolicyStatusInfo info(ASCIIToUTF16(policy->name),
202 PolicyStatusInfo::SOURCE_TYPE_UNDEFINED,
203 PolicyStatusInfo::LEVEL_UNDEFINED,
204 Value::CreateNullValue(),
205 PolicyStatusInfo::STATUS_UNDEFINED,
206 string16());
207 unsent_policies.push_back(info.GetDictionaryValue());
208 } else {
209 *any_policies_sent = true;
210 }
211 }
212
213 // Add policies that weren't actually sent from providers to list.
214 std::vector<DictionaryValue*>::const_iterator info = unsent_policies.begin();
215 for ( ; info != unsent_policies.end(); ++info)
216 result->Append(*info);
217
218 return result;
219 }
220
221 // static
222 string16 PolicyStatus::GetPolicyName(ConfigurationPolicyType policy_type) {
223 static std::map<ConfigurationPolicyType, string16> name_map;
224 static const ConfigurationPolicyProvider::PolicyDefinitionList*
225 supported_policies;
226
227 if (!supported_policies) {
228 supported_policies =
229 ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList();
230
231 // Create mapping from ConfigurationPolicyTypes to actual policy names.
232 const ConfigurationPolicyProvider::PolicyDefinitionList::Entry* entry =
233 supported_policies->begin;
234 for ( ; entry != supported_policies->end; ++entry)
235 name_map[entry->policy_type] = ASCIIToUTF16(entry->name);
236 }
237
238 std::map<ConfigurationPolicyType, string16>::const_iterator entry =
239 name_map.find(policy_type);
240
241 if (entry == name_map.end())
242 return string16();
243
244 return entry->second;
245 }
246
247 bool PolicyStatus::AddPolicyFromReaders(
248 ConfigurationPolicyType policy, ListValue* list) const {
249 DictionaryValue* mp_policy =
250 managed_platform_->GetPolicyStatus(policy);
251 DictionaryValue* mc_policy =
252 managed_cloud_->GetPolicyStatus(policy);
253 DictionaryValue* rp_policy =
254 recommended_platform_->GetPolicyStatus(policy);
255 DictionaryValue* rc_policy =
256 recommended_cloud_->GetPolicyStatus(policy);
257
258 bool added_policy = mp_policy || mc_policy || rp_policy || rc_policy;
259
260 if (mp_policy)
261 list->Append(mp_policy);
262 if (mc_policy)
263 list->Append(mc_policy);
264 if (rp_policy)
265 list->Append(rp_policy);
266 if (rc_policy)
267 list->Append(rc_policy);
268
269 return added_policy;
270 }
271
272 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698