diff --git a/features/encryption.feature b/features/encryption.feature index 787fa850..02f8b423 100644 --- a/features/encryption.feature +++ b/features/encryption.feature @@ -55,3 +55,27 @@ Then the config for journal "simple" should have "encrypt" set to "bool:True" When we run "jrnl simple -n 1" Then the output should contain "2013-06-10 15:40 Life is good" + + Scenario: Encrypt journal with no keyring backend and do not store in keyring + Given we use the config "basic.yaml" + When we disable the keychain + and we run "jrnl test entry" + and we run "jrnl --encrypt" and enter + """ + password + password + n + """ + Then we should get no error + + Scenario: Encrypt journal with no keyring backend and do store in keyring + Given we use the config "basic.yaml" + When we disable the keychain + and we run "jrnl test entry" + and we run "jrnl --encrypt" and enter + """ + password + password + y + """ + Then we should get no error diff --git a/features/steps/core.py b/features/steps/core.py index 79591f57..3befe4bd 100644 --- a/features/steps/core.py +++ b/features/steps/core.py @@ -41,6 +41,22 @@ class TestKeyring(keyring.backend.KeyringBackend): self.keys[servicename][username] = None +class NoKeyring(keyring.backend.KeyringBackend): + """A keyring that simulated an environment with no keyring backend.""" + + priority = 2 + keys = defaultdict(dict) + + def set_password(self, servicename, username, password): + raise keyring.errors.NoKeyringError + + def get_password(self, servicename, username): + raise keyring.errors.NoKeyringError + + def delete_password(self, servicename, username): + raise keyring.errors.NoKeyringError + + # set the keyring for keyring lib keyring.set_keyring(TestKeyring()) @@ -208,6 +224,11 @@ def set_keychain(context, journal, password): keyring.set_password("jrnl", journal, password) +@when("we disable the keychain") +def disable_keychain(context): + keyring.core.set_keyring(NoKeyring()) + + @then("we should get an error") def has_error(context): assert context.exit_status != 0, context.exit_status diff --git a/jrnl/util.py b/jrnl/util.py index db86a5ee..8ebaea41 100644 --- a/jrnl/util.py +++ b/jrnl/util.py @@ -59,9 +59,6 @@ def create_password( if yesno("Do you want to store the password in your keychain?", default=True): set_keychain(journal_name, pw) - else: - set_keychain(journal_name, None) - return pw @@ -107,7 +104,13 @@ def set_keychain(journal_name, password): except keyring.errors.PasswordDeleteError: pass else: - keyring.set_password("jrnl", journal_name, password) + try: + keyring.set_password("jrnl", journal_name, password) + except keyring.errors.NoKeyringError: + print( + "Keyring backend not found. Please install one of the supported backends by visiting: https://pypi.org/project/keyring/", + file=sys.stderr, + ) def yesno(prompt, default=True):