Skip to content

Commit 13ecddf

Browse files
committed
Decode FHIR pseudonym tokens in LocalizationListService
1 parent f440a17 commit 13ecddf

4 files changed

Lines changed: 15 additions & 14 deletions

File tree

‎app/models/fhir/resources/localization_list/request.py‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
DEVICE_SYSTEM,
1010
PSEUDONYM_SYSTEM,
1111
)
12-
from app.models.pseudonym import OprfPseudonym
13-
from app.services.fhir.pseudonym_token import decode_pseudonym_token
1412

1513
logger = logging.getLogger(__name__)
1614

@@ -92,9 +90,6 @@ def empty(self) -> bool:
9290
def is_localize_params(self) -> bool:
9391
return self.subject is not None and self.source is None
9492

95-
def get_subject_as_class_or_none(self) -> OprfPseudonym | None:
96-
return decode_pseudonym_token(self.subject, SUBJECT_IDENTIFIER_PARAM) if self.subject else None
97-
9893

9994
class LocalizationListSearchParams(LocalizationListParams):
10095
"""Search parameters for a List search, which also controls the page that is returned."""

‎app/models/fhir/resources/localization_list/resource.py‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
URA_SYSTEM_EXTENSION,
2020
)
2121
from app.models.fhir.resources.domain_resource import DomainResource
22-
from app.models.pseudonym import OprfPseudonym
2322
from app.models.ura import UraNumber
24-
from app.services.fhir.pseudonym_token import decode_pseudonym_token
2523

2624

2725
class ReferenceExtension(Extension):
@@ -88,14 +86,14 @@ def get_ura(self) -> UraNumber:
8886

8987
return UraNumber(target_ura)
9088

91-
def get_encoded_pseudonym(self) -> OprfPseudonym:
89+
def get_encoded_pseudonym(self) -> str:
9290
if self.subject is None:
9391
raise ValueError("List.subject is required")
9492

9593
if self.subject.identifier.system != PSEUDONYM_SYSTEM:
9694
raise ValueError(f"List.subject.identifier.system must be {PSEUDONYM_SYSTEM}")
9795

98-
return decode_pseudonym_token(self.subject.identifier.value, "List.subject.identifier.value")
96+
return self.subject.identifier.value
9997

10098
def get_device(self) -> str:
10199
if self.source.identifier.system != DEVICE_SYSTEM:

‎app/services/fhir/localization_list.py‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,26 @@
99
from app.models.fhir.resources.localization_list.request import (
1010
COUNT_PARAM,
1111
OFFSET_PARAM,
12+
SUBJECT_IDENTIFIER_PARAM,
1213
LocalizationListParams,
1314
LocalizationListSearchParams,
1415
)
1516
from app.models.fhir.resources.localization_list.resource import LocalizationList
1617
from app.models.fhir.resources.operation_outcome.resource import OperationOutcome
18+
from app.models.pseudonym import OprfPseudonym
1719
from app.models.ura import UraNumber
1820
from app.services.exceptions import UnauthorizedUraError
21+
from app.services.fhir.pseudonym_token import decode_pseudonym_token
1922
from app.services.pseudonym_referral_service import PseudonymReferralService
2023
from app.services.referral_service import ReferralService
2124

2225
logger = logging.getLogger(__name__)
2326

2427

28+
def _subject_pseudonym(params: LocalizationListParams) -> OprfPseudonym | None:
29+
return decode_pseudonym_token(params.subject, SUBJECT_IDENTIFIER_PARAM) if params.subject else None
30+
31+
2532
class LocalizationListService:
2633
def __init__(
2734
self,
@@ -43,7 +50,6 @@ def create(
4350
"""Returns the stored List and whether it was created by this call."""
4451
ura_number = data.get_ura()
4552
device = data.get_device()
46-
pseudonym = data.get_encoded_pseudonym()
4753

4854
if ura_number != authenticated_ura:
4955
gflog.emit(
@@ -54,6 +60,7 @@ def create(
5460
)
5561
raise UnauthorizedUraError("Registration not linked to the authorized URA")
5662

63+
pseudonym = decode_pseudonym_token(data.get_encoded_pseudonym(), "List.subject.identifier.value")
5764
referral, created = self.pseudonym_referral_service.register(pseudonym, ura_number=ura_number, source=device)
5865

5966
return LocalizationList.from_referral(referral), created
@@ -72,7 +79,7 @@ def query(
7279
7380
When `request_url` is given, the bundle links to the current, next and previous page.
7481
"""
75-
subject = params.get_subject_as_class_or_none()
82+
subject = _subject_pseudonym(params)
7683
page_size = min(params.count or self.default_page_size, self.max_page_size)
7784

7885
if params.is_localize_params() and subject is not None:
@@ -132,7 +139,7 @@ def delete_by_query(
132139
authenticated_ura: UraNumber,
133140
source: str,
134141
) -> tuple[OperationOutcome, int]:
135-
subject = params.get_subject_as_class_or_none()
142+
subject = _subject_pseudonym(params)
136143
deleted_count = self.pseudonym_referral_service.delete_many(authenticated_ura, pseudonym=subject, source=source)
137144

138145
if deleted_count < 1:

‎tests/services/fhir/test_localization_list.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ def test_stores_and_returns_the_resource(self, service: LocalizationListService)
6363

6464
assert result.id is not None
6565

66+
@pytest.mark.parametrize("pseudonym", [TEST_PSEUDONYM_TOKEN, INVALID_PSEUDONYM_TOKEN], ids=["valid", "invalid"])
6667
def test_rejects_a_resource_for_another_ura(
67-
self, service: LocalizationListService, caplog: pytest.LogCaptureFixture
68+
self, service: LocalizationListService, caplog: pytest.LogCaptureFixture, pseudonym: str
6869
) -> None:
69-
data = make_list_resource(ura=str(OTHER_URA))
70+
data = make_list_resource(ura=str(OTHER_URA), pseudonym=pseudonym)
7071

7172
with caplog.at_level(logging.INFO), pytest.raises(UnauthorizedUraError):
7273
service.create(data, AUTH_URA)

0 commit comments

Comments
 (0)