Skip to content

Commit e49fd0e

Browse files
NRL-2015 decide whether to use v2 perimssions based on presence of a v2 permissions file. No longer decide based on missing v1 headers. In order to lookup v2 permissions file we need v2 headers though
1 parent 07d1abc commit e49fd0e

File tree

2 files changed

+46
-10
lines changed

2 files changed

+46
-10
lines changed

layer/nrlf/core/decorators.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@
1919
from nrlf.core.codes import SpineErrorConcept
2020
from nrlf.core.config import Config
2121
from 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,
2725
X_REQUEST_ID_HEADER,
2826
AccessControls,
2927
PointerTypes,
28+
V2Headers,
3029
)
3130
from nrlf.core.dynamodb.repository import DocumentPointerRepository
3231
from nrlf.core.errors import OperationOutcomeError, ParseError
@@ -145,17 +144,18 @@ def wrapper(*args, **kwargs) -> Dict[str, Any]:
145144
RepositoryType = Union[Type[DocumentPointerRepository], None]
146145

147146

148-
def _use_v2_permissions_model(headers: Dict[str, str]) -> bool:
147+
def _use_v2_permissions_model(headers: Dict[str, str], path: str) -> bool:
149148
case_insensitive_headers = {key.lower(): value for key, value in headers.items()}
150149

151-
v1_headers_provided = (
152-
CLIENT_RP_DETAILS in case_insensitive_headers.keys()
153-
and CONNECTION_METADATA in case_insensitive_headers.keys()
150+
v2_headers_provided = (
151+
V2Headers.NHSD_END_USER_ORGANISATION_ODS in case_insensitive_headers.keys()
152+
and V2Headers.NHSD_NRL_APP_ID in case_insensitive_headers.keys()
154153
)
155-
if v1_headers_provided:
154+
if not v2_headers_provided:
156155
return False
157156

158-
v2_permissions_configured = get_pointer_permissions_v2() != {}
157+
metadata = parse_headers(headers, use_v2_permissions=True)
158+
v2_permissions_configured = get_pointer_permissions_v2(metadata, path) != {}
159159

160160
return v2_permissions_configured
161161

@@ -195,7 +195,7 @@ def _load_v2_connection_metadata(headers: Dict[str, str], path: str):
195195
def load_connection_metadata(headers: Dict[str, str], config: Config, path=""):
196196
logger.log(LogReference.HANDLER002, headers=headers)
197197

198-
if _use_v2_permissions_model(headers):
198+
if _use_v2_permissions_model(headers, path):
199199
return _load_v2_connection_metadata(headers, path)
200200

201201
metadata = parse_headers(headers, use_v2_permissions=False)

layer/nrlf/core/tests/test_decorators.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,8 +816,12 @@ def test_request_load_connection_metadata_with_no_permission_lookup_or_file():
816816

817817
@pytest.mark.parametrize("headers_missing_from_request", missing_headers)
818818
def test_request_load_connection_with_missing_headers_gets_v2_permissions(
819-
headers_missing_from_request,
819+
headers_missing_from_request, mocker
820820
):
821+
mocker.patch(
822+
"nrlf.core.decorators.get_pointer_permissions_v2",
823+
return_value={"types": ["http://snomed.info/sct|736253001"]},
824+
)
821825
headers = create_headers(
822826
additional_headers={
823827
V2Headers.NHSD_END_USER_ORGANISATION_ODS: "Y05868",
@@ -848,6 +852,38 @@ def _create_v2_headers() -> dict:
848852
return headers
849853

850854

855+
def test_load_connection_metadata_gets_v1_permissions_when_v2_permission_file_missing(
856+
mocker,
857+
):
858+
v1_permissions = [
859+
"http://snomed.info/sct|749001000000101",
860+
"https://nicip.nhs.uk|MAULR",
861+
]
862+
mocker.patch(
863+
"nrlf.core.decorators.parse_permissions_file",
864+
return_value=v1_permissions,
865+
)
866+
mocker.patch(
867+
"nrlf.core.decorators.get_pointer_permissions_v2",
868+
return_value={},
869+
)
870+
871+
v1_plus_v2_headers = create_headers(
872+
additional_headers={
873+
V2Headers.NHSD_END_USER_ORGANISATION_ODS: "Y05868",
874+
V2Headers.NHSD_NRL_APP_ID: "Y05868-TestApp-12345678",
875+
}
876+
)
877+
878+
expected_metadata = load_connection_metadata(
879+
headers=v1_plus_v2_headers, config=Config(), path="/producer/DocumentReference"
880+
)
881+
882+
assert expected_metadata.pointer_types == v1_permissions
883+
assert expected_metadata.ods_code == "Y05868"
884+
assert expected_metadata.nrl_app_id == "Y05868-TestApp-12345678"
885+
886+
851887
def test_load_v2_connection_metadata_allow_all_types(mocker: MockerFixture):
852888
mocker.patch(
853889
"nrlf.core.decorators.get_pointer_permissions_v2",

0 commit comments

Comments
 (0)