Skip to content

Commit 06efbf1

Browse files
committed
incorporate the errors property from verification result and renamed the signature verification package inside security
1 parent f38df42 commit 06efbf1

6 files changed

Lines changed: 15 additions & 31 deletions

File tree

README.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ pip install apimatic-core
7171
| [`OneOfValidationException`](apimatic_core/exceptions/oneof_validation_exception.py) | Thrown on failed validation of oneOf union-type cases |
7272
| [`AnyOfValidationException`](apimatic_core/exceptions/anyof_validation_exception.py) | Thrown on failed validation of anyOf union-type cases |
7373
| [`AuthValidationException`](apimatic_core/exceptions/auth_validation_exception.py) | Thrown when authentication scheme validation fails |
74-
| [`SignatureVerificationError`](apimatic_core/exceptions/signature_verification_error.py) | Thrown when HMAC or custom signature verification fails |
7574

7675
---
7776

@@ -169,10 +168,10 @@ pip install apimatic-core
169168

170169
| Name | Description |
171170
|------------------------------------------------------------------------------------------------------| ------------------------------------------------------------------------------------ |
172-
| [`HmacSignatureVerifier`](apimatic_core/security/signature_verification/hmac_signature_verifier.py) | Verifies HMAC signatures using configurable templates, hash algorithms, and encoders |
173-
| [`HexEncoder`](apimatic_core/security/signature_verification/hmac_signature_verifier.py) | Encodes digest as lowercase hex |
174-
| [`Base64Encoder`](apimatic_core/security/signature_verification/hmac_signature_verifier.py) | Encodes digest as Base64 |
175-
| [`Base64UrlEncoder`](apimatic_core/security/signature_verification/hmac_signature_verifier.py) | Encodes digest as URL-safe Base64 without padding |
171+
| [`HmacSignatureVerifier`](apimatic_core/security/signature_verifiers/hmac_signature_verifier.py) | Verifies HMAC signatures using configurable templates, hash algorithms, and encoders |
172+
| [`HexEncoder`](apimatic_core/security/signature_verifiers/hmac_signature_verifier.py) | Encodes digest as lowercase hex |
173+
| [`Base64Encoder`](apimatic_core/security/signature_verifiers/hmac_signature_verifier.py) | Encodes digest as Base64 |
174+
| [`Base64UrlEncoder`](apimatic_core/security/signature_verifiers/hmac_signature_verifier.py) | Encodes digest as URL-safe Base64 without padding |
176175

177176
This layer enables secure handling of webhooks, callbacks, and API integrations that rely on HMAC or other signing strategies.
178177

apimatic_core/exceptions/signature_verification_error.py

Lines changed: 0 additions & 14 deletions
This file was deleted.

apimatic_core/security/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
__all__=[
2-
'signature_verification'
2+
'signature_verifiers'
33
]

apimatic_core/security/signature_verification/__init__.py renamed to apimatic_core/security/signature_verifiers/__init__.py

File renamed without changes.

apimatic_core/security/signature_verification/hmac_signature_verifier.py renamed to apimatic_core/security/signature_verifiers/hmac_signature_verifier.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from apimatic_core_interfaces.http.request import Request
66
from apimatic_core_interfaces.security.signature_verifier import SignatureVerifier
77
from apimatic_core_interfaces.types.signature_verification_result import SignatureVerificationResult
8-
from apimatic_core.exceptions.signature_verification_error import SignatureVerificationError
98

109

1110
class DigestEncoder:
@@ -83,7 +82,7 @@ def verify(self, request: Request) -> SignatureVerificationResult:
8382
provided = self._read_signature_header(request)
8483
if provided is None:
8584
return SignatureVerificationResult.failed(
86-
ValueError(f"Signature header '{self._signature_header_lc}' is missing")
85+
[f"Signature header '{self._signature_header_lc}' is missing"]
8786
)
8887

8988
message_bytes = self._resolve_message_bytes(request)
@@ -93,11 +92,11 @@ def verify(self, request: Request) -> SignatureVerificationResult:
9392

9493
is_match = hmac.compare_digest(provided, expected)
9594
return SignatureVerificationResult.passed() if is_match else SignatureVerificationResult.failed(
96-
SignatureVerificationError("Signature mismatch")
95+
["Signature mismatch"]
9796
)
9897
except Exception as exc:
9998
return SignatureVerificationResult.failed(
100-
SignatureVerificationError(f"Signature Verification Failed: {exc}")
99+
[f"Signature Verification Failed: {exc}"]
101100
)
102101

103102
# ------------- internal helpers -------------

tests/apimatic_core/security/signature_verification/test_hmac_signature_verifier.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pytest
66
from apimatic_core_interfaces.http.request import Request
77

8-
from apimatic_core.security.signature_verification.hmac_signature_verifier import (
8+
from apimatic_core.security.signature_verifiers.hmac_signature_verifier import (
99
HmacSignatureVerifier,
1010
HexEncoder,
1111
Base64Encoder,
@@ -265,7 +265,7 @@ def test_missing_signature_header_fails(self, req_base, enc_hex):
265265
encoder=enc_hex,
266266
)
267267
result = verifier.verify(req_base)
268-
assert not result.ok and isinstance(result.error, Exception)
268+
assert not result.ok and "Signature header 'x-missing' is missing" == result.errors[0]
269269

270270
def test_blank_signature_header_fails(self, req_base, enc_hex):
271271
verifier = HmacSignatureVerifier(
@@ -288,7 +288,7 @@ def test_signature_mismatch_fails(self, req_base, enc_hex):
288288
)
289289
req_wrong = _with_header(req_base, "X-Sig", "wrong")
290290
result = verifier.verify(req_wrong)
291-
assert not result.ok and "Signature mismatch" in str(result.error)
291+
assert not result.ok and "Signature mismatch" in str(result.errors[0])
292292

293293
# ---------- Negative: resolver returns wrong type / None ----------
294294
@pytest.mark.parametrize("bad_resolver, error_message", [
@@ -303,7 +303,7 @@ def test_resolver_returning_invalid_leads_to_failed_result(self, bad_resolver, e
303303
)
304304
req_seeded = _with_header(req_base, "X-Sig", "does-not-matter")
305305
result = verifier.verify(req_seeded)
306-
assert not result.ok and error_message in str(result.error)
306+
assert not result.ok and error_message in str(result.errors[0])
307307

308308
# ---------- Negative: encoder misconfigured (None) ----------
309309
def test_encoder_none_causes_failed_result(self, req_base):
@@ -315,7 +315,7 @@ def test_encoder_none_causes_failed_result(self, req_base):
315315
)
316316
req_seeded = _with_header(req_base, "X-Sig", "whatever")
317317
result = verifier.verify(req_seeded)
318-
assert not result.ok and "Signature Verification Failed" in str(result.error)
318+
assert not result.ok and "Signature Verification Failed" in str(result.errors[0])
319319

320320
# ---------- Negative: fallback path with builder=None and raw_body=None ----------
321321
def test_builder_none_and_no_raw_body_causes_failed_result(self, req_base):
@@ -326,7 +326,7 @@ def test_builder_none_and_no_raw_body_causes_failed_result(self, req_base):
326326
canonical_message_builder=None,
327327
)
328328
result = verifier.verify(req)
329-
assert not result.ok and "Signature mismatch" in str(result.error)
329+
assert not result.ok and "Signature mismatch" in str(result.errors[0])
330330

331331
# ---------- Negative: custom hash that raises ----------
332332
class BoomHash:
@@ -342,4 +342,4 @@ def test_hash_function_raises_produces_failed_result(self, req_base):
342342
)
343343
req_seeded = _with_header(req_base, "X-Sig", "anything")
344344
result = verifier.verify(req_seeded)
345-
assert not result.ok and "Signature Verification Failed" in str(result.error)
345+
assert not result.ok and "Signature Verification Failed" in str(result.errors[0])

0 commit comments

Comments
 (0)