From e6ff596b4c4a308134d2fbbf1c353a7e86cc693e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 20 Mar 2023 13:24:59 +0000 Subject: [PATCH] update: handle messed up namespaces in AndroidManifest.xml --- MANIFEST.in | 1 + fdroidserver/update.py | 36 ++++++++++++++++++---------- tests/org.sajeg.fallingblocks_3.apk | Bin 0 -> 49715 bytes tests/update.TestCase | 23 ++++++++++++++++++ 4 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 tests/org.sajeg.fallingblocks_3.apk diff --git a/MANIFEST.in b/MANIFEST.in index 98889a35..32018317 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -634,6 +634,7 @@ include tests/org.bitbucket.tickytacky.mirrormirror_2.apk include tests/org.bitbucket.tickytacky.mirrormirror_3.apk include tests/org.bitbucket.tickytacky.mirrormirror_4.apk include tests/org.dyndns.fules.ck_20.apk +include tests/org.sajeg.fallingblocks_3.apk include tests/publish.TestCase include tests/repo/categories.txt include tests/repo/com.example.test.helloworld_1.apk diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 06dd762f..222587a9 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -34,6 +34,7 @@ import json import time import yaml import copy +import defusedxml.ElementTree as ElementTree from datetime import datetime, timezone from argparse import ArgumentParser from pathlib import Path @@ -1394,13 +1395,16 @@ def scan_apk_androguard(apk, apkfile): apk['nativecode'].extend(sorted(list(arch))) for item in xml.findall('uses-permission'): - name = str(item.attrib[xmlns + 'name']) + name = item.attrib.get(xmlns + 'name') + if not name: + logging.debug( + _('Ignoring bad element in manifest: %s') + % ElementTree.tostring(item).decode() + ) + continue maxSdkVersion = item.attrib.get(xmlns + 'maxSdkVersion') maxSdkVersion = int(maxSdkVersion) if maxSdkVersion else None - permission = UsesPermission( - name, - maxSdkVersion - ) + permission = UsesPermission(str(name), maxSdkVersion) apk['uses-permission'].append(permission) for name, maxSdkVersion in apkobject.get_uses_implied_permission_list(): permission = UsesPermission( @@ -1410,20 +1414,26 @@ def scan_apk_androguard(apk, apkfile): apk['uses-permission'].append(permission) for item in xml.findall('uses-permission-sdk-23'): - name = str(item.attrib[xmlns + 'name']) + name = item.attrib.get(xmlns + 'name') + if not name: + logging.debug( + _('Ignoring bad element in manifest: %s') + % ElementTree.tostring(item).decode() + ) + continue maxSdkVersion = item.attrib.get(xmlns + 'maxSdkVersion') maxSdkVersion = int(maxSdkVersion) if maxSdkVersion else None - permission_sdk_23 = UsesPermissionSdk23( - name, - maxSdkVersion - ) + permission_sdk_23 = UsesPermissionSdk23(str(name), maxSdkVersion) apk['uses-permission-sdk-23'].append(permission_sdk_23) for item in xml.findall('uses-feature'): - key = xmlns + 'name' - if key not in item.attrib: + feature = str(item.attrib.get(xmlns + 'name', '')) + if not feature: + logging.debug( + _('Ignoring bad element in manifest: %s') + % ElementTree.tostring(item).decode() + ) continue - feature = str(item.attrib[key]) if feature not in ( 'android.hardware.screen.portrait', 'android.hardware.screen.landscape', diff --git a/tests/org.sajeg.fallingblocks_3.apk b/tests/org.sajeg.fallingblocks_3.apk new file mode 100644 index 0000000000000000000000000000000000000000..98bfe770b352eba28e93975c0a079e75e66f9e54 GIT binary patch literal 49715 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 Qiv^%U-qZnf{QmTR04{4U$^ZZW literal 0 HcmV?d00001 diff --git a/tests/update.TestCase b/tests/update.TestCase index 0a102dfd..b3234711 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -900,6 +900,29 @@ class UpdateTest(unittest.TestCase): shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile) fdroidserver.update.scan_apk(apkfile) + def test_scan_apk_bad_namespace_in_manifest(self): + """Some APKs can produce an exception when parsing the AndroidManifest.xml + + This kind of parsing exception should be reported then ignored + so that working APKs can be included in the index. There are + so many weird things that make it into APKs, that does not + automatically disqualify them from inclusion. + + This APK has elements with messed up namespaces: + + + """ + # reset the state, perhaps this should be in setUp() + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.update.config = config + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + os.mkdir('repo') + apkfile = 'repo/org.sajeg.fallingblocks_3.apk' + shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile) + fdroidserver.update.scan_apk(apkfile) + def test_process_apk(self): def _build_yaml_representer(dumper, data): '''Creates a YAML representation of a Build instance'''