From abab1852fd6de2963c09581f2306526237b53739 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Sat, 31 Jul 2021 16:58:22 -0700 Subject: [PATCH 1/4] Raise exception when trying to commit folder-based journal (including DayOne) --- jrnl/DayOneJournal.py | 1 + jrnl/FolderJournal.py | 1 + jrnl/commands.py | 8 ++++++++ jrnl/exception.py | 7 +++++++ tests/bdd/features/encrypt.feature | 9 +++++++++ 5 files changed, 26 insertions(+) diff --git a/jrnl/DayOneJournal.py b/jrnl/DayOneJournal.py index 01b934e5..376486b4 100644 --- a/jrnl/DayOneJournal.py +++ b/jrnl/DayOneJournal.py @@ -32,6 +32,7 @@ class DayOne(Journal.Journal): def __init__(self, **kwargs): self.entries = [] self._deleted_entries = [] + self.cannot_be_encrypted = True super().__init__(**kwargs) def open(self): diff --git a/jrnl/FolderJournal.py b/jrnl/FolderJournal.py index 954a9436..474a3ea1 100644 --- a/jrnl/FolderJournal.py +++ b/jrnl/FolderJournal.py @@ -25,6 +25,7 @@ class Folder(Journal.Journal): def __init__(self, **kwargs): self.entries = [] self._diff_entry_dates = [] + self.cannot_be_encrypted = True super(Folder, self).__init__(**kwargs) def open(self): diff --git a/jrnl/commands.py b/jrnl/commands.py index 07ca0767..40d4c2f3 100644 --- a/jrnl/commands.py +++ b/jrnl/commands.py @@ -13,6 +13,7 @@ avoid any possible overhead for these standalone commands. """ import platform import sys +from .exception import JrnlError def preconfig_diagnostic(_): @@ -68,6 +69,13 @@ def postconfig_encrypt(args, config, original_config, **kwargs): # Open the journal journal = open_journal(args.journal_name, config) + if hasattr(journal, "cannot_be_encrypted") and journal.cannot_be_encrypted: + raise JrnlError( + "CannotEncryptJournalType", + journal_name=args.journal_name, + journal_type=journal.__class__.__name__, + ) + journal.config["encrypt"] = True new_journal = EncryptedJournal.from_journal(journal) diff --git a/jrnl/exception.py b/jrnl/exception.py index 07bf9023..0bafbdeb 100644 --- a/jrnl/exception.py +++ b/jrnl/exception.py @@ -38,6 +38,13 @@ class JrnlError(Exception): by at least {columns} in the configuration file or by using --config-override at the command line """, + "CannotEncryptJournalType": """ + The journal {journal_name} can't be encrypted because it is a + {journal_type} journal. + + To encrypt it, create a new journal referencing a file, export + this journal to the new journal, then encrypt the new journal. + """, } msg = error_messages[self.error_type].format(**kwargs) diff --git a/tests/bdd/features/encrypt.feature b/tests/bdd/features/encrypt.feature index 31d53520..19b255f2 100644 --- a/tests/bdd/features/encrypt.feature +++ b/tests/bdd/features/encrypt.feature @@ -40,3 +40,12 @@ Feature: Encrypting and decrypting journals Then we should be prompted for a password And the output should contain "2013-06-10 15:40 Life is good" + Scenario Outline: Attempt to encrypt a folder or DayOne journal should result in an error + Given we use the config "" + When we run "jrnl --encrypt" + Then the error output should contain "can't be encrypted" + + Examples: configs + | config_file | + | empty_folder.yaml | + | dayone.yaml | From b22417d179bb843972634edb87453b38bc2a5a49 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Mon, 16 Aug 2021 20:06:12 -0700 Subject: [PATCH 2/4] Change negative bool name to a positive --- jrnl/DayOneJournal.py | 2 +- jrnl/FolderJournal.py | 2 +- jrnl/commands.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jrnl/DayOneJournal.py b/jrnl/DayOneJournal.py index 376486b4..1e484365 100644 --- a/jrnl/DayOneJournal.py +++ b/jrnl/DayOneJournal.py @@ -32,7 +32,7 @@ class DayOne(Journal.Journal): def __init__(self, **kwargs): self.entries = [] self._deleted_entries = [] - self.cannot_be_encrypted = True + self.can_be_encrypted = False super().__init__(**kwargs) def open(self): diff --git a/jrnl/FolderJournal.py b/jrnl/FolderJournal.py index 474a3ea1..0c67a141 100644 --- a/jrnl/FolderJournal.py +++ b/jrnl/FolderJournal.py @@ -25,7 +25,7 @@ class Folder(Journal.Journal): def __init__(self, **kwargs): self.entries = [] self._diff_entry_dates = [] - self.cannot_be_encrypted = True + self.can_be_encrypted = False super(Folder, self).__init__(**kwargs) def open(self): diff --git a/jrnl/commands.py b/jrnl/commands.py index 40d4c2f3..d765242a 100644 --- a/jrnl/commands.py +++ b/jrnl/commands.py @@ -69,7 +69,7 @@ def postconfig_encrypt(args, config, original_config, **kwargs): # Open the journal journal = open_journal(args.journal_name, config) - if hasattr(journal, "cannot_be_encrypted") and journal.cannot_be_encrypted: + if hasattr(journal, "can_be_encrypted") and not journal.can_be_encrypted: raise JrnlError( "CannotEncryptJournalType", journal_name=args.journal_name, From 7a1cf85720490b4727fb1ee20eb4999f91d00649 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Sat, 21 Aug 2021 12:30:57 -0700 Subject: [PATCH 3/4] Add test to ensure this doesn't mess with encrypting normal journals --- tests/bdd/features/encrypt.feature | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/bdd/features/encrypt.feature b/tests/bdd/features/encrypt.feature index 19b255f2..a8b31c2e 100644 --- a/tests/bdd/features/encrypt.feature +++ b/tests/bdd/features/encrypt.feature @@ -49,3 +49,12 @@ Feature: Encrypting and decrypting journals | config_file | | empty_folder.yaml | | dayone.yaml | + + Scenario Outline: Attempt to encrypt basic journal should not result in an error + Given we use the config "" + When we run "jrnl --encrypt" + Then we should get no error + + Examples: configs + | config_file | + | simple.yaml | From 25513e7db45c10abd05a3730c6f08a097861f0b7 Mon Sep 17 00:00:00 2001 From: Micah Jerome Ellison Date: Sat, 21 Aug 2021 12:41:54 -0700 Subject: [PATCH 4/4] Consolidate and standardized tests --- tests/bdd/features/encrypt.feature | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/tests/bdd/features/encrypt.feature b/tests/bdd/features/encrypt.feature index a8b31c2e..02bff32f 100644 --- a/tests/bdd/features/encrypt.feature +++ b/tests/bdd/features/encrypt.feature @@ -28,18 +28,24 @@ Feature: Encrypting and decrypting journals # This should warn the user that the journal is already encrypted - Scenario: Encrypting a journal + Scenario Outline: Encrypting a journal Given we use the config "simple.yaml" When we run "jrnl --encrypt" and enter swordfish swordfish n - Then we should see the message "Journal encrypted" + Then we should get no error + And we should see the message "Journal encrypted" And the config for journal "default" should contain "encrypt: true" When we run "jrnl -n 1" and enter "swordfish" Then we should be prompted for a password And the output should contain "2013-06-10 15:40 Life is good" + Examples: configs + | config_file | + | basic_onefile.yaml | + + Scenario Outline: Attempt to encrypt a folder or DayOne journal should result in an error Given we use the config "" When we run "jrnl --encrypt" @@ -47,14 +53,5 @@ Feature: Encrypting and decrypting journals Examples: configs | config_file | - | empty_folder.yaml | - | dayone.yaml | - - Scenario Outline: Attempt to encrypt basic journal should not result in an error - Given we use the config "" - When we run "jrnl --encrypt" - Then we should get no error - - Examples: configs - | config_file | - | simple.yaml | + | basic_folder.yaml | + | basic_dayone.yaml |