From f8eac2b09c14628ced690eb0c760ba74ba8256db Mon Sep 17 00:00:00 2001 From: Allan Eising Date: Wed, 16 Jul 2025 09:22:02 +0200 Subject: [PATCH] Handle exceptions better --- .../sshecret_admin/services/admin_backend.py | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/packages/sshecret-admin/src/sshecret_admin/services/admin_backend.py b/packages/sshecret-admin/src/sshecret_admin/services/admin_backend.py index 6213f55..8545127 100644 --- a/packages/sshecret-admin/src/sshecret_admin/services/admin_backend.py +++ b/packages/sshecret-admin/src/sshecret_admin/services/admin_backend.py @@ -17,7 +17,11 @@ from sshecret.backend import ( Operation, SubSystem, ) -from sshecret.backend.exceptions import BackendError, BackendValidationError +from sshecret.backend.exceptions import ( + BackendError, + BackendValidationError, + HttpErrorItem, +) from sshecret.backend.identifiers import KeySpec from sshecret.backend.models import ( ClientQueryResult, @@ -30,6 +34,7 @@ from sshecret.crypto import encrypt_string, load_public_key from .secret_manager import ( AsyncSecretContext, + InvalidSecretNameError, SecretUpdateParams, password_manager_context, ) @@ -603,7 +608,7 @@ class AdminBackend: client = await self.get_client(client_id) if not client: if update: - raise ClientNotFoundError() + raise ClientNotFoundError(f"Client {client_name} not found") LOG.warning("Requested client %s not found!", client_name) continue public_key = load_public_key(client.public_key.encode()) @@ -628,10 +633,17 @@ class AdminBackend: group=group, distinguisher=distinguisher, ) - except ClientManagementError: - raise + except InvalidSecretNameError as e: + field_error = self.create_field_error("name", str(e)) + error = self.create_validation_error(field_error) + raise error from e + + except ClientNotFoundError as e: + field_error = self.create_field_error("clients", str(e)) + error = self.create_validation_error(field_error) + raise error from e except Exception as e: - raise BackendUnavailableError() from e + raise ClientManagementError(e) async def update_secret(self, name: str, value: str) -> None: """Update secrets.""" @@ -748,3 +760,16 @@ class AdminBackend: async def get_audit_log_count(self) -> int: """Get audit log count.""" return await self.audit.count() + + def create_field_error(self, field: str, error_message: str) -> HttpErrorItem: + """Create a field error.""" + field_error: HttpErrorItem = { + "loc": ["body", field], + "msg": error_message, + "type": "None", + } + return field_error + + def create_validation_error(self, *errors: HttpErrorItem) -> BackendValidationError: + """Create a custom backend validation error.""" + return BackendValidationError(errors=list(errors))