6.5 KiB
6.5 KiB
影响授权的状态事件类型包括:
{{% boxes/note %}}
如果未明确给出权限等级,则从默认值推断。
例如,提及 sender
的权限等级时,也可指代房间用户的默认权限等级。
{{% /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.aliases
:- 若事件无
state_key
,则拒绝。 - 若发送者域名与
state_key
不符,则拒绝。 - 否则,允许。
- 若事件无
- 若类型为
m.room.member
:- 若没有
state_key
属性,或content
中无membership
属性,则拒绝。 - 若
membership
为join
:- 若唯一的前序事件为
m.room.create
且state_key
为创建者,则允许。 - 若
sender
与state_key
不符,则拒绝。 - 若
sender
被封禁,则拒绝。 - 若
join_rule
为invite
,则当membership
状态是invite
或join
时,允许。 - 若
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
时允许。 - 若
sender
当前成员状态不是join
,则拒绝。 - 若 目标用户 当前成员状态为
ban
且sender
权限等级低于 封禁等级,则拒绝。 - 若
sender
权限等级大于等于 踢人等级,且 目标用户 权限等级小于sender
权限等级,则允许。 - 否则,拒绝。
- 若
- 若
membership
为ban
:- 若
sender
当前成员状态不是join
,则拒绝。 - 若
sender
权限等级大于等于 封禁等级,且 目标用户 权限等级低于sender
权限等级,则允许。 - 否则,拒绝。
- 若
- 其他情况下,未知成员状态。拒绝。
- 若没有
- 若
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
属性中被更改或移除的每一项:- 若当前值大于
sender
当前权限等级,则拒绝。
- 若当前值大于
- 针对
events
属性中被添加或更改的每一项:- 若新值大于
sender
当前权限等级,则拒绝。
- 若新值大于
- 针对
users
属性(除sender
本人)的被更改或移除的每一项:- 若当前值大于等于
sender
当前权限等级,则拒绝。
- 若当前值大于等于
- 针对
users
属性被添加或更改的每一项:- 若新值大于
sender
当前权限等级,则拒绝。
- 若新值大于
- 否则,允许。
- 若
- 若类型为
m.room.redaction
:- 若
sender
权限等级大于等于 撤回等级,则允许。 - 若被撤回事件的
event_id
域名与m.room.redaction
的event_id
域名一致,则允许。 - 否则,拒绝。
- 若
- 否则,允许。
{{% boxes/note %}} 这些规则的部分后果:
- 除非你是房间成员,否则唯一被允许的操作(除首次创建/加入外)为:加入公共房间、接受或拒绝对房间的邀请。
- 取消封禁某人,你必须拥有大于等于踢人和封禁等级的权限,且你的权限等级高于目标用户。 {{% /boxes/note %}}