OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 from xml.dom import minidom | 6 from xml.dom import minidom |
7 from writers import xml_formatted_writer | 7 from writers import xml_formatted_writer |
8 | 8 |
9 | 9 |
10 def GetWriter(config): | 10 def GetWriter(config): |
11 '''Factory method for instanciating the ADMXWriter. Every Writer needs a | 11 '''Factory method for instanciating the ADMXWriter. Every Writer needs a |
12 GetWriter method because the TemplateFormatter uses this method to | 12 GetWriter method because the TemplateFormatter uses this method to |
13 instantiate a Writer. | 13 instantiate a Writer. |
14 ''' | 14 ''' |
15 return ADMXWriter(['win'], config) | 15 return ADMXWriter(['win'], config) |
16 | 16 |
17 | 17 |
18 class ADMXWriter(xml_formatted_writer.XMLFormattedWriter): | 18 class ADMXWriter(xml_formatted_writer.XMLFormattedWriter): |
19 '''Class for generating an ADMX policy template. It is used by the | 19 '''Class for generating an ADMX policy template. It is used by the |
20 PolicyTemplateGenerator to write the admx file. | 20 PolicyTemplateGenerator to write the admx file. |
21 ''' | 21 ''' |
22 | 22 |
23 # DOM root node of the generated ADMX document. | 23 # DOM root node of the generated ADMX document. |
24 _doc = None | 24 _doc = None |
25 | 25 |
26 # The ADMX "policies" element that contains the ADMX "policy" elements that | 26 # The ADMX "policies" element that contains the ADMX "policy" elements that |
27 # are generated. | 27 # are generated. |
28 _active_policies_elem = None | 28 _active_policies_elem = None |
29 | 29 |
| 30 def Init(self): |
| 31 # Shortcut to platform-specific ADMX/ADM specific configuration. |
| 32 assert len(self.platforms) == 1 |
| 33 self.winconfig = self.config['win_config'][self.platforms[0]] |
| 34 |
30 def _AdmlString(self, name): | 35 def _AdmlString(self, name): |
31 '''Creates a reference to the named string in an ADML file. | 36 '''Creates a reference to the named string in an ADML file. |
32 Args: | 37 Args: |
33 name: Name of the referenced ADML string. | 38 name: Name of the referenced ADML string. |
34 ''' | 39 ''' |
35 name = name.replace('.', '_') | 40 name = name.replace('.', '_') |
36 return '$(string.' + name + ')' | 41 return '$(string.' + name + ')' |
37 | 42 |
38 def _AdmlStringExplain(self, name): | 43 def _AdmlStringExplain(self, name): |
39 '''Creates a reference to the named explanation string in an ADML file. | 44 '''Creates a reference to the named explanation string in an ADML file. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 } | 119 } |
115 category_elem = self.AddElement(parent, 'category', attributes) | 120 category_elem = self.AddElement(parent, 'category', attributes) |
116 if parent_category_name: | 121 if parent_category_name: |
117 attributes = {'ref': parent_category_name} | 122 attributes = {'ref': parent_category_name} |
118 self.AddElement(category_elem, 'parentCategory', attributes) | 123 self.AddElement(category_elem, 'parentCategory', attributes) |
119 | 124 |
120 def _AddCategories(self, categories): | 125 def _AddCategories(self, categories): |
121 '''Generates the ADMX "categories" element and adds it to the categories | 126 '''Generates the ADMX "categories" element and adds it to the categories |
122 main node. The "categories" element defines the category for the policies | 127 main node. The "categories" element defines the category for the policies |
123 defined in this ADMX document. Here is an example of an ADMX "categories" | 128 defined in this ADMX document. Here is an example of an ADMX "categories" |
124 element: | 129 element on Windows: |
125 | 130 |
126 <categories> | 131 <categories> |
127 <category displayName="$(string.googlechrome)" name="googlechrome"> | 132 <category displayName="$(string.googlechrome)" name="googlechrome"> |
128 <parentCategory ref="Google:Cat_Google"/> | 133 <parentCategory ref="Google:Cat_Google"/> |
129 </category> | 134 </category> |
130 </categories> | 135 </categories> |
131 | 136 |
132 Args: | 137 Args: |
133 categories_path: The categories path e.g. ['google', 'googlechrome']. For | 138 categories_path: The categories path e.g. ['google', 'googlechrome']. For |
134 each level in the path a "category" element will be generated, unless | 139 each level in the path a "category" element will be generated, unless |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 passed parent element. | 203 passed parent element. |
199 ''' | 204 ''' |
200 name = policy['name'] | 205 name = policy['name'] |
201 items = policy['items'] | 206 items = policy['items'] |
202 attributes = { | 207 attributes = { |
203 'id': name, | 208 'id': name, |
204 'valueName': name, | 209 'valueName': name, |
205 } | 210 } |
206 enum_elem = self.AddElement(parent, 'enum', attributes) | 211 enum_elem = self.AddElement(parent, 'enum', attributes) |
207 for item in items: | 212 for item in items: |
208 attributes = {'displayName': self._AdmlString(item['name'])} | 213 attributes = {'displayName': self._AdmlString(name + "_" + item['name'])} |
209 item_elem = self.AddElement(enum_elem, 'item', attributes) | 214 item_elem = self.AddElement(enum_elem, 'item', attributes) |
210 value_elem = self.AddElement(item_elem, 'value') | 215 value_elem = self.AddElement(item_elem, 'value') |
211 value_string = str(item['value']) | 216 value_string = str(item['value']) |
212 if policy['type'] == 'int-enum': | 217 if policy['type'] == 'int-enum': |
213 self.AddElement(value_elem, 'decimal', {'value': value_string}) | 218 self.AddElement(value_elem, 'decimal', {'value': value_string}) |
214 else: | 219 else: |
215 self.AddElement(value_elem, 'string', {}, value_string) | 220 self.AddElement(value_elem, 'string', {}, value_string) |
216 | 221 |
217 def _AddListPolicy(self, parent, key, name): | 222 def _AddListPolicy(self, parent, key, name): |
218 '''Generates ADMX XML elements for a List-Policy and adds them to the | 223 '''Generates ADMX XML elements for a List-Policy and adds them to the |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 ''' | 270 ''' |
266 policies_elem = self._active_policies_elem | 271 policies_elem = self._active_policies_elem |
267 policy_type = policy['type'] | 272 policy_type = policy['type'] |
268 policy_name = policy['name'] | 273 policy_name = policy['name'] |
269 if policy_type == 'external': | 274 if policy_type == 'external': |
270 # This type can only be set through cloud policy. | 275 # This type can only be set through cloud policy. |
271 return | 276 return |
272 | 277 |
273 attributes = { | 278 attributes = { |
274 'name': name, | 279 'name': name, |
275 'class': self.config['win_group_policy_class'], | 280 'class': self.GetClass(policy), |
276 'displayName': self._AdmlString(policy_name), | 281 'displayName': self._AdmlString(policy_name), |
277 'explainText': self._AdmlStringExplain(policy_name), | 282 'explainText': self._AdmlStringExplain(policy_name), |
278 'presentation': self._AdmlPresentation(policy_name), | 283 'presentation': self._AdmlPresentation(policy_name), |
279 'key': key, | 284 'key': key, |
280 } | 285 } |
281 # Store the current "policy" AMDX element in self for later use by the | 286 # Store the current "policy" AMDX element in self for later use by the |
282 # WritePolicy method. | 287 # WritePolicy method. |
283 policy_elem = self.AddElement(policies_elem, 'policy', | 288 policy_elem = self.AddElement(policies_elem, 'policy', |
284 attributes) | 289 attributes) |
285 self.AddElement(policy_elem, 'parentCategory', | 290 self.AddElement(policy_elem, 'parentCategory', |
(...skipping 18 matching lines...) Expand all Loading... |
304 self._AddListPolicy(parent, key, policy_name) | 309 self._AddListPolicy(parent, key, policy_name) |
305 elif policy_type == 'group': | 310 elif policy_type == 'group': |
306 pass | 311 pass |
307 else: | 312 else: |
308 raise Exception('Unknown policy type %s.' % policy_type) | 313 raise Exception('Unknown policy type %s.' % policy_type) |
309 | 314 |
310 def WritePolicy(self, policy): | 315 def WritePolicy(self, policy): |
311 if self.CanBeMandatory(policy): | 316 if self.CanBeMandatory(policy): |
312 self._WritePolicy(policy, | 317 self._WritePolicy(policy, |
313 policy['name'], | 318 policy['name'], |
314 self.config['win_reg_mandatory_key_name'], | 319 self.winconfig['reg_mandatory_key_name'], |
315 self._active_mandatory_policy_group_name) | 320 self._active_mandatory_policy_group_name) |
316 | 321 |
317 def WriteRecommendedPolicy(self, policy): | 322 def WriteRecommendedPolicy(self, policy): |
318 self._WritePolicy(policy, | 323 self._WritePolicy(policy, |
319 policy['name'] + '_recommended', | 324 policy['name'] + '_recommended', |
320 self.config['win_reg_recommended_key_name'], | 325 self.winconfig['reg_recommended_key_name'], |
321 self._active_recommended_policy_group_name) | 326 self._active_recommended_policy_group_name) |
322 | 327 |
323 def _BeginPolicyGroup(self, group, name, parent): | 328 def _BeginPolicyGroup(self, group, name, parent): |
324 '''Generates ADMX elements for a Policy-Group. | 329 '''Generates ADMX elements for a Policy-Group. |
325 ''' | 330 ''' |
326 attributes = { | 331 attributes = { |
327 'name': name, | 332 'name': name, |
328 'displayName': self._AdmlString(group['name'] + '_group'), | 333 'displayName': self._AdmlString(group['name'] + '_group'), |
329 } | 334 } |
330 category_elem = self.AddElement(self._categories_elem, | 335 category_elem = self.AddElement(self._categories_elem, |
331 'category', | 336 'category', |
332 attributes) | 337 attributes) |
333 attributes = { | 338 attributes = { |
334 'ref': parent | 339 'ref': parent |
335 } | 340 } |
336 self.AddElement(category_elem, 'parentCategory', attributes) | 341 self.AddElement(category_elem, 'parentCategory', attributes) |
337 | 342 |
338 def BeginPolicyGroup(self, group): | 343 def BeginPolicyGroup(self, group): |
339 self._BeginPolicyGroup(group, | 344 self._BeginPolicyGroup(group, |
340 group['name'], | 345 group['name'], |
341 self.config['win_mandatory_category_path'][-1]) | 346 self.winconfig['mandatory_category_path'][-1]) |
342 self._active_mandatory_policy_group_name = group['name'] | 347 self._active_mandatory_policy_group_name = group['name'] |
343 | 348 |
344 def EndPolicyGroup(self): | 349 def EndPolicyGroup(self): |
345 self._active_mandatory_policy_group_name = \ | 350 self._active_mandatory_policy_group_name = \ |
346 self.config['win_mandatory_category_path'][-1] | 351 self.winconfig['mandatory_category_path'][-1] |
347 | 352 |
348 def BeginRecommendedPolicyGroup(self, group): | 353 def BeginRecommendedPolicyGroup(self, group): |
349 self._BeginPolicyGroup(group, | 354 self._BeginPolicyGroup(group, |
350 group['name'] + '_recommended', | 355 group['name'] + '_recommended', |
351 self.config['win_recommended_category_path'][-1]) | 356 self.winconfig['recommended_category_path'][-1]) |
352 self._active_recommended_policy_group_name = group['name'] + '_recommended' | 357 self._active_recommended_policy_group_name = group['name'] + '_recommended' |
353 | 358 |
354 def EndRecommendedPolicyGroup(self): | 359 def EndRecommendedPolicyGroup(self): |
355 self._active_recommended_policy_group_name = \ | 360 self._active_recommended_policy_group_name = \ |
356 self.config['win_recommended_category_path'][-1] | 361 self.winconfig['recommended_category_path'][-1] |
357 | 362 |
358 def BeginTemplate(self): | 363 def BeginTemplate(self): |
359 '''Generates the skeleton of the ADMX template. An ADMX template contains | 364 '''Generates the skeleton of the ADMX template. An ADMX template contains |
360 an ADMX "PolicyDefinitions" element with four child nodes: "policies" | 365 an ADMX "PolicyDefinitions" element with four child nodes: "policies" |
361 "policyNamspaces", "resources", "supportedOn" and "categories" | 366 "policyNamspaces", "resources", "supportedOn" and "categories" |
362 ''' | 367 ''' |
363 dom_impl = minidom.getDOMImplementation('') | 368 dom_impl = minidom.getDOMImplementation('') |
364 self._doc = dom_impl.createDocument(None, 'policyDefinitions', None) | 369 self._doc = dom_impl.createDocument(None, 'policyDefinitions', None) |
365 if self._GetChromiumVersionString() is not None: | 370 if self._GetChromiumVersionString() is not None: |
366 self.AddComment(self._doc.documentElement, self.config['build'] + \ | 371 self.AddComment(self._doc.documentElement, self.config['build'] + \ |
367 ' version: ' + self._GetChromiumVersionString()) | 372 ' version: ' + self._GetChromiumVersionString()) |
368 policy_definitions_elem = self._doc.documentElement | 373 policy_definitions_elem = self._doc.documentElement |
369 | 374 |
370 policy_definitions_elem.attributes['revision'] = '1.0' | 375 policy_definitions_elem.attributes['revision'] = '1.0' |
371 policy_definitions_elem.attributes['schemaVersion'] = '1.0' | 376 policy_definitions_elem.attributes['schemaVersion'] = '1.0' |
372 | 377 |
373 self._AddPolicyNamespaces(policy_definitions_elem, | 378 self._AddPolicyNamespaces(policy_definitions_elem, |
374 self.config['admx_prefix'], | 379 self.config['admx_prefix'], |
375 self.config['admx_namespace']) | 380 self.winconfig['namespace']) |
376 self.AddElement(policy_definitions_elem, 'resources', | 381 self.AddElement(policy_definitions_elem, 'resources', |
377 {'minRequiredRevision' : '1.0'}) | 382 {'minRequiredRevision' : '1.0'}) |
378 self._AddSupportedOn(policy_definitions_elem, | 383 self._AddSupportedOn(policy_definitions_elem, |
379 self.config['win_supported_os']) | 384 self.config['win_supported_os']) |
380 self._categories_elem = self.AddElement(policy_definitions_elem, | 385 self._categories_elem = self.AddElement(policy_definitions_elem, |
381 'categories') | 386 'categories') |
382 self._AddCategories(self.config['win_mandatory_category_path']) | 387 self._AddCategories(self.winconfig['mandatory_category_path']) |
383 self._AddCategories(self.config['win_recommended_category_path']) | 388 self._AddCategories(self.winconfig['recommended_category_path']) |
384 self._active_policies_elem = self.AddElement(policy_definitions_elem, | 389 self._active_policies_elem = self.AddElement(policy_definitions_elem, |
385 'policies') | 390 'policies') |
386 self._active_mandatory_policy_group_name = \ | 391 self._active_mandatory_policy_group_name = \ |
387 self.config['win_mandatory_category_path'][-1] | 392 self.winconfig['mandatory_category_path'][-1] |
388 self._active_recommended_policy_group_name = \ | 393 self._active_recommended_policy_group_name = \ |
389 self.config['win_recommended_category_path'][-1] | 394 self.winconfig['recommended_category_path'][-1] |
390 | 395 |
391 def GetTemplateText(self): | 396 def GetTemplateText(self): |
392 return self.ToPrettyXml(self._doc) | 397 return self.ToPrettyXml(self._doc) |
| 398 |
| 399 def GetClass(self, policy): |
| 400 return 'Both' |
OLD | NEW |