From 189d6eea2697e6496d8594e0a86217587f687967 Mon Sep 17 00:00:00 2001 From: Blake Griffith Date: Tue, 29 Dec 2015 08:19:47 -0600 Subject: [PATCH 1/3] Add check that symlinks exist. --- letsencrypt/storage.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/letsencrypt/storage.py b/letsencrypt/storage.py index 08b48ff5e..9b2b1705a 100644 --- a/letsencrypt/storage.py +++ b/letsencrypt/storage.py @@ -128,6 +128,15 @@ class RenewableCert(object): # pylint: disable=too-many-instance-attributes self.fullchain = self.configuration["fullchain"] self._fix_symlinks() + self._check_symlinks() + + def _check_symlinks(self): + def check(link): + return os.path.exists(os.path.realpath(link)) + for kind in ALL_FOUR: + if not check(getattr(self, kind)): + raise errors.CertStorageError( + "link: {0} does not exist".format(getattr(self, kind))) def _consistent(self): """Are the files associated with this lineage self-consistent? From 834b811ca08e0945b9d24d359b7945d6e1e6e542 Mon Sep 17 00:00:00 2001 From: TheNavigat Date: Fri, 29 Jan 2016 18:30:49 +0200 Subject: [PATCH 2/3] Adding tests for checking the existence of symlinks --- letsencrypt/tests/renewer_test.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/letsencrypt/tests/renewer_test.py b/letsencrypt/tests/renewer_test.py index 7030e4998..4d217cba4 100644 --- a/letsencrypt/tests/renewer_test.py +++ b/letsencrypt/tests/renewer_test.py @@ -76,7 +76,10 @@ class BaseRenewableCertTest(unittest.TestCase): junk.close() self.defaults = configobj.ConfigObj() - self.test_rc = storage.RenewableCert(config.filename, self.cli_config) + + with mock.patch("letsencrypt.storage.RenewableCert._check_symlinks") as check: + check.return_value = True + self.test_rc = storage.RenewableCert(config.filename, self.cli_config) def tearDown(self): shutil.rmtree(self.tempdir) @@ -786,6 +789,12 @@ class RenewableCertTests(BaseRenewableCertTest): renewer.main(cli_args=self._common_cli_args()) # The errors.CertStorageError is caught inside and nothing happens. + def test_missing_cert(self): + from letsencrypt import storage + self.assertRaises(errors.CertStorageError, + storage.RenewableCert, + self.config.filename, self.cli_config) + if __name__ == "__main__": unittest.main() # pragma: no cover From b2ff1ed20f937f5bc192a662dd1f1c2a9a849a94 Mon Sep 17 00:00:00 2001 From: TheNavigat Date: Fri, 29 Jan 2016 18:43:23 +0200 Subject: [PATCH 3/3] Adding docstring to functions in storage.py --- letsencrypt/storage.py | 2 ++ letsencrypt/tests/renewer_test.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/letsencrypt/storage.py b/letsencrypt/storage.py index 9b2b1705a..e41805459 100644 --- a/letsencrypt/storage.py +++ b/letsencrypt/storage.py @@ -131,7 +131,9 @@ class RenewableCert(object): # pylint: disable=too-many-instance-attributes self._check_symlinks() def _check_symlinks(self): + """Raises an exception if a symlink doesn't exist""" def check(link): + """Checks if symlink points to a file that exists""" return os.path.exists(os.path.realpath(link)) for kind in ALL_FOUR: if not check(getattr(self, kind)): diff --git a/letsencrypt/tests/renewer_test.py b/letsencrypt/tests/renewer_test.py index 4d217cba4..3c8e3cb95 100644 --- a/letsencrypt/tests/renewer_test.py +++ b/letsencrypt/tests/renewer_test.py @@ -76,7 +76,7 @@ class BaseRenewableCertTest(unittest.TestCase): junk.close() self.defaults = configobj.ConfigObj() - + with mock.patch("letsencrypt.storage.RenewableCert._check_symlinks") as check: check.return_value = True self.test_rc = storage.RenewableCert(config.filename, self.cli_config)