KP opened on request, changed delimiter
This commit is contained in:
parent
324938133f
commit
8a6a8c0edf
5 changed files with 17 additions and 23 deletions
|
|
@ -13,7 +13,7 @@ class SimpleValueTemplate(Template):
|
||||||
|
|
||||||
|
|
||||||
class ComplexValueTemplate(SimpleValueTemplate):
|
class ComplexValueTemplate(SimpleValueTemplate):
|
||||||
delimiter = '@'
|
delimiter = '%'
|
||||||
|
|
||||||
|
|
||||||
@injectable
|
@injectable
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
import os.path
|
import os.path
|
||||||
import shutil
|
from contextlib import contextmanager
|
||||||
|
from typing import Any, Generator
|
||||||
|
|
||||||
|
import keyring
|
||||||
from injectable import injectable
|
from injectable import injectable
|
||||||
from pykeepass import PyKeePass, create_database
|
from pykeepass import PyKeePass, create_database
|
||||||
|
|
||||||
|
|
@ -12,22 +14,16 @@ class Passwords:
|
||||||
settings = get_settings()
|
settings = get_settings()
|
||||||
|
|
||||||
with open(settings.kp.secret, "r") as fh:
|
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._path = settings.kp.file
|
||||||
self._kp_org = self._open_or_create(self._path, secret)
|
|
||||||
self._kp = self._open_lock(self._path, secret)
|
|
||||||
|
|
||||||
@staticmethod
|
@contextmanager
|
||||||
def _open_or_create(path, password) -> PyKeePass:
|
def open(self, mode: str = "r") -> Generator[PyKeePass | Any, Any, None]:
|
||||||
if os.path.exists(path):
|
kp = PyKeePass(self._path, password=keyring.get_password("karl", "kp")) \
|
||||||
return PyKeePass(path, password=password)
|
if os.path.exists(self._path) else create_database(self._path, password=keyring.get_password("karl", "kp"))
|
||||||
return create_database(path, password)
|
yield kp
|
||||||
|
if mode == "rw":
|
||||||
@staticmethod
|
kp.save()
|
||||||
def _open_lock(path, password) -> PyKeePass:
|
|
||||||
lock_path = path + ".lock"
|
|
||||||
shutil.copyfile(path, lock_path)
|
|
||||||
return Passwords._open_or_create(lock_path, password)
|
|
||||||
|
|
||||||
def get_values(self, keys: list[str]) -> dict[str, str]:
|
def get_values(self, keys: list[str]) -> dict[str, str]:
|
||||||
output = {}
|
output = {}
|
||||||
|
|
@ -36,7 +32,8 @@ class Passwords:
|
||||||
path = key_parts[:-1] if len(key_parts) > 2 else None
|
path = key_parts[:-1] if len(key_parts) > 2 else None
|
||||||
entry_name = key_parts[-2]
|
entry_name = key_parts[-2]
|
||||||
field_name = key_parts[-1]
|
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)
|
output[k] = self._get_field_value(kp_entry, field_name)
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
@ -53,8 +50,3 @@ class Passwords:
|
||||||
return kp_entry.url
|
return kp_entry.url
|
||||||
case _:
|
case _:
|
||||||
return kp_entry.get_custom_property(field_name)
|
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)
|
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ dependencies = [
|
||||||
"injectable==4.0.1",
|
"injectable==4.0.1",
|
||||||
"py-automapper>=2.2.0",
|
"py-automapper>=2.2.0",
|
||||||
"fastapi-utils>=0.8.0",
|
"fastapi-utils>=0.8.0",
|
||||||
|
"keyring>=25.6.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
value: ${sample}
|
value: ${sample}
|
||||||
nested: ${some.nested.value}
|
nested: ${some.nested.value}
|
||||||
custom: @{custom.field}
|
custom: %{custom.field}
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ class TestMo(TestCase):
|
||||||
with open(target_path, 'r') as f:
|
with open(target_path, 'r') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
self.assertFalse(content.__contains__('${'))
|
self.assertFalse(content.__contains__('${'))
|
||||||
|
self.assertFalse(content.__contains__('%{'))
|
||||||
parsed = yaml.load(content, Loader=yaml.FullLoader)
|
parsed = yaml.load(content, Loader=yaml.FullLoader)
|
||||||
self.assertEqual('some_pass', parsed['value'])
|
self.assertEqual('some_pass', parsed['value'])
|
||||||
self.assertEqual('nested_pass', parsed['nested'])
|
self.assertEqual('nested_pass', parsed['nested'])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue