Files
glchat/.golangci.yml
T
grendervill 16218ee045 feat(auth): сервис аккаунтов и аутентификации Фазы 1
- регистрация: политика пароля (≥10 + локальный словарь 10k утечек, SecLists MIT),
  username и email без учёта регистра, шифрование email с привязкой к аккаунту,
  blind index для поиска, автовступление в главный сервер с ролью @user
- вход: Argon2id+pepper, TOTP при включённом 2FA, блокировка после серии неудач,
  события безопасности; единый ответ на неверный пароль и неизвестный аккаунт
- сессии: opaque-токены (в БД только SHA-256), ротация токена, logout/logout-all,
  отзыв остальных сессий при смене пароля, step-up с окном 10 минут
- 2FA: настройка секрета с QR-URL, подтверждение кодом, 8 резервных кодов
  (хранятся хэшами), обязательность для инстанс-админов, запрет отключения
- тесты на реальной SQLite: регистрация/вход/дубликаты, слабые и утёкшие пароли,
  ротация и logout-all, TOTP и резервные коды, step-up, смена пароля,
  выключенная регистрация, отсутствие секретов в логах
2026-09-19 21:29:07 +03:00

140 lines
3.7 KiB
YAML

version: "2"
run:
timeout: 5m
tests: true
build-tags:
- sqlite_cgo
linters:
default: none
enable:
- asasalint
- bodyclose
- copyloopvar
- depguard
- dogsled
- durationcheck
- errcheck
- errorlint
- exhaustive
- forbidigo
- gocheckcompilerdirectives
- gocritic
- gosec
- govet
- ineffassign
- loggercheck
- misspell
- nilerr
- noctx
- nolintlint
- prealloc
- predeclared
- revive
- rowserrcheck
- sloglint
- sqlclosecheck
- staticcheck
- unconvert
- unparam
- unused
- usestdlibvars
- whitespace
settings:
depguard:
rules:
permissions:
files:
- "**/internal/permissions/**"
deny:
- pkg: "glchat/internal/(auth|guilds|roles|channels|messages|files|invites|voice|search|gateway|emojis|sounds|webhooks|moderation|audit|friends|dm)/"
desc: "permissions must stay a leaf package without domain dependencies"
database:
files:
- "**/internal/database/**"
deny:
- pkg: "glchat/internal/(server|gateway|auth|guilds|roles|channels|messages)/"
desc: "the database package must not import domain packages"
forbidigo:
forbid:
- pattern: 'panic\('
msg: "no panics in handlers or services; return errors instead"
- pattern: 'fmt\.Print.*'
msg: "use log/slog instead of fmt printing"
analyze-types: false
gocritic:
enabled-tags:
- diagnostic
- performance
disabled-checks:
- hugeParam
- rangeValCopy
gosec:
excludes:
- G404
misspell:
locale: US
revive:
rules:
- name: blank-imports
- name: context-as-argument
- name: context-keys-type
- name: error-return
- name: error-strings
- name: error-naming
- name: exported
disabled: true
- name: indent-error-flow
- name: var-naming
- name: unreachable-code
sloglint:
attr-only: true
context: "scope"
staticcheck:
checks:
- all
- -ST1000
- -ST1003
exclusions:
generated: lax
presets:
- comments
- std-error-handling
rules:
- path: "_test\\.go"
linters:
- gosec
- errcheck
- forbidigo
# В тестах пропуски результатов и вспомогательные
# переменные мешают читаемости сильнее, чем помогают.
- dogsled
- prealloc
- unparam
# store: идентификаторы Snowflake заведомо < MaxInt64 (преобразования
# документированы в idToInt/intToID), SQL собирается из константных
# фрагментов шаблона, а значения всегда передаются параметрами.
- path: "internal/store/"
linters:
- gosec
- path: "(^|/)internal/database/sqlc/"
linters:
- revive
- gocritic
- unused
- staticcheck
# gofumpt намеренно не включён в formatters golangci-lint: в v2.13 он сообщает
# о расхождениях, которых `golangci-lint fmt` не устраняет (проверено на v2.13.2).
# gofumpt применяется отдельным инструментом в целях make fmt / make go-lint.
formatters:
enable:
- goimports
settings:
goimports:
local-prefixes:
- glchat
exclusions:
generated: lax