test(api): сценарии §11.5 и §11.6 — админ инстанса и realtime-события

- администратор инстанса вне сервера видит и меняет чужой сервер: комнаты,
  роли, участники, аудит; его действия помечены actor_instance_admin;
- администратора инстанса нельзя исключить или замутить с сервера
  (instance.admin_protected) — права глобальны и не отзываются владельцем;
- realtime-проверка: два WS-клиента (владелец и участник) получают события
  CHANNEL_CREATE, GUILD_UPDATE, GUILD_ROLE_CREATE, MEMBER_ROLES_UPDATE от
  REST-ручек, а USER_UPDATE приходит только владельцу сессии.
This commit is contained in:
2026-09-19 21:50:54 +03:00
parent 1b1a679827
commit 6d7062dc2f
2 changed files with 292 additions and 0 deletions
+5
View File
@@ -907,6 +907,11 @@ func (s *Server) checkMemberHierarchy(ctx context.Context, guildID uint64, actor
if err != nil {
return humaError(err)
}
// Администратора инстанса нельзя модерировать с сервера: его права
// глобальны и не могут быть отозваны владельцем сервера (AGENT.md 7.19).
if target, err := s.store.GetUser(ctx, targetID); err == nil && target.IsInstanceAdmin {
return humaErrorStatus(http.StatusForbidden, "instance.admin_protected", "instance administrator cannot be moderated")
}
if targetID == guild.OwnerID && actor.ID != guild.OwnerID {
return humaErrorStatus(http.StatusForbidden, "perm.denied", "guild owner cannot be moderated")
}