Skip to content

Commit 7008512

Browse files
committed
fix: check header in crit is supported
1 parent 4183e3f commit 7008512

File tree

5 files changed

+40
-13
lines changed

5 files changed

+40
-13
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ jobs:
8080
name: GitHub
8181

8282
- name: SonarCloud Scan
83-
uses: SonarSource/sonarqube-scan-action@v5.3.1
83+
uses: SonarSource/sonarqube-scan-action@v5
8484
continue-on-error: true
8585
env:
8686
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

src/joserfc/_rfc7515/registry.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
JWS_HEADER_REGISTRY,
99
Header,
1010
HeaderRegistryDict,
11-
validate_registry_header,
11+
check_registry_header,
1212
check_crit_header,
1313
check_supported_header,
1414
)
@@ -82,8 +82,8 @@ def get_alg(self, name: str) -> JWSAlgModel:
8282

8383
def check_header(self, header: Header) -> None:
8484
"""Check and validate the fields in header part of a JWS object."""
85-
check_crit_header(header)
86-
validate_registry_header(self.header_registry, header)
85+
check_crit_header(self.header_registry, header)
86+
check_registry_header(self.header_registry, header)
8787
if self.strict_check_header:
8888
check_supported_header(self.header_registry, header)
8989

src/joserfc/_rfc7516/registry.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
HeaderRegistryDict,
99
JWE_HEADER_REGISTRY,
1010
check_supported_header,
11-
validate_registry_header,
11+
check_registry_header,
1212
check_crit_header,
1313
)
1414

@@ -71,12 +71,12 @@ def register(cls, model: JWEAlgorithm) -> None:
7171

7272
def check_header(self, header: Header, check_more: bool = False) -> None:
7373
"""Check and validate the fields in header part of a JWS object."""
74-
check_crit_header(header)
75-
validate_registry_header(self.header_registry, header)
74+
check_crit_header(self.header_registry, header)
75+
check_registry_header(self.header_registry, header)
7676

7777
alg = self.get_alg(header["alg"])
7878
if alg.more_header_registry:
79-
validate_registry_header(alg.more_header_registry, header, check_more)
79+
check_registry_header(alg.more_header_registry, header, check_more)
8080

8181
if self.strict_check_header:
8282
allowed_registry = self.header_registry.copy()

src/joserfc/registry.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
Header = dict[str, Any]
1111

1212

13-
def is_str(value: str) -> None:
13+
def is_str(value: Any) -> None:
1414
if not isinstance(value, str):
1515
raise ValueError("must be a str")
1616

@@ -185,7 +185,7 @@ def check_supported_header(registry: HeaderRegistryDict, header: Header) -> None
185185
raise UnsupportedHeaderError(f"Unsupported {unsupported_keys} in header")
186186

187187

188-
def validate_registry_header(registry: HeaderRegistryDict, header: Header, check_required: bool = True) -> None:
188+
def check_registry_header(registry: HeaderRegistryDict, header: Header, check_required: bool = True) -> None:
189189
for key, reg in registry.items():
190190
if check_required and reg.required and key not in header:
191191
raise MissingHeaderError(key)
@@ -196,9 +196,18 @@ def validate_registry_header(registry: HeaderRegistryDict, header: Header, check
196196
raise InvalidHeaderValueError(f"'{key}' in header {error}")
197197

198198

199-
def check_crit_header(header: Header) -> None:
200-
# check crit header
199+
def check_crit_header(registry: HeaderRegistryDict, header: Header) -> None:
200+
# check `crit` header
201+
missing_crit_headers = []
202+
unsupported_crit_headers = []
201203
if "crit" in header:
202204
for k in header["crit"]:
203205
if k not in header:
204-
raise MissingCritHeaderError(k)
206+
missing_crit_headers.append(k)
207+
elif k not in registry:
208+
unsupported_crit_headers.append(k)
209+
210+
if missing_crit_headers:
211+
raise MissingCritHeaderError(",".join(missing_crit_headers))
212+
elif unsupported_crit_headers:
213+
raise UnsupportedHeaderError(f"Unsupported {unsupported_crit_headers} in header")

tests/jws/test_errors.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,24 @@ def test_crit_header(self):
113113
header = {"alg": "HS256", "kid": "1", "crit": ["kid"]}
114114
jws.serialize_compact(header, "i", self.key)
115115

116+
def test_unsupported_crit_header(self):
117+
header = {"alg": "HS256", "bob": "a", "crit": ["bob"]}
118+
self.assertRaises(
119+
UnsupportedHeaderError,
120+
jws.serialize_compact,
121+
header,
122+
"i",
123+
self.key,
124+
)
125+
126+
registry = jws.JWSRegistry(
127+
header_registry={
128+
"bob": HeaderParameter("Bob", "str"),
129+
}
130+
)
131+
# allow with custom header registry
132+
jws.serialize_compact(header, "i", self.key, registry=registry)
133+
116134
def test_extra_header(self):
117135
header = {"alg": "HS256", "extra": "hi"}
118136
self.assertRaises(

0 commit comments

Comments
 (0)