Skip to content

Commit 4aacdc6

Browse files
committed
Accept only the API field names for OprfPseudonym
1 parent 13ecddf commit 4aacdc6

7 files changed

Lines changed: 24 additions & 11 deletions

File tree

‎app/models/pseudonym.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ class PseudonymResponse(BaseModel):
1010

1111

1212
class OprfPseudonym(BaseModel):
13-
model_config = ConfigDict(frozen=True, validate_by_name=True)
13+
model_config = ConfigDict(frozen=True)
1414

15-
jwe: str = Field(validation_alias="pseudonym")
16-
blind_factor: str = Field(validation_alias="oprf_key")
15+
jwe: str = Field(alias="pseudonym")
16+
blind_factor: str = Field(alias="oprf_key")
1717

1818

1919
@dataclass

‎app/services/fhir/pseudonym_token.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
def decode_pseudonym_token(token: str, field: str) -> OprfPseudonym:
77
try:
88
data = decode_url_safe_token(token)
9-
return OprfPseudonym(jwe=data["evaluated_output"], blind_factor=data["blind_factor"])
9+
return OprfPseudonym(pseudonym=data["evaluated_output"], oprf_key=data["blind_factor"])
1010
except Exception as exc:
1111
raise PseudonymError(f"Invalid pseudonym in {field}") from exc

‎tests/models/test_pseudonym.py‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
from app.models.pseudonym import EncryptedPseudonym
1+
import pytest
2+
from pydantic import ValidationError
3+
4+
from app.models.pseudonym import EncryptedPseudonym, OprfPseudonym
25

36

47
def test_init_should_converts_value_to_string() -> None:
@@ -38,3 +41,13 @@ def test_inequality_should_succeed_with_different_value() -> None:
3841
def test_equality_should_return_false_when_compared_with_non_instance() -> None:
3942
pseudonym = EncryptedPseudonym("test", "mock")
4043
assert pseudonym != "test"
44+
45+
46+
def test_oprf_pseudonym_reads_the_api_field_names() -> None:
47+
pseudonym = OprfPseudonym.model_validate({"pseudonym": "JWE", "oprf_key": "BF"})
48+
assert (pseudonym.jwe, pseudonym.blind_factor) == ("JWE", "BF")
49+
50+
51+
def test_oprf_pseudonym_rejects_the_internal_field_names() -> None:
52+
with pytest.raises(ValidationError):
53+
OprfPseudonym.model_validate({"jwe": "JWE", "blind_factor": "BF"})

‎tests/services/fhir/test_pseudonym_token.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def _encode(data: dict[str, str]) -> str:
1717

1818

1919
def test_decodes_evaluated_output_and_blind_factor() -> None:
20-
assert decode_pseudonym_token(TEST_PSEUDONYM_TOKEN, FIELD) == OprfPseudonym(jwe="JWE", blind_factor="BF")
20+
assert decode_pseudonym_token(TEST_PSEUDONYM_TOKEN, FIELD) == OprfPseudonym(pseudonym="JWE", oprf_key="BF")
2121

2222

2323
@pytest.mark.parametrize(

‎tests/services/test_crypto_service_api_client.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from app.models.pseudonym import OprfPseudonym, PseudonymResponse
88
from app.services.crypto_service_api_client import CryptoServiceApiClient
99

10-
PSEUDONYM = OprfPseudonym(jwe="jwe", blind_factor="bf")
10+
PSEUDONYM = OprfPseudonym(pseudonym="jwe", oprf_key="bf")
1111

1212

1313
@pytest.fixture()
@@ -31,7 +31,7 @@ def test_exchange_returns_hashed_pseudonym(crypto_client: CryptoServiceApiClient
3131
http_mock.do_request.return_value = response
3232

3333
result = crypto_client.exchange(
34-
OprfPseudonym(jwe="some-jwe", blind_factor="some-blind-factor"), "some-label", "CBC_AES"
34+
OprfPseudonym(pseudonym="some-jwe", oprf_key="some-blind-factor"), "some-label", "CBC_AES"
3535
)
3636

3737
assert result == PseudonymResponse(encrypted_pseudonym="abc", iv="123")

‎tests/services/test_pseudonym_referral_service.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
REQUESTING_URA = UraNumber("00000456")
1818
SOURCE = "SomeDevice"
1919
OTHER_SOURCE = "OtherDevice"
20-
PSEUDONYM = OprfPseudonym(jwe="JWE", blind_factor="BF")
21-
OTHER_PSEUDONYM = OprfPseudonym(jwe="OTHER", blind_factor="BF")
20+
PSEUDONYM = OprfPseudonym(pseudonym="JWE", oprf_key="BF")
21+
OTHER_PSEUDONYM = OprfPseudonym(pseudonym="OTHER", oprf_key="BF")
2222

2323

2424
class FailingCryptoClient(CryptoServiceApiClientMock):

‎tests/services/test_pseudonym_resolver.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from app.services.key_info import KeyInfoService
77
from app.services.pseudonym_resolver import PseudonymResolver
88

9-
OPRF_PSEUDONYM = OprfPseudonym(jwe="JWE", blind_factor="BF")
9+
OPRF_PSEUDONYM = OprfPseudonym(pseudonym="JWE", oprf_key="BF")
1010

1111

1212
@pytest.fixture()

0 commit comments

Comments
 (0)