Detect fresh install and guide the user to set an encryption passphrase so they know why they're prompted

This commit is contained in:
Miguel Jacq 2025-11-02 11:13:52 +11:00
parent 327e7882b5
commit 4f773e1c1b
Signed by: mig5
GPG key ID: 59B3F0C24135C6A9
3 changed files with 21 additions and 8 deletions

View file

@ -14,8 +14,8 @@ class KeyPrompt(QDialog):
def __init__( def __init__(
self, self,
parent=None, parent=None,
title: str = "Unlock database", title: str = "Enter key",
message: str = "Enter SQLCipher key", message: str = "Enter key",
): ):
super().__init__(parent) super().__init__(parent)
self.setWindowTitle(title) self.setWindowTitle(title)

View file

@ -1,5 +1,6 @@
from __future__ import annotations from __future__ import annotations
import os
import sys import sys
from PySide6.QtCore import QDate, QTimer, Qt, QSettings from PySide6.QtCore import QDate, QTimer, Qt, QSettings
@ -37,8 +38,14 @@ class MainWindow(QMainWindow):
self.setMinimumSize(1000, 650) self.setMinimumSize(1000, 650)
self.cfg = load_db_config() self.cfg = load_db_config()
if not os.path.exists(self.cfg.path):
# Fresh database/first time use, so guide the user re: setting a key
first_time = True
else:
first_time = False
# Always prompt for the key (we never store it) # Always prompt for the key (we never store it)
if not self._prompt_for_key_until_valid(): if not self._prompt_for_key_until_valid(first_time):
sys.exit(1) sys.exit(1)
# ---- UI: Left fixed panel (calendar) + right editor ----------------- # ---- UI: Left fixed panel (calendar) + right editor -----------------
@ -161,12 +168,18 @@ class MainWindow(QMainWindow):
return False return False
return ok return ok
def _prompt_for_key_until_valid(self) -> bool: def _prompt_for_key_until_valid(self, first_time: bool) -> bool:
""" """
Prompt for the SQLCipher key. Prompt for the SQLCipher key.
""" """
if first_time:
title = "Set an encryption key"
message = "Bouquin encrypts your data.\n\nPlease create a strong passphrase to encrypt the notebook.\n\nYou can always change it later!"
else:
title = "Unlock encrypted notebook"
message = "Enter your key to unlock the notebook"
while True: while True:
dlg = KeyPrompt(self, message="Enter a key to unlock the notebook") dlg = KeyPrompt(self, title, message)
if dlg.exec() != QDialog.Accepted: if dlg.exec() != QDialog.Accepted:
return False return False
self.cfg.key = dlg.key() self.cfg.key = dlg.key()

View file

@ -76,11 +76,11 @@ class SettingsDialog(QDialog):
self.accept() self.accept()
def _change_key(self): def _change_key(self):
p1 = KeyPrompt(self, title="Change key", message="Enter new key") p1 = KeyPrompt(self, title="Change key", message="Enter a new encryption key")
if p1.exec() != QDialog.Accepted: if p1.exec() != QDialog.Accepted:
return return
new_key = p1.key() new_key = p1.key()
p2 = KeyPrompt(self, title="Change key", message="Re-enter new key") p2 = KeyPrompt(self, title="Change key", message="Re-enter the new key")
if p2.exec() != QDialog.Accepted: if p2.exec() != QDialog.Accepted:
return return
if new_key != p2.key(): if new_key != p2.key():
@ -92,7 +92,7 @@ class SettingsDialog(QDialog):
try: try:
self._db.rekey(new_key) self._db.rekey(new_key)
QMessageBox.information( QMessageBox.information(
self, "Key changed", "The database key was updated." self, "Key changed", "The notebook was re-encrypted with the new key!"
) )
except Exception as e: except Exception as e:
QMessageBox.critical(self, "Error", f"Could not change key:\n{e}") QMessageBox.critical(self, "Error", f"Could not change key:\n{e}")