diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 8e580971..5f18f3b7 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -302,6 +302,30 @@ def read_config(opts, config_file='config.py'): return config +def assert_config_keystore(config): + """Check weather keystore is configured correctly and raise exception if not.""" + + nosigningkey = False + if 'repo_keyalias' not in config: + nosigningkey = True + logging.critical(_("'repo_keyalias' not found in config.py!")) + if 'keystore' not in config: + nosigningkey = True + logging.critical(_("'keystore' not found in config.py!")) + elif not os.path.exists(config['keystore']): + nosigningkey = True + logging.critical("'" + config['keystore'] + "' does not exist!") + if 'keystorepass' not in config: + nosigningkey = True + logging.critical(_("'keystorepass' not found in config.py!")) + if 'keypass' not in config: + nosigningkey = True + logging.critical(_("'keypass' not found in config.py!")) + if nosigningkey: + raise FDroidException("This command requires a signing key, " + + "you can create one using: fdroid update --create-key") + + def find_sdk_tools_cmd(cmd): '''find a working path to a tool from the Android SDK''' diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 0e23060c..d013b319 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -63,26 +63,8 @@ def make(apps, sortedids, apks, repodir, archive): return "fdroid.app:" + appid, apps[appid].Name raise MetaDataException("Cannot resolve app id " + appid) - nosigningkey = False if not common.options.nosign: - if 'repo_keyalias' not in common.config: - nosigningkey = True - logging.critical(_("'repo_keyalias' not found in config.py!")) - if 'keystore' not in common.config: - nosigningkey = True - logging.critical(_("'keystore' not found in config.py!")) - if 'keystorepass' not in common.config: - nosigningkey = True - logging.critical(_("'keystorepass' not found in config.py!")) - if 'keypass' not in common.config: - nosigningkey = True - logging.critical(_("'keypass' not found in config.py!")) - if not os.path.exists(common.config['keystore']): - nosigningkey = True - logging.critical("'" + common.config['keystore'] + "' does not exist!") - if nosigningkey: - raise FDroidException("`fdroid update` requires a signing key, " + - "you can create one using: fdroid update --create-key") + common.assert_config_keystore(common.config) repodict = collections.OrderedDict() repodict['timestamp'] = datetime.utcnow() diff --git a/fdroidserver/publish.py b/fdroidserver/publish.py index 4bdb8fb1..431d2aef 100644 --- a/fdroidserver/publish.py +++ b/fdroidserver/publish.py @@ -157,6 +157,8 @@ def main(): logging.critical(_('Java JDK not found! Install in standard location or set java_paths!')) sys.exit(1) + common.assert_config_keystore(config) + log_dir = 'logs' if not os.path.isdir(log_dir): logging.info(_("Creating log directory")) diff --git a/tests/common.TestCase b/tests/common.TestCase index a09c948b..3a10b7bb 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -25,6 +25,7 @@ if localmodule not in sys.path: import fdroidserver.signindex import fdroidserver.common import fdroidserver.metadata +from testcommon import TmpCwd from fdroidserver.exception import FDroidException @@ -39,6 +40,20 @@ class CommonTest(unittest.TestCase): os.makedirs(self.tmpdir) os.chdir(self.basedir) + def test_assert_config_keystore(self): + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + with self.assertRaises(FDroidException): + fdroidserver.common.assert_config_keystore({}) + + with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir): + c = {'repo_keyalias': 'localhost', + 'keystore': 'keystore.jks', + 'keystorepass': '12345', + 'keypass': '12345'} + with open('keystore.jks', 'w'): + pass + fdroidserver.common.assert_config_keystore(c) + def _set_build_tools(self): build_tools = os.path.join(fdroidserver.common.config['sdk_path'], 'build-tools') if os.path.exists(build_tools):