Only servers can set these fields. If clients attempt to set them they will be replaced. The server should set these fields
Only servers can set these fields. The server should set these fields
when an event is sent according to the following rules:
when an event is sent according to the following rules:
- Check the client can view the event ID in question. If they cannot, reject the request.
- Check the client can view the event ID in question. If they cannot, reject the request.
- Check that the room's `m.room.create` event allows cross-room threading by the presence of `"m.cross_room_threading": true`
- Check that the room's `m.room.create` event allows cross-room threading by the presence of `"m.cross_room_threading": true`
in the `content` field. If absent, it is `false`.
in the `content` field. If absent, it is `false`.
- Fetch the servers *currently in the room* for the event. Add them all to `servers`.
- Fetch the servers *currently in the room* for the event. Add them all to `relationship_servers`.
- Fetch the room ID that the event belongs to. Add it to `room_id`.
- Fetch the room ID that the event belongs to. Add it to `relationship_room_id`.
This proposal does not require any changes to `/createRoom` as `"m.cross_room_threading": true` can be specified via the
This proposal does not require any changes to `/createRoom` as `"m.cross_room_threading": true` can be specified via the
`creation_content` field in that API.
`creation_content` field in that API.
@ -188,12 +190,12 @@ The `POST /relationships` endpoint includes a new field:
in order to explore the thread. Default: `false`.
in order to explore the thread. Default: `false`.
Server implementation:
Server implementation:
- When walking the thread DAG, if there is an event that is not known, check the relationship for `room_id` and `servers`. If
- When walking the thread DAG, if there is an event that is not known, check the relationship for `relationship_room_id` and `relationship_servers`. If
they exist, peek into the room ([MSC2444](https://github.com/matrix-org/matrix-doc/pull/2444)), or if that is not supported,
they exist, peek into the room ([MSC2444](https://github.com/matrix-org/matrix-doc/pull/2444)), or if that is not supported,
join the room as the user querying `/relationships` if and only if `"auto_join": true` in the `/relationships` request. This
join the room as the user querying `/relationships` if and only if `"auto_join": true` in the `/relationships` request. This
is required in order to allow the event to be retrieved. Server implementations can treat the auto join as the same as if the
is required in order to allow the event to be retrieved. Server implementations can treat the auto join as the same as if the
client made a request to [/join/{roomIdOrAlias}](https://matrix.org/docs/spec/client_server/r0.6.0#post-matrix-client-r0-join-roomidoralias)
client made a request to [/join/{roomIdOrAlias}](https://matrix.org/docs/spec/client_server/r0.6.0#post-matrix-client-r0-join-roomidoralias)
with the `server_name` query parameters set to those in `servers`.
with the `server_name` query parameters set to those in `relationship_servers`.
Security considerations:
Security considerations:
- Allowing cross-room threading leaks the event IDs in a given room, as well as which servers are in the room at the point
- Allowing cross-room threading leaks the event IDs in a given room, as well as which servers are in the room at the point
@ -206,3 +208,5 @@ Justifications:
information *somewhere* so servers can retrieve the event and continue navigating the thread. As the client and server
information *somewhere* so servers can retrieve the event and continue navigating the thread. As the client and server
already have the event which contains a relationship to another event inside an unknown room, the simplest option is to
already have the event which contains a relationship to another event inside an unknown room, the simplest option is to
also contain the routing information with that relationship.
also contain the routing information with that relationship.
- The fields are in the `unsigned` section so clients cannot artificially set them, and because `unsigned` is where a lot