The error responses from /leave do not conform to the spec.
Description
The spec (https://spec.matrix.org/v1.3/client-server-api/#post_matrixclientv3roomsroomidleave) only allows two possible responses from a call to /leave. A 200 if the room was left, or 429 if the request was rate limited.
However, Synapse will return different responses depending on your, and your homeservers state in the room:
- Leaving a room that doesn't exist on the host returns "M_UNKNOWN" (Not a known room)
- Leaving a room on the host that I was never in (but the host is still joined to via another user) will result in a M_FORBIDDEN.
- Leaving a room that I was previously in will always no-op with a 200.
The spec is unfortunately doesn't define the behaviour for trying to leave a room when you were never part of it, but my feeling is that it should no-op in a similar fashion to reinviting users, or rejoining a room also no-op.
Steps to reproduce
For case 1:
- Try to
/leavea random roomID that you totally made up. - Observe the error
For case 2:
- Create a room your homeserver
- Try to /leave that room from another user who was never joined to it.
- Observe the error
For case 3:
- Create a room.
- Leave the room.
- Leave the room (and repeat as much as you like)
- Observe a 200 response with an empty body.
Homeserver
half-shot.uk
Synapse Version
1.60.0
Installation Method
pip (from PyPI)
Platform
Probably not relevant
Relevant log output
Ditto
Anything else that would be useful to know?
No response
This behaviour has been part of Synapse for ages at this point, so I think it's worth pondering whether this is a Synapse bug or a spec omission.
- Leaving a room that I was previously in will always no-op with a 200
This is not always the case. If you are banned and unbanned after having previously left a room, you will get the same 403 as if you were never in the room.
It seems that leaving after being kicked also yields a 403 error (M_FORBIDDEN, $USER not in room $ROOM.).