mirror of
https://github.com/element-hq/synapse.git
synced 2026-11-04 19:57:45 +00:00
## What the MSC says From MSC4140's [Auth rule evaluation](https://github.com/matrix-org/matrix-spec-proposals/blob/b7cb09664fed684388ba656459d08cfaf786c1d1/proposals/4140-delayed-events-futures.md#auth-rule-evaluation): > The server SHOULD also check the event could be sent when it is scheduled and reject the request if not. In particular, servers SHOULD check the sender is in the room (or otherwise authorized to send the event) to avoid storing events for rooms the user is not in. ## This PR - Checks the event against the room's auth rules as if it were sent now, and returns the same 403 `M_FORBIDDEN` that `/send` and `/state` would. - Changes to the sender's own membership are exempt: a join or knock can be sent from outside the room, which is how this PR reads the MSC's "or otherwise authorized". They are checked by the auth rules when they are sent. Here are a few examples: | Delayed event | Before | After | | ----------------------------------------------------------------- | --------------------------------------- | ---------------------------------------- | | `m.room.message` from outside the room | 200 `delay_id`, fails at send time | 403 `M_FORBIDDEN` | | Kick of another member from outside the room | 200 `delay_id`, fails at send time | 403 `M_FORBIDDEN` | | `m.room.name` from a member whose power level is too low | 200 `delay_id`, fails at send time | 403 `M_FORBIDDEN` | | **Exception**: join of a public room from outside it | 200 `delay_id`, joins at send time | unchanged | | Join from outside the room, then a message due after it | both accepted, message sent once joined | join accepted, message 403 `M_FORBIDDEN` |