From: Hans-Christoph Steiner Date: Fri, 2 Mar 2018 11:50:48 +0000 (+0100) Subject: VercodeOperation: only allow simple math expresssions and %c X-Git-Tag: 1.0.3~19^2 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=8f30c892c5432b93875eb08699ac966663c46dcc;p=fdroidserver.git VercodeOperation: only allow simple math expresssions and %c --- diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index d919c72b..0a4f6e27 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -429,6 +429,9 @@ def checkupdates_app(app): msg = 'Invalid update check method' if version and vercode and app.VercodeOperation: + if not common.VERCODE_OPERATION_RE.match(app.VercodeOperation): + raise MetaDataException(_('Invalid VercodeOperation: {field}') + .format(field=app.VercodeOperation)) oldvercode = str(int(vercode)) op = app.VercodeOperation.replace("%c", oldvercode) vercode = str(eval(op)) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 93a6945f..cf1d9203 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -61,6 +61,8 @@ from .asynchronousfilereader import AsynchronousFileReader # has to be manually set in test_aapt_version() MINIMUM_AAPT_VERSION = '26.0.0' +VERCODE_OPERATION_RE = re.compile(r'^([ 0-9/*+-]|%c)+$') + # A signature block file with a .DSA, .RSA, or .EC extension CERT_PATH_REGEX = re.compile(r'^META-INF/.*\.(DSA|EC|RSA)$') APK_NAME_REGEX = re.compile(r'^([a-zA-Z][\w.]*)_(-?[0-9]+)_?([0-9a-f]{7})?\.apk') diff --git a/fdroidserver/lint.py b/fdroidserver/lint.py index ed86e29a..a40ffffe 100644 --- a/fdroidserver/lint.py +++ b/fdroidserver/lint.py @@ -222,6 +222,11 @@ def check_update_check_data_url(app): yield _('UpdateCheckData must use HTTPS URL: {url}').format(url=url) +def check_vercode_operation(app): + if app.VercodeOperation and not common.VERCODE_OPERATION_RE.match(app.VercodeOperation): + yield _('Invalid VercodeOperation: {field}').format(field=app.VercodeOperation) + + def check_ucm_tags(app): lastbuild = get_lastbuild(app.builds) if (lastbuild is not None @@ -529,6 +534,7 @@ def main(): app_check_funcs = [ check_regexes, check_update_check_data_url, + check_vercode_operation, check_ucm_tags, check_char_limits, check_old_links, diff --git a/tests/lint.TestCase b/tests/lint.TestCase index ad9f0514..28d539a0 100755 --- a/tests/lint.TestCase +++ b/tests/lint.TestCase @@ -19,6 +19,7 @@ if localmodule not in sys.path: import fdroidserver.common import fdroidserver.lint +import fdroidserver.metadata class LintTest(unittest.TestCase): @@ -69,6 +70,52 @@ class LintTest(unittest.TestCase): logging.debug(warn) self.assertTrue(anywarns) + def test_check_vercode_operation(self): + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.common.config = config + fdroidserver.lint.config = config + + app = fdroidserver.metadata.App() + app.Name = 'Bad App' + app.Summary = 'We pwn you' + app.Description = 'These are some back' + + good_fields = [ + '6%c', + '%c - 1', + '%c + 10', + '%c*10', + '%c*10 + 3', + '%c*10 + 8', + '%c + 2 ', + '%c + 3', + '%c + 7', + ] + bad_fields = [ + 'open("/etc/passwd")', + '%C + 1', + '%%c * 123', + '123 + %%', + '%c % 7', + ] + + anywarns = False + for good in good_fields: + app.VercodeOperation = good + for warn in fdroidserver.lint.check_vercode_operation(app): + anywarns = True + logging.debug(warn) + self.assertFalse(anywarns) + + for bad in bad_fields: + anywarns = False + app.VercodeOperation = bad + for warn in fdroidserver.lint.check_vercode_operation(app): + anywarns = True + logging.debug(warn) + self.assertTrue(anywarns) + if __name__ == "__main__": parser = optparse.OptionParser()