Merge 7af95c1f4e into e9f0f31d27
commit
badab183be
@ -0,0 +1,167 @@
|
||||
# MSC3847: Ignoring invites using individual policy rooms
|
||||
|
||||
Receiving unwanted invites is something that users currently need to live
|
||||
with on the Matrix network. To alleviate this, Matrix needs a mechanism to
|
||||
let users specify that they are not interested in invites from specific
|
||||
users or towards specific rooms.
|
||||
|
||||
In this proposal, we introduce the necessary extensions to let users do
|
||||
this and to let clients perform filtering of unwanted invites.
|
||||
|
||||
We proceed as follows:
|
||||
|
||||
1. We build upon the mechanism of policy rooms, introduced in [MSC2313](https://github.com/matrix-org/matrix-doc/pull/2313), and define
|
||||
a user's individual policy room, which may be created on behalf of the user by
|
||||
a Matrix client, and which is shared across all devices and clients of the user.
|
||||
2. We build upon the mechanism of recommendations, also introduced in [MSC2313](https://github.com/matrix-org/matrix-doc/pull/2313),
|
||||
and create a new recommendation for ignoring invites from a specific user, from
|
||||
a specific server or towards a specific room.
|
||||
|
||||
|
||||
## Proposal
|
||||
|
||||
### Background
|
||||
|
||||
[Matrix specs define policy rooms](https://spec.matrix.org/v1.3/client-server-api/#moderation-policy-lists).
|
||||
A policy room is a room in which rules such as the following may be published:
|
||||
|
||||
```jsonc
|
||||
{
|
||||
"type": "m.policy.rule.user", // Or `m.policy.rule.server` or `m.policy.rule.room`.
|
||||
"state_key": "rule_1", // Arbitrary.
|
||||
"content": {
|
||||
"entity": "@alice:example.org",
|
||||
"recommendation": "m.ban",
|
||||
"reason": "undesirable behaviour"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Policy rooms are designed to be associated with entire servers, communities,
|
||||
individual rooms or individual users, but there is no specification
|
||||
clarifying how to associate an issuer with a policy room.
|
||||
|
||||
### Associating policy rooms to a user
|
||||
|
||||
For individual users, we introduce a new event `m.policies`, designed
|
||||
to be used as part of account data. This event has content:
|
||||
|
||||
| Content | Type | Description |
|
||||
|---------|------|-------------|
|
||||
| `m.ignore.invites` | `Policies` | A list of rooms in which policies should be understood as "ignore invite" lists. |
|
||||
|
||||
We expect that future MSCs will expand upon this event `m.policies` and
|
||||
add further fields with other lists of rooms in which policies should be
|
||||
understood differently. This is, however, beyond the scope of the current
|
||||
MSC.
|
||||
|
||||
We also expect that future MSCs will expand upon this event `m.policies`
|
||||
to add semantics in other positions than account data, e.g. community rooms.
|
||||
This is also beyond the scope of the current MSC.
|
||||
|
||||
Where `Policies` is defined as:
|
||||
|
||||
| Content | Type | Description |
|
||||
|-------------|------|-------------|
|
||||
| `target` | Room ID | A room in which to issue new policies. |
|
||||
| `sources` | Room ID [] | A list of rooms from which to apply new policies. Should generally include `target`. |
|
||||
|
||||
The expected behavior is that:
|
||||
|
||||
- if a user Alice has a `m.policies` with key `m.ignore.invites` and `target` R,
|
||||
then whenever Alice issues a new policy to ignore invites from their client
|
||||
or another trusted agent, this policy will be stored in room R.
|
||||
|
||||
- if a user Alice has a `m.policies` with key `m.ignore.invites` and `sources`
|
||||
containing room R, any client or trusted agent acting on behalf of Alice will
|
||||
monitor room R for new policies and apply the recommendations on behalf of Alice,
|
||||
interpreting such policies as "ignore invites".
|
||||
|
||||
### Expanding recommendations to individual events
|
||||
|
||||
Policy lists define three scopes `m.policy.rule.user` for rules that deal with users,
|
||||
`m.policy.rule.room` for rules that deals with rooms and `m.policy.rule.server` for
|
||||
rules that deal with servers.
|
||||
|
||||
We expand these lists with a fourth scope `m.policy.rule.event` for rules that deal
|
||||
with individual events, in this case ignoring a specific invite.
|
||||
|
||||
### Suggested client behaviour
|
||||
|
||||
If a user Alice has a `m.policies` with key `m.ignore.invites` and `sources` containing
|
||||
room R *and* if a new policy `m.ban` appears in R:
|
||||
|
||||
- any pending invite currently displayed that matches the `entity` is removed from display;
|
||||
- any incoming invite that matches the `entity` is not displayed among invites.
|
||||
|
||||
However, clients are expected to offer the ability to look at any ignored invite,
|
||||
in a manner similar to a trashcan/recycle bin/undelete mechanism for desktop file
|
||||
systems.
|
||||
|
||||
Similarly, if a policy `m.ban` in a `m.ignore.invites` room is redacted/amended,
|
||||
clients should show any invite that doesn't match any `m.ignore.invites` & `m.ban`
|
||||
entities anymore.
|
||||
|
||||
If the client detects that one of the rooms has been upgraded, it should follow
|
||||
the tombstone to the new room.
|
||||
|
||||
### Server behavior
|
||||
|
||||
None at this stage. While implementation details may differ, key `m.ignore.invites` is
|
||||
designed *a priori* to be executed entirely client-side.
|
||||
|
||||
## Potential issues
|
||||
|
||||
### Number of events
|
||||
|
||||
There is a risk that the list of ignored invites of some users may grow a lot, which might have
|
||||
performance impact, both during initial sync and during filtering. We believe that this risk is
|
||||
limited. If necessary, clients may decide to cleanup ignored invites after some time.
|
||||
|
||||
### Sync size
|
||||
|
||||
With this proposal, any invite ignored with `m.ignore.invites` will still show up at each `/sync`.
|
||||
In time, this can grow expensive. This is, however, necessary to be able to un-ignore invites
|
||||
from the client.
|
||||
|
||||
We plan to file a followup MSC to introduce a `m.policies` key `m.drop.invites`, which will
|
||||
ask the server to simply not send the invites during the next `/sync` operations.
|
||||
|
||||
## Alternatives
|
||||
|
||||
### Rejecting invites
|
||||
|
||||
A client could of course reject invites instead of ignoring them. However, experience shows that
|
||||
spam/bullying tools monitor invite rejections to send invite spam. This entire MSC is meant to
|
||||
offer an alternative mechanism that would close this gap and let users ignore invites without
|
||||
notifying the sender.
|
||||
|
||||
### Server-side filtering
|
||||
|
||||
Just as `m.ignored_users_list` is handled mostly on the server, we could handle `m.invites.ignore`
|
||||
largely on the server. However, this would make it much harder to undo erroneous ignores (i.e.
|
||||
implementing some sort of recovery from trashcan) on the client.
|
||||
|
||||
Consequently, we prefer handling things on the client, even if this may require more traffic.
|
||||
|
||||
## Security considerations
|
||||
|
||||
### Room aliases
|
||||
We have decided to specify room IDs rather than room aliases as room aliases can, in some circumstances,
|
||||
be forged by malicious users/administrators.
|
||||
|
||||
### Trust
|
||||
If the administrator of a policy room R is malicious, they can use this room to specify that all invites,
|
||||
or some specific good invites, should be ignored. A user who uses R as a `source` will therefore not see
|
||||
some invites that they would otherwise see.
|
||||
|
||||
In other words, using a room as source requires trusting the administrator of that room.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
During testing:
|
||||
|
||||
- `m.ignore.invites` should be prefixed `org.matrix.msc3847.ignore.invites`;
|
||||
- `m.policies` should be prefixed `org.matrix.msc3847.policies`;
|
||||
- `m.policy.rule.event` should be prefixed `org.matrix.msc3847.policy.rule.event`.
|
||||
|
||||
Loading…
Reference in New Issue