Skip to content

Commit 680c5b0

Browse files
NRL-2015 Raise a better error when new permissions policy fails to validate
1 parent 79c6e9f commit 680c5b0

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

layer/nrlf/core/decorators.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
event_source,
1010
)
1111
from aws_lambda_powertools.utilities.typing import LambdaContext
12-
from pydantic import BaseModel
12+
from pydantic import BaseModel, ValidationError
1313

1414
from nrlf.core.authoriser import (
1515
get_pointer_permissions_v2,
@@ -164,9 +164,27 @@ def v1_perms_stuff(metadata: ConnectionMetadata, config: Config):
164164
def v2_perms_stuff(metadata: ConnectionMetadata, path=""):
165165
pointer_permissions = get_pointer_permissions_v2(metadata, path)
166166

167-
metadata.nrl_permissions_policy = PermissionsPolicy.model_validate(
168-
pointer_permissions
169-
)
167+
try:
168+
metadata.nrl_permissions_policy = PermissionsPolicy.model_validate(
169+
pointer_permissions
170+
)
171+
except ValidationError as err:
172+
logger.log(
173+
LogReference.HANDLER004e,
174+
pointer_permissions=pointer_permissions,
175+
path=path,
176+
validation_errors=err.errors(),
177+
)
178+
raise OperationOutcomeError(
179+
status_code="401",
180+
severity="error",
181+
code="invalid",
182+
details=SpineErrorConcept.from_code("MISSING_OR_INVALID_HEADER"),
183+
diagnostics=(
184+
"Unable to parse metadata about the requesting application. "
185+
"Contact the onboarding team."
186+
),
187+
) from None
170188

171189
if (
172190
AccessControls.ALLOW_ALL_TYPES.value

layer/nrlf/core/log_references.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class LogReference(Enum):
3333
HANDLER004b = _Reference("INFO", "Parsing embedded permissions file")
3434
HANDLER004c = _Reference("INFO", "Parsed embedded permissions file")
3535
HANDLER004d = _Reference("INFO", "Using v2 permissions model")
36+
HANDLER004e = _Reference("ERROR", "Unable to validate PermissionsPolicy")
3637
HANDLER005 = _Reference("WARN", "Rejecting request due to missing pointer types")
3738
HANDLER006 = _Reference("DEBUG", "Attempting to parse request parameters")
3839
HANDLER007 = _Reference("INFO", "Parsed request parameters")

layer/nrlf/core/tests/test_decorators.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,29 @@ def test_load_v2_connection_metadata_missing_access_controls(mocker: MockerFixtu
10041004
assert metadata.nrl_permissions_policy.types == specific_types
10051005

10061006

1007+
def test_load_v2_connection_metadata_invalid_permissions_file(mocker: MockerFixture):
1008+
mocker.patch("nrlf.core.decorators.get_pointer_permissions_v2", return_value=[])
1009+
1010+
with pytest.raises(OperationOutcomeError) as err:
1011+
load_connection_metadata(
1012+
headers=_create_v2_headers(),
1013+
config=Config(),
1014+
path="/producer/DocumentReference",
1015+
)
1016+
1017+
assert err.value.status_code == "401"
1018+
assert err.value.operation_outcome.resourceType == "OperationOutcome"
1019+
assert err.value.operation_outcome.issue[0].severity == "error"
1020+
assert err.value.operation_outcome.issue[0].code == "invalid"
1021+
assert err.value.operation_outcome.issue[0].details == SpineErrorConcept.from_code(
1022+
"MISSING_OR_INVALID_HEADER"
1023+
)
1024+
assert (
1025+
err.value.operation_outcome.issue[0].diagnostics
1026+
== "Unable to parse metadata about the requesting application. Contact the onboarding team."
1027+
)
1028+
1029+
10071030
def test_request_handler_with_custom_repository(mocker: MockerFixture):
10081031
repository_mock = mocker.Mock()
10091032

0 commit comments

Comments
 (0)