1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-11-09 00:40:11 +01:00

Merge branch 'master' into 'master'

fix bad parsing of maxSdkVersion as a @string resource

See merge request fdroid/fdroidserver!494
This commit is contained in:
Hans-Christoph Steiner 2018-04-26 14:36:07 +00:00
commit 03ad2578d4
8 changed files with 214 additions and 19 deletions

3
.gitignore vendored
View File

@ -36,9 +36,12 @@ makebuildserver.config.py
/tests/archive/categories.txt /tests/archive/categories.txt
/tests/archive/icons* /tests/archive/icons*
/tests/archive/index.jar /tests/archive/index.jar
/tests/archive/index_unsigned.jar
/tests/archive/index.xml /tests/archive/index.xml
/tests/archive/index-v1.jar /tests/archive/index-v1.jar
/tests/archive/index-v1.json
/tests/repo/index.jar /tests/repo/index.jar
/tests/repo/index_unsigned.jar
/tests/repo/index-v1.jar /tests/repo/index-v1.jar
/tests/repo/info.guardianproject.urzip/ /tests/repo/info.guardianproject.urzip/
/tests/repo/info.guardianproject.checkey/en-US/phoneScreenshots/checkey-phone.png /tests/repo/info.guardianproject.checkey/en-US/phoneScreenshots/checkey-phone.png

View File

@ -1181,6 +1181,46 @@ def scan_apk_aapt(apk, apkfile):
apk['icons_src'] = _get_apk_icons_src(apkfile, icon_name) apk['icons_src'] = _get_apk_icons_src(apkfile, icon_name)
def _ensure_final_value(packageName, arsc, value):
"""Ensure incoming value is always the value, not the resid
androguard will sometimes return the Android "resId" aka
Resource ID instead of the actual value. This checks whether
the value is actually a resId, then performs the Android
Resource lookup as needed.
"""
if value:
returnValue = value
if value[0] == '@':
try: # can be a literal value or a resId
res_id = int(value.replace("@", "0x"), 16)
res_id = arsc.get_id(packageName, res_id)[1]
returnValue = arsc.get_string(packageName, res_id)[1]
except ValueError:
pass
return returnValue
def _sanitize_sdk_version(value):
"""Sanitize the raw values from androguard to handle bad values
minSdkVersion/targetSdkVersion/maxSdkVersion must be integers,
but that doesn't stop devs from doing strange things like
setting them using Android XML strings.
https://gitlab.com/souch/SMSbypass/blob/v0.9/app/src/main/AndroidManifest.xml#L29
https://gitlab.com/souch/SMSbypass/blob/v0.9/app/src/main/res/values/strings.xml#L27
"""
try:
sdk_version = int(value)
if sdk_version > 0:
return str(sdk_version) # heinous, but this is still str in the codebase
except (TypeError, ValueError):
pass
return None
def scan_apk_androguard(apk, apkfile): def scan_apk_androguard(apk, apkfile):
try: try:
from androguard.core.bytecodes.apk import APK from androguard.core.bytecodes.apk import APK
@ -1210,23 +1250,20 @@ def scan_apk_androguard(apk, apkfile):
apk['versionCode'] = int(apkobject.get_androidversion_code()) apk['versionCode'] = int(apkobject.get_androidversion_code())
apk['name'] = apkobject.get_app_name() apk['name'] = apkobject.get_app_name()
versionName = apkobject.get_androidversion_name() apk['versionName'] = _ensure_final_value(apk['packageName'], arsc,
if versionName: apkobject.get_androidversion_name())
apk['versionName'] = versionName
if versionName[0] == '@':
try: # can be a literal value or a resId
res_id = int(versionName.replace("@", "0x"), 16)
res_id = arsc.get_id(apk['packageName'], res_id)[1]
apk['versionName'] = arsc.get_string(apk['packageName'], res_id)[1]
except ValueError:
pass
if apkobject.get_max_sdk_version() is not None: minSdkVersion = _sanitize_sdk_version(apkobject.get_min_sdk_version())
apk['maxSdkVersion'] = apkobject.get_max_sdk_version() if minSdkVersion is not None:
if apkobject.get_min_sdk_version() is not None: apk['minSdkVersion'] = minSdkVersion
apk['minSdkVersion'] = apkobject.get_min_sdk_version()
if apkobject.get_target_sdk_version() is not None: targetSdkVersion = _sanitize_sdk_version(apkobject.get_target_sdk_version())
apk['targetSdkVersion'] = apkobject.get_target_sdk_version() if targetSdkVersion is not None:
apk['targetSdkVersion'] = targetSdkVersion
maxSdkVersion = _sanitize_sdk_version(apkobject.get_max_sdk_version())
if maxSdkVersion is not None:
apk['maxSdkVersion'] = maxSdkVersion
icon_id_str = apkobject.get_element("application", "icon") icon_id_str = apkobject.get_element("application", "icon")
if icon_id_str: if icon_id_str:

