summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEshan <eshanmind@gmail.com>2020-05-30 15:43:10 -0400
committerGitHub <noreply@github.com>2020-05-30 12:43:10 -0700
commit0b9137c17d9ec6f10857763ae25c216b5844960f (patch)
treedf503304e9fa5a1dee650a23115ea1e3604f80b9
parentca482b0a4688b5a840c78d83dbb79ec2d823372f (diff)
Fix set_keychain errors (#964)
* fix keyring problems * black * remove else and use stderr * black * add tests * black * change description of nokeyring * dumb syntax error
-rw-r--r--features/encryption.feature24
-rw-r--r--features/steps/core.py21
-rw-r--r--jrnl/util.py11
3 files changed, 52 insertions, 4 deletions
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):