KP opened on request, changed delimiter

This commit is contained in:
Piotr Dec 2025-11-04 00:14:18 +01:00
parent 324938133f
commit 8a6a8c0edf
Signed by: stawros
GPG key ID: 74B18A3F0F1E99C0
5 changed files with 17 additions and 23 deletions

View file

@ -13,7 +13,7 @@ class SimpleValueTemplate(Template):
class ComplexValueTemplate(SimpleValueTemplate):
delimiter = '@'
delimiter = '%'
@injectable

View file

@ -1,6 +1,8 @@
import os.path
import shutil
from contextlib import contextmanager
from typing import Any, Generator
import keyring
from injectable import injectable
from pykeepass import PyKeePass, create_database
@ -12,22 +14,16 @@ class Passwords:
settings = get_settings()
with open(settings.kp.secret, "r") as fh:
secret = fh.read().splitlines()[0]
keyring.set_password("karl", "kp", fh.read().splitlines()[0])
self._path = settings.kp.file
self._kp_org = self._open_or_create(self._path, secret)
self._kp = self._open_lock(self._path, secret)
@staticmethod
def _open_or_create(path, password) -> PyKeePass:
if os.path.exists(path):
return PyKeePass(path, password=password)
return create_database(path, password)
@staticmethod
def _open_lock(path, password) -> PyKeePass:
lock_path = path + ".lock"
shutil.copyfile(path, lock_path)
return Passwords._open_or_create(lock_path, password)
@contextmanager
def open(self, mode: str = "r") -> Generator[PyKeePass | Any, Any, None]:
kp = PyKeePass(self._path, password=keyring.get_password("karl", "kp")) \
if os.path.exists(self._path) else create_database(self._path, password=keyring.get_password("karl", "kp"))
yield kp
if mode == "rw":
kp.save()
def get_values(self, keys: list[str]) -> dict[str, str]:
output = {}
@ -36,7 +32,8 @@ class Passwords:
path = key_parts[:-1] if len(key_parts) > 2 else None
entry_name = key_parts[-2]
field_name = key_parts[-1]
kp_entry = self._kp_org.find_entries(path=path, first=True, title=entry_name)
with self.open() as kp:
kp_entry = kp.find_entries(path=path, first=True, title=entry_name)
output[k] = self._get_field_value(kp_entry, field_name)
return output
@ -53,8 +50,3 @@ class Passwords:
return kp_entry.url
case _:
return kp_entry.get_custom_property(field_name)
def save(self):
# nadpisz plik źródłowy zmianami z lock
self._kp.save()
shutil.copyfile(self._path + ".lock", self._path)