mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 01:14:58 +03:00
Разбор аудита, блоки B, C и D. Каждая правка — с тестом. Критичное: - 2FA снималась без пароля: POST /auth/profile/totp/start/ выключал уже включённую 2FA, минуя и текущий пароль, и требование организации, которые спрашивает соседний /disable/. Теперь 409, если 2FA включена. - Сброс пароля по письму оставлял чужие сессии живыми — то есть не помогал ровно в том случае, ради которого пароль и сбрасывают. Сессии завершаются, как при смене пароля из профиля. - HTTPS на домене установки не выпускался никогда: ask-эндпоинт шлюза знал только домены порталов. Теперь он признаёт и адрес самой установки. - WebSocket молча не работал на любой установке с TLS: браузер держит __Host-cookie, а Channels ищет сессию по обычному имени, и HTTP-middleware на хендшейк не выполняется. Добавлен chatballs.http.ws_middleware. Существенное: - Повтор входящего сообщения ронял весь цикл поллинга: IntegrityError ловился без точки сохранения внутри чужой транзакции. - Смена адреса в «Настройках» выбрасывала того, кто её делает. Прежний адрес остаётся принятым (identity.0033). - Редирект уводил скачивание во внутреннюю сеть: политика исходящих проверяла только исходный адрес. Проверка висит на каждом Location. - Портал помощи можно было повесить на адрес установки и подменить сотрудникам приложение своим Help Center. - Пароль прокси уходил в ответ API целиком; теперь маскируется, а маска при сохранении возвращает сохранённый пароль. - /api/v1/health/ready/ закрыт на публичной границе. Мелочи: адрес для A-записи портала считается от адреса установки, а не от 127.0.0.1; колонка EncryptedCharField вмещает шифротекст, а не открытое значение; WS-маршруты проверяют Origin; мёртвый require_organization_scope убран. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>