OLD | NEW |
---|---|
(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 | |
OLD | NEW |