MSC2314 has now been closed, so we're backing out its implementation, which originally happened in #6176. Unfortunately it's not a direct revert, as that PR mixed in a bunch of unrelated changes to tests etc.tags/v1.58.0rc1
@@ -0,0 +1 @@ | |||||
Back out experimental implementation of [MSC2314](https://github.com/matrix-org/matrix-spec-proposals/pull/2314). |
@@ -515,7 +515,7 @@ class FederationServer(FederationBase): | |||||
) | ) | ||||
async def on_room_state_request( | async def on_room_state_request( | ||||
self, origin: str, room_id: str, event_id: Optional[str] | |||||
self, origin: str, room_id: str, event_id: str | |||||
) -> Tuple[int, JsonDict]: | ) -> Tuple[int, JsonDict]: | ||||
origin_host, _ = parse_server_name(origin) | origin_host, _ = parse_server_name(origin) | ||||
await self.check_server_matches_acl(origin_host, room_id) | await self.check_server_matches_acl(origin_host, room_id) | ||||
@@ -530,18 +530,13 @@ class FederationServer(FederationBase): | |||||
# - but that's non-trivial to get right, and anyway somewhat defeats | # - but that's non-trivial to get right, and anyway somewhat defeats | ||||
# the point of the linearizer. | # the point of the linearizer. | ||||
async with self._server_linearizer.queue((origin, room_id)): | async with self._server_linearizer.queue((origin, room_id)): | ||||
resp: JsonDict = dict( | |||||
await self._state_resp_cache.wrap( | |||||
(room_id, event_id), | |||||
self._on_context_state_request_compute, | |||||
room_id, | |||||
event_id, | |||||
) | |||||
resp = await self._state_resp_cache.wrap( | |||||
(room_id, event_id), | |||||
self._on_context_state_request_compute, | |||||
room_id, | |||||
event_id, | |||||
) | ) | ||||
room_version = await self.store.get_room_version_id(room_id) | |||||
resp["room_version"] = room_version | |||||
return 200, resp | return 200, resp | ||||
async def on_state_ids_request( | async def on_state_ids_request( | ||||
@@ -574,14 +569,11 @@ class FederationServer(FederationBase): | |||||
return {"pdu_ids": state_ids, "auth_chain_ids": list(auth_chain_ids)} | return {"pdu_ids": state_ids, "auth_chain_ids": list(auth_chain_ids)} | ||||
async def _on_context_state_request_compute( | async def _on_context_state_request_compute( | ||||
self, room_id: str, event_id: Optional[str] | |||||
self, room_id: str, event_id: str | |||||
) -> Dict[str, list]: | ) -> Dict[str, list]: | ||||
pdus: Collection[EventBase] | pdus: Collection[EventBase] | ||||
if event_id: | |||||
event_ids = await self.handler.get_state_ids_for_pdu(room_id, event_id) | |||||
pdus = await self.store.get_events_as_list(event_ids) | |||||
else: | |||||
pdus = (await self.state.get_current_state(room_id)).values() | |||||
event_ids = await self.handler.get_state_ids_for_pdu(room_id, event_id) | |||||
pdus = await self.store.get_events_as_list(event_ids) | |||||
auth_chain = await self.store.get_auth_chain( | auth_chain = await self.store.get_auth_chain( | ||||
room_id, [pdu.event_id for pdu in pdus] | room_id, [pdu.event_id for pdu in pdus] | ||||
@@ -160,7 +160,7 @@ class FederationStateV1Servlet(BaseFederationServerServlet): | |||||
return await self.handler.on_room_state_request( | return await self.handler.on_room_state_request( | ||||
origin, | origin, | ||||
room_id, | room_id, | ||||
parse_string_from_args(query, "event_id", None, required=False), | |||||
parse_string_from_args(query, "event_id", None, required=True), | |||||
) | ) | ||||
@@ -21,10 +21,6 @@ Newly created users see their own presence in /initialSync (SYT-34) | |||||
# Blacklisted due to https://github.com/matrix-org/synapse/issues/1396 | # Blacklisted due to https://github.com/matrix-org/synapse/issues/1396 | ||||
Should reject keys claiming to belong to a different user | Should reject keys claiming to belong to a different user | ||||
# Blacklisted due to https://github.com/matrix-org/matrix-doc/pull/2314 removing | |||||
# this requirement from the spec | |||||
Inbound federation of state requires event_id as a mandatory paramater | |||||
# Blacklisted until MSC2753 is implemented | # Blacklisted until MSC2753 is implemented | ||||
Local users can peek into world_readable rooms by room ID | Local users can peek into world_readable rooms by room ID | ||||
We can't peek into rooms with shared history_visibility | We can't peek into rooms with shared history_visibility | ||||
@@ -104,58 +104,21 @@ class ServerACLsTestCase(unittest.TestCase): | |||||
class StateQueryTests(unittest.FederatingHomeserverTestCase): | class StateQueryTests(unittest.FederatingHomeserverTestCase): | ||||
servlets = [ | servlets = [ | ||||
admin.register_servlets, | admin.register_servlets, | ||||
room.register_servlets, | room.register_servlets, | ||||
login.register_servlets, | login.register_servlets, | ||||
] | ] | ||||
def test_without_event_id(self): | |||||
""" | |||||
Querying v1/state/<room_id> without an event ID will return the current | |||||
known state. | |||||
""" | |||||
u1 = self.register_user("u1", "pass") | |||||
u1_token = self.login("u1", "pass") | |||||
room_1 = self.helper.create_room_as(u1, tok=u1_token) | |||||
self.inject_room_member(room_1, "@user:other.example.com", "join") | |||||
channel = self.make_signed_federation_request( | |||||
"GET", "/_matrix/federation/v1/state/%s" % (room_1,) | |||||
) | |||||
self.assertEqual(200, channel.code, channel.result) | |||||
self.assertEqual( | |||||
channel.json_body["room_version"], | |||||
self.hs.config.server.default_room_version.identifier, | |||||
) | |||||
members = set( | |||||
map( | |||||
lambda x: x["state_key"], | |||||
filter( | |||||
lambda x: x["type"] == "m.room.member", channel.json_body["pdus"] | |||||
), | |||||
) | |||||
) | |||||
self.assertEqual(members, {"@user:other.example.com", u1}) | |||||
self.assertEqual(len(channel.json_body["pdus"]), 6) | |||||
def test_needs_to_be_in_room(self): | def test_needs_to_be_in_room(self): | ||||
""" | |||||
Querying v1/state/<room_id> requires the server | |||||
be in the room to provide data. | |||||
""" | |||||
"""/v1/state/<room_id> requires the server to be in the room""" | |||||
u1 = self.register_user("u1", "pass") | u1 = self.register_user("u1", "pass") | ||||
u1_token = self.login("u1", "pass") | u1_token = self.login("u1", "pass") | ||||
room_1 = self.helper.create_room_as(u1, tok=u1_token) | room_1 = self.helper.create_room_as(u1, tok=u1_token) | ||||
channel = self.make_signed_federation_request( | channel = self.make_signed_federation_request( | ||||
"GET", "/_matrix/federation/v1/state/%s" % (room_1,) | |||||
"GET", "/_matrix/federation/v1/state/%s?event_id=xyz" % (room_1,) | |||||
) | ) | ||||
self.assertEqual(403, channel.code, channel.result) | self.assertEqual(403, channel.code, channel.result) | ||||
self.assertEqual(channel.json_body["errcode"], "M_FORBIDDEN") | self.assertEqual(channel.json_body["errcode"], "M_FORBIDDEN") | ||||