feat(cli): включение 2FA инстанс-админа командой totp-setup
2FA обязательна для инстанс-администраторов, но до её включения вход закрыт — получался замкнутый круг. Добавлены команды обслуживания: - `glchat totp-setup --email <admin>`: создаёт секрет, подтверждает его кодом, печатает секрет, otpauth-ссылку и 8 резервных кодов (каждый одноразовый); - `glchat totp-reset --email <admin>`: удаляет секрет при потере устройства; - код `auth.2fa_enrollment_required` с подсказкой, какую команду выполнить; - установщик: флаг `--admin-2fa` для автоматического включения (по умолчанию печатает подсказку, чтобы секреты не оседали в логах установки). Проверено сквозным прогоном локально: bootstrap → 403 на входе без 2FA → totp-setup → вход с TOTP-кодом → профиль, серверы, комнаты, роли, участники, аудит, создание сервера админом, 429 на шестой попытке входа, секретов в логах нет.
This commit is contained in:
@@ -33,8 +33,8 @@ func newAPIError(err error) apiError {
|
||||
case errors.Is(err, auth.ErrTOTPInvalid):
|
||||
candidate.Status, candidate.Code, candidate.Message = http.StatusBadRequest, "auth.totp_invalid", "invalid two-factor code"
|
||||
case errors.Is(err, auth.ErrInstanceAdminTOTP):
|
||||
candidate.Status, candidate.Code = http.StatusForbidden, "auth.2fa_required"
|
||||
candidate.Message = "instance administrators must enable two-factor authentication"
|
||||
candidate.Status, candidate.Code = http.StatusForbidden, "auth.2fa_enrollment_required"
|
||||
candidate.Message = "instance administrator must enable two-factor authentication: run `glchat totp-setup --email <admin>` on the server"
|
||||
case errors.Is(err, auth.ErrSessionExpired):
|
||||
candidate.Status, candidate.Code, candidate.Message = http.StatusUnauthorized, "auth.session_expired", "session expired"
|
||||
case errors.Is(err, auth.ErrStepUpRequired):
|
||||
|
||||
Reference in New Issue
Block a user