MSC4323: User suspension & locking endpoints (#4323)
parent
765af8d00f
commit
24f045ba45
@ -0,0 +1,147 @@
|
||||
# MSC4323: User suspension & locking endpoints
|
||||
|
||||
Currently the specification outlines error codes for suspended and locked users,
|
||||
even going as far as to suggest which endpoints can and cannot be executed by suspended users.
|
||||
However, it does not currently define an endpoint which server administrators can call to suspend
|
||||
and unsuspend users on their server.
|
||||
As a result, moderation tooling such as Draupnir and Meowlnir have to implement
|
||||
implementation-specific calls, which is not sustainable as more implementations other than Synapse
|
||||
integrate this feature.
|
||||
|
||||
This proposal will outline new endpoints that will allow server administrators to
|
||||
suspend, unsuspend, lock, and unlock given users.
|
||||
|
||||
## Proposal
|
||||
|
||||
> [!IMPORTANT]
|
||||
> What defines a "server administrator" is left up to the implementation itself as most already have
|
||||
> their own systems for defining administrators (e.g. Synapse has a database flag, Conduit has room
|
||||
> membership) which rarely has a reason to be exposed outside of their respective management
|
||||
> interfaces.
|
||||
|
||||
Complementing [section 10.22 (Server Administration)][p1] of the client-to-server specification,
|
||||
four new endpoints are introduced:
|
||||
|
||||
- `GET /_matrix/client/v1/admin/suspend/{userId}`
|
||||
- `PUT /_matrix/client/v1/admin/suspend/{userId}`
|
||||
- `GET /_matrix/client/v1/admin/lock/{userId}`
|
||||
- `PUT /_matrix/client/v1/admin/lock/{userId}`
|
||||
|
||||
These new endpoints are similar to [`GET /_matrix/client/v3/admin/whois/{userId}`][p2] in that they
|
||||
are clearly defined as administration endpoints, however are restricted to only permitting
|
||||
execution on local server users.
|
||||
|
||||
### New endpoint definitions
|
||||
|
||||
The response body of both the `GET` and `PUT` endpoints, as well as the request body of the
|
||||
`PUT` endpoints, are defined below. Custom properties may be used provided they utilise
|
||||
[proper namespacing][p3] in their fields.
|
||||
|
||||
**Suspend**:
|
||||
|
||||
A single key, `suspended`, with a boolean indicating if the target account is suspended:
|
||||
|
||||
```json
|
||||
{"suspended": true}
|
||||
```
|
||||
|
||||
**Lock**:
|
||||
|
||||
A single key, `locked`, with a boolean indicating if the target account is locked:
|
||||
|
||||
```json
|
||||
{"locked": false}
|
||||
```
|
||||
|
||||
### New capability definition
|
||||
|
||||
The server should advertise that these new endpoints are available for the authenticated user
|
||||
to use by including the following new capability:
|
||||
|
||||
```json5
|
||||
{
|
||||
"capabilities": {
|
||||
"m.account_moderation": {
|
||||
"suspend": true, // or false if unavailable/unimplemented
|
||||
"lock": true // or false if unavailable/unimplemented
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This allows clients to determine whether they are able to suspend/lock users on this homeserver,
|
||||
allowing them to do things like dynamically show or hide a "suspend user" button, etc.
|
||||
|
||||
The capability should not be advertised at all if both `suspend` and `lock` would be `false`.
|
||||
Omitting a key is equivalent to it being `false`.
|
||||
|
||||
### Errors and restrictions
|
||||
|
||||
Sending a request to the respective endpoints returns:
|
||||
|
||||
- `400 / M_INVALID_PARAM`: The user ID does not belong to the local server.
|
||||
- `403 / M_FORBIDDEN`: The requesting user is not a server administrator, is trying to suspend/lock
|
||||
their own account, or the target user is another administrator.
|
||||
- `404 / M_NOT_FOUND`: The user ID is not found, or is deactivated.
|
||||
|
||||
In order to prevent user enumeration, implementations have to ensure that authorization is checked
|
||||
prior to trying to do account lookups.
|
||||
As this endpoint requires authentication with an administrator account, guest access is not
|
||||
permitted. Additionally, no rate-limiting is imposed.
|
||||
|
||||
[p1]: https://spec.matrix.org/v1.15/client-server-api/#server-administration
|
||||
[p2]: https://spec.matrix.org/v1.15/client-server-api/#get_matrixclientv3adminwhoisuserid
|
||||
[p3]: https://spec.matrix.org/v1.15/appendices/#common-namespaced-identifier-grammar
|
||||
|
||||
## Potential issues
|
||||
|
||||
This proposal does not outline any metadata fields for management, such as action reasons,
|
||||
temporary actions, authors, etc, which implementation-specific methods may currently have.
|
||||
This is for the sake of brevity and simplicity, and may be expanded upon by a future proposal.
|
||||
|
||||
This proposal is also written under the assumption that all server administrators are equal, and
|
||||
cannot be suspended or locked. If a server permits such actions against a privileged user, without
|
||||
stripping their privileges, conflicting behaviours may be encountered.
|
||||
|
||||
## Alternatives
|
||||
|
||||
A full "user-info" endpoint has been suggested, which would include more information about a user's
|
||||
account that could interest server administrators. This proposal focuses solely on providing
|
||||
tooling with the capability to suspend and lock without needing to maintain several
|
||||
implementation-specific versions of their code, and adding a full-fleged user-info endpoint is
|
||||
almost entirely out of scope.
|
||||
|
||||
## Security considerations
|
||||
|
||||
Adding these new endpoints may provide a path to circumvent restrictions previously imposed on
|
||||
implementation-specific versions of the suspend and lock endpoints (such as them being blocked off
|
||||
at the reverse proxy) - server developers will likely want to ensure that their users are made
|
||||
appropriate aware of this (via release notes or some other similar high-visibility channel) so that
|
||||
they can apply those same restrictions to these new endpoints if necessary.
|
||||
|
||||
These endpoints also increase the compromise value of an administrator account, as an attacker who
|
||||
breaches one of these accounts will be able to suspend or lock other users on the server. While
|
||||
the attacker would not be able to lock out other administrators, a single-administrator homeserver
|
||||
may be vulnerable to a temporary takeover if the sole administrator account is breached and
|
||||
the deployment cannot be secured & have the change reverted quickly.
|
||||
It may possibly also allow an attacker to disable other room-level moderation tooling, such as
|
||||
moderation bots, assuming those tools are not also server administrators.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
| Stable | Unstable |
|
||||
| ------ | -------- |
|
||||
| `/_matrix/client/v1/admin/...` | `/_matrix/client/unstable/uk.timedout.msc4323/admin/...` |
|
||||
| `m.account_moderation` | `uk.timedout.msc4323` |
|
||||
|
||||
`locked` and `suspended` in the request/response bodies do not require an unstable prefix
|
||||
as the entire body is new.
|
||||
|
||||
Servers should advertise `"uk.timedout.msc4323":true` in their `/versions` response while this
|
||||
proposal is unstable in order to advertise support for this new feature.
|
||||
It is left as an implementation detail whether to require authentication to view this version flag
|
||||
or not, as the capabilities endpoint requires authentication regardless.
|
||||
|
||||
## Dependencies
|
||||
|
||||
None
|
||||
Loading…
Reference in New Issue