purge config.py handling, it is no longer supported
This commit is contained in:
parent
cb9533bd74
commit
642499ec94
1
.gitignore
vendored
1
.gitignore
vendored
@ -27,7 +27,6 @@ tmp/
|
|||||||
/tests/repo/status
|
/tests/repo/status
|
||||||
|
|
||||||
# files used in manual testing
|
# files used in manual testing
|
||||||
/config.py
|
|
||||||
/config.yml
|
/config.yml
|
||||||
/tmp/
|
/tmp/
|
||||||
/logs/
|
/logs/
|
||||||
|
@ -555,11 +555,11 @@ servergitmirrors:
|
|||||||
- ./tests/key-tricks.py
|
- ./tests/key-tricks.py
|
||||||
- ssh-keyscan gitlab.com >> /root/.ssh/known_hosts
|
- ssh-keyscan gitlab.com >> /root/.ssh/known_hosts
|
||||||
- test -d /tmp/fdroid/repo || mkdir -p /tmp/fdroid/repo
|
- test -d /tmp/fdroid/repo || mkdir -p /tmp/fdroid/repo
|
||||||
- cp tests/config.py tests/keystore.jks /tmp/fdroid/
|
- cp tests/config.yml tests/keystore.jks /tmp/fdroid/
|
||||||
- cp tests/repo/com.politedroid_6.apk /tmp/fdroid/repo/
|
- cp tests/repo/com.politedroid_6.apk /tmp/fdroid/repo/
|
||||||
- cd /tmp/fdroid
|
- cd /tmp/fdroid
|
||||||
- touch fdroid-icon.png
|
- touch fdroid-icon.png
|
||||||
- printf "\nservergitmirrors = 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.py
|
- printf "\nservergitmirrors\x3a 'git@gitlab.com:fdroid/ci-test-servergitmirrors-repo.git'\n" >> config.yml
|
||||||
- $PYTHONPATH/fdroid update --verbose --create-metadata
|
- $PYTHONPATH/fdroid update --verbose --create-metadata
|
||||||
- $PYTHONPATH/fdroid deploy --verbose
|
- $PYTHONPATH/fdroid deploy --verbose
|
||||||
- export DLURL=`grep -Eo 'https://gitlab.com/fdroid/ci-test-servergitmirrors-repo[^"]+' repo/index-v1.json`
|
- export DLURL=`grep -Eo 'https://gitlab.com/fdroid/ci-test-servergitmirrors-repo[^"]+' repo/index-v1.json`
|
||||||
|
@ -548,7 +548,7 @@ include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt
|
|||||||
include tests/build-tools/generate.sh
|
include tests/build-tools/generate.sh
|
||||||
include tests/check-fdroid-apk
|
include tests/check-fdroid-apk
|
||||||
include tests/com.fake.IpaApp_1000000000001.ipa
|
include tests/com.fake.IpaApp_1000000000001.ipa
|
||||||
include tests/config.py
|
include tests/config.yml
|
||||||
include tests/config/antiFeatures.yml
|
include tests/config/antiFeatures.yml
|
||||||
include tests/config/categories.yml
|
include tests/config/categories.yml
|
||||||
include tests/config/de/antiFeatures.yml
|
include tests/config/de/antiFeatures.yml
|
||||||
|
@ -531,8 +531,7 @@ def read_config():
|
|||||||
not required, just use defaults.
|
not required, just use defaults.
|
||||||
|
|
||||||
config.yml is the preferred form because no code is executed when
|
config.yml is the preferred form because no code is executed when
|
||||||
reading it. config.py is deprecated and supported for backwards
|
reading it. config.py is deprecated and no longer supported.
|
||||||
compatibility.
|
|
||||||
|
|
||||||
config.yml requires ASCII or UTF-8 encoding because this code does
|
config.yml requires ASCII or UTF-8 encoding because this code does
|
||||||
not auto-detect the file's encoding. That is left up to the YAML
|
not auto-detect the file's encoding. That is left up to the YAML
|
||||||
@ -550,10 +549,6 @@ def read_config():
|
|||||||
config_file = 'config.yml'
|
config_file = 'config.yml'
|
||||||
old_config_file = 'config.py'
|
old_config_file = 'config.py'
|
||||||
|
|
||||||
if os.path.exists(config_file) and os.path.exists(old_config_file):
|
|
||||||
logging.error(_("""Conflicting config files! Using {newfile}, ignoring {oldfile}!""")
|
|
||||||
.format(oldfile=old_config_file, newfile=config_file))
|
|
||||||
|
|
||||||
if os.path.exists(config_file):
|
if os.path.exists(config_file):
|
||||||
logging.debug(_("Reading '{config_file}'").format(config_file=config_file))
|
logging.debug(_("Reading '{config_file}'").format(config_file=config_file))
|
||||||
with open(config_file, encoding='utf-8') as fp:
|
with open(config_file, encoding='utf-8') as fp:
|
||||||
@ -561,19 +556,13 @@ def read_config():
|
|||||||
if not config:
|
if not config:
|
||||||
config = {}
|
config = {}
|
||||||
config_type_check(config_file, config)
|
config_type_check(config_file, config)
|
||||||
elif os.path.exists(old_config_file):
|
|
||||||
logging.warning(_("""{oldfile} is deprecated, use {newfile}""")
|
|
||||||
.format(oldfile=old_config_file, newfile=config_file))
|
|
||||||
with io.open(old_config_file, "rb") as fp:
|
|
||||||
code = compile(fp.read(), old_config_file, 'exec')
|
|
||||||
exec(code, None, config) # nosec TODO automatically migrate
|
|
||||||
|
|
||||||
for k in ('mirrors', 'install_list', 'uninstall_list', 'serverwebroot', 'servergitroot'):
|
if os.path.exists(old_config_file):
|
||||||
if k in config:
|
|
||||||
if not type(config[k]) in (str, list, tuple):
|
|
||||||
logging.warning(
|
logging.warning(
|
||||||
_("'{field}' will be in random order! Use () or [] brackets if order is important!")
|
_("""Ignoring deprecated {oldfile}, use {newfile}!""").format(
|
||||||
.format(field=k))
|
oldfile=old_config_file, newfile=config_file
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
# smartcardoptions must be a list since its command line args for Popen
|
# smartcardoptions must be a list since its command line args for Popen
|
||||||
smartcardoptions = config.get('smartcardoptions')
|
smartcardoptions = config.get('smartcardoptions')
|
||||||
@ -4203,7 +4192,7 @@ def load_stats_fdroid_signing_key_fingerprints():
|
|||||||
|
|
||||||
|
|
||||||
def write_to_config(thisconfig, key, value=None, config_file=None):
|
def write_to_config(thisconfig, key, value=None, config_file=None):
|
||||||
"""Write a key/value to the local config.yml or config.py.
|
"""Write a key/value to the local config.yml.
|
||||||
|
|
||||||
NOTE: only supports writing string variables.
|
NOTE: only supports writing string variables.
|
||||||
|
|
||||||
@ -4222,8 +4211,6 @@ def write_to_config(thisconfig, key, value=None, config_file=None):
|
|||||||
value = thisconfig[origkey] if origkey in thisconfig else thisconfig[key]
|
value = thisconfig[origkey] if origkey in thisconfig else thisconfig[key]
|
||||||
if config_file:
|
if config_file:
|
||||||
cfg = config_file
|
cfg = config_file
|
||||||
elif os.path.exists('config.py') and not os.path.exists('config.yml'):
|
|
||||||
cfg = 'config.py'
|
|
||||||
else:
|
else:
|
||||||
cfg = 'config.yml'
|
cfg = 'config.yml'
|
||||||
|
|
||||||
@ -4239,19 +4226,8 @@ def write_to_config(thisconfig, key, value=None, config_file=None):
|
|||||||
if not lines[-1].endswith('\n'):
|
if not lines[-1].endswith('\n'):
|
||||||
lines[-1] += '\n'
|
lines[-1] += '\n'
|
||||||
|
|
||||||
# regex for finding and replacing python string variable
|
pattern = re.compile(r'^[\s#]*' + key + r':.*\n')
|
||||||
# definitions/initializations
|
repl = yaml.dump({key: value})
|
||||||
if cfg.endswith('.py'):
|
|
||||||
pattern = re.compile(r'^[\s#]*' + key + r'\s*=\s*"[^"]*"')
|
|
||||||
repl = key + ' = "' + value + '"'
|
|
||||||
pattern2 = re.compile(r'^[\s#]*' + key + r"\s*=\s*'[^']*'")
|
|
||||||
repl2 = key + " = '" + value + "'"
|
|
||||||
else:
|
|
||||||
# assume .yml as default
|
|
||||||
pattern = re.compile(r'^[\s#]*' + key + r':.*')
|
|
||||||
repl = yaml.dump({key: value}, default_flow_style=False)
|
|
||||||
pattern2 = pattern
|
|
||||||
repl2 = repl
|
|
||||||
|
|
||||||
# If we replaced this line once, we make sure won't be a
|
# If we replaced this line once, we make sure won't be a
|
||||||
# second instance of this line for this key in the document.
|
# second instance of this line for this key in the document.
|
||||||
@ -4259,18 +4235,15 @@ def write_to_config(thisconfig, key, value=None, config_file=None):
|
|||||||
# edit config file
|
# edit config file
|
||||||
with open(cfg, 'w') as f:
|
with open(cfg, 'w') as f:
|
||||||
for line in lines:
|
for line in lines:
|
||||||
if pattern.match(line) or pattern2.match(line):
|
if pattern.match(line):
|
||||||
if not didRepl:
|
if not didRepl:
|
||||||
line = pattern.sub(repl, line)
|
line = pattern.sub(repl, line)
|
||||||
line = pattern2.sub(repl2, line)
|
|
||||||
f.write(line)
|
f.write(line)
|
||||||
didRepl = True
|
didRepl = True
|
||||||
else:
|
else:
|
||||||
f.write(line)
|
f.write(line)
|
||||||
if not didRepl:
|
if not didRepl:
|
||||||
f.write('\n')
|
|
||||||
f.write(repl)
|
f.write(repl)
|
||||||
f.write('\n')
|
|
||||||
|
|
||||||
|
|
||||||
def parse_xml(path):
|
def parse_xml(path):
|
||||||
|
@ -138,7 +138,7 @@ def main():
|
|||||||
_("Android SDK not found at {path}!").format(path=test_config['sdk_path'])
|
_("Android SDK not found at {path}!").format(path=test_config['sdk_path'])
|
||||||
)
|
)
|
||||||
|
|
||||||
if not os.path.exists('config.yml') and not os.path.exists('config.py'):
|
if not os.path.exists('config.yml'):
|
||||||
# 'metadata' and 'tmp' are created in fdroid
|
# 'metadata' and 'tmp' are created in fdroid
|
||||||
if not os.path.exists('repo'):
|
if not os.path.exists('repo'):
|
||||||
os.mkdir('repo')
|
os.mkdir('repo')
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
|
|
||||||
# TODO convert to config.yml!
|
|
||||||
|
|
||||||
repo_url = "https://MyFirstFDroidRepo.org/fdroid/repo"
|
|
||||||
repo_name = "My First F-Droid Repo Demo"
|
|
||||||
repo_description = """This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid."""
|
|
||||||
|
|
||||||
archive_older = 3
|
|
||||||
archive_url = "https://f-droid.org/archive"
|
|
||||||
archive_name = "My First F-Droid Archive Demo"
|
|
||||||
archive_description = """
|
|
||||||
The repository of older versions of applications from the main demo repository.
|
|
||||||
"""
|
|
||||||
|
|
||||||
make_current_version_link = False
|
|
||||||
|
|
||||||
repo_keyalias = "sova"
|
|
||||||
keystore = "keystore.jks"
|
|
||||||
keystorepass = "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI="
|
|
||||||
keypass = "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI="
|
|
||||||
keydname = "CN=sova, OU=F-Droid"
|
|
||||||
|
|
||||||
mirrors = (
|
|
||||||
'http://foobarfoobarfoobar.onion/fdroid',
|
|
||||||
'https://foo.bar/fdroid',
|
|
||||||
)
|
|
||||||
|
|
||||||
install_list = 'org.adaway'
|
|
||||||
uninstall_list = ('com.android.vending', 'com.facebook.orca', )
|
|
||||||
|
|
||||||
repo_key_sha256 = "f49af3f11efddf20dffd70f5e3117b9976674167adca280e6b1932a0601b26f6"
|
|
27
tests/config.yml
Normal file
27
tests/config.yml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
repo_url: https://MyFirstFDroidRepo.org/fdroid/repo
|
||||||
|
repo_name: My First F-Droid Repo Demo
|
||||||
|
repo_description: This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid.
|
||||||
|
|
||||||
|
archive_older: 3
|
||||||
|
archive_url: https://f-droid.org/archive
|
||||||
|
archive_name: My First F-Droid Archive Demo
|
||||||
|
archive_description: The repository of older versions of applications from the main demo repository.
|
||||||
|
|
||||||
|
make_current_version_link: false
|
||||||
|
|
||||||
|
repo_keyalias: sova
|
||||||
|
keystore: keystore.jks
|
||||||
|
keystorepass: "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI="
|
||||||
|
keypass: "r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI="
|
||||||
|
keydname: "CN=sova, OU=F-Droid"
|
||||||
|
|
||||||
|
mirrors:
|
||||||
|
- http://foobarfoobarfoobar.onion/fdroid
|
||||||
|
- https://foo.bar/fdroid
|
||||||
|
|
||||||
|
install_list: org.adaway
|
||||||
|
uninstall_list: ['com.android.vending', 'com.facebook.orca']
|
||||||
|
|
||||||
|
repo_key_sha256: f49af3f11efddf20dffd70f5e3117b9976674167adca280e6b1932a0601b26f6
|
@ -58,6 +58,9 @@ class CommonTest(unittest.TestCase):
|
|||||||
os.makedirs(self.tmpdir)
|
os.makedirs(self.tmpdir)
|
||||||
os.chdir(basedir)
|
os.chdir(basedir)
|
||||||
|
|
||||||
|
self.verbose = '-v' in sys.argv or '--verbose' in sys.argv
|
||||||
|
fdroidserver.common.set_console_logging(self.verbose)
|
||||||
|
|
||||||
# these are declared as None at the top of the module file
|
# these are declared as None at the top of the module file
|
||||||
fdroidserver.common.config = None
|
fdroidserver.common.config = None
|
||||||
fdroidserver.common.options = None
|
fdroidserver.common.options = None
|
||||||
@ -642,65 +645,65 @@ class CommonTest(unittest.TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def test_write_to_config(self):
|
def test_write_to_config(self):
|
||||||
with tempfile.TemporaryDirectory() as tmpPath:
|
"""Test that config items can be added without messing up config.yml.
|
||||||
cfgPath = os.path.join(tmpPath, 'config.py')
|
|
||||||
with open(cfgPath, 'w') as f:
|
The '_orig' key are where the original string values of paths
|
||||||
f.write(
|
are stored. Paths have tilde expansion and env vars replaced
|
||||||
|
in fill_config_defaults().
|
||||||
|
|
||||||
|
"""
|
||||||
|
os.chdir(self.testdir)
|
||||||
|
config_yml = 'config.yml'
|
||||||
|
Path(config_yml).write_text(
|
||||||
textwrap.dedent(
|
textwrap.dedent(
|
||||||
"""\
|
"""\
|
||||||
# abc
|
# abc
|
||||||
# test = 'example value'
|
# test: 'example value'
|
||||||
default_me= '%%%'
|
a_path: ~/android-sdk
|
||||||
|
|
||||||
# comment
|
# comment
|
||||||
do_not_touch = "good value"
|
do_not_touch: good value
|
||||||
default_me="!!!"
|
a_path: "!!!"
|
||||||
|
|
||||||
key="123" # inline"""
|
key: "123" # inline"""
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
cfg = {'key': '111', 'default_me_orig': 'orig'}
|
config = {'key': 111, 'a_path_orig': '~/android-sdk'}
|
||||||
fdroidserver.common.write_to_config(cfg, 'key', config_file=cfgPath)
|
fdroidserver.common.write_to_config(config, 'key', config_file=config_yml)
|
||||||
fdroidserver.common.write_to_config(cfg, 'default_me', config_file=cfgPath)
|
fdroidserver.common.write_to_config(
|
||||||
fdroidserver.common.write_to_config(cfg, 'test', value='test value', config_file=cfgPath)
|
config, 'a_path', config_file=config_yml
|
||||||
fdroidserver.common.write_to_config(cfg, 'new_key', value='new', config_file=cfgPath)
|
)
|
||||||
|
fdroidserver.common.write_to_config(
|
||||||
|
config, 'test', value='test value', config_file=config_yml
|
||||||
|
)
|
||||||
|
fdroidserver.common.write_to_config(
|
||||||
|
config, 'new_key', value='new', config_file=config_yml
|
||||||
|
)
|
||||||
|
|
||||||
with open(cfgPath, 'r') as f:
|
with open(config_yml) as fp:
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
f.read(),
|
fp.read(),
|
||||||
textwrap.dedent(
|
textwrap.dedent(
|
||||||
"""\
|
"""\
|
||||||
# abc
|
# abc
|
||||||
test = 'test value'
|
test: test value
|
||||||
default_me = 'orig'
|
a_path: ~/android-sdk
|
||||||
|
|
||||||
# comment
|
# comment
|
||||||
do_not_touch = "good value"
|
do_not_touch: good value
|
||||||
|
|
||||||
key = "111" # inline
|
key: 111
|
||||||
|
new_key: new
|
||||||
new_key = "new"
|
|
||||||
"""
|
"""
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_write_to_config_when_empty(self):
|
def test_write_to_config_when_empty(self):
|
||||||
with tempfile.TemporaryDirectory() as tmpPath:
|
config_yml = Path(self.testdir) / 'config.yml'
|
||||||
cfgPath = os.path.join(tmpPath, 'config.py')
|
config_yml.write_text('')
|
||||||
with open(cfgPath, 'w') as f:
|
fdroidserver.common.write_to_config({}, 'key', 'val', config_yml)
|
||||||
pass
|
self.assertEqual(config_yml.read_text(), 'key: val\n')
|
||||||
fdroidserver.common.write_to_config({}, 'key', 'val', cfgPath)
|
|
||||||
with open(cfgPath, 'r') as f:
|
|
||||||
self.assertEqual(
|
|
||||||
f.read(),
|
|
||||||
textwrap.dedent(
|
|
||||||
"""\
|
|
||||||
|
|
||||||
key = "val"
|
|
||||||
"""
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_apk_name_regex(self):
|
def test_apk_name_regex(self):
|
||||||
good = [
|
good = [
|
||||||
@ -1883,7 +1886,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
"""It should set defaults if no config file is found"""
|
"""It should set defaults if no config file is found"""
|
||||||
os.chdir(self.tmpdir)
|
os.chdir(self.tmpdir)
|
||||||
self.assertFalse(os.path.exists('config.yml'))
|
self.assertFalse(os.path.exists('config.yml'))
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertIsNotNone(config.get('char_limits'))
|
self.assertIsNotNone(config.get('char_limits'))
|
||||||
|
|
||||||
@ -1892,7 +1894,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
os.chdir(self.tmpdir)
|
os.chdir(self.tmpdir)
|
||||||
open('config.yml', 'w').close()
|
open('config.yml', 'w').close()
|
||||||
self.assertTrue(os.path.exists('config.yml'))
|
self.assertTrue(os.path.exists('config.yml'))
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertIsNotNone(config.get('char_limits'))
|
self.assertIsNotNone(config.get('char_limits'))
|
||||||
|
|
||||||
@ -1902,7 +1903,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
with open('config.yml', 'w') as fp:
|
with open('config.yml', 'w') as fp:
|
||||||
fp.write('apksigner: yml')
|
fp.write('apksigner: yml')
|
||||||
self.assertTrue(os.path.exists('config.yml'))
|
self.assertTrue(os.path.exists('config.yml'))
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertEqual('yml', config.get('apksigner'))
|
self.assertEqual('yml', config.get('apksigner'))
|
||||||
|
|
||||||
@ -1913,7 +1913,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
with open('config.yml', 'w', encoding='utf-8') as fp:
|
with open('config.yml', 'w', encoding='utf-8') as fp:
|
||||||
fp.write('apksigner: ' + teststr)
|
fp.write('apksigner: ' + teststr)
|
||||||
self.assertTrue(os.path.exists('config.yml'))
|
self.assertTrue(os.path.exists('config.yml'))
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertEqual(teststr, config.get('apksigner'))
|
self.assertEqual(teststr, config.get('apksigner'))
|
||||||
|
|
||||||
@ -1924,7 +1923,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
with open('config.yml', 'w') as fp:
|
with open('config.yml', 'w') as fp:
|
||||||
yaml.dump({'apksigner': teststr}, fp)
|
yaml.dump({'apksigner': teststr}, fp)
|
||||||
self.assertTrue(os.path.exists('config.yml'))
|
self.assertTrue(os.path.exists('config.yml'))
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertEqual(teststr, config.get('apksigner'))
|
self.assertEqual(teststr, config.get('apksigner'))
|
||||||
|
|
||||||
@ -1936,7 +1934,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
with open('config.yml', 'w') as fp:
|
with open('config.yml', 'w') as fp:
|
||||||
fp.write("""keypass: {'env': 'SECRET'}""")
|
fp.write("""keypass: {'env': 'SECRET'}""")
|
||||||
self.assertTrue(os.path.exists('config.yml'))
|
self.assertTrue(os.path.exists('config.yml'))
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass'))
|
self.assertEqual(os.getenv('SECRET', 'fail'), config.get('keypass'))
|
||||||
|
|
||||||
@ -1952,16 +1949,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
with self.assertRaises(yaml.scanner.ScannerError):
|
with self.assertRaises(yaml.scanner.ScannerError):
|
||||||
fdroidserver.common.read_config()
|
fdroidserver.common.read_config()
|
||||||
|
|
||||||
def test_with_config_py(self):
|
|
||||||
"""Make sure it is still possible to use config.py alone."""
|
|
||||||
os.chdir(self.tmpdir)
|
|
||||||
with open('config.py', 'w') as fp:
|
|
||||||
fp.write('apksigner = "py"')
|
|
||||||
self.assertFalse(os.path.exists('config.yml'))
|
|
||||||
self.assertTrue(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
|
||||||
self.assertEqual("py", config.get('apksigner'))
|
|
||||||
|
|
||||||
def test_config_perm_warning(self):
|
def test_config_perm_warning(self):
|
||||||
"""Exercise the code path that issues a warning about unsafe permissions."""
|
"""Exercise the code path that issues a warning about unsafe permissions."""
|
||||||
os.chdir(self.tmpdir)
|
os.chdir(self.tmpdir)
|
||||||
@ -1973,24 +1960,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
os.remove(fp.name)
|
os.remove(fp.name)
|
||||||
fdroidserver.common.config = None
|
fdroidserver.common.config = None
|
||||||
|
|
||||||
with open('config.py', 'w') as fp:
|
|
||||||
fp.write('keystore = "foo.jks"')
|
|
||||||
self.assertTrue(os.path.exists(fp.name))
|
|
||||||
os.chmod(fp.name, 0o666) # nosec B103
|
|
||||||
fdroidserver.common.read_config()
|
|
||||||
|
|
||||||
def test_with_both_config_yml_py(self):
|
|
||||||
"""If config.yml and config.py are present, config.py should be ignored."""
|
|
||||||
os.chdir(self.tmpdir)
|
|
||||||
with open('config.yml', 'w') as fp:
|
|
||||||
fp.write('apksigner: yml')
|
|
||||||
with open('config.py', 'w') as fp:
|
|
||||||
fp.write('apksigner = "py"')
|
|
||||||
self.assertTrue(os.path.exists('config.yml'))
|
|
||||||
self.assertTrue(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
|
||||||
self.assertEqual('yml', config.get('apksigner'))
|
|
||||||
|
|
||||||
def test_config_repo_url(self):
|
def test_config_repo_url(self):
|
||||||
"""repo_url ends in /repo, archive_url ends in /archive."""
|
"""repo_url ends in /repo, archive_url ends in /archive."""
|
||||||
os.chdir(self.tmpdir)
|
os.chdir(self.tmpdir)
|
||||||
@ -2037,28 +2006,12 @@ class CommonTest(unittest.TestCase):
|
|||||||
os.chdir(self.tmpdir)
|
os.chdir(self.tmpdir)
|
||||||
with open('config.yml', 'w') as fp:
|
with open('config.yml', 'w') as fp:
|
||||||
fp.write('apksigner: yml')
|
fp.write('apksigner: yml')
|
||||||
|
os.chmod('config.yml', 0o0600)
|
||||||
self.assertTrue(os.path.exists(fp.name))
|
self.assertTrue(os.path.exists(fp.name))
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertFalse('keypass' in config)
|
self.assertFalse('keypass' in config)
|
||||||
self.assertEqual('yml', config.get('apksigner'))
|
self.assertEqual('yml', config.get('apksigner'))
|
||||||
fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword')
|
fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword')
|
||||||
with open(fp.name) as fp:
|
|
||||||
print(fp.read())
|
|
||||||
fdroidserver.common.config = None
|
|
||||||
config = fdroidserver.common.read_config()
|
|
||||||
self.assertEqual('mysecretpassword', config['keypass'])
|
|
||||||
|
|
||||||
def test_write_to_config_py(self):
|
|
||||||
os.chdir(self.tmpdir)
|
|
||||||
with open('config.py', 'w') as fp:
|
|
||||||
fp.write('apksigner = "py"')
|
|
||||||
self.assertTrue(os.path.exists(fp.name))
|
|
||||||
self.assertFalse(os.path.exists('config.yml'))
|
|
||||||
config = fdroidserver.common.read_config()
|
|
||||||
self.assertFalse('keypass' in config)
|
|
||||||
self.assertEqual('py', config.get('apksigner'))
|
|
||||||
fdroidserver.common.write_to_config(config, 'keypass', 'mysecretpassword')
|
|
||||||
fdroidserver.common.config = None
|
fdroidserver.common.config = None
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertEqual('mysecretpassword', config['keypass'])
|
self.assertEqual('mysecretpassword', config['keypass'])
|
||||||
@ -2068,7 +2021,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
with open('config.yml', 'w') as fp:
|
with open('config.yml', 'w') as fp:
|
||||||
fp.write('java_paths:\n 8: /usr/lib/jvm/java-8-openjdk\n')
|
fp.write('java_paths:\n 8: /usr/lib/jvm/java-8-openjdk\n')
|
||||||
self.assertTrue(os.path.exists(fp.name))
|
self.assertTrue(os.path.exists(fp.name))
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
config = fdroidserver.common.read_config()
|
config = fdroidserver.common.read_config()
|
||||||
self.assertEqual('/usr/lib/jvm/java-8-openjdk', config.get('java_paths', {}).get('8'))
|
self.assertEqual('/usr/lib/jvm/java-8-openjdk', config.get('java_paths', {}).get('8'))
|
||||||
|
|
||||||
@ -2143,10 +2095,11 @@ class CommonTest(unittest.TestCase):
|
|||||||
|
|
||||||
def test_loading_config_buildserver_yml(self):
|
def test_loading_config_buildserver_yml(self):
|
||||||
"""Smoke check to make sure this file is properly parsed"""
|
"""Smoke check to make sure this file is properly parsed"""
|
||||||
os.chdir(self.tmpdir)
|
os.chdir(self.testdir)
|
||||||
shutil.copy(os.path.join(basedir, '..', 'buildserver', 'config.buildserver.yml'),
|
shutil.copy(
|
||||||
'config.yml')
|
os.path.join(basedir, '..', 'buildserver', 'config.buildserver.yml'),
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
'config.yml',
|
||||||
|
)
|
||||||
fdroidserver.common.read_config()
|
fdroidserver.common.read_config()
|
||||||
|
|
||||||
def test_setup_status_output(self):
|
def test_setup_status_output(self):
|
||||||
@ -2742,35 +2695,6 @@ class CommonTest(unittest.TestCase):
|
|||||||
config['smartcardoptions'],
|
config['smartcardoptions'],
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_get_smartcardoptions_config_py(self):
|
|
||||||
os.chdir(self.tmpdir)
|
|
||||||
with open('config.py', 'w') as fp:
|
|
||||||
fp.write(
|
|
||||||
textwrap.dedent(
|
|
||||||
"""
|
|
||||||
smartcardoptions = '''
|
|
||||||
\t-storetype\tPKCS11
|
|
||||||
\t-providerClass\tsun.security.pkcs11.SunPKCS11
|
|
||||||
\t-providerArg\t/etc/pkcs11_java.cfg
|
|
||||||
|
|
||||||
'''
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
)
|
|
||||||
config = fdroidserver.common.read_config()
|
|
||||||
fdroidserver.common.config = config
|
|
||||||
self.assertEqual(
|
|
||||||
[
|
|
||||||
'-storetype',
|
|
||||||
'PKCS11',
|
|
||||||
'-providerClass',
|
|
||||||
'sun.security.pkcs11.SunPKCS11',
|
|
||||||
'-providerArg',
|
|
||||||
'/etc/pkcs11_java.cfg',
|
|
||||||
],
|
|
||||||
config['smartcardoptions'],
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_load_localized_config(self):
|
def test_load_localized_config(self):
|
||||||
"""It should load"""
|
"""It should load"""
|
||||||
antiFeatures = fdroidserver.common.load_localized_config(
|
antiFeatures = fdroidserver.common.load_localized_config(
|
||||||
|
@ -38,8 +38,8 @@ class IndexTest(unittest.TestCase):
|
|||||||
cls.index_v1_jar = basedir / 'repo' / 'index-v1.jar'
|
cls.index_v1_jar = basedir / 'repo' / 'index-v1.jar'
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
(basedir / 'config.py').chmod(0o600)
|
(basedir / 'config.yml').chmod(0o600)
|
||||||
os.chdir(basedir) # so read_config() can find config.py
|
os.chdir(basedir) # so read_config() can find config.yml
|
||||||
|
|
||||||
common.config = None
|
common.config = None
|
||||||
common.options = Options
|
common.options = Options
|
||||||
@ -380,8 +380,7 @@ class IndexTest(unittest.TestCase):
|
|||||||
with zipfile.ZipFile(jarfile, 'w', zipfile.ZIP_DEFLATED) as jar:
|
with zipfile.ZipFile(jarfile, 'w', zipfile.ZIP_DEFLATED) as jar:
|
||||||
jar.writestr('publishsigkeys.json', json.dumps(sigkeyfps))
|
jar.writestr('publishsigkeys.json', json.dumps(sigkeyfps))
|
||||||
publish.sign_sig_key_fingerprint_list(jarfile)
|
publish.sign_sig_key_fingerprint_list(jarfile)
|
||||||
with open('config.py', 'w'):
|
Path('config.yml').write_text('')
|
||||||
pass
|
|
||||||
|
|
||||||
index.v1_sort_packages(
|
index.v1_sort_packages(
|
||||||
i, common.load_stats_fdroid_signing_key_fingerprints()
|
i, common.load_stats_fdroid_signing_key_fingerprints()
|
||||||
@ -701,7 +700,7 @@ class IndexTest(unittest.TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def test_add_mirrors_to_repodict(self):
|
def test_add_mirrors_to_repodict(self):
|
||||||
"""Test based on the contents of tests/config.py"""
|
"""Test based on the contents of tests/config.yml"""
|
||||||
repodict = {'address': common.config['repo_url']}
|
repodict = {'address': common.config['repo_url']}
|
||||||
index.add_mirrors_to_repodict('repo', repodict)
|
index.add_mirrors_to_repodict('repo', repodict)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
@ -250,7 +250,6 @@ class NightlyTest(unittest.TestCase):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']])
|
self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']])
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
git_url = 'git@github.com:f-droid/test-nightly'
|
git_url = 'git@github.com:f-droid/test-nightly'
|
||||||
mirror_url = index.get_mirror_service_urls({"url": git_url})[0]
|
mirror_url = index.get_mirror_service_urls({"url": git_url})[0]
|
||||||
expected = {
|
expected = {
|
||||||
@ -324,7 +323,6 @@ class NightlyTest(unittest.TestCase):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']])
|
self.assertEqual(called, [['ssh', '-Tvi'], ['fdroid', 'deploy']])
|
||||||
self.assertFalse(os.path.exists('config.py'))
|
|
||||||
expected = {
|
expected = {
|
||||||
'archive_description': 'Old nightly builds that have been archived.',
|
'archive_description': 'Old nightly builds that have been archived.',
|
||||||
'archive_name': 'fdroid/test-nightly archive',
|
'archive_name': 'fdroid/test-nightly archive',
|
||||||
|
@ -13,10 +13,12 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import pathlib
|
import pathlib
|
||||||
|
import ruamel.yaml
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
import tempfile
|
import tempfile
|
||||||
|
from pathlib import Path
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
from fdroidserver import publish
|
from fdroidserver import publish
|
||||||
@ -94,8 +96,7 @@ class PublishTest(unittest.TestCase):
|
|||||||
]
|
]
|
||||||
|
|
||||||
os.chdir(self.testdir)
|
os.chdir(self.testdir)
|
||||||
with open('config.py', 'w') as f:
|
Path('config.yml').write_text('')
|
||||||
pass
|
|
||||||
|
|
||||||
publish.store_stats_fdroid_signing_key_fingerprints(appids, indent=2)
|
publish.store_stats_fdroid_signing_key_fingerprints(appids, indent=2)
|
||||||
|
|
||||||
@ -116,10 +117,12 @@ class PublishTest(unittest.TestCase):
|
|||||||
}
|
}
|
||||||
self.assertEqual(expected, common.load_stats_fdroid_signing_key_fingerprints())
|
self.assertEqual(expected, common.load_stats_fdroid_signing_key_fingerprints())
|
||||||
|
|
||||||
with open('config.py', 'r') as f:
|
yaml = ruamel.yaml.YAML(typ='safe')
|
||||||
|
with open('config.yml') as fp:
|
||||||
|
config = yaml.load(fp)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
'\nrepo_key_sha256 = "c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41"\n',
|
'c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41',
|
||||||
f.read(),
|
config['repo_key_sha256'],
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_store_and_load_fdroid_signing_key_fingerprints_with_missmatch(self):
|
def test_store_and_load_fdroid_signing_key_fingerprints_with_missmatch(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user