| Index: grit/format/policy_templates/writers/adm_writer.py
|
| ===================================================================
|
| --- grit/format/policy_templates/writers/adm_writer.py (revision 202)
|
| +++ grit/format/policy_templates/writers/adm_writer.py (working copy)
|
| @@ -1,274 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -
|
| -from grit.format.policy_templates.writers import template_writer
|
| -
|
| -
|
| -NEWLINE = '\r\n'
|
| -
|
| -
|
| -def GetWriter(config):
|
| - '''Factory method for creating AdmWriter objects.
|
| - See the constructor of TemplateWriter for description of
|
| - arguments.
|
| - '''
|
| - return AdmWriter(['win'], config)
|
| -
|
| -
|
| -class IndentedStringBuilder:
|
| - '''Utility class for building text with indented lines.'''
|
| -
|
| - def __init__(self):
|
| - self.lines = []
|
| - self.indent = ''
|
| -
|
| - def AddLine(self, string='', indent_diff=0):
|
| - '''Appends a string with indentation and a linebreak to |self.lines|.
|
| -
|
| - Args:
|
| - string: The string to print.
|
| - indent_diff: the difference of indentation of the printed line,
|
| - compared to the next/previous printed line. Increment occurs
|
| - after printing the line, while decrement occurs before that.
|
| - '''
|
| - indent_diff *= 2
|
| - if indent_diff < 0:
|
| - self.indent = self.indent[(-indent_diff):]
|
| - if string != '':
|
| - self.lines.append(self.indent + string)
|
| - else:
|
| - self.lines.append('')
|
| - if indent_diff > 0:
|
| - self.indent += ''.ljust(indent_diff)
|
| -
|
| - def AddLines(self, other):
|
| - '''Appends the content of another |IndentedStringBuilder| to |self.lines|.
|
| - Indentation of the added lines will be the sum of |self.indent| and
|
| - their original indentation.
|
| -
|
| - Args:
|
| - other: The buffer from which lines are copied.
|
| - '''
|
| - for line in other.lines:
|
| - self.AddLine(line)
|
| -
|
| - def ToString(self):
|
| - '''Returns |self.lines| as text string.'''
|
| - return NEWLINE.join(self.lines)
|
| -
|
| -
|
| -class AdmWriter(template_writer.TemplateWriter):
|
| - '''Class for generating policy templates in Windows ADM format.
|
| - It is used by PolicyTemplateGenerator to write ADM files.
|
| - '''
|
| -
|
| - TYPE_TO_INPUT = {
|
| - 'string': 'EDITTEXT',
|
| - 'int': 'NUMERIC',
|
| - 'string-enum': 'DROPDOWNLIST',
|
| - 'int-enum': 'DROPDOWNLIST',
|
| - 'list': 'LISTBOX',
|
| - 'string-enum-list': 'LISTBOX',
|
| - 'dict': 'EDITTEXT'
|
| - }
|
| -
|
| - def _Escape(self, string):
|
| - return string.replace('.', '_')
|
| -
|
| - def _AddGuiString(self, name, value):
|
| - # The |name| must be escaped.
|
| - assert name == self._Escape(name)
|
| - # Escape newlines in the value.
|
| - value = value.replace('\n', '\\n')
|
| - if name in self.strings_seen:
|
| - err = ('%s was added as "%s" and now added again as "%s"' %
|
| - (name, self.strings_seen[name], value))
|
| - assert value == self.strings_seen[name], err
|
| - else:
|
| - self.strings_seen[name] = value
|
| - line = '%s="%s"' % (name, value)
|
| - self.strings.AddLine(line)
|
| -
|
| - def _WriteSupported(self, builder):
|
| - builder.AddLine('#if version >= 4', 1)
|
| - builder.AddLine('SUPPORTED !!SUPPORTED_WINXPSP2')
|
| - builder.AddLine('#endif', -1)
|
| -
|
| - def _WritePart(self, policy, key_name, builder):
|
| - '''Writes the PART ... END PART section of a policy.
|
| -
|
| - Args:
|
| - policy: The policy to write to the output.
|
| - key_name: The registry key backing the policy.
|
| - builder: Builder to append lines to.
|
| - '''
|
| - policy_part_name = self._Escape(policy['name'] + '_Part')
|
| - self._AddGuiString(policy_part_name, policy['label'])
|
| -
|
| - # Print the PART ... END PART section:
|
| - builder.AddLine()
|
| - adm_type = self.TYPE_TO_INPUT[policy['type']]
|
| - builder.AddLine('PART !!%s %s' % (policy_part_name, adm_type), 1)
|
| - if policy['type'] in ('list', 'string-enum-list'):
|
| - # Note that the following line causes FullArmor ADMX Migrator to create
|
| - # corrupt ADMX files. Please use admx_writer to get ADMX files.
|
| - builder.AddLine('KEYNAME "%s\\%s"' % (key_name, policy['name']))
|
| - builder.AddLine('VALUEPREFIX ""')
|
| - else:
|
| - builder.AddLine('VALUENAME "%s"' % policy['name'])
|
| - if policy['type'] == 'int':
|
| - # The default max for NUMERIC values is 9999 which is too small for us.
|
| - builder.AddLine('MIN 0 MAX 2000000000')
|
| - if policy['type'] in ('string', 'dict'):
|
| - # The default max for EDITTEXT values is 1023, which is too small for
|
| - # big JSON blobs and other string policies.
|
| - builder.AddLine('MAXLEN 1000000')
|
| - if policy['type'] in ('int-enum', 'string-enum'):
|
| - builder.AddLine('ITEMLIST', 1)
|
| - for item in policy['items']:
|
| - if policy['type'] == 'int-enum':
|
| - value_text = 'NUMERIC ' + str(item['value'])
|
| - else:
|
| - value_text = '"' + item['value'] + '"'
|
| - string_id = self._Escape(item['name'] + '_DropDown')
|
| - builder.AddLine('NAME !!%s VALUE %s' % (string_id, value_text))
|
| - self._AddGuiString(string_id, item['caption'])
|
| - builder.AddLine('END ITEMLIST', -1)
|
| - builder.AddLine('END PART', -1)
|
| -
|
| - def _WritePolicy(self, policy, key_name, builder):
|
| - if policy['type'] == 'external':
|
| - # This type can only be set through cloud policy.
|
| - return
|
| -
|
| - policy_name = self._Escape(policy['name'] + '_Policy')
|
| - self._AddGuiString(policy_name, policy['caption'])
|
| - builder.AddLine('POLICY !!%s' % policy_name, 1)
|
| - self._WriteSupported(builder)
|
| - policy_explain_name = self._Escape(policy['name'] + '_Explain')
|
| - self._AddGuiString(policy_explain_name, policy['desc'])
|
| - builder.AddLine('EXPLAIN !!' + policy_explain_name)
|
| -
|
| - if policy['type'] == 'main':
|
| - builder.AddLine('VALUENAME "%s"' % policy['name'])
|
| - builder.AddLine('VALUEON NUMERIC 1')
|
| - builder.AddLine('VALUEOFF NUMERIC 0')
|
| - else:
|
| - self._WritePart(policy, key_name, builder)
|
| -
|
| - builder.AddLine('END POLICY', -1)
|
| - builder.AddLine()
|
| -
|
| - def WriteComment(self, comment):
|
| - self.lines.AddLine('; ' + comment)
|
| -
|
| - def WritePolicy(self, policy):
|
| - if self.CanBeMandatory(policy):
|
| - self._WritePolicy(policy,
|
| - self.config['win_reg_mandatory_key_name'],
|
| - self.policies)
|
| -
|
| - def WriteRecommendedPolicy(self, policy):
|
| - self._WritePolicy(policy,
|
| - self.config['win_reg_recommended_key_name'],
|
| - self.recommended_policies)
|
| -
|
| - def BeginPolicyGroup(self, group):
|
| - category_name = self._Escape(group['name'] + '_Category')
|
| - self._AddGuiString(category_name, group['caption'])
|
| - self.policies.AddLine('CATEGORY !!' + category_name, 1)
|
| -
|
| - def EndPolicyGroup(self):
|
| - self.policies.AddLine('END CATEGORY', -1)
|
| - self.policies.AddLine('')
|
| -
|
| - def BeginRecommendedPolicyGroup(self, group):
|
| - category_name = self._Escape(group['name'] + '_Category')
|
| - self._AddGuiString(category_name, group['caption'])
|
| - self.recommended_policies.AddLine('CATEGORY !!' + category_name, 1)
|
| -
|
| - def EndRecommendedPolicyGroup(self):
|
| - self.recommended_policies.AddLine('END CATEGORY', -1)
|
| - self.recommended_policies.AddLine('')
|
| -
|
| - def _CreateTemplate(self, category_path, key_name, policies):
|
| - '''Creates the whole ADM template except for the [Strings] section, and
|
| - returns it as an |IndentedStringBuilder|.
|
| -
|
| - Args:
|
| - category_path: List of strings representing the category path.
|
| - key_name: Main registry key backing the policies.
|
| - policies: ADM code for all the policies in an |IndentedStringBuilder|.
|
| - '''
|
| - lines = IndentedStringBuilder()
|
| - for part in category_path:
|
| - lines.AddLine('CATEGORY !!' + part, 1)
|
| - lines.AddLine('KEYNAME "%s"' % key_name)
|
| - lines.AddLine()
|
| -
|
| - lines.AddLines(policies)
|
| -
|
| - for part in category_path:
|
| - lines.AddLine('END CATEGORY', -1)
|
| - lines.AddLine()
|
| -
|
| - return lines
|
| -
|
| - def BeginTemplate(self):
|
| - if self._GetChromiumVersionString() is not None:
|
| - self.WriteComment(self.config['build'] + ' version: ' + \
|
| - self._GetChromiumVersionString())
|
| - self._AddGuiString(self.config['win_supported_os'],
|
| - self.messages['win_supported_winxpsp2']['text'])
|
| - category_path = self.config['win_mandatory_category_path']
|
| - recommended_category_path = self.config['win_recommended_category_path']
|
| - recommended_name = '%s - %s' % \
|
| - (self.config['app_name'], self.messages['doc_recommended']['text'])
|
| - if self.config['build'] == 'chrome':
|
| - self._AddGuiString(category_path[0], 'Google')
|
| - self._AddGuiString(category_path[1], self.config['app_name'])
|
| - self._AddGuiString(recommended_category_path[1], recommended_name)
|
| - elif self.config['build'] == 'chromium':
|
| - self._AddGuiString(category_path[0], self.config['app_name'])
|
| - self._AddGuiString(recommended_category_path[0], recommended_name)
|
| - # All the policies will be written into self.policies.
|
| - # The final template text will be assembled into self.lines by
|
| - # self.EndTemplate().
|
| -
|
| - def EndTemplate(self):
|
| - # Copy policies into self.lines.
|
| - policy_class = self.config['win_group_policy_class'].upper()
|
| - for class_name in ['MACHINE', 'USER']:
|
| - if policy_class != 'BOTH' and policy_class != class_name:
|
| - continue
|
| - self.lines.AddLine('CLASS ' + class_name, 1)
|
| - self.lines.AddLines(self._CreateTemplate(
|
| - self.config['win_mandatory_category_path'],
|
| - self.config['win_reg_mandatory_key_name'],
|
| - self.policies))
|
| - self.lines.AddLines(self._CreateTemplate(
|
| - self.config['win_recommended_category_path'],
|
| - self.config['win_reg_recommended_key_name'],
|
| - self.recommended_policies))
|
| - self.lines.AddLine('', -1)
|
| - # Copy user strings into self.lines.
|
| - self.lines.AddLine('[Strings]')
|
| - self.lines.AddLines(self.strings)
|
| -
|
| - def Init(self):
|
| - # String buffer for building the whole ADM file.
|
| - self.lines = IndentedStringBuilder()
|
| - # String buffer for building the strings section of the ADM file.
|
| - self.strings = IndentedStringBuilder()
|
| - # Map of strings seen, to avoid duplicates.
|
| - self.strings_seen = {}
|
| - # String buffer for building the policies of the ADM file.
|
| - self.policies = IndentedStringBuilder()
|
| - # String buffer for building the recommended policies of the ADM file.
|
| - self.recommended_policies = IndentedStringBuilder()
|
| -
|
| - def GetTemplateText(self):
|
| - return self.lines.ToString()
|
|
|