MSC: Distinction between Ignore and Block
parent
8d2fb67793
commit
db40aa7ab4
@ -0,0 +1,91 @@
|
||||
# MSC4283: Distinction between Ignore and Block
|
||||
|
||||
When discussing features around user safety, terminology like *ignore*, *block*, *filter*, and *mute*
|
||||
is typically used. Though the terminology is consistent, the definitions are not.
|
||||
|
||||
In a similar effort to [MSC4161](https://github.com/matrix-org/matrix-spec-proposals/pull/4161), this
|
||||
proposal aims to clarify the definitions used from a technical perspective. Clients can, but SHOULD
|
||||
NOT, use different terminology for their users.
|
||||
|
||||
## Proposal
|
||||
|
||||
The following terms are to be used by developers and the Matrix Specification itself. Effort has been
|
||||
made to avoid dramatic spec text changes with this proposal.
|
||||
|
||||
**Ignore** means to filter the receipt of an action without giving indication to the sender that filtering
|
||||
has happened. This filtering can be done server-side or client-side, though server-side is more popular
|
||||
as of writing. For example, *ignoring* an invite means that the invite enters a black hole never to
|
||||
be seen by the intended recipient.
|
||||
|
||||
Other platforms and protocols may call *ignores* "mutes" or "filters". Avoid these terms as they
|
||||
conflict with other parts of the Matrix Protocol (namely, with notifications and `/sync`).
|
||||
|
||||
**Block** means to prevent the sender from completing an action. This is typically done server-side,
|
||||
but with some work, can be done client-side. Reusing the invite example, the sender would get explicitly
|
||||
told "you cannot send this invite" instead of it appearing successful with an *ignore*.
|
||||
|
||||
Other platforms may call *blocks* "ignores", which is mildly confusing, but swapping the terminology
|
||||
would involve significant edits to the specification and its implementations.
|
||||
|
||||
### Example flow: Invites
|
||||
|
||||
Happy path:
|
||||
|
||||
1. Alice searches for Bob in the user directory.
|
||||
2. Alice creates a room and invites Bob to it, having found their user ID in the directory.
|
||||
3. Bob receives the invite in their client.
|
||||
4. Bob accepts (or rejects) the invite eventually.
|
||||
|
||||
A *block* could be imposed at steps 1 or 2 (or both):
|
||||
|
||||
* At step 1, Alice gets told that Bob has blocked them and cannot be invited. It's also possible that
|
||||
Bob just doesn't show up at all until Alice enters the full user ID for Bob, at which point the
|
||||
client says "@bob:example.org has blocked you".
|
||||
* At step 2, Alice's invite (and possibly room creation too) fails because Bob blocked them. Alice
|
||||
sees this in the error message.
|
||||
|
||||
An *ignore* would be imposed between steps 2 and 3: instead of failing to complete the invite, the
|
||||
invite is received by Bob's server, but the path never reaches step 3. Bob's server (or client) simply
|
||||
no-ops the delivery of the invite, leaving Alice to think that Bob is, well, *ignoring them*.
|
||||
|
||||
### Example flow: Messages
|
||||
|
||||
Once in a room together, the happy path would be:
|
||||
|
||||
1. Alice sends a message.
|
||||
2. Bob receives that message in their client.
|
||||
|
||||
A *block* could be imposed such that Alice's client explicitly says "Bob did not receive this message",
|
||||
and either Bob's client or server would further *ignore* the message. For encrypted messages, Alice
|
||||
might not even be able to claim One-Time Keys (or similar) for Bob prior to sending.
|
||||
|
||||
An *ignore* would take the shape of allowing Alice to claim OTKs, and possibly even deliver key material
|
||||
to Bob, but Bob's client or server would prevent the message from appearing. Some clients may elect
|
||||
to minimize the message rather than completely hide it to retain some conversation context. Placeholders
|
||||
like "This message is hidden because you have ignored this user." are encouraged in that case.
|
||||
|
||||
## Potential issues
|
||||
|
||||
Other platforms and protocols may use yet more different terminology, and could be confusing to
|
||||
developers trying to bridge with or transition from those places. Noted in the above proposal, it's
|
||||
preferred to instead maintain the *ignore* definition that is currently in use by Matrix rather than
|
||||
rework existing features and functionality.
|
||||
|
||||
## Alternatives
|
||||
|
||||
Significant alternatives are discussed inline in this proposal.
|
||||
|
||||
## Security and safety considerations
|
||||
|
||||
Whether to use blocks or ignores (or both!) may carry some security and privacy considerations. Because
|
||||
blocks are known to both parties, this may expose the intended target to increased or alternative
|
||||
forms of abuse.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
No unstable prefix is required for this proposal because it's purely definitions.
|
||||
|
||||
## Dependencies
|
||||
|
||||
No direct dependencies. This proposal would benefit from a [MSC4270](https://github.com/matrix-org/matrix-spec-proposals/pull/4270)-style
|
||||
glossary, however.
|
||||
Loading…
Reference in New Issue