diff --git a/CHANGES.md b/CHANGES.md index f4114acb60..c99b57a883 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,12 @@ +# Synapse 1.164.2 (2026-11-02) + +## Bugfixes + +- Restore the unstable [MSC2965](https://github.com/matrix-org/matrix-spec-proposals/pull/2965) `/auth_metadata` endpoint, which Element X clients still request after upgrading from Synapse 1.162 or earlier, causing them to fail to refresh their access token. ([\#20460](https://github.com/element-hq/synapse/issues/20460)) + + + + # Synapse 1.164.1 (2026-10-28) ## Bugfixes diff --git a/debian/changelog b/debian/changelog index 8be78124a8..117f0b575f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +matrix-synapse-py3 (1.164.2) stable; urgency=medium + + * New synapse release 1.164.2. + + -- Synapse Packaging team Mon, 02 Nov 2026 15:59:43 +0000 + matrix-synapse-py3 (1.164.1) stable; urgency=medium * New synapse release 1.164.1. diff --git a/pyproject.toml b/pyproject.toml index 3826a88fcb..7850db8048 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "matrix-synapse" -version = "1.164.1" +version = "1.164.2" description = "Homeserver for the Matrix decentralised comms protocol" readme = "README.rst" authors = [ diff --git a/synapse/rest/client/auth_metadata.py b/synapse/rest/client/auth_metadata.py index d8f172d0bd..a6b8c19502 100644 --- a/synapse/rest/client/auth_metadata.py +++ b/synapse/rest/client/auth_metadata.py @@ -30,11 +30,22 @@ class AuthMetadataServlet(RestServlet): Advertises the OAuth 2.0 server metadata for the homeserver. """ - PATTERNS = client_patterns( - "/auth_metadata$", - releases=("v1",), - unstable=False, - ) + # The unstable path is still requested by matrix-rust-sdk clients that last saw + # `/versions` before we advertised Matrix v1.15, and can be removed once those + # clients no longer get stuck on it. + # See https://github.com/element-hq/synapse/issues/20459 + PATTERNS = [ + *client_patterns( + "/auth_metadata$", + releases=("v1",), + unstable=False, + ), + *client_patterns( + "/org.matrix.msc2965/auth_metadata$", + releases=(), + unstable=True, + ), + ] def __init__(self, hs: "HomeServer"): super().__init__() diff --git a/tests/rest/client/test_auth_metadata.py b/tests/rest/client/test_auth_metadata.py index 57fe16241d..0e1310f74c 100644 --- a/tests/rest/client/test_auth_metadata.py +++ b/tests/rest/client/test_auth_metadata.py @@ -21,6 +21,8 @@ from http import HTTPStatus from typing import ClassVar from unittest.mock import Mock +from parameterized import parameterized_class + from twisted.internet.testing import MemoryReactor from synapse.api.auth.mas import MasDelegatedAuth @@ -32,6 +34,13 @@ from synapse.util.clock import Clock from tests.unittest import HomeserverTestCase +@parameterized_class( + ("endpoint",), + [ + ("/_matrix/client/unstable/org.matrix.msc2965/auth_metadata",), + ("/_matrix/client/v1/auth_metadata",), + ], +) class AuthMetadataMasDisabledTestCase(HomeserverTestCase): endpoint: ClassVar[str] servlets = [ @@ -40,11 +49,19 @@ class AuthMetadataMasDisabledTestCase(HomeserverTestCase): def test_returns_404_when_mas_disabled(self) -> None: # Make an unauthenticated request for the discovery info. - channel = self.make_request("GET", "/_matrix/client/v1/auth_metadata") + channel = self.make_request("GET", self.endpoint) self.assertEqual(channel.code, HTTPStatus.NOT_FOUND) +@parameterized_class( + ("endpoint",), + [ + ("/_matrix/client/unstable/org.matrix.msc2965/auth_metadata",), + ("/_matrix/client/v1/auth_metadata",), + ], +) class AuthMetadataMasEnabledTestCase(HomeserverTestCase): + endpoint: ClassVar[str] servlets = [ auth_metadata.register_servlets, ] @@ -72,7 +89,7 @@ class AuthMetadataMasEnabledTestCase(HomeserverTestCase): self.auth.auth_metadata.return_value = test_auth_metadata - channel = self.make_request("GET", "/_matrix/client/v1/auth_metadata") + channel = self.make_request("GET", self.endpoint) self.assertEqual(channel.code, HTTPStatus.OK, channel.result) self.assertEqual(channel.json_body, test_auth_metadata)