mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-05-10 16:48:31 +02:00
Create encrypted journal
Add failing test for configuring an encrypted journal Overload open for EncryptedJournal This avoids the execution path that calls EncryptedJournal._create() without a password parameter. It results in duplication of code that requests and stores a password, which should be factored out in a subsequent change. Modify test to test for returned strings The entered string for the password is not being used by the test and I don't understand why. Use util wrapper for getpass This allows for tests to run without prompting for user input.
This commit is contained in:
parent
b260ff35b9
commit
623fa6c307
3 changed files with 41 additions and 0 deletions
|
@ -9,6 +9,9 @@ journals:
|
||||||
ideas: features/journals/nothing.journal
|
ideas: features/journals/nothing.journal
|
||||||
simple: features/journals/simple.journal
|
simple: features/journals/simple.journal
|
||||||
work: features/journals/work.journal
|
work: features/journals/work.journal
|
||||||
|
new_encrypted:
|
||||||
|
encrypt: true
|
||||||
|
journal: features/journals/new_encrypted.journal
|
||||||
linewrap: 80
|
linewrap: 80
|
||||||
password: ''
|
password: ''
|
||||||
tagsymbols: '@'
|
tagsymbols: '@'
|
||||||
|
|
|
@ -39,3 +39,8 @@ Feature: Multiple journals
|
||||||
Given we use the config "bug343.yaml"
|
Given we use the config "bug343.yaml"
|
||||||
When we run "jrnl a long day in the office"
|
When we run "jrnl a long day in the office"
|
||||||
Then we should see the message "No default journal configured"
|
Then we should see the message "No default journal configured"
|
||||||
|
|
||||||
|
Scenario: Don't crash if no file exists for a configured encrypted journal
|
||||||
|
Given we use the config "multiple.yaml"
|
||||||
|
When we run "jrnl new_encrypted Adding first entry" and enter "these three eyes"
|
||||||
|
Then we should see the message "Journal 'new_encrypted' created"
|
||||||
|
|
|
@ -5,7 +5,13 @@ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
||||||
import hashlib
|
import hashlib
|
||||||
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
|
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
|
||||||
from cryptography.hazmat.backends import default_backend
|
from cryptography.hazmat.backends import default_backend
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
import base64
|
import base64
|
||||||
|
import getpass
|
||||||
|
import logging
|
||||||
|
|
||||||
|
log = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
def make_key(password):
|
def make_key(password):
|
||||||
|
@ -27,6 +33,33 @@ class EncryptedJournal(Journal.Journal):
|
||||||
super(EncryptedJournal, self).__init__(name, **kwargs)
|
super(EncryptedJournal, self).__init__(name, **kwargs)
|
||||||
self.config['encrypt'] = True
|
self.config['encrypt'] = True
|
||||||
|
|
||||||
|
def open(self, filename=None):
|
||||||
|
"""Opens the journal file defined in the config and parses it into a list of Entries.
|
||||||
|
Entries have the form (date, title, body)."""
|
||||||
|
filename = filename or self.config['journal']
|
||||||
|
|
||||||
|
if not os.path.exists(filename):
|
||||||
|
password = util.getpass("Enter password for new journal: ")
|
||||||
|
if password:
|
||||||
|
if util.yesno("Do you want to store the password in your keychain?", default=True):
|
||||||
|
util.set_keychain(self.name, password)
|
||||||
|
else:
|
||||||
|
util.set_keychain(self.name, None)
|
||||||
|
self.config['password'] = password
|
||||||
|
text = ""
|
||||||
|
self._store(filename, text)
|
||||||
|
util.prompt("[Journal '{0}' created at {1}]".format(self.name, filename))
|
||||||
|
else:
|
||||||
|
util.prompt("No password supplied for encrypted journal")
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
text = self._load(filename)
|
||||||
|
self.entries = self._parse(text)
|
||||||
|
self.sort()
|
||||||
|
log.debug("opened %s with %d entries", self.__class__.__name__, len(self))
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
def _load(self, filename, password=None):
|
def _load(self, filename, password=None):
|
||||||
"""Loads an encrypted journal from a file and tries to decrypt it.
|
"""Loads an encrypted journal from a file and tries to decrypt it.
|
||||||
If password is not provided, will look for password in the keychain
|
If password is not provided, will look for password in the keychain
|
||||||
|
|
Loading…
Add table
Reference in a new issue