Index: grit/format/policy_templates/writers/ios_plist_writer.py |
=================================================================== |
--- grit/format/policy_templates/writers/ios_plist_writer.py (revision 0) |
+++ grit/format/policy_templates/writers/ios_plist_writer.py (working copy) |
@@ -0,0 +1,122 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2014 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. |
+ |
+ |
+import base64 |
+ |
+from xml.dom import minidom |
+from grit.format.policy_templates.writers import plist_writer |
+ |
+ |
+# This writer outputs a Property List with an example for each of the policies |
+# supported on iOS. This plist can be pushed to Chrome on iOS via the MDM API |
+# introduced in iOS 7. |
+ |
+CHROME_POLICY_COMMENT = '''\ |
+ ChromePolicy is the preferred key to configure Chrome. |
+ Each of the keys in this <dict> configures a Chrome policy. |
+ All of the Chrome policies are configured with an example |
+ value below. |
+ Note that it's not necessary to configure all of them. ''' |
+ |
+ENCODED_CHROME_POLICY_COMMENT = '''\ |
+ EncodedChromePolicy contains a Property List file, encoded in Base64, |
+ which contains the same policies that can go in ChromePolicy. |
+ This key can be used by vendors that restrict the app configuration |
+ types to strings. |
+ The value of this string can be validated by running these |
+ commands in Mac OS X: |
+ |
+ # (first, copy-paste the string into a file named "policy.plist") |
+ # base64 -D < policy.plist > decoded_policy.plist |
+ # plutil -lint decoded_policy.plist |
+ |
+ plutil should indicate that decoded_policy.plist is valid, |
+ otherwise Chrome will reject the encoded string too. |
+ |
+ This command can be used to pretty-print the plist file: |
+ |
+ # plutil -convert xml1 decoded_policy.plist |
+ |
+ Note that <ChromePolicy> is the preferred key to configure Chrome. |
+ If <ChromePolicy> is present then <EncodedChromePolicy> is ignored. ''' |
+ |
+def GetWriter(config): |
+ '''Factory method for creating IOSPlistWriter objects. |
+ See the constructor of TemplateWriter for description of |
+ arguments. |
+ ''' |
+ return IOSPlistWriter(['ios'], config) |
+ |
+ |
+class IOSPlistWriter(plist_writer.PListWriter): |
+ '''Class for generating policy templates in the iOS plist format. |
+ It is used by PolicyTemplateGenerator to write plist files. |
+ ''' |
+ |
+ # Overridden. |
+ def IsPolicySupported(self, policy): |
+ # Output examples only for policies that are supported on iOS. |
+ for support_on in policy['supported_on']: |
+ if ('ios' in support_on['platforms'] and |
+ support_on['until_version'] == '' and |
+ super(IOSPlistWriter, self).IsPolicySupported(policy)): |
+ return True |
+ return False |
+ |
+ def _WriteValue(self, parent, value): |
+ if type(value) == bool: |
+ self.AddElement(parent, 'true' if value else 'false') |
+ elif type(value) == int: |
+ self.AddElement(parent, 'integer', {}, str(value)) |
+ elif type(value) == str: |
+ self.AddElement(parent, 'string', {}, value) |
+ elif type(value) == list: |
+ array = self.AddElement(parent, 'array') |
+ for element in value: |
+ self._WriteValue(array, element) |
+ elif type(value) == dict: |
+ dic = self.AddElement(parent, 'dict') |
+ for k, v in sorted(value.iteritems()): |
+ self.AddElement(dic, 'key', {}, k) |
+ self._WriteValue(dic, v) |
+ else: |
+ raise ValueError('Unsupported type in example value: ' + type(value)) |
+ |
+ # Overridden. |
+ def WritePolicy(self, policy): |
+ for dict in [self._dict, self._encoded_dict]: |
+ self.AddElement(dict, 'key', {}, policy['name']) |
+ self._WriteValue(dict, policy['example_value']) |
+ |
+ # Overridden. |
+ # |self._plist| is created in super.Init(). |
+ def BeginTemplate(self): |
+ self._plist.attributes['version'] = '1.0' |
+ self._root_dict = self.AddElement(self._plist, 'dict') |
+ self.AddComment(self._root_dict, CHROME_POLICY_COMMENT) |
+ self._dict = self._AddKeyValuePair(self._root_dict, 'ChromePolicy', 'dict') |
+ |
+ self._encoded_plist.attributes['version'] = '1.0' |
+ self._encoded_dict = self.AddElement(self._encoded_plist, 'dict') |
+ |
+ # Overridden. |
+ def EndTemplate(self): |
+ # Add the "EncodedChromePolicy" entry. |
+ encoded = base64.b64encode(self._encoded_doc.toxml()) |
+ self.AddComment(self._root_dict, ENCODED_CHROME_POLICY_COMMENT) |
+ self._AddStringKeyValuePair(self._root_dict, 'EncodedChromePolicy', encoded) |
+ |
+ # Overridden. |
+ def Init(self): |
+ super(IOSPlistWriter, self).Init() |
+ # Create a secondary DOM for the EncodedChromePolicy Plist, which will be |
+ # serialized and encoded in EndTemplate. |
+ self._encoded_doc = self.CreatePlistDocument() |
+ self._encoded_plist = self._encoded_doc.documentElement |
+ |
+ # Overridden. |
+ def GetTemplateText(self): |
+ return self.ToPrettyXml(self._doc, encoding='UTF-8') |
Property changes on: grit/format/policy_templates/writers/ios_plist_writer.py |
___________________________________________________________________ |
Added: svn:eol-style |
## -0,0 +1 ## |
+LF |
\ No newline at end of property |