summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xtools/make_key2
-rwxr-xr-xtools/privapp_permissions/privapp_permissions.py158
2 files changed, 138 insertions, 22 deletions
diff --git a/tools/make_key b/tools/make_key
index a6cf49c0d..9eb3c9884 100755
--- a/tools/make_key
+++ b/tools/make_key
@@ -69,7 +69,7 @@ if [ "${password}" == "" ]; then
else
echo "creating ${1}.pk8 with password [${password}]"
export password
- openssl pkcs8 -in ${one} -topk8 -outform DER -out $1.pk8 \
+ openssl pkcs8 -in ${one} -topk8 -v1 PBE-SHA1-3DES -outform DER -out $1.pk8 \
-passout env:password
unset password
fi
diff --git a/tools/privapp_permissions/privapp_permissions.py b/tools/privapp_permissions/privapp_permissions.py
index 4016573a4..d61319e4d 100755
--- a/tools/privapp_permissions/privapp_permissions.py
+++ b/tools/privapp_permissions/privapp_permissions.py
@@ -38,7 +38,7 @@ Generates privapp-permissions.xml file for priv-apps.
Usage:
Specify which apk to generate priv-app permissions for. If no apk is \
specified, this will default to all APKs under "<ANDROID_PRODUCT_OUT>/ \
-system/priv-app".
+system/priv-app and (system/)product/priv-app".
Examples:
@@ -156,9 +156,18 @@ class Resources(object):
'You must either set up your build environment, or specify a '
'device to run against. See --help for more info.')
- self.privapp_apks = self._resolve_apks(apks)
- self.permissions_dir = self._resolve_sys_path('system/etc/permissions')
- self.sysconfig_dir = self._resolve_sys_path('system/etc/sysconfig')
+ self.system_privapp_apks, self.product_privapp_apks =(
+ self._resolve_apks(apks))
+ self.system_permissions_dir = (
+ self._resolve_sys_path('system/etc/permissions'))
+ self.system_sysconfig_dir = (
+ self._resolve_sys_path('system/etc/sysconfig'))
+ self.product_permissions_dir = (
+ self._resolve_sys_path('product/etc/permissions',
+ 'system/product/etc/permissions'))
+ self.product_sysconfig_dir = (
+ self._resolve_sys_path('product/etc/sysconfig',
+ 'system/product/etc/sysconfig'))
self.framework_res_apk = self._resolve_sys_path('system/framework/'
'framework-res.apk')
@@ -289,7 +298,8 @@ class Resources(object):
be found.
"""
if not apks:
- return self._resolve_all_privapps()
+ return (self._resolve_all_system_privapps(),
+ self._resolve_all_product_privapps())
ret_apks = []
for apk in apks:
@@ -306,29 +316,77 @@ class Resources(object):
raise MissingResourceError('File "%s" does not exist.' % apk)
else:
ret_apks.append(apk)
- return ret_apks
+ return ret_apks, None
- def _resolve_all_privapps(self):
+ def _resolve_all_system_privapps(self):
"""Extract package name and requested permissions."""
if self._is_android_env:
- priv_app_dir = os.path.join(os.environ['ANDROID_PRODUCT_OUT'],
- 'system/priv-app')
+ system_priv_app_dir = (
+ os.path.join(os.environ['ANDROID_PRODUCT_OUT'],
+ 'system/priv-app'))
else:
try:
- priv_app_dir = self.adb.pull('/system/priv-app/')
+ system_priv_app_dir = self.adb.pull('/system/priv-app/')
except subprocess.CalledProcessError:
raise MissingResourceError(
'Directory "/system/priv-app" could not be pulled from on '
'device "%s".' % self.adb.serial)
- return get_output('find %s -name "*.apk"' % priv_app_dir).split()
+ return get_output('find %s -name "*.apk"' % system_priv_app_dir).split()
- def _resolve_sys_path(self, file_path):
+ def _resolve_all_product_privapps(self):
+ """Extract package name and requested permissions."""
+ if self._is_android_env:
+ product_priv_app_dir = (
+ os.path.join(os.environ['ANDROID_PRODUCT_OUT'],
+ 'product/priv-app'))
+ if not os.path.exists(product_priv_app_dir):
+ product_priv_app_dir = (
+ os.path.join(os.environ['ANDROID_PRODUCT_OUT'],
+ 'system/product/priv-app'))
+ else:
+ try:
+ product_priv_app_dir = self.adb.pull('/product/priv-app/')
+ except subprocess.CalledProcessError:
+ print('Warning: Directory "/product/priv-app" could not be '
+ 'pulled from on device "%s". Trying '
+ '"/system/product/priv-app"' % self.adb.serial,
+ file=sys.stderr)
+ try:
+ product_priv_app_dir = (
+ self.adb.pull('/system/product/priv-app/'))
+ except subprocess.CalledProcessError:
+ raise MissingResourceError(
+ 'Directory "/system/product/priv-app" could not be '
+ 'pulled from on device "%s".' % self.adb.serial)
+
+ return get_output(
+ 'find %s -name "*.apk"' % product_priv_app_dir).split()
+
+ def _resolve_sys_path(self, file_path, fallback_file_path=None):
"""Resolves a path that is a part of an Android System Image."""
if self._is_android_env:
- return os.path.join(os.environ['ANDROID_PRODUCT_OUT'], file_path)
+ sys_path = (
+ os.path.join(os.environ['ANDROID_PRODUCT_OUT'], file_path))
+ if not os.path.exists(sys_path):
+ sys_path = (
+ os.path.join(os.environ['ANDROID_PRODUCT_OUT'],
+ fallback_file_path))
else:
- return self.adb.pull(file_path)
+ try:
+ sys_path = self.adb.pull(file_path)
+ except subprocess.CalledProcessError:
+ print('Warning: Directory %s could not be pulled from on device'
+ '"%s". Trying "/system/product/priv-app"'
+ % (file_path, self.adb.serial), file=sys.stderr)
+ try:
+ sys_path = self.adb.pull(fallback_file_path)
+ except subprocess.CalledProcessError:
+ raise MissingResourceError(
+ 'Directory %s could not be pulled from on '
+ 'device "%s".' % (fallback_file_path, self.adb.serial))
+
+ return sys_path
def get_output(command):
@@ -390,17 +448,38 @@ def parse_args():
help='A list of paths to priv-app APKs to generate permissions for. '
'To make a path device-side, prefix the path with "device:".'
)
+ parser.add_argument(
+ '-w',
+ '--writetodisk',
+ action='store_true',
+ default=False,
+ required=False,
+ help='Whether or not to store the generated permissions directly to '
+ 'a file. See --systemfile/--productfile for more information.'
+ )
+ parser.add_argument(
+ '--systemfile',
+ default='./system.xml',
+ required=False,
+ help='Path to system permissions file. Default value is ./system.xml'
+ )
+ parser.add_argument(
+ '--productfile',
+ default='./product.xml',
+ required=False,
+ help='Path to system permissions file. Default value is ./product.xml'
+ )
cmd_args = parser.parse_args()
return cmd_args
-
-def create_permission_file(resources):
+def create_permission_file(resources, privapp_apks, permissions_dir,
+ sysconfig_dir, file=None):
# Parse base XML files in /etc dir, permissions listed there don't have
# to be re-added
base_permissions = {}
- base_xml_files = itertools.chain(list_xml_files(resources.permissions_dir),
- list_xml_files(resources.sysconfig_dir))
+ base_xml_files = itertools.chain(list_xml_files(permissions_dir),
+ list_xml_files(sysconfig_dir))
for xml_file in base_xml_files:
parse_config_xml(xml_file, base_permissions)
@@ -409,7 +488,7 @@ def create_permission_file(resources):
apps_redefine_base = []
results = {}
- for priv_app in resources.privapp_apks:
+ for priv_app in privapp_apks:
pkg_info = extract_pkg_and_requested_permissions(resources.aapt,
priv_app)
pkg_name = pkg_info['package_name']
@@ -426,7 +505,8 @@ def create_permission_file(resources):
results[pkg_name] = sorted(priv_perms)
print_xml(results, apps_redefine_base)
-
+ if file is not None:
+ print_xml(results, apps_redefine_base, file)
def print_xml(results, apps_redefine_base, fd=sys.stdout):
"""Print results to the given file."""
@@ -572,7 +652,43 @@ if __name__ == '__main__':
serial=args.serial,
apks=args.apks
)
- create_permission_file(tool_resources)
+ system_permission_file=None
+ product_permission_file=None
+ print('#' * 80)
+ print('#')
+ if args.writetodisk:
+ print('#System XML written to %s:' % args.systemfile)
+ system_permission_file = open(args.systemfile, 'w')
+ else:
+ print('#System XML:')
+ print('#')
+ print('#' * 80)
+ create_permission_file(
+ tool_resources,
+ tool_resources.system_privapp_apks,
+ tool_resources.system_permissions_dir,
+ tool_resources.system_sysconfig_dir,
+ system_permission_file)
+ if args.writetodisk:
+ system_permission_file.close()
+ if tool_resources.product_privapp_apks:
+ print('#' * 80)
+ print('#')
+ if args.writetodisk:
+ print('#Product XML written to %s:' % args.productfile)
+ product_permission_file = open(args.productfile, 'w')
+ else:
+ print('#Product XML:')
+ print('#')
+ print('#' * 80)
+ create_permission_file(
+ tool_resources,
+ tool_resources.product_privapp_apks,
+ tool_resources.product_permissions_dir,
+ tool_resources.product_sysconfig_dir,
+ product_permission_file)
+ if args.writetodisk:
+ product_permission_file.close()
except MissingResourceError as e:
print(str(e), file=sys.stderr)
exit(1)