index: fail if user sets mirrors:isPrimary wrong

Really, this is not meant to be set by the user in the config.  But if they
add something harmless that'll be ignored anyway, it seems that throwing an
error is too much.  So only throw the error if it is set wrongly.
This commit is contained in:
Hans-Christoph Steiner 2025-03-19 17:39:45 +01:00
parent 8e39f82eb9
commit 20569217d9
2 changed files with 24 additions and 0 deletions

View file

@ -1516,6 +1516,7 @@ def add_mirrors_to_repodict(repo_section, repodict):
repodict['mirrors'] = [] repodict['mirrors'] = []
canonical_url = repodict['address'] canonical_url = repodict['address']
found_primary = False found_primary = False
errors = 0
for mirror in mirrors: for mirror in mirrors:
if canonical_url == mirror['url']: if canonical_url == mirror['url']:
found_primary = True found_primary = True
@ -1524,9 +1525,19 @@ def add_mirrors_to_repodict(repo_section, repodict):
for k in sorted(mirror.keys()): for k in sorted(mirror.keys()):
sortedmirror[k] = mirror[k] sortedmirror[k] = mirror[k]
repodict['mirrors'].insert(0, sortedmirror) repodict['mirrors'].insert(0, sortedmirror)
elif mirror.get('isPrimary'):
errors += 1
logging.error(
_('Mirror config for {url} contains "isPrimary" key!').format(
url=mirror['url']
)
)
else: else:
repodict['mirrors'].append(mirror) repodict['mirrors'].append(mirror)
if errors:
raise FDroidException(_('"isPrimary" key should not be added to mirrors!'))
if repodict['mirrors'] and not found_primary: if repodict['mirrors'] and not found_primary:
repodict['mirrors'].insert(0, {'isPrimary': True, 'url': repodict['address']}) repodict['mirrors'].insert(0, {'isPrimary': True, 'url': repodict['address']})

View file

@ -814,6 +814,19 @@ class IndexTest(unittest.TestCase):
with self.assertRaises(fdroidserver.exception.FDroidException): with self.assertRaises(fdroidserver.exception.FDroidException):
index.add_mirrors_to_repodict('repo', repodict) index.add_mirrors_to_repodict('repo', repodict)
def test_erroneous_isPrimary_in_mirrors_config(self):
"""There can be only one primary mirror aka canonical URL"""
common.config = {
'repo_url': 'http://one/fdroid',
'mirrors': [
{'url': 'http://one/fdroid', 'countryCode': 'SA'},
{'url': 'http://two/fdroid', 'isPrimary': True},
],
}
repodict = {'address': common.config['repo_url']}
with self.assertRaises(fdroidserver.exception.FDroidException):
index.add_mirrors_to_repodict('repo', repodict)
class AltstoreIndexTest(unittest.TestCase): class AltstoreIndexTest(unittest.TestCase):
def test_make_altstore(self): def test_make_altstore(self):