use androguard if aapt isn't found

This commit is contained in:
thez3ro 2017-04-13 14:18:48 +02:00
parent 9607cdb621
commit 06598ae406
No known key found for this signature in database
GPG key ID: F628F9E41DD7C073
8 changed files with 490 additions and 111 deletions

92
tests/androguard_test.py Normal file
View file

@ -0,0 +1,92 @@
#!/usr/bin/env python3
import inspect
import logging
import optparse
import os
import shutil
import sys
import tempfile
import unittest
import yaml
from binascii import unhexlify
localmodule = os.path.realpath(
os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..'))
print('localmodule: ' + localmodule)
if localmodule not in sys.path:
sys.path.insert(0, localmodule)
import fdroidserver.common
import fdroidserver.metadata
import fdroidserver.update
class UpdateTest(unittest.TestCase):
'''fdroid androguard manual tests'''
def testScanMetadataAndroguardAAPT(self):
def _create_apkmetadata_object(apkName):
'''Create an empty apk metadata object'''
apk = {}
apk['apkName'] = apkName
apk['uses-permission'] = []
apk['uses-permission-sdk-23'] = []
apk['features'] = []
apk['icons_src'] = {}
return apk
config = dict()
fdroidserver.common.fill_config_defaults(config)
fdroidserver.update.config = config
os.chdir(os.path.dirname(__file__))
if os.path.basename(os.getcwd()) != 'tests':
raise Exception('This test must be run in the "tests/" subdir')
config['ndk_paths'] = dict()
config['accepted_formats'] = ['json', 'txt', 'yml']
fdroidserver.common.config = config
fdroidserver.update.config = config
fdroidserver.update.options = type('', (), {})()
fdroidserver.update.options.clean = True
fdroidserver.update.options.delete_unknown = True
self.assertTrue(fdroidserver.common.set_command_in_config('aapt'))
try:
from androguard.core.bytecodes.apk import APK
except ImportError:
raise Exception("androguard not installed!")
apkList = ['../info.guardianproject.urzip.apk', '../org.dyndns.fules.ck_20.apk']
for apkName in apkList:
logging.debug("Processing " + apkName)
apkfile = os.path.join('repo', apkName)
apkaapt = _create_apkmetadata_object(apkName)
logging.debug("Using AAPT for metadata")
fdroidserver.update.scan_apk_aapt(apkaapt, apkfile)
# avoid AAPT application name bug
del apkaapt['name']
apkandroguard = _create_apkmetadata_object(apkName)
logging.debug("Using androguard for metadata")
fdroidserver.update.scan_apk_androguard(apkandroguard, apkfile)
# avoid AAPT application name bug
del apkandroguard['name']
self.maxDiff = None
self.assertEqual(apkaapt, apkandroguard)
if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("-v", "--verbose", action="store_true", default=False,
help="Spew out even more information than normal")
(fdroidserver.common.options, args) = parser.parse_args(['--verbose'])
newSuite = unittest.TestSuite()
newSuite.addTest(unittest.makeSuite(UpdateTest))
unittest.main()

View file

@ -0,0 +1,20 @@
antiFeatures: !!set {}
features: []
hash: abfb3adb7496611749e7abfb014c5c789e3a02489e48a5c3665110d1b1acd931
hashType: sha256
icon: info.guardianproject.urzip.100.png
icons:
'0': info.guardianproject.urzip.100.png
'160': info.guardianproject.urzip.100.png
icons_src:
'-1': res/drawable/ic_launcher.png
'160': res/drawable/ic_launcher.png
minSdkVersion: '4'
packageName: info.guardianproject.urzip
sig: e0ecb5fc2d63088e4a07ae410a127722
size: 9969
targetSdkVersion: '18'
uses-permission: []
uses-permission-sdk-23: []
versionCode: 100
versionName: '0.1'

View file

@ -0,0 +1,41 @@
antiFeatures: !!set {}
features: []
hash: 897486e1f857c6c0ee32ccbad0e1b8cd82f6d0e65a44a23f13f852d2b63a18c8
hashType: sha256
icon: org.dyndns.fules.ck.20.png
icons:
'0': org.dyndns.fules.ck.20.png
'120': org.dyndns.fules.ck.20.png
'160': org.dyndns.fules.ck.20.png
'240': org.dyndns.fules.ck.20.png
icons_src:
'-1': res/drawable-mdpi-v4/icon_launcher.png
'120': res/drawable-ldpi-v4/icon_launcher.png
'160': res/drawable-mdpi-v4/icon_launcher.png
'240': res/drawable-hdpi-v4/icon_launcher.png
minSdkVersion: '7'
nativecode:
- arm64-v8a
- armeabi
- armeabi-v7a
- mips
- mips64
- x86
- x86_64
packageName: org.dyndns.fules.ck
sig: 9bf7a6a67f95688daec75eab4b1436ac
size: 132453
targetSdkVersion: '8'
uses-permission:
- !!python/object/new:fdroidserver.update.UsesPermission
- android.permission.BIND_INPUT_METHOD
- null
- !!python/object/new:fdroidserver.update.UsesPermission
- android.permission.READ_EXTERNAL_STORAGE
- null
- !!python/object/new:fdroidserver.update.UsesPermission
- android.permission.VIBRATE
- null
uses-permission-sdk-23: []
versionCode: 20
versionName: v1.6pre2

Binary file not shown.

View file

@ -224,6 +224,54 @@ class UpdateTest(unittest.TestCase):
self.assertIsNone(apk.get('obbMainFile'))
self.assertIsNone(apk.get('obbPatchFile'))
def testScanApkMetadata(self):
def _build_yaml_representer(dumper, data):
'''Creates a YAML representation of a Build instance'''
return dumper.represent_dict(data)
config = dict()
fdroidserver.common.fill_config_defaults(config)
fdroidserver.update.config = config
os.chdir(os.path.dirname(__file__))
if os.path.basename(os.getcwd()) != 'tests':
raise Exception('This test must be run in the "tests/" subdir')
config['ndk_paths'] = dict()
config['accepted_formats'] = ['json', 'txt', 'yml']
fdroidserver.common.config = config
fdroidserver.update.config = config
fdroidserver.update.options = type('', (), {})()
fdroidserver.update.options.clean = True
fdroidserver.update.options.delete_unknown = True
for icon_dir in fdroidserver.update.get_all_icon_dirs('repo'):
if not os.path.exists(icon_dir):
os.makedirs(icon_dir)
knownapks = fdroidserver.common.KnownApks()
apkList = ['../urzip.apk', '../org.dyndns.fules.ck_20.apk']
for apkName in apkList:
_, apk, cachechanged = fdroidserver.update.scan_apk({}, apkName, 'repo', knownapks, False)
# Don't care about the date added to the repo and relative apkName
del apk['added']
del apk['apkName']
# avoid AAPT application name bug
del apk['name']
savepath = os.path.join('metadata', 'apk', apk['packageName'] + '.yaml')
# Uncomment to save APK metadata
# with open(savepath, 'w') as f:
# yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer)
# yaml.dump(apk, f, default_flow_style=False)
with open(savepath, 'r') as f:
frompickle = yaml.load(f)
self.maxDiff = None
self.assertEqual(apk, frompickle)
def test_scan_invalid_apk(self):
os.chdir(os.path.join(localmodule, 'tests'))
if os.path.basename(os.getcwd()) != 'tests':