From 25b4a47951d0754e31612cc947a1f373e72a4f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20P=C3=B6hn?= Date: Sun, 5 Aug 2018 23:41:12 +0200 Subject: [PATCH] check for unknown app fields and build flags when parsing yml --- fdroidserver/metadata.py | 113 ++++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 48 deletions(-) diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 378fdeb8..a945b589 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -99,6 +99,57 @@ app_fields = set([ 'builds', # For formats that do builds as a list ]) +yaml_app_field_order = [ + 'Disabled', + 'AntiFeatures', + 'Provides', + 'Categories', + 'License', + 'AuthorName', + 'AuthorEmail', + 'AuthorWebSite', + 'WebSite', + 'SourceCode', + 'IssueTracker', + 'Translation', + 'Changelog', + 'Donate', + 'FlattrID', + 'LiberapayID', + 'Bitcoin', + 'Litecoin', + '\n', + 'Name', + 'AutoName', + 'Summary', + 'Description', + '\n', + 'RequiresRoot', + '\n', + 'RepoType', + 'Repo', + 'Binaries', + '\n', + 'Builds', + '\n', + 'MaintainerNotes', + '\n', + 'ArchivePolicy', + 'AutoUpdateMode', + 'UpdateCheckMode', + 'UpdateCheckIgnore', + 'VercodeOperation', + 'UpdateCheckName', + 'UpdateCheckData', + 'CurrentVersion', + 'CurrentVersionCode', + '\n', + 'NoSourceSince', +] + + +yaml_app_fields = [x for x in yaml_app_field_order if x != '\n'] + class App(dict): @@ -1022,6 +1073,20 @@ def parse_json_metadata(mf, app): def parse_yaml_metadata(mf, app): yamldata = yaml.load(mf, Loader=YamlLoader) + + for field in yamldata: + if field not in yaml_app_fields: + warn_or_exception(_('Unrecognised app field: {fieldname}') + .format(fieldname=field)) + if 'Builds' not in yamldata.keys(): + warn_or_exception(_('Missing app field: {fieldname}') + .format(fieldname='Builds')) + for build in yamldata['Builds']: + for build_flag in build.keys(): + if build_flag not in build_flags: + warn_or_exception(_('Unrecognised build flag: {build_flag}') + .format(build_flag=build_flag)) + if yamldata: app.update(yamldata) return app @@ -1133,54 +1198,6 @@ def write_yaml(mf, app): return builds - yaml_app_field_order = [ - 'Disabled', - 'AntiFeatures', - 'Provides', - 'Categories', - 'License', - 'AuthorName', - 'AuthorEmail', - 'AuthorWebSite', - 'WebSite', - 'SourceCode', - 'IssueTracker', - 'Translation', - 'Changelog', - 'Donate', - 'FlattrID', - 'LiberapayID', - 'Bitcoin', - 'Litecoin', - '\n', - 'Name', - 'AutoName', - 'Summary', - 'Description', - '\n', - 'RequiresRoot', - '\n', - 'RepoType', - 'Repo', - 'Binaries', - '\n', - 'Builds', - '\n', - 'MaintainerNotes', - '\n', - 'ArchivePolicy', - 'AutoUpdateMode', - 'UpdateCheckMode', - 'UpdateCheckIgnore', - 'VercodeOperation', - 'UpdateCheckName', - 'UpdateCheckData', - 'CurrentVersion', - 'CurrentVersionCode', - '\n', - 'NoSourceSince', - ] - yaml_app = _app_to_yaml(app) ruamel.yaml.round_trip_dump(yaml_app, mf, indent=4, block_seq_indent=2)