Parse maxSdkVersion and -23 permission tags

Parse maxSdkVersion and uses-permission-sdk-23
tags and insert them into the index, e.g.,
<package>
 <permissions>READ_EXTERNAL_STORAGE,READ_CALENDAR,WRITE_EXTERNAL_STORAGE</permissions>
  <uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE"
   maxSdkVersion="18" />
  <uses-permission name="android.permission.READ_CALENDAR" />
  <uses-permission name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission-sdk-23 name="android.permission.ACCESS_FINE_LOCATION" />
</package>

Also increase version of index format
This commit is contained in:
Dominik Schürmann 2016-07-30 23:12:52 +02:00
parent e46debe12e
commit cb965dcb07

View file

@ -31,6 +31,8 @@ from datetime import datetime, timedelta
from xml.dom.minidom import Document from xml.dom.minidom import Document
from argparse import ArgumentParser from argparse import ArgumentParser
import time import time
import collections
from pyasn1.error import PyAsn1Error from pyasn1.error import PyAsn1Error
from pyasn1.codec.der import decoder, encoder from pyasn1.codec.der import decoder, encoder
from pyasn1_modules import rfc2315 from pyasn1_modules import rfc2315
@ -44,12 +46,15 @@ from . import metadata
from .common import FDroidPopen, FDroidPopenBytes, SdkToolsPopen from .common import FDroidPopen, FDroidPopenBytes, SdkToolsPopen
from .metadata import MetaDataException from .metadata import MetaDataException
METADATA_VERSION = 16 METADATA_VERSION = 17
screen_densities = ['640', '480', '320', '240', '160', '120'] screen_densities = ['640', '480', '320', '240', '160', '120']
all_screen_densities = ['0'] + screen_densities all_screen_densities = ['0'] + screen_densities
UsesPermission = collections.namedtuple('UsesPermission', ['name', 'maxSdkVersion'])
UsesPermissionSdk23 = collections.namedtuple('UsesPermissionSdk23', ['name', 'maxSdkVersion'])
def dpi_to_px(density): def dpi_to_px(density):
return (int(density) * 48) / 160 return (int(density) * 48) / 160
@ -528,7 +533,8 @@ def scan_apks(apps, apkcache, repodir, knownapks, use_date_from_apk=False):
icon_pat = re.compile(".*application-icon-([0-9]+):'([^']+?)'.*") icon_pat = re.compile(".*application-icon-([0-9]+):'([^']+?)'.*")
icon_pat_nodpi = re.compile(".*icon='([^']+?)'.*") icon_pat_nodpi = re.compile(".*icon='([^']+?)'.*")
sdkversion_pat = re.compile(".*'([0-9]*)'.*") sdkversion_pat = re.compile(".*'([0-9]*)'.*")
string_pat = re.compile(".* name='([^']*)'.*") permission_pat = re.compile(".*(name='(?P<name>.*?)')(.*maxSdkVersion='(?P<maxSdkVersion>.*?)')?.*")
feature_pat = re.compile(".*name='([^']*)'.*")
for apkfile in glob.glob(os.path.join(repodir, '*.apk')): for apkfile in glob.glob(os.path.join(repodir, '*.apk')):
apkfilename = apkfile[len(repodir) + 1:] apkfilename = apkfile[len(repodir) + 1:]
@ -556,7 +562,8 @@ def scan_apks(apps, apkcache, repodir, knownapks, use_date_from_apk=False):
if os.path.exists(os.path.join(repodir, srcfilename)): if os.path.exists(os.path.join(repodir, srcfilename)):
apk['srcname'] = srcfilename apk['srcname'] = srcfilename
apk['size'] = os.path.getsize(apkfile) apk['size'] = os.path.getsize(apkfile)
apk['permissions'] = set() apk['uses-permission'] = set()
apk['uses-permission-sdk-23'] = set()
apk['features'] = set() apk['features'] = set()
apk['icons_src'] = {} apk['icons_src'] = {}
apk['icons'] = {} apk['icons'] = {}
@ -624,20 +631,34 @@ def scan_apks(apps, apkcache, repodir, knownapks, use_date_from_apk=False):
apk['nativecode'] = [] apk['nativecode'] = []
for arch in line[13:].split(' '): for arch in line[13:].split(' '):
apk['nativecode'].append(arch[1:-1]) apk['nativecode'].append(arch[1:-1])
elif line.startswith("uses-permission:"): elif line.startswith('uses-permission:'):
perm = re.match(string_pat, line).group(1) perm_match = re.match(permission_pat, line).groupdict()
if perm.startswith("android.permission."):
perm = perm[19:] permission = UsesPermission(
apk['permissions'].add(perm) perm_match['name'],
elif line.startswith("uses-feature:"): perm_match['maxSdkVersion']
perm = re.match(string_pat, line).group(1) )
apk['uses-permission'].add(permission)
elif line.startswith('uses-permission-sdk-23:'):
perm_match = re.match(permission_pat, line).groupdict()
permission_sdk_23 = UsesPermissionSdk23(
perm_match['name'],
perm_match['maxSdkVersion']
)
apk['uses-permission-sdk-23'].add(permission_sdk_23)
elif line.startswith('uses-feature:'):
feature = re.match(feature_pat, line).group(1)
# Filter out this, it's only added with the latest SDK tools and # Filter out this, it's only added with the latest SDK tools and
# causes problems for lots of apps. # causes problems for lots of apps.
if perm != "android.hardware.screen.portrait" \ if feature != "android.hardware.screen.portrait" \
and perm != "android.hardware.screen.landscape": and feature != "android.hardware.screen.landscape":
if perm.startswith("android.feature."): if feature.startswith("android.feature."):
perm = perm[16:] feature = feature[16:]
apk['features'].add(perm) apk['features'].add(feature)
if 'minSdkVersion' not in apk: if 'minSdkVersion' not in apk:
logging.warn("No SDK version information found in {0}".format(apkfile)) logging.warn("No SDK version information found in {0}".format(apkfile))
@ -1046,7 +1067,28 @@ def make_index(apps, sortedids, apks, repodir, archive, categories):
addElementNonEmpty('obbPatchFileSha256', apk.get('obbPatchFileSha256'), doc, apkel) addElementNonEmpty('obbPatchFileSha256', apk.get('obbPatchFileSha256'), doc, apkel)
if 'added' in apk: if 'added' in apk:
addElement('added', time.strftime('%Y-%m-%d', apk['added']), doc, apkel) addElement('added', time.strftime('%Y-%m-%d', apk['added']), doc, apkel)
addElementNonEmpty('permissions', ','.join(apk['permissions']), doc, apkel)
# TODO: remove old permission format
old_permissions = set()
for perm in apk['uses-permission']:
perm_name = perm.name
if perm_name.startswith("android.permission."):
perm_name = perm_name[19:]
old_permissions.add(perm_name)
addElementNonEmpty('permissions', ','.join(old_permissions), doc, apkel)
for permission in apk['uses-permission']:
permel = doc.createElement('uses-permission')
permel.setAttribute('name', permission.name)
if permission.maxSdkVersion is not None:
permel.setAttribute('maxSdkVersion', permission.maxSdkVersion)
apkel.appendChild(permel)
for permission_sdk_23 in apk['uses-permission-sdk-23']:
permel = doc.createElement('uses-permission-sdk-23')
permel.setAttribute('name', permission_sdk_23.name)
if permission_sdk_23.maxSdkVersion is not None:
permel.setAttribute('maxSdkVersion', permission_sdk_23.maxSdkVersion)
apkel.appendChild(permel)
if 'nativecode' in apk: if 'nativecode' in apk:
addElement('nativecode', ','.join(apk['nativecode']), doc, apkel) addElement('nativecode', ','.join(apk['nativecode']), doc, apkel)
addElementNonEmpty('features', ','.join(apk['features']), doc, apkel) addElementNonEmpty('features', ','.join(apk['features']), doc, apkel)