7.7 KiB
7.7 KiB
事件必须由 sender
属性指示的服务器进行签名。
影响授权的状态事件类型包括:
{{% boxes/note %}}
当未明确提供时,权限级别将从默认值推断。例如,提及 sender
的权限级别也可以指房间中用户的默认权限级别。
{{% /boxes/note %}}
{{% boxes/note %}}
m.room.redaction
事件与其他事件一样需遵守授权规则。实际上,这意味着除非 m.room.power_levels
事件通过 events
或 events_default
属性为 m.room.redaction
事件设置了权限级别要求,否则通常会被授权规则允许。特别地,redact level 不会被授权规则考虑在内。
能够发送撤回事件并不意味着应执行撤回。接收服务器必须执行额外的检查,详见处理撤回章节。 {{% /boxes/note %}}
规则如下:
- 如果类型为
m.room.create
:- 如果存在任何
prev_events
,则拒绝。 - 如果
room_id
的域与sender
的域不匹配,则拒绝。 - 如果存在
content.room_version
且不是已识别的版本,则拒绝。 - 如果
content
中没有creator
属性,则拒绝。 - 否则,允许。
- 如果存在任何
- 考虑事件的
auth_events
:- 如果对于某个
type
和state_key
对存在重复条目,则拒绝。 - 如果存在条目的
type
和state_key
与授权事件选择算法(按服务器规范描述)指定的不符,则拒绝。 - 如果存在条目本身按接收 PDU 时执行的检查被拒绝,则拒绝。
- 如果条目中没有
m.room.create
事件,则拒绝。
- 如果对于某个
- 如果房间状态中的
m.room.create
事件的content
属性m.federate
为false
,并且该事件的sender
域与创建事件的sender
域不匹配,则拒绝。 - 如果类型为
m.room.member
:- 如果没有
state_key
属性,或content
中没有membership
属性,则拒绝。 - {{% added-in v=8 %}}
如果
content
中有join_authorised_via_users_server
属性:- 如果事件未被该 key 标识的用户 ID 的 homeserver 有效签名,则拒绝。
- 如果
membership
为join
:- 如果唯一先前事件为
m.room.create
且state_key
为创建者,则允许。 - 如果
sender
与state_key
不匹配,则拒绝。 - 如果
sender
被封禁,则拒绝。 - 如果
join_rule
为invite
或knock
,当成员状态为invite
或join
时允许。 - {{% added-in v=8 %}}
如果
join_rule
为restricted
:- 如果成员状态为
join
或invite
,则允许。 - 如果
content
中的join_authorised_via_users_server
key 不是有足够权限邀请其它用户的用户,则拒绝。 - 否则,允许。
- 如果成员状态为
- 如果
join_rule
为public
,允许。 - 否则,拒绝。
- 如果唯一先前事件为
- 如果
membership
为invite
:- 如果
content
包含third_party_invite
属性:- 如果目标用户被封禁,则拒绝。
- 如果
content.third_party_invite
没有signed
属性,则拒绝。 - 如果
signed
没有mxid
和token
属性,则拒绝。 - 如果
mxid
不等于state_key
,则拒绝。 - 如果当前房间状态中没有
state_key
与token
匹配的m.room.third_party_invite
事件,则拒绝。 - 如果
sender
与m.room.third_party_invite
的sender
不匹配,则拒绝。 - 如果
signed
中的任一签名与m.room.third_party_invite
事件中的任何公钥匹配,则允许。公钥位于m.room.third_party_invite
的content
中:- 在
public_key
属性中为单个公钥。 - 在
public_keys
属性中为公钥列表。
- 在
- 否则,拒绝。
- 如果
sender
当前成员状态不是join
,则拒绝。 - 如果目标用户的当前成员状态为
join
或ban
,则拒绝。 - 如果
sender
的权限级别大于或等于邀请级别,允许。 - 否则,拒绝。
- 如果
- 如果
membership
为leave
:- 如果
sender
与state_key
匹配,且该用户当前的成员状态为invite
、join
或knock
时允许,否则拒绝。 - 如果
sender
当前成员状态不是join
,则拒绝。 - 如果目标用户的当前成员状态为
ban
且sender
的权限级别低于封禁级别,则拒绝。 - 如果
sender
的权限级别大于或等于踢出级别,且目标用户的权限级别低于sender
,则允许。 - 否则,拒绝。
- 如果
- 如果
membership
为ban
:- 如果
sender
当前成员状态不是join
,则拒绝。 - 如果
sender
的权限级别大于或等于封禁级别,且目标用户的权限级别低于sender
,则允许。 - 否则,拒绝。
- 如果
- 如果
membership
为knock
:- 如果
join_rule
不是knock
,则拒绝。 - 如果
sender
与state_key
不匹配,则拒绝。 - 如果
sender
当前的成员状态不是ban
、invite
或join
,则允许。 - 否则,拒绝。
- 如果
- 否则,成员状态未知。拒绝。
- 如果没有
- 如果
sender
当前的成员状态不是join
,拒绝。 - 如果类型为
m.room.third_party_invite
:- 只有当
sender
当前的权限级别大于或等于邀请级别时,允许。
- 只有当
- 如果事件类型的所需权限级别大于
sender
的权限级别,拒绝。 - 如果事件含有以
@
开头的state_key
且与sender
不匹配,则拒绝。 - 如果类型为
m.room.power_levels
:- 如果
content
中users
属性不是一个有效的对象(主键为合法用户 ID,值为整数或可转为整数的字符串),则拒绝。 - 如果房间中没有之前的
m.room.power_levels
事件,允许。 - 对于
users_default
、events_default
、state_default
、ban
、redact
、kick
、invite
属性,检查它们是否有新增、更改或移除。对每个更改项:- 如果当前值高于
sender
当前权限级别,则拒绝。 - 如果新值高于
sender
当前权限级别,则拒绝。
- 如果当前值高于
- 针对
events
或notifications
属性中被更改或移除的每个条目:- 如果当前值大于
sender
当前权限级别,则拒绝。
- 如果当前值大于
- 对于向
events
或notifications
属性新增或更改的每个条目:- 如果新值大于
sender
当前权限级别,则拒绝。
- 如果新值大于
- 除了
sender
自身的条目外,对users
属性被更改或移除的每个条目:- 如果当前值大于等于
sender
当前权限级别,则拒绝。
- 如果当前值大于等于
- 对于向
users
属性新增或更改的每个条目:- 如果新值大于
sender
当前权限级别,则拒绝。
- 如果新值大于
- 否则,允许。
- 如果
- 否则,允许。
{{% boxes/note %}} 这些规则的一些结果:
- 除非你是房间成员,否则唯一被允许的操作(除初始创建/加入外)为:加入公开房间、接受或拒绝房间邀请。
- 要解除某人的封禁,你必须拥有大于等于踢出和封禁级别的权限级别,且比目标用户的权限级别高。 {{% /boxes/note %}}