summary refs log tree commit diff
diff options
context:
space:
mode:
authorQuentin Gliech <quenting@element.io>2025-04-15 17:30:45 +0200
committerGitHub <noreply@github.com>2025-04-15 17:30:45 +0200
commit2c7a61e311002ebec0e3f5aff054f46dfb0015c5 (patch)
treef63aad9a20470a1e6883e1427e9345e1a953f891
parentFix `force_tracing_for_users` config when using MAS (#18334) (diff)
downloadsynapse-2c7a61e311002ebec0e3f5aff054f46dfb0015c5.tar.xz
Don't cache introspection failures (#18339)
-rw-r--r--changelog.d/18339.bugfix1
-rw-r--r--synapse/api/auth/msc3861_delegated.py12
2 files changed, 10 insertions, 3 deletions
diff --git a/changelog.d/18339.bugfix b/changelog.d/18339.bugfix
new file mode 100644

index 0000000000..09d6d73420 --- /dev/null +++ b/changelog.d/18339.bugfix
@@ -0,0 +1 @@ +Stop caching introspection failures when delegating auth to MAS. diff --git a/synapse/api/auth/msc3861_delegated.py b/synapse/api/auth/msc3861_delegated.py
index 0598286cf4..9ded3366e3 100644 --- a/synapse/api/auth/msc3861_delegated.py +++ b/synapse/api/auth/msc3861_delegated.py
@@ -49,7 +49,7 @@ from synapse.logging.opentracing import active_span, force_tracing, start_active from synapse.types import Requester, UserID, create_requester from synapse.util import json_decoder from synapse.util.caches.cached_call import RetryOnExceptionCachedCall -from synapse.util.caches.response_cache import ResponseCache +from synapse.util.caches.response_cache import ResponseCache, ResponseCacheContext if TYPE_CHECKING: from synapse.rest.admin.experimental_features import ExperimentalFeature @@ -279,7 +279,9 @@ class MSC3861DelegatedAuth(BaseAuth): metadata = await self._issuer_metadata.get() return metadata.get("introspection_endpoint") - async def _introspect_token(self, token: str) -> IntrospectionResult: + async def _introspect_token( + self, token: str, cache_context: ResponseCacheContext[str] + ) -> IntrospectionResult: """ Send a token to the introspection endpoint and returns the introspection response @@ -295,6 +297,8 @@ class MSC3861DelegatedAuth(BaseAuth): Returns: The introspection response """ + # By default, we shouldn't cache the result unless we know it's valid + cache_context.should_cache = False introspection_endpoint = await self._introspection_endpoint() raw_headers: Dict[str, str] = { "Content-Type": "application/x-www-form-urlencoded", @@ -352,6 +356,8 @@ class MSC3861DelegatedAuth(BaseAuth): "The introspection endpoint returned an invalid JSON response." ) + # We had a valid response, so we can cache it + cache_context.should_cache = True return IntrospectionResult( IntrospectionToken(**resp), retrieved_at_ms=self._clock.time_msec() ) @@ -482,7 +488,7 @@ class MSC3861DelegatedAuth(BaseAuth): try: introspection_result = await self._introspection_cache.wrap( - token, self._introspect_token, token + token, self._introspect_token, token, cache_context=True ) except Exception: logger.exception("Failed to introspect token")