Fix crypto service - add has_key, set_password, verify_password methods
This commit is contained in:
@@ -20,9 +20,12 @@ class CryptoService:
|
|||||||
key_file = os.environ.get("SNIP_KEY_FILE", "~/.snip/.key")
|
key_file = os.environ.get("SNIP_KEY_FILE", "~/.snip/.key")
|
||||||
self.key_file = os.path.expanduser(key_file)
|
self.key_file = os.path.expanduser(key_file)
|
||||||
self._ensure_dir()
|
self._ensure_dir()
|
||||||
|
self._password = None
|
||||||
|
|
||||||
def _ensure_dir(self):
|
def _ensure_dir(self):
|
||||||
os.makedirs(os.path.dirname(self.key_file), exist_ok=True)
|
key_dir = os.path.dirname(self.key_file)
|
||||||
|
if key_dir:
|
||||||
|
os.makedirs(key_dir, exist_ok=True)
|
||||||
|
|
||||||
def _get_salt(self) -> bytes:
|
def _get_salt(self) -> bytes:
|
||||||
salt_file = f"{self.key_file}.salt"
|
salt_file = f"{self.key_file}.salt"
|
||||||
@@ -48,14 +51,34 @@ class CryptoService:
|
|||||||
key = self._derive_key(password)
|
key = self._derive_key(password)
|
||||||
return Fernet(key)
|
return Fernet(key)
|
||||||
|
|
||||||
def encrypt(self, plaintext: str, password: str) -> str:
|
def has_key(self) -> bool:
|
||||||
|
"""Check if a password has been set."""
|
||||||
|
return self._password is not None
|
||||||
|
|
||||||
|
def set_password(self, password: str):
|
||||||
|
"""Set the encryption password."""
|
||||||
|
self._password = password
|
||||||
|
|
||||||
|
def verify_password(self, password: str) -> bool:
|
||||||
|
"""Verify if the given password is correct."""
|
||||||
|
return self._password == password
|
||||||
|
|
||||||
|
def encrypt(self, plaintext: str, password: str | None = None) -> str:
|
||||||
"""Encrypt plaintext using password-derived key."""
|
"""Encrypt plaintext using password-derived key."""
|
||||||
|
if password is None:
|
||||||
|
password = self._password
|
||||||
|
if password is None:
|
||||||
|
raise ValueError("No password set")
|
||||||
f = self._get_fernet(password)
|
f = self._get_fernet(password)
|
||||||
encrypted = f.encrypt(plaintext.encode())
|
encrypted = f.encrypt(plaintext.encode())
|
||||||
return base64.urlsafe_b64encode(encrypted).decode()
|
return base64.urlsafe_b64encode(encrypted).decode()
|
||||||
|
|
||||||
def decrypt(self, ciphertext: str, password: str) -> str:
|
def decrypt(self, ciphertext: str, password: str | None = None) -> str:
|
||||||
"""Decrypt ciphertext using password-derived key."""
|
"""Decrypt ciphertext using password-derived key."""
|
||||||
|
if password is None:
|
||||||
|
password = self._password
|
||||||
|
if password is None:
|
||||||
|
raise ValueError("No password set")
|
||||||
f = self._get_fernet(password)
|
f = self._get_fernet(password)
|
||||||
encrypted = base64.urlsafe_b64decode(ciphertext.encode())
|
encrypted = base64.urlsafe_b64decode(ciphertext.encode())
|
||||||
return f.decrypt(encrypted).decode()
|
return f.decrypt(encrypted).decode()
|
||||||
Reference in New Issue
Block a user