Initial draft
parent
adb190dce1
commit
61bd9836d9
@ -0,0 +1,126 @@
|
||||
# MSC4335: M_USER_LIMIT_EXCEEDED error code
|
||||
|
||||
Currently, Matrix homeservers lack a standardized error code to indicate when user-related limits
|
||||
have been exceeded. This creates inconsistent client experiences when homeservers need to reject
|
||||
operations due to per-user quotas, rate limits, or resource constraints.
|
||||
|
||||
Different implementations may return generic error codes like `M_FORBIDDEN` or `M_TOO_LARGE`, making
|
||||
it difficult for clients to provide appropriate user feedback or implement proper retry logic.
|
||||
|
||||
A concrete use case for this is the
|
||||
[fair usage limits introduced on the matrix.org homeserver](https://matrix.org/homeserver/pricing/#usage-limits).
|
||||
|
||||
This proposal introduces a new error code `M_USER_LIMIT_EXCEEDED` that homeservers can use to
|
||||
signal when a user has exceeded their allocated limits, distinct from general rate limiting or
|
||||
server-wide constraints. This improves the user experience by allowing clients to provide more
|
||||
specific error messages and handle user-specific limitations appropriately.
|
||||
|
||||
|
||||
## Proposal
|
||||
|
||||
This proposal adds a new error code `M_USER_LIMIT_EXCEEDED` to the Matrix specification. This error
|
||||
code should be returned when a user has exceeded limits that are specifically associated with their
|
||||
account, such as:
|
||||
|
||||
* **Storage quotas**: When a user has exceeded their allocated storage space for media uploads,
|
||||
message history, or other persistent data.
|
||||
* **Resource limits**: When a user has reached their maximum number of allowed rooms, devices,
|
||||
or other account-scoped resources.
|
||||
* **Feature limits**: When a user has exceeded usage limits for specific features (e.g., number
|
||||
of public rooms they can create, number of invites they can send).
|
||||
* **Account tier restrictions**: When a user's account type (free, premium, etc.) prevents them
|
||||
from performing certain operations.
|
||||
|
||||
The error should be returned with HTTP status code **403 Forbidden** to indicate that the operation
|
||||
is not permitted due to the user's current limits.
|
||||
|
||||
### Error Response Format
|
||||
|
||||
When returning this error, servers should use the standard Matrix error response format:
|
||||
|
||||
```json
|
||||
{
|
||||
"errcode": "M_USER_LIMIT_EXCEEDED",
|
||||
"error": "User has exceeded their storage quota of 10GB"
|
||||
}
|
||||
```
|
||||
|
||||
The human-readable `error` field should provide specific information about what limit was exceeded
|
||||
and, where possible, include details about the current usage and limit values to help users
|
||||
understand their situation.
|
||||
|
||||
### Applicable Endpoints
|
||||
|
||||
This error code can be returned by any Matrix Client-Server API endpoint where user-specific limits
|
||||
might be enforced. Examples might include:
|
||||
|
||||
* `POST /_matrix/media/v3/upload` - When storage quota is exceeded
|
||||
* `POST /_matrix/client/v3/rooms/{roomId}/invite` - When invite limits (like maximum participant count) are exceeded
|
||||
|
||||
The HTTP response code should be chosen based on the specification for the individual endpoint. For
|
||||
example, the most appropriate code for `POST /_matrix/media/v3/upload` would be `403`.
|
||||
|
||||
### Distinction from Other Error Codes
|
||||
|
||||
This error code is distinct from:
|
||||
|
||||
* `M_LIMIT_EXCEEDED`: Used for general rate limiting that applies to all users or based on IP/client
|
||||
* `M_FORBIDDEN`: Used for authorization failures or policy violations not related to usage limits
|
||||
* `M_RESOURCE_LIMIT_EXCEEDED`: Used for server-wide resource constraints affecting all users
|
||||
* `M_TOO_LARGE`: Used when a request is too large (file size, message length, etc.) regardless of user limits
|
||||
|
||||
## Potential issues
|
||||
|
||||
This error code does not specify the exact nature of the limit that was exceeded, which could
|
||||
potentially lead to ambiguity. However, this is consistent with other Matrix error codes that
|
||||
rely on the human-readable `error` field to provide specific details. Implementers should ensure
|
||||
they provide clear, actionable error messages.
|
||||
|
||||
The error code does not provide machine-readable information about current usage or limits,
|
||||
which could be useful for clients to display progress bars or usage statistics. However, adding
|
||||
such fields would require a more complex specification change and could be addressed in a future
|
||||
MSC if deemed necessary.
|
||||
|
||||
## Alternatives
|
||||
|
||||
Several alternatives were considered for this proposal:
|
||||
|
||||
**Use M_RESOURCE_LIMIT_EXCEEDED**: The existing `M_RESOURCE_LIMIT_EXCEEDED` error code could be
|
||||
expanded to cover user-specific limits. However, this code is currently used for server-wide
|
||||
resource constraints, and overloading it could create confusion about whether the limit applies
|
||||
to the user specifically or the server generally.
|
||||
|
||||
**Add structured error information**: Instead of a simple error code, a more complex error format
|
||||
could include machine-readable fields for limit types, current usage, and maximum limits. While
|
||||
this would provide more information, it would require a more significant change to the error
|
||||
response format and could be added in a future MSC if needed.
|
||||
|
||||
**Multiple specific error codes**: Separate error codes could be introduced for different types
|
||||
of limits (e.g., `M_STORAGE_LIMIT_EXCEEDED`, `M_ROOM_LIMIT_EXCEEDED`). However, this approach
|
||||
would require many new error codes and doesn't provide significant benefits over a single code
|
||||
with descriptive error messages.
|
||||
|
||||
## Security considerations
|
||||
|
||||
None as only adding a new error code.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
While this proposal is being developed and refined, implementations should use the unstable prefix
|
||||
`ORG.MATRIX.MSC4335.M_USER_LIMIT_EXCEEDED` instead of `M_USER_LIMIT_EXCEEDED`.
|
||||
|
||||
For example:
|
||||
|
||||
```json
|
||||
{
|
||||
"errcode": "ORG.MATRIX.MSC4335.M_USER_LIMIT_EXCEEDED",
|
||||
"error": "User has exceeded their fair usage limit of 2GB"
|
||||
}
|
||||
```
|
||||
|
||||
Once the MSC is accepted and the error code is included in the Matrix specification, implementations
|
||||
should transition to using the stable `M_USER_LIMIT_EXCEEDED` error code.
|
||||
|
||||
## Dependencies
|
||||
|
||||
None.
|
||||
@ -1 +0,0 @@
|
||||
placeholder
|
||||
Loading…
Reference in New Issue