Skip to content

Commit

Permalink
Fix set_keychain errors (#964)
Browse files Browse the repository at this point in the history
* fix keyring problems
* black
* remove else and use stderr
* black
* add tests
* black
* change description of nokeyring
* dumb syntax error
  • Loading branch information
eshrh authored May 30, 2020
1 parent 30c4528 commit 52eaef2
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 4 deletions.
24 changes: 24 additions & 0 deletions features/encryption.feature
Original file line number Diff line number Diff line change
Expand Up @@ -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
21 changes: 21 additions & 0 deletions features/steps/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,22 @@ def delete_password(self, servicename, username):
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())

Expand Down Expand Up @@ -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
Expand Down
11 changes: 7 additions & 4 deletions jrnl/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit 52eaef2

Please sign in to comment.