-
Notifications
You must be signed in to change notification settings - Fork 399
Room versions 8 and 9: Restricted rooms #3387
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 19 commits
Commits
Show all changes
24 commits
Select commit
Hold shift + click to select a range
e650fca
Room versions 8 and 9: Restricted rooms
turt2live 7a5e820
Changelogs
turt2live 3769724
Capitalization
turt2live f7f2ea8
Remove verbiage for spaces because they don't exist
turt2live 2ccae80
Iterations on text
turt2live e3b7735
Merge remote-tracking branch 'origin/travis/spec/v8-v9' into travis/s…
turt2live db2a738
Another clarification
turt2live c613d2e
Make error code descriptions consistent
turt2live d521f25
Merge remote-tracking branch 'origin/main' into travis/spec/v8-v9
turt2live b31298d
Apply suggestions from code review
turt2live 9c18649
Merge branch 'main' into travis/spec/v8-v9
turt2live b04da31
Incorporate from merge
turt2live 17954df
Misc language update per review
turt2live 75fc992
Update accuracy before splitting auth rules
turt2live 44fc526
fix wtf moment
turt2live 3447b12
Fix up v8 and v9 to match "fully specify room versions"
turt2live a8fa47f
Scope auth events selection to room version
turt2live 157f750
Apply consistency
turt2live 42195ca
Add changelogs
turt2live 56bf4a4
Review part 1
turt2live 245cc17
Apply suggestions from code review
turt2live fd82238
Split out redaction sections
turt2live cc65d8a
Clarify general case of join conditions
turt2live e58bc1b
Update diagram
turt2live File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add support for `restricted` rooms as per [MSC3083](https://github.com/matrix-org/matrix-doc/pull/3083), [MSC3289](https://github.com/matrix-org/matrix-doc/pull/3289), and [MSC3375](https://github.com/matrix-org/matrix-doc/pull/3375). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add Room Version 8 as per [MSC3289](https://github.com/matrix-org/matrix-doc/pull/3289). | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add Room Version 9 as per [MSC3375](https://github.com/matrix-org/matrix-doc/pull/3375). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add support for `restricted` rooms as per [MSC3083](https://github.com/matrix-org/matrix-doc/pull/3083), [MSC3289](https://github.com/matrix-org/matrix-doc/pull/3289), and [MSC3375](https://github.com/matrix-org/matrix-doc/pull/3375). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
--- | ||
toc_hide: true | ||
--- | ||
|
||
Events must be signed by the server denoted by the `sender` key. | ||
|
||
`m.room.redaction` events are not explicitly part of the auth rules. | ||
They are still subject to the minimum power level rules, but should always | ||
fall into "10. Otherwise, allow". Instead of being authorized at the time | ||
of receipt, they are authorized at a later stage: see the | ||
[Redactions](#redactions) section below for more information. | ||
|
||
The types of state events that affect authorization are: | ||
|
||
- `m.room.create` | ||
- `m.room.member` | ||
- `m.room.join_rules` | ||
- `m.room.power_levels` | ||
- `m.room.third_party_invite` | ||
|
||
{{% boxes/note %}} | ||
Power levels are inferred from defaults when not explicitly supplied. | ||
For example, mentions of the `sender`'s power level can also refer to | ||
the default power level for users in the room. | ||
{{% /boxes/note %}} | ||
|
||
The rules are as follows: | ||
|
||
1. If type is `m.room.create`: | ||
1. If it has any previous events, reject. | ||
2. If the domain of the `room_id` does not match the domain of the | ||
`sender`, reject. | ||
3. If `content.room_version` is present and is not a recognised | ||
version, reject. | ||
4. If `content` has no `creator` field, reject. | ||
5. Otherwise, allow. | ||
2. Reject if event has `auth_events` that: | ||
1. have duplicate entries for a given `type` and `state_key` pair | ||
2. have entries whose `type` and `state_key` don't match those | ||
specified by the [auth events | ||
selection](/server-server-api#auth-events-selection) | ||
algorithm described in the server specification. | ||
3. If event does not have a `m.room.create` in its `auth_events`, | ||
reject. | ||
4. If type is `m.room.member`: | ||
1. If no `state_key` key or `membership` key in `content`, reject. | ||
2. If `content` has `join_authorised_via_users_server` | ||
turt2live marked this conversation as resolved.
Show resolved
Hide resolved
|
||
key: | ||
1. If the event is not validly signed by the user ID denoted | ||
by the key, reject. | ||
3. If `membership` is `join`: | ||
1. If the only previous event is an `m.room.create` and the | ||
`state_key` is the creator, allow. | ||
2. If the `sender` does not match `state_key`, reject. | ||
3. If the `sender` is banned, reject. | ||
4. If the `join_rule` is `invite` then allow if membership | ||
state is `invite` or `join`. | ||
5. If the `join_rule` is `restricted`: | ||
1. If membership state is `join` or `invite`, allow. | ||
2. If the `join_authorised_via_users_server` key in `content` | ||
is not a user with sufficient permission to invite other | ||
users, reject. | ||
3. Otherwise, allow. | ||
6. If the `join_rule` is `public`, allow. | ||
7. Otherwise, reject. | ||
4. If `membership` is `invite`: | ||
1. If `content` has `third_party_invite` key: | ||
1. If *target user* is banned, reject. | ||
2. If `content.third_party_invite` does not have a `signed` | ||
key, reject. | ||
3. If `signed` does not have `mxid` and `token` keys, | ||
reject. | ||
4. If `mxid` does not match `state_key`, reject. | ||
5. If there is no `m.room.third_party_invite` event in the | ||
current room state with `state_key` matching `token`, | ||
reject. | ||
6. If `sender` does not match `sender` of the | ||
`m.room.third_party_invite`, reject. | ||
7. If any signature in `signed` matches any public key in | ||
the `m.room.third_party_invite` event, allow. The public | ||
keys are in `content` of `m.room.third_party_invite` as: | ||
1. A single public key in the `public_key` field. | ||
2. A list of public keys in the `public_keys` field. | ||
8. Otherwise, reject. | ||
2. If the `sender`'s current membership state is not `join`, | ||
reject. | ||
3. If *target user*'s current membership state is `join` or | ||
`ban`, reject. | ||
4. If the `sender`'s power level is greater than or equal to | ||
the *invite level*, allow. | ||
5. Otherwise, reject. | ||
5. If `membership` is `leave`: | ||
1. If the `sender` matches `state_key`, allow if and only if | ||
that user's current membership state is `invite` or `join`. | ||
2. If the `sender`'s current membership state is not `join`, | ||
reject. | ||
3. If the *target user*'s current membership state is `ban`, | ||
and the `sender`'s power level is less than the *ban level*, | ||
reject. | ||
4. If the `sender`'s power level is greater than or equal to | ||
the *kick level*, and the *target user*'s power level is | ||
less than the `sender`'s power level, allow. | ||
5. Otherwise, reject. | ||
6. If `membership` is `ban`: | ||
1. If the `sender`'s current membership state is not `join`, | ||
reject. | ||
2. If the `sender`'s power level is greater than or equal to | ||
the *ban level*, and the *target user*'s power level is less | ||
than the `sender`'s power level, allow. | ||
3. Otherwise, reject. | ||
7. If `membership` is `knock`: | ||
1. If the `join_rule` is anything other than `knock`, reject. | ||
2. If `sender` does not match `state_key`, reject. | ||
3. If the `sender`'s current membership is not `ban`, `invite`, | ||
or `join`, allow. | ||
8. Otherwise, the membership is unknown. Reject. | ||
5. If the `sender`'s current membership state is not `join`, reject. | ||
6. If type is `m.room.third_party_invite`: | ||
1. Allow if and only if `sender`'s current power level is greater | ||
than or equal to the *invite level*. | ||
7. If the event type's *required power level* is greater than the | ||
`sender`'s power level, reject. | ||
8. If the event has a `state_key` that starts with an `@` and does not | ||
match the `sender`, reject. | ||
9. If type is `m.room.power_levels`: | ||
1. If `users` key in `content` is not a dictionary with keys that | ||
are valid user IDs with values that are integers (or a string | ||
that is an integer), reject. | ||
2. If there is no previous `m.room.power_levels` event in the room, | ||
allow. | ||
3. For the keys `users_default`, `events_default`, `state_default`, | ||
`ban`, `redact`, `kick`, `invite` check if they were added, | ||
changed or removed. For each found alteration: | ||
1. If the current value is higher than the `sender`'s current | ||
power level, reject. | ||
2. If the new value is higher than the `sender`'s current power | ||
level, reject. | ||
4. For each entry being added, changed or removed in both the | ||
`events`, `users`, and `notifications` keys: | ||
1. If the current value is higher than the `sender`'s current | ||
power level, reject. | ||
2. If the new value is higher than the `sender`'s current power | ||
level, reject. | ||
5. For each entry being changed under the `users` key, other than | ||
the `sender`'s own entry: | ||
1. If the current value is equal to the `sender`'s current | ||
power level, reject. | ||
6. Otherwise, allow. | ||
10. Otherwise, allow. | ||
|
||
{{% boxes/note %}} | ||
Some consequences of these rules: | ||
|
||
- Unless you are a member of the room, the only permitted operations | ||
(apart from the initial create/join) are: joining a public room; | ||
accepting or rejecting an invitation to a room. | ||
- To unban somebody, you must have power level greater than or equal | ||
to both the kick *and* ban levels, *and* greater than the target | ||
user's power level. | ||
{{% /boxes/note %}} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.