99 event_source ,
1010)
1111from aws_lambda_powertools .utilities .typing import LambdaContext
12- from pydantic import BaseModel
12+ from pydantic import BaseModel , ValidationError
1313
1414from nrlf .core .authoriser import (
1515 get_pointer_permissions_v2 ,
1919from nrlf .core .codes import SpineErrorConcept
2020from nrlf .core .config import Config
2121from nrlf .core .constants import (
22- CLIENT_RP_DETAILS ,
23- CONNECTION_METADATA ,
2422 NHSD_CORRELATION_ID_HEADER ,
2523 PERMISSION_ALLOW_ALL_POINTER_TYPES ,
2624 X_CORRELATION_ID_HEADER ,
3129from nrlf .core .dynamodb .repository import DocumentPointerRepository
3230from nrlf .core .errors import OperationOutcomeError , ParseError
3331from nrlf .core .logger import LogReference , logger
34- from nrlf .core .model import PermissionsPolicy
32+ from nrlf .core .model import ConnectionMetadata , PermissionsPolicy
3533from nrlf .core .request import parse_body , parse_headers , parse_params , parse_path
3634from nrlf .core .response import Response
3735
@@ -74,7 +72,7 @@ def wrapper(*args, **kwargs) -> Dict[str, Any]:
7472
7573
7674def header_handler (
77- wrapped_func : Callable [..., Dict [str , Any ]]
75+ wrapped_func : Callable [..., Dict [str , Any ]],
7876) -> Callable [..., Dict [str , Any ]]:
7977 """
8078 Wraps the function to set the specific headers in the request and response
@@ -118,7 +116,7 @@ def wrapper(*args, **kwargs) -> Dict[str, Any]:
118116
119117
120118def logger_initialiser (
121- wrapper_func : Callable [..., Dict [str , Any ]]
119+ wrapper_func : Callable [..., Dict [str , Any ]],
122120) -> Callable [..., Dict [str , Any ]]:
123121 """
124122 Wraps the function and initialises the request logger
@@ -145,27 +143,48 @@ def wrapper(*args, **kwargs) -> Dict[str, Any]:
145143RepositoryType = Union [Type [DocumentPointerRepository ], None ]
146144
147145
148- def _use_v2_permissions_model (headers : Dict [str , str ]) -> bool :
149- case_insensitive_headers = {key .lower (): value for key , value in headers .items ()}
150- # if either or both headers are missing
151- return (
152- CLIENT_RP_DETAILS not in case_insensitive_headers .keys ()
153- or CONNECTION_METADATA not in case_insensitive_headers .keys ()
154- )
146+ def v1_perms_stuff (metadata : ConnectionMetadata , config : Config ):
147+ if PERMISSION_ALLOW_ALL_POINTER_TYPES in metadata .nrl_permissions :
148+ logger .log (LogReference .HANDLER004a )
149+ metadata .pointer_types = PointerTypes .list ()
150+ return metadata
151+
152+ logger .log (LogReference .HANDLER004b )
153+ pointer_types = parse_permissions_file (metadata )
154+ if not pointer_types and not metadata .is_test_event :
155+ logger .log (LogReference .HANDLER004 )
156+ pointer_types = get_pointer_types (metadata , config )
155157
158+ metadata .pointer_types = pointer_types
159+ logger .log (LogReference .HANDLER004c , pointer_types = pointer_types )
156160
157- def _load_v2_connection_metadata (headers : Dict [str , str ], path : str ):
158- logger .log (LogReference .HANDLER004d )
161+ return metadata
159162
160- metadata = parse_headers (headers , use_v2_permissions = True )
161- logger .log (LogReference .HANDLER003 , metadata = metadata .model_dump ())
162163
163- logger . log ( LogReference . HANDLER004b )
164+ def v2_perms_stuff ( metadata : ConnectionMetadata , path = "" ):
164165 pointer_permissions = get_pointer_permissions_v2 (metadata , path )
165166
166- metadata .nrl_permissions_policy = PermissionsPolicy .model_validate (
167- pointer_permissions
168- )
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
169188
170189 if (
171190 AccessControls .ALLOW_ALL_TYPES .value
@@ -189,27 +208,16 @@ def _load_v2_connection_metadata(headers: Dict[str, str], path: str):
189208def load_connection_metadata (headers : Dict [str , str ], config : Config , path = "" ):
190209 logger .log (LogReference .HANDLER002 , headers = headers )
191210
192- if _use_v2_permissions_model (headers ):
193- return _load_v2_connection_metadata (headers , path )
194-
195- metadata = parse_headers (headers , use_v2_permissions = False )
211+ metadata = parse_headers (headers )
196212 logger .log (LogReference .HANDLER003 , metadata = metadata .model_dump ())
197213
198- if PERMISSION_ALLOW_ALL_POINTER_TYPES in metadata .nrl_permissions :
199- logger .log (LogReference .HANDLER004a )
200- metadata .pointer_types = PointerTypes .list ()
201- return metadata
202-
203- logger .log (LogReference .HANDLER004b )
204- pointer_types = parse_permissions_file (metadata )
205- if not pointer_types and not metadata .is_test_event :
206- logger .log (LogReference .HANDLER004 )
207- pointer_types = get_pointer_types (metadata , config )
208-
209- metadata .pointer_types = pointer_types
210- logger .log (LogReference .HANDLER004c , pointer_types = pointer_types )
214+ try :
215+ return v2_perms_stuff (metadata , path )
216+ except FileNotFoundError :
217+ # No v2 perms file found, so try v1 instead
218+ pass
211219
212- return metadata
220+ return v1_perms_stuff ( metadata , config )
213221
214222
215223def filter_kwargs (handler_func : RequestHandler , kwargs : Dict [str , Any ]):
0 commit comments