Fix keyring error handling (#1138)

* Capture KeyringLocked exception and allow manual password entry
* Create LockedKeyring for steps
* Support types in set_keyring step
* Clarify LockedKeyring docs
* Deal with locked exceptions elsewhere too
* Create behave tests for locked keyring
* Fix linting
* Fix keyring step to allow no type
* Handle all keyring retrieval errors
* Better keyring error handling
* Remove locked keyring for steps; generalize failed keyring
* Finalize tests for keyring handling
* Update set_keyring step
* Make password of failed keyring encryption test more semantic
This commit is contained in:
Karim Rahal 2021-01-02 23:26:45 +02:00 committed by GitHub
parent 9f1bef7fde
commit 57de4f9ba4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 20 deletions

View file

@ -69,21 +69,19 @@ class NoKeyring(keyring.backend.KeyringBackend):
class FailedKeyring(keyring.backend.KeyringBackend):
"""
A keyring that simulates an environment with a keyring that has passwords, but fails
to return them.
A keyring that cannot be retrieved.
"""
priority = 2
keys = defaultdict(dict)
def set_password(self, servicename, username, password):
self.keys[servicename][username] = password
raise keyring.errors.KeyringError
def get_password(self, servicename, username):
raise keyring.errors.NoKeyringError
raise keyring.errors.KeyringError
def delete_password(self, servicename, username):
self.keys[servicename][username] = None
raise keyring.errors.KeyringError
# set a default keyring
@ -148,8 +146,12 @@ def use_password(context, password, num=1):
@given("we have a keyring")
def set_keyring(context):
keyring.set_keyring(TestKeyring())
@given("we have a {type} keyring")
def set_keyring(context, type=""):
if type == "failed":
keyring.set_keyring(FailedKeyring())
else:
keyring.set_keyring(TestKeyring())
@given("we do not have a keyring")