1#!/usr/bin/env python 2# 3# Copyright (C) 2022 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17"""A tool for modifying privileged permission allowlists.""" 18 19from __future__ import print_function 20 21import argparse 22import sys 23from xml.dom import minidom 24 25 26class InvalidRootNodeException(Exception): 27 pass 28 29 30class InvalidNumberOfPrivappPermissionChildren(Exception): 31 pass 32 33 34def modify_allowlist(allowlist_dom, package_name): 35 if allowlist_dom.documentElement.tagName != 'permissions': 36 raise InvalidRootNodeException 37 nodes = allowlist_dom.getElementsByTagName('privapp-permissions') 38 if nodes.length != 1: 39 raise InvalidNumberOfPrivappPermissionChildren 40 privapp_permissions = nodes[0] 41 privapp_permissions.setAttribute('package', package_name) 42 43 44def parse_args(): 45 """Parse commandline arguments.""" 46 47 parser = argparse.ArgumentParser() 48 parser.add_argument('input', help='input allowlist template file') 49 parser.add_argument( 50 'package_name', help='package name to use in the allowlist' 51 ) 52 parser.add_argument('output', help='output allowlist file') 53 54 return parser.parse_args() 55 56 57def main(): 58 try: 59 args = parse_args() 60 doc = minidom.parse(args.input) 61 modify_allowlist(doc, args.package_name) 62 with open(args.output, 'w') as output_file: 63 doc.writexml(output_file, encoding='utf-8') 64 except Exception as err: 65 print('error: ' + str(err), file=sys.stderr) 66 sys.exit(-1) 67 68 69if __name__ == '__main__': 70 main() 71