View File

@ -0,0 +1,52 @@
Categories:Phone & SMS
License:GPL-3.0
Web Site:https://gitlab.com/souch/SMSbypass
Source Code:https://gitlab.com/souch/SMSbypass/tree/HEAD
Issue Tracker:https://gitlab.com/souch/SMSbypass/issues
Donate:http://rodolphe.souchaud.free.fr/donate
FlattrID:cad90e036b975ed129a3ce80a0750466
Auto Name:Battery level
Summary:Filter SMS and show them in a fake app
Description:
In order to keep away curious eyes, SMS-bypass filters incoming SMS messages
before they reach your inbox. Based on bughunter2.smsfilter.
Features:
* Discrete fake app "Battery level": Long tap on Battery percentage will show SMS.
* Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings
* Add contact from contact list
* Export messages to a text file
.
Repo Type:git
Repo:https://gitlab.com/souch/SMSbypass.git
Build:0.8,5
commit=v0.8
subdir=app
gradle=yes
prebuild=sed -i -e '/minSdkVersion/amaxSdkVersion 19\n' build.gradle
Build:0.8b,6
disable=don't build, just use as template for AUM, correct VC is 8
commit=2bd6164ff6391906af2af2b484de69a4ff926a01
subdir=app
gradle=yes
Build:0.8.1,8
disable=mistagged
commit=v0.8.1
subdir=app
gradle=yes
Build:0.9,9
commit=v0.9
subdir=app
gradle=yes
Auto Update Mode:Version v%v
Update Check Mode:Tags
Current Version:0.9
Current Version Code:9

View File

@ -21,6 +21,26 @@
] ]
}, },
"apps": [ "apps": [
{
"categories": [
"Phone & SMS"
],
"suggestedVersionName": "0.9",
"suggestedVersionCode": "9",
"description": "<p>In order to keep away curious eyes, SMS-bypass filters incoming SMS messages before they reach your inbox. Based on bughunter2.smsfilter.</p><p>Features:</p><ul><li> Discrete fake app \"Battery level\": Long tap on Battery percentage will show SMS.</li><li> Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings</li><li> Add contact from contact list</li><li> Export messages to a text file</li></ul>",
"donate": "http://rodolphe.souchaud.free.fr/donate",
"flattrID": "cad90e036b975ed129a3ce80a0750466",
"issueTracker": "https://gitlab.com/souch/SMSbypass/issues",
"license": "GPL-3.0",
"name": "Battery level",
"sourceCode": "https://gitlab.com/souch/SMSbypass/tree/HEAD",
"summary": "Filter SMS and show them in a fake app",
"webSite": "https://gitlab.com/souch/SMSbypass",
"added": 1524700800000,
"icon": "souch.smsbypass.9.png",
"packageName": "souch.smsbypass",
"lastUpdated": 1524700800000
},
{ {
"categories": [ "categories": [
"tests" "tests"
@ -525,6 +545,48 @@
"versionCode": 1619, "versionCode": 1619,
"versionName": "0.1" "versionName": "0.1"
} }
],
"souch.smsbypass": [
{
"added": 1524700800000,
"apkName": "souch.smsbypass_9.apk",
"hash": "80b0ae68a1189baa3ee6717092e3dbf1a4210165f7f7e5f2f9616bd63a2ec01d",
"hashType": "sha256",
"minSdkVersion": "8",
"packageName": "souch.smsbypass",
"sig": "e50c99753cd45e2736d52cb49be07581",
"signer": "d3aec784b1fd71549fc22c999789122e3639895db6bd585da5835fbe3db6985c",
"size": 81295,
"targetSdkVersion": "18",
"uses-permission": [
[
"android.permission.RECEIVE_SMS",
null
],
[
"android.permission.SEND_SMS",
null
],
[
"android.permission.READ_CONTACTS",
null
],
[
"android.permission.WRITE_EXTERNAL_STORAGE",
null
],
[
"android.permission.VIBRATE",
null
],
[
"android.permission.READ_EXTERNAL_STORAGE",
null
]
],
"versionCode": 9,
"versionName": "0.9"
}
] ]
} }
} }

View File

@ -8,6 +8,37 @@
<install packageName="org.adaway"/> <install packageName="org.adaway"/>
<uninstall packageName="com.android.vending"/> <uninstall packageName="com.android.vending"/>
<uninstall packageName="com.facebook.orca"/> <uninstall packageName="com.facebook.orca"/>
<application id="souch.smsbypass">
<id>souch.smsbypass</id>
<added>2018-04-26</added>
<lastupdated>2018-04-26</lastupdated>
<name>Battery level</name>
<summary>Filter SMS and show them in a fake app</summary>
<icon>souch.smsbypass.9.png</icon>
<desc>&lt;p&gt;In order to keep away curious eyes, SMS-bypass filters incoming SMS messages before they reach your inbox. Based on bughunter2.smsfilter.&lt;/p&gt;&lt;p&gt;Features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt; Discrete fake app &quot;Battery level&quot;: Long tap on Battery percentage will show SMS.&lt;/li&gt;&lt;li&gt; Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings&lt;/li&gt;&lt;li&gt; Add contact from contact list&lt;/li&gt;&lt;li&gt; Export messages to a text file&lt;/li&gt;&lt;/ul&gt;</desc>
<license>GPL-3.0</license>
<categories>Phone &amp; SMS</categories>
<category>Phone &amp; SMS</category>
<web>https://gitlab.com/souch/SMSbypass</web>
<source>https://gitlab.com/souch/SMSbypass/tree/HEAD</source>
<tracker>https://gitlab.com/souch/SMSbypass/issues</tracker>
<donate>http://rodolphe.souchaud.free.fr/donate</donate>
<flattr>cad90e036b975ed129a3ce80a0750466</flattr>
<marketversion>0.9</marketversion>
<marketvercode>9</marketvercode>
<package>
<version>0.9</version>
<versioncode>9</versioncode>
<apkname>souch.smsbypass_9.apk</apkname>
<hash type="sha256">80b0ae68a1189baa3ee6717092e3dbf1a4210165f7f7e5f2f9616bd63a2ec01d</hash>
<size>81295</size>
<sdkver>8</sdkver>
<targetSdkVersion>18</targetSdkVersion>
<added>2018-04-26</added>
<sig>e50c99753cd45e2736d52cb49be07581</sig>
<permissions>READ_CONTACTS,READ_EXTERNAL_STORAGE,RECEIVE_SMS,SEND_SMS,VIBRATE,WRITE_EXTERNAL_STORAGE</permissions>
</package>
</application>
<application id="duplicate.permisssions"> <application id="duplicate.permisssions">
<id>duplicate.permisssions</id> <id>duplicate.permisssions</id>
<added>2017-12-22</added> <added>2017-12-22</added>

Binary file not shown.

View File

@ -10,4 +10,5 @@ obb.main.twoversions_1101615.apk obb.main.twoversions 2016-01-01
obb.main.twoversions_1101617.apk obb.main.twoversions 2016-06-20 obb.main.twoversions_1101617.apk obb.main.twoversions 2016-06-20
obb.mainpatch.current_1619.apk obb.mainpatch.current 2016-04-23 obb.mainpatch.current_1619.apk obb.mainpatch.current 2016-04-23
obb.mainpatch.current_1619_another-release-key.apk obb.mainpatch.current 2017-06-01 obb.mainpatch.current_1619_another-release-key.apk obb.mainpatch.current 2017-06-01
souch.smsbypass_9.apk souch.smsbypass 2018-04-26
urzip-; Рахма́нинов, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢尔盖·.apk info.guardianproject.urzip 2016-06-23 urzip-; Рахма́нинов, [rɐxˈmanʲɪnəf] سيرجي_رخمانينوف 谢尔盖·.apk info.guardianproject.urzip 2016-06-23

View File

@ -253,7 +253,7 @@ class UpdateTest(unittest.TestCase):
apps = fdroidserver.metadata.read_metadata(xref=True) apps = fdroidserver.metadata.read_metadata(xref=True)
knownapks = fdroidserver.common.KnownApks() knownapks = fdroidserver.common.KnownApks()
apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False)
self.assertEqual(len(apks), 13) self.assertEqual(len(apks), 14)
apk = apks[0] apk = apks[0]
self.assertEqual(apk['packageName'], 'com.politedroid') self.assertEqual(apk['packageName'], 'com.politedroid')
self.assertEqual(apk['versionCode'], 3) self.assertEqual(apk['versionCode'], 3)
@ -298,7 +298,12 @@ class UpdateTest(unittest.TestCase):
if os.path.basename(os.getcwd()) != 'tests': if os.path.basename(os.getcwd()) != 'tests':
raise Exception('This test must be run in the "tests/" subdir') raise Exception('This test must be run in the "tests/" subdir')
apk_info = fdroidserver.update.scan_apk('repo/souch.smsbypass_9.apk')
self.assertIsNone(apk_info.get('maxSdkVersion'))
self.assertEqual(apk_info.get('versionName'), '0.9')
apk_info = fdroidserver.update.scan_apk('repo/duplicate.permisssions_9999999.apk') apk_info = fdroidserver.update.scan_apk('repo/duplicate.permisssions_9999999.apk')
self.assertIsNone(apk_info.get('versionName'))
self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable/ic_launcher.png', self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable/ic_launcher.png',
'-1': 'res/drawable/ic_launcher.png'}) '-1': 'res/drawable/ic_launcher.png'})
@ -324,14 +329,17 @@ class UpdateTest(unittest.TestCase):
self.assertEqual(apk_info['targetSdkVersion'], '8') self.assertEqual(apk_info['targetSdkVersion'], '8')
apk_info = fdroidserver.update.scan_apk('org.bitbucket.tickytacky.mirrormirror_4.apk') apk_info = fdroidserver.update.scan_apk('org.bitbucket.tickytacky.mirrormirror_4.apk')
self.assertEqual(apk_info.get('versionName'), '1.0.3')
self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable-mdpi/mirror.png', self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable-mdpi/mirror.png',
'-1': 'res/drawable-mdpi/mirror.png'}) '-1': 'res/drawable-mdpi/mirror.png'})
apk_info = fdroidserver.update.scan_apk('repo/info.zwanenburg.caffeinetile_4.apk') apk_info = fdroidserver.update.scan_apk('repo/info.zwanenburg.caffeinetile_4.apk')
self.assertEqual(apk_info.get('versionName'), '1.3')
self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable/ic_coffee_on.xml', self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable/ic_coffee_on.xml',
'-1': 'res/drawable/ic_coffee_on.xml'}) '-1': 'res/drawable/ic_coffee_on.xml'})
apk_info = fdroidserver.update.scan_apk('repo/com.politedroid_6.apk') apk_info = fdroidserver.update.scan_apk('repo/com.politedroid_6.apk')
self.assertEqual(apk_info.get('versionName'), '1.5')
self.assertEqual(apk_info['icons_src'], {'120': 'res/drawable-ldpi-v4/icon.png', self.assertEqual(apk_info['icons_src'], {'120': 'res/drawable-ldpi-v4/icon.png',
'160': 'res/drawable-mdpi-v4/icon.png', '160': 'res/drawable-mdpi-v4/icon.png',
'240': 'res/drawable-hdpi-v4/icon.png', '240': 'res/drawable-hdpi-v4/icon.png',
@ -339,6 +347,7 @@ class UpdateTest(unittest.TestCase):
'-1': 'res/drawable-mdpi-v4/icon.png'}) '-1': 'res/drawable-mdpi-v4/icon.png'})
apk_info = fdroidserver.update.scan_apk('SpeedoMeterApp.main_1.apk') apk_info = fdroidserver.update.scan_apk('SpeedoMeterApp.main_1.apk')
self.assertEqual(apk_info.get('versionName'), '1.0')
self.assertEqual(apk_info['icons_src'], {}) self.assertEqual(apk_info['icons_src'], {})
def test_scan_apk_no_sig(self): def test_scan_apk_no_sig(self):
@ -549,7 +558,7 @@ class UpdateTest(unittest.TestCase):
knownapks = fdroidserver.common.KnownApks() knownapks = fdroidserver.common.KnownApks()
apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False) apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False)
fdroidserver.update.translate_per_build_anti_features(apps, apks) fdroidserver.update.translate_per_build_anti_features(apps, apks)
self.assertEqual(len(apks), 13) self.assertEqual(len(apks), 14)
foundtest = False foundtest = False
for apk in apks: for apk in apks:
if apk['packageName'] == 'com.politedroid' and apk['versionCode'] == 3: if apk['packageName'] == 'com.politedroid' and apk['versionCode'] == 3: