Improve error handling and begin error test suite

This commit is contained in:
2025-05-31 10:55:33 +02:00
parent 289352d872
commit 18f61631c9
3 changed files with 37 additions and 10 deletions

View File

@ -7,6 +7,7 @@ from pathlib import Path
from typing import cast from typing import cast
import pykeepass import pykeepass
import pykeepass.exceptions
from sshecret_admin.core.settings import AdminServerSettings from sshecret_admin.core.settings import AdminServerSettings
from .models import SecretGroup from .models import SecretGroup
@ -20,6 +21,10 @@ NO_USERNAME = "NO_USERNAME"
DEFAULT_LOCATION = "keepass.kdbx" DEFAULT_LOCATION = "keepass.kdbx"
class PasswordCredentialsError(Exception):
pass
def create_password_db(location: Path, password: str) -> None: def create_password_db(location: Path, password: str) -> None:
"""Create the password database.""" """Create the password database."""
LOG.info("Creating password database at %s", location) LOG.info("Creating password database at %s", location)
@ -248,7 +253,12 @@ class PasswordContext:
@contextmanager @contextmanager
def _password_context(location: Path, password: str) -> Iterator[PasswordContext]: def _password_context(location: Path, password: str) -> Iterator[PasswordContext]:
"""Open the password context.""" """Open the password context."""
database = pykeepass.PyKeePass(str(location.absolute()), password=password) try:
database = pykeepass.PyKeePass(str(location.absolute()), password=password)
except pykeepass.exceptions.CredentialsError as e:
raise PasswordCredentialsError(
"Could not open password database. Invalid credentials."
) from e
context = PasswordContext(database) context = PasswordContext(database)
yield context yield context

View File

@ -7,9 +7,7 @@ those in the low level API.
import random import random
import string import string
from pathlib import Path
from typing import cast from typing import cast
import pytest
import pykeepass import pykeepass
from sshecret_admin.services.keepass import PasswordContext from sshecret_admin.services.keepass import PasswordContext
@ -43,13 +41,6 @@ def create_random_entries(
password_database.save() password_database.save()
@pytest.fixture(name="password_database")
def password_db_fixture(tmp_path: Path):
"""Create a password database."""
filename = tmp_path / "kpdb.kdbx"
yield pykeepass.create_database(str(filename), password="test")
def test_add_entry(password_database: pykeepass.PyKeePass) -> None: def test_add_entry(password_database: pykeepass.PyKeePass) -> None:
"""Test add entry.""" """Test add entry."""
context = PasswordContext(password_database) context = PasswordContext(password_database)

View File

@ -0,0 +1,26 @@
"""Tests various error types."""
from pathlib import Path
import pykeepass
import pykeepass.exceptions
import pytest
from sshecret_admin.services.keepass import PasswordContext, _password_context, PasswordCredentialsError
def test_open_invalid_database() -> None:
"""Test opening a non-existing database."""
bogus_path = Path("/tmp/non/existing/password/database.kdbx")
with pytest.raises(FileNotFoundError):
with _password_context(bogus_path, "foobar") as context:
assert context is not None
def test_incorrect_password(tmp_path: Path) -> None:
"""Test opening database with incorrect password."""
filename = tmp_path / "db.kdbx"
pykeepass.create_database(str(filename), password="correct")
with pytest.raises(PasswordCredentialsError):
with _password_context(filename, "incorrect") as context:
assert context is not None