Compare admin token as UTF-8 bytes to avoid TypeError on non-ASCII input (B-46)
secrets.compare_digest raises TypeError instead of returning False when a str argument contains non-ASCII characters, turning a bad admin token into an unhandled 500 instead of the expected 403. Encode both sides before comparing. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,15 @@ async def test_admin_rejects_wrong_token(client):
|
||||
assert resp.status_code == 403
|
||||
|
||||
|
||||
async def test_admin_rejects_non_ascii_token_with_403_not_500(client):
|
||||
"""B-46: secrets.compare_digest raises TypeError on a non-ASCII str, which
|
||||
used to bubble up as a 500 instead of the expected 403. httpx encodes str
|
||||
header values as ASCII client-side, so the raw UTF-8 bytes are passed
|
||||
directly to reproduce what a real non-ASCII header on the wire looks like."""
|
||||
resp = await client.get("/admin/config", headers={"X-Admin-Token": "café".encode("utf-8")})
|
||||
assert resp.status_code == 403
|
||||
|
||||
|
||||
async def test_admin_reads_and_updates_config(client):
|
||||
headers = {"X-Admin-Token": "test-admin-token"}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user