diff --git a/synapse/rest/client/capabilities.py b/synapse/rest/client/capabilities.py index 3154b9f77e95..002e8f3a4c9f 100644 --- a/synapse/rest/client/capabilities.py +++ b/synapse/rest/client/capabilities.py @@ -68,6 +68,9 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]: "m.get_login_token": { "enabled": self.config.auth.login_via_existing_enabled, }, + "org.matrix.msc3882.get_login_token": { + "enabled": self.config.auth.login_via_existing_enabled, + }, } } diff --git a/synapse/rest/client/login.py b/synapse/rest/client/login.py index 7be327e26f08..35f1899af26b 100644 --- a/synapse/rest/client/login.py +++ b/synapse/rest/client/login.py @@ -174,6 +174,7 @@ def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]: # If the login token flow is enabled advertise the get_login_token flag. if self._get_login_token_enabled: tokenTypeFlow["get_login_token"] = True + tokenTypeFlow["org.matrix.msc3882.get_login_token"] = True flows.append(tokenTypeFlow) flows.extend({"type": t} for t in self.auth_handler.get_supported_login_types()) diff --git a/synapse/rest/client/login_token_request.py b/synapse/rest/client/login_token_request.py index d189a923b5bf..724783d926d9 100644 --- a/synapse/rest/client/login_token_request.py +++ b/synapse/rest/client/login_token_request.py @@ -53,7 +53,10 @@ class LoginTokenRequestServlet(RestServlet): *client_patterns( "/login/get_token$", releases=["v1"], v1=False, unstable=False ), - # TODO: this is no longer needed once unstable MSC3882 does not need to be supported: + # TODO: these are no longer needed once unstable MSC3882 does not need to be supported: + *client_patterns( + "/org.matrix.msc3882/login/get_token$", releases=[], v1=False, unstable=True + ), *client_patterns( "/org.matrix.msc3882/login/token$", releases=[], v1=False, unstable=True ), diff --git a/tests/rest/client/test_capabilities.py b/tests/rest/client/test_capabilities.py index cf23430f6ad4..77ab1a8b3d75 100644 --- a/tests/rest/client/test_capabilities.py +++ b/tests/rest/client/test_capabilities.py @@ -200,6 +200,7 @@ def test_get_get_token_login_fields_when_disabled(self) -> None: self.assertEqual(channel.code, HTTPStatus.OK) self.assertFalse(capabilities["m.get_login_token"]["enabled"]) + self.assertFalse(capabilities["org.matrix.msc3882.get_login_token"]["enabled"]) @override_config({"login_via_existing_session": {"enabled": True}}) def test_get_get_token_login_fields_when_enabled(self) -> None: @@ -214,3 +215,4 @@ def test_get_get_token_login_fields_when_enabled(self) -> None: self.assertEqual(channel.code, HTTPStatus.OK) self.assertTrue(capabilities["m.get_login_token"]["enabled"]) + self.assertTrue(capabilities["org.matrix.msc3882.get_login_token"]["enabled"]) diff --git a/tests/rest/client/test_login.py b/tests/rest/client/test_login.py index 768d7ad4c217..f1ee67c00eed 100644 --- a/tests/rest/client/test_login.py +++ b/tests/rest/client/test_login.py @@ -527,7 +527,11 @@ def test_get_login_flows_with_login_via_existing_enabled(self) -> None: self.assertCountEqual( channel.json_body["flows"], [ - {"type": "m.login.token", "get_login_token": True}, + { + "type": "m.login.token", + "get_login_token": True, + "org.matrix.msc3882.get_login_token": True, + }, {"type": "m.login.password"}, {"type": "m.login.application_service"}, ], diff --git a/tests/rest/client/test_login_token_request.py b/tests/rest/client/test_login_token_request.py index f05e619aa86d..aaf8faafeaa9 100644 --- a/tests/rest/client/test_login_token_request.py +++ b/tests/rest/client/test_login_token_request.py @@ -15,7 +15,7 @@ from twisted.test.proto_helpers import MemoryReactor from synapse.rest import admin -from synapse.rest.client import login, login_token_request, versions +from synapse.rest.client import capabilities, login, login_token_request, versions from synapse.server import HomeServer from synapse.util import Clock @@ -31,6 +31,7 @@ class LoginTokenRequestServletTestCase(unittest.HomeserverTestCase): admin.register_servlets, login_token_request.register_servlets, versions.register_servlets, # TODO: remove once unstable revision 0 support is removed + capabilities.register_servlets, # TODO: remove once unstable revision 1 support is removed ] def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer: @@ -143,7 +144,7 @@ def test_expires_in(self) -> None: } ) def test_unstable_support(self) -> None: - # TODO: remove support for unstable MSC3882 is no longer needed + # TODO: remove when unstable MSC3882 is no longer needed # check feature is advertised in versions response: channel = self.make_request( @@ -166,3 +167,40 @@ def test_unstable_support(self) -> None: ) self.assertEqual(channel.code, 200) self.assertEqual(channel.json_body["expires_in"], 15) + + @override_config( + { + "login_via_existing_session": { + "enabled": True, + "require_ui_auth": False, + "token_timeout": "15s", + } + } + ) + def test_unstable_revision1_support(self) -> None: + # TODO: remove when unstable MSC3882 is no longer needed + + self.register_user(self.user, self.password) + token = self.login(self.user, self.password) + + # check feature is advertised in versions response: + channel = self.make_request( + "GET", "/_matrix/client/v3/capabilities", {}, access_token=token + ) + self.assertEqual(channel.code, 200) + self.assertEqual( + channel.json_body["capabilities"]["org.matrix.msc3882.get_login_token"][ + "enabled" + ], + True, + ) + + # check feature is available via the r1 unstable endpoint and returns an expires_in_ms value in milliseconds + channel = self.make_request( + "POST", + "/_matrix/client/unstable/org.matrix.msc3882/login/get_token", + {}, + access_token=token, + ) + self.assertEqual(channel.code, 200) + self.assertEqual(channel.json_body["expires_in_ms"], 15000)