chore: extract build_access_denied_message in its own function

Signed-off-by: Akram Ben Aissi <<akram.benaissi@gmail.com>>
This commit is contained in:
Akram Ben Aissi 2025-07-03 14:10:15 +02:00
parent 31f85076ad
commit b945525a9e

View file

@ -105,22 +105,27 @@ def is_action_allowed(
return False return False
def build_access_denied_message(action: str | None, resource: ProtectedResource | None, user: User | None) -> str:
"""Build detailed error message for access denied scenarios."""
if action and resource and user:
resource_info = f"{resource.type}::{resource.identifier}"
user_info = f"'{user.principal}'"
if user.attributes:
attrs = ", ".join([f"{k}={v}" for k, v in user.attributes.items()])
user_info += f" (attributes: {attrs})"
message = f"User {user_info} cannot perform action '{action}' on resource '{resource_info}'"
else:
message = "Insufficient permissions"
return message
class AccessDeniedError(RuntimeError): class AccessDeniedError(RuntimeError):
def __init__(self, action: str | None = None, resource: ProtectedResource | None = None, user: User | None = None): def __init__(self, action: str | None = None, resource: ProtectedResource | None = None, user: User | None = None):
self.action = action self.action = action
self.resource = resource self.resource = resource
self.user = user self.user = user
# Build detailed error message message = build_access_denied_message(action, resource, user)
if action and resource and user:
resource_info = f"{resource.type}::{resource.identifier}"
user_info = f"'{user.principal}'"
if user.attributes:
attrs = ", ".join([f"{k}={v}" for k, v in user.attributes.items()])
user_info += f" (attributes: {attrs})"
message = f"User {user_info} cannot perform action '{action}' on resource '{resource_info}'"
else:
message = "Insufficient permissions"
super().__init__(message) super().__init__(message)