summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gemato/openpgp.py28
-rw-r--r--tests/test_openpgp.py4
2 files changed, 18 insertions, 14 deletions
diff --git a/gemato/openpgp.py b/gemato/openpgp.py
index 7d42125..8663f02 100644
--- a/gemato/openpgp.py
+++ b/gemato/openpgp.py
@@ -229,6 +229,19 @@ class SystemGPGEnvironment:
return (p.wait(), out, err)
+def _rmtree_error_handler(func, path, exc_info):
+ # ignore ENOENT -- it probably means a race condition between
+ # us and gpg-agent cleaning up after itself
+ # also non-empty directory due to races, and EBUSY for NFS:
+ # https://bugs.gentoo.org/684172
+ if (not isinstance(exc_info[1], OSError)
+ or exc_info[1].errno not in (errno.ENOENT,
+ errno.ENOTEMPTY,
+ errno.EEXIST,
+ errno.EBUSY)):
+ raise exc_info[1]
+
+
class IsolatedGPGEnvironment(SystemGPGEnvironment):
"""
An isolated environment for OpenPGP routines. Used to get reliable
@@ -279,19 +292,6 @@ debug-level guru
def clone(self):
return IsolatedGPGEnvironment(debug=self.debug, proxy=self.proxy)
- @staticmethod
- def _rmtree_error_handler(func, path, exc_info):
- # ignore ENOENT -- it probably means a race condition between
- # us and gpg-agent cleaning up after itself
- # also non-empty directory due to races, and EBUSY for NFS:
- # https://bugs.gentoo.org/684172
- if (not isinstance(exc_info[1], OSError)
- or exc_info[1].errno not in (errno.ENOENT,
- errno.ENOTEMPTY,
- errno.EEXIST,
- errno.EBUSY)):
- raise exc_info[1]
-
def close(self):
if self._home is not None:
ret, sout, serr = self._spawn_gpg(
@@ -304,7 +304,7 @@ debug-level guru
# we need to loop due to ENOTEMPTY potential
while os.path.isdir(self._home):
shutil.rmtree(self._home,
- onerror=self._rmtree_error_handler)
+ onerror=_rmtree_error_handler)
else:
logging.debug(f'GNUPGHOME left for debug purposes: '
f'{self._home}')
diff --git a/tests/test_openpgp.py b/tests/test_openpgp.py
index 3eacc32..6bce97d 100644
--- a/tests/test_openpgp.py
+++ b/tests/test_openpgp.py
@@ -337,6 +337,7 @@ class MockedSystemGPGEnvironment(SystemGPGEnvironment):
"""System environment variant mocked to use isolated GNUPGHOME"""
def __init__(self, *args, **kwargs):
self._tmpdir = tempfile.TemporaryDirectory()
+ self._home = self._tmpdir.name
os.environ['GNUPGHOME'] = self._tmpdir.name
super().__init__(*args, **kwargs)
@@ -348,6 +349,9 @@ class MockedSystemGPGEnvironment(SystemGPGEnvironment):
def close(self):
if self._tmpdir is not None:
+ IsolatedGPGEnvironment.close(self)
+ # we need to recreate it to make cleanup() happy
+ os.mkdir(self._tmpdir.name)
self._tmpdir.cleanup()
self._tmpdir = None
os.environ.pop('GNUPGHOME', None)