From 4d117b54ff9d9e43d715231cd506f9dc09475328 Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Thu, 10 Sep 2026 11:51:07 +0100 Subject: [PATCH] Type decoded JWT payloads as JSON --- src/mock_vws/_model_target_web_api.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/mock_vws/_model_target_web_api.py b/src/mock_vws/_model_target_web_api.py index 3fd98a433..63b9ee51c 100644 --- a/src/mock_vws/_model_target_web_api.py +++ b/src/mock_vws/_model_target_web_api.py @@ -6,7 +6,6 @@ import secrets import uuid import zipfile -from collections.abc import Mapping from http import HTTPStatus from typing import Any, Protocol, TypeGuard, runtime_checkable from urllib.parse import parse_qs @@ -93,11 +92,6 @@ def remove_oauth2_client_credential(self, client_id: str) -> None: _MAX_CLIENT_CREDENTIALS = 100 -def _is_object_mapping(value: object, /) -> TypeGuard[Mapping[object, object]]: - """Return whether a value is a mapping with unchecked entries.""" - return isinstance(value, Mapping) - - # A stable mock value standing in for the user-id segment that real # Vuforia embeds in some Model Target error targets such as # ``userId:7635391``. The numeric portion is per-account in real Vuforia; @@ -300,7 +294,7 @@ def _jwt_header_error(*, bearer_token: str) -> str | None: @beartype -def _jwt_payload(*, bearer_token: str) -> tuple[Mapping[object, object], bool]: +def _jwt_payload(*, bearer_token: str) -> tuple[dict[str, JSONValue], bool]: """Decode a JSON Web Token payload and report whether it is an object. """ @@ -316,8 +310,8 @@ def _jwt_payload(*, bearer_token: str) -> tuple[Mapping[object, object], bool]: except ValueError: payload = None - if not _is_object_mapping(payload): - return dict[object, object](), False + if not _is_json_object(payload): + return {}, False return payload, True @@ -357,7 +351,7 @@ def _jwt_scopes(*, bearer_token: str) -> frozenset[str]: """Return scopes from a valid mock JSON Web Token.""" empty_scopes = frozenset[str]() payload, _ = _jwt_payload(bearer_token=bearer_token) - scope: object = payload.get("scope", "") + scope = payload.get("scope", "") if not isinstance(scope, str): return empty_scopes return frozenset(scope.split())