lint: check config keys

This commit is contained in:
linsui 2024-09-05 02:10:08 +08:00
parent debac3fd61
commit 0ad2820b6f
2 changed files with 51 additions and 3 deletions

View file

@ -749,6 +749,12 @@ def check_certificate_pinned_binaries(app):
def lint_config(arg): def lint_config(arg):
path = Path(arg) path = Path(arg)
passed = True passed = True
mirrors_name = f'{common.MIRRORS_CONFIG_NAME}.yml'
config_name = f'{common.CONFIG_CONFIG_NAME}.yml'
categories_name = f'{common.CATEGORIES_CONFIG_NAME}.yml'
antifeatures_name = f'{common.ANTIFEATURES_CONFIG_NAME}.yml'
yamllintresult = common.run_yamllint(path) yamllintresult = common.run_yamllint(path)
if yamllintresult: if yamllintresult:
print(yamllintresult) print(yamllintresult)
@ -758,7 +764,7 @@ def lint_config(arg):
data = ruamel.yaml.YAML(typ='safe').load(fp) data = ruamel.yaml.YAML(typ='safe').load(fp)
common.config_type_check(arg, data) common.config_type_check(arg, data)
if path.name == 'mirrors.yml': if path.name == mirrors_name:
import pycountry import pycountry
valid_country_codes = [c.alpha_2 for c in pycountry.countries] valid_country_codes = [c.alpha_2 for c in pycountry.countries]
@ -779,6 +785,34 @@ def lint_config(arg):
msg += ' ' msg += ' '
msg += _('Did you mean {code}?').format(code=', '.join(sorted(m))) msg += _('Did you mean {code}?').format(code=', '.join(sorted(m)))
print(msg) print(msg)
elif path.name in (config_name, categories_name, antifeatures_name):
for key in data:
if path.name == config_name and key not in ('archive', 'repo'):
passed = False
print(
_('ERROR: {key} in {path} is not "archive" or "repo"!').format(
key=key, path=path
)
)
allowed_keys = ['name']
if path.name in [config_name, antifeatures_name]:
allowed_keys.append('description')
# only for source strings currently
if path.parent.name == 'config':
allowed_keys.append('icon')
for subkey in data[key]:
if subkey not in allowed_keys:
passed = False
print(
_(
'ERROR: {key}:{subkey} in {path} is not in allowed keys: {allowed_keys}!'
).format(
key=key,
subkey=subkey,
path=path,
allowed_keys=', '.join(allowed_keys),
)
)
return passed return passed

View file

@ -4,23 +4,25 @@
import logging import logging
import os import os
import ruamel.yaml
import shutil import shutil
import sys import sys
import tempfile import tempfile
import unittest import unittest
from pathlib import Path from pathlib import Path
import ruamel.yaml
localmodule = Path(__file__).resolve().parent.parent localmodule = Path(__file__).resolve().parent.parent
print('localmodule: ' + str(localmodule)) print('localmodule: ' + str(localmodule))
if localmodule not in sys.path: if localmodule not in sys.path:
sys.path.insert(0, str(localmodule)) sys.path.insert(0, str(localmodule))
from testcommon import mkdtemp, parse_args_for_test
import fdroidserver.common import fdroidserver.common
import fdroidserver.lint import fdroidserver.lint
import fdroidserver.metadata import fdroidserver.metadata
from fdroidserver.common import CATEGORIES_CONFIG_NAME from fdroidserver.common import CATEGORIES_CONFIG_NAME
from testcommon import mkdtemp, parse_args_for_test
class LintTest(unittest.TestCase): class LintTest(unittest.TestCase):
@ -437,6 +439,18 @@ class LintTest(unittest.TestCase):
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
fdroidserver.lint.lint_config('mirrors.yml') fdroidserver.lint.lint_config('mirrors.yml')
def test_lint_invalid_config_keys(self):
os.chdir(self.testdir)
Path('config').mkdir()
Path('config/config.yml').write_text('repo:\n invalid_key: test')
self.assertFalse(fdroidserver.lint.lint_config('config/config.yml'))
def test_lint_invalid_localized_config_keys(self):
os.chdir(self.testdir)
Path('config/en').mkdir(parents=True)
Path('config/en/antiFeatures.yml').write_text('NonFreeNet:\n icon: test.png')
self.assertFalse(fdroidserver.lint.lint_config('config/en/antiFeatures.yml'))
def test_check_certificate_pinned_binaries_empty(self): def test_check_certificate_pinned_binaries_empty(self):
fdroidserver.common.config = {} fdroidserver.common.config = {}
app = fdroidserver.metadata.App() app = fdroidserver.metadata.App()