feat(api,install): исключения fail2ban и смена своего никнейма

- установщик: `[DEFAULT] ignoreip` в jail.local — локальные сети и WireGuard
  исключены всегда, свой адрес добавляется флагом `--ignore-ip <ip|cidr>`;
  админ, часто заходящий в панель, больше не банит сам себя;
- участник может менять свой никнейм на сервере без MANAGE_NICKNAMES и без
  проверки иерархии (тайм-аут на себя по-прежнему запрещён);
- тест на смену своего ника и запрет self-тайм-аута.
This commit is contained in:
2026-09-19 23:27:26 +03:00
parent ac2b2cb18a
commit 0a82dd3a02
4 changed files with 62 additions and 4 deletions
+11 -3
View File
@@ -729,21 +729,29 @@ func (s *Server) registerMemberRoutes(api huma.API) {
if err != nil {
return nil, err
}
if err := s.checkMemberHierarchy(ctx, guildID, user, resolved, targetID); err != nil {
return nil, err
// Свой никнейм участник меняет сам: иерархия и MANAGE_NICKNAMES для
// этого не нужны (AGENT.md 7.2, 7.17). Тайм-аут на себя — запрещён.
selfEdit := targetID == user.ID
if !selfEdit {
if err := s.checkMemberHierarchy(ctx, guildID, user, resolved, targetID); err != nil {
return nil, err
}
}
var (
nickname *string
timeoutUntil *time.Time
)
if input.Body.Nickname != nil {
if !resolved.Has(permissions.ManageNicknames) {
if !selfEdit && !resolved.Has(permissions.ManageNicknames) {
return nil, humaErrorStatus(http.StatusForbidden, "perm.denied", "MANAGE_NICKNAMES is required")
}
trimmed := strings.TrimSpace(*input.Body.Nickname)
nickname = &trimmed
}
if input.Body.TimeoutUntil != nil {
if selfEdit {
return nil, humaErrorStatus(http.StatusForbidden, "perm.denied", "you cannot time yourself out")
}
if !resolved.Has(permissions.TimeoutMembers) {
return nil, humaErrorStatus(http.StatusForbidden, "perm.denied", "TIMEOUT_MEMBERS is required")
}