Вход в бота только по одноразовому QR-приглашению. Админ в «👥 Участники» выпускает QR, видит участников и отзывает доступ. Неавторизованным — одна фраза в сутки, дальше тишина; перебор токенов глушится.
make lint && make test# 73 теста: сервис + полный сценарий через Dispatcher
Вживую (после токена бота): админ → «👥 Участники» → «➕ Пригласить» → QR → второй аккаунт сканирует → меню без «Участников»; третий аккаунт тем же QR → отказ; отзыв → кнопки бывшего участника молчат.
Заметки
Гонка двух сканов одного QR проверена на Postgres: 20 параллельных попыток → ровно 1 успех.
Права админа теперь по роли в БД; ADMIN_IDS только заводит первых админов при старте.
## Что меняется
Вход в бота только по одноразовому QR-приглашению. Админ в «👥 Участники» выпускает QR, видит участников и отзывает доступ. Неавторизованным — одна фраза в сутки, дальше тишина; перебор токенов глушится.
Closes #25
## Как проверить
```bash
make lint && make test # 73 теста: сервис + полный сценарий через Dispatcher
```
Вживую (после токена бота): админ → «👥 Участники» → «➕ Пригласить» → QR → второй аккаунт сканирует → меню без «Участников»; третий аккаунт тем же QR → отказ; отзыв → кнопки бывшего участника молчат.
## Заметки
- Гонка двух сканов одного QR проверена на Postgres: 20 параллельных попыток → ровно 1 успех.
- Права админа теперь по роли в БД; `ADMIN_IDS` только заводит первых админов при старте.
## Чек-лист
- [x] ветка от origin/dev
- [x] lint + тесты зелёные
- [x] секретов в диффе нет
- [x] лог в issue дописан
🤖 Generated with [Claude Code](https://claude.com/claude-code)
- AccessService: одноразовые приглашения (128 бит, в БД только sha256, TTL 24 ч),
атомарный захват приглашения (условный UPDATE — из двух сканов одного QR проходит один),
антиперебор (> 5 неудач в час — молчание), отзыв (черновик и FSM удаляются), повторное приглашение
- ADMIN_IDS заводятся в БД при старте; дальше — только по приглашению
- AccessMiddleware: участники из БД (+ last_seen раз в 5 мин), новичкам — только /start <токен>
- «👥 Участники» для админов: список, QR (segno) + ссылка, отзыв с подтверждением
- один ответ на неверный/истёкший/использованный токен — без подсказок
Refs #25
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что меняется
Вход в бота только по одноразовому QR-приглашению. Админ в «👥 Участники» выпускает QR, видит участников и отзывает доступ. Неавторизованным — одна фраза в сутки, дальше тишина; перебор токенов глушится.
Closes #25
Как проверить
Вживую (после токена бота): админ → «👥 Участники» → «➕ Пригласить» → QR → второй аккаунт сканирует → меню без «Участников»; третий аккаунт тем же QR → отказ; отзыв → кнопки бывшего участника молчат.
Заметки
ADMIN_IDSтолько заводит первых админов при старте.Чек-лист
🤖 Generated with Claude Code
Pull request closed