From 1a420eeaf087ca5712ff6658a2117c50590c50f8 Mon Sep 17 00:00:00 2001 From: mi Date: Thu, 30 Jul 2026 19:47:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BD=D0=B8=D1=84=D0=B8=D1=86=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D1=8D=D0=BA=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B,=20=D1=82=D1=80=D0=B5=D0=B1=D1=83=D1=8E=D1=89?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8,=20=D0=B2=20=D0=B3=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B2=D0=BE=D0=BC=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backlog.md | 56 ++++++++----------- .../app/dialogs/[dialogId].tsx | 12 ++-- .../frontend-test-site/app/dialogs/index.tsx | 18 +++--- .../app/notifications/index.tsx | 24 +++----- .../frontend-test-site/app/profile.tsx | 15 +++-- .../src/components/GuestAuthGate.tsx | 51 +++++++++++++++++ .../tests/e2e/smoke.spec.ts | 17 +++++- 7 files changed, 124 insertions(+), 69 deletions(-) create mode 100644 codebase/backend/frontend-test-site/src/components/GuestAuthGate.tsx diff --git a/backlog.md b/backlog.md index 81d0964..a6d6adb 100644 --- a/backlog.md +++ b/backlog.md @@ -1,38 +1,33 @@ # Закрыто 21.07-27.07 -1. MVP frontend: один чат с компанией без истории диалогов; пункт «Чат» открывает текущий активный диалог или создаёт его при отсутствии -2. При создании пользователя номер телефона копировать в профиль Russian_Phone -3. Убрать хеширование устройства клиента в devise_json - хочу видеть его параметры. -4. Добавить параметр, ограничивающих кол-во неуспешных попыток ввода смс. -5. Поправить чтение сообщений от Битрикса. Сейчас они выглядят так: "[b]Антон Пичугин:[/b] [br]опять ты?" Надо убрать из текста сообщения Отправителя в битриксе -6. Если неавторизованный пользователь вводит сообщение, после отправки идет на регистрацию, после окончания регистрации его сообщение пропадает. Надо чтобы сохранялось и отправлялось (по аналогии с нажатием на кнопку из раздела "Популярные вопросы") -7. Изменение в БД по аудитам (заполнение IP, сквозное заполнение UserSession) -8. Яндекс.капчу добавить -9. Формы согласий поправить (Согласие на обработку ПД + Политика, Пользовательское соглашение, Реклама) -10. При повторном запросе OTP кода при авторизации не нужно указывать ошибку "Новый код заказан. Предыдущий код больше не действует." -11. Интеграция с СМС-провайдером — спецификация и план rollout зафиксированы в `modules/module-11-idgtl-sms.md`; пункт не закрыт до реализации `sms-service`/worker, Keycloak lifecycle, schema `sms`, callback/nginx, env validation, observability и общего DoD. Production prerequisites: согласованные sender/template, Direct `TOKEN_1`, callback credentials/подтверждённый source IP и статический egress IP. -12. Моделирование уведомлений — постановка v6 синхронизирована с `functional_blocks (business logic)/notification-requirements.md`, arch-00…05 и module-01/03/07. Зафиксированы: instruction только в новой вкладке; TTL только при отсутствии `date_expired`; первое скачивание любого связанного документа скрывает; `producer_test` только для smoke, secret/hash раздельно. -13. Кнопка "Позвонить оператору" (ссылка tel:+74999591007) -14. На главном экране две кнопки: чат и звонок оператору. На кнопке с чатом уведомление при наличии непрочитанных сообщений. +## MVP frontend: один чат с компанией без истории диалогов; пункт «Чат» открывает текущий активный диалог или создаёт его при отсутствии +## При создании пользователя номер телефона копировать в профиль Russian_Phone +## Убрать хеширование устройства клиента в devise_json - хочу видеть его параметры. +## Добавить параметр, ограничивающих кол-во неуспешных попыток ввода смс. +## Поправить чтение сообщений от Битрикса. Сейчас они выглядят так: "[b]Антон Пичугин:[/b] [br]опять ты?" Надо убрать из текста сообщения Отправителя в битриксе +## Если неавторизованный пользователь вводит сообщение, после отправки идет на регистрацию, после окончания регистрации его сообщение пропадает. Надо чтобы сохранялось и отправлялось (по аналогии с нажатием на кнопку из раздела "Популярные вопросы") +## Изменение в БД по аудитам (заполнение IP, сквозное заполнение UserSession) +## Яндекс.капчу добавить +## Формы согласий поправить (Согласие на обработку ПД + Политика, Пользовательское соглашение, Реклама) +## При повторном запросе OTP кода при авторизации не нужно указывать ошибку "Новый код заказан. Предыдущий код больше не действует." +## Интеграция с СМС-провайдером — спецификация и план rollout зафиксированы в `modules/module-11-idgtl-sms.md`; пункт не закрыт до реализации `sms-service`/worker, Keycloak lifecycle, schema `sms`, callback/nginx, env validation, observability и общего DoD. Production prerequisites: согласованные sender/template, Direct `TOKEN_1`, callback credentials/подтверждённый source IP и статический egress IP. +## Моделирование уведомлений — постановка v6 синхронизирована с `functional_blocks (business logic)/notification-requirements.md`, arch-00…05 и module-01/03/07. Зафиксированы: instruction только в новой вкладке; TTL только при отсутствии `date_expired`; первое скачивание любого связанного документа скрывает; `producer_test` только для smoke, secret/hash раздельно. +## Кнопка "Позвонить оператору" (ссылка tel:+74999591007) +## На главном экране две кнопки: чат и звонок оператору. На кнопке с чатом уведомление при наличии непрочитанных сообщений. # Закрыто 28.07-03.08 -19. Подключить OTLP-провайдер -1. Отправлять на UI информацию разные ошибки при попытках авторизации в зависимости от события: код неверен, истёк или уже использован; превышен лимит попыток авторизации, попробуйте через 24 часа (в случаях превышения otp.phone.max_send_attempts_per_24h); превышен лимит неуспешных авторизаций, начните процедуру заново (в случае превышения otp.phone.max_verify_attempts). -23. При отрицательном результате проверки сообщения через message-safety, если сообщение отправлялось с главного экрана, то пользователь не переводится в чат, ему под окном главного экрана выпадает сообщение об ошибке. Не на всех устройствах это видно. Воспринимается как UX-дефект. Как надо: вне зависимости от решения message-safety, если пользователь отправил сообщение, то он переводится на экран с чатом. Далее, сейчас отрицательный результат message-safety выводится пользователю как техническая ошибка (красным цветом под полем ввода сообщения) и опять же воспринимается не как бизнес-логика, а как техническая ошибка. Это поведение нужно поменять. Если сообщение пользователя не прошло проверку, нужно ему в окне чата прислать ответ: Для сообщений: К сожалению, ваше сообщение не соответствует правилам данного чата и не может быть отправлено. Попробуйте переформулировать. Для документов: К сожалению, ваш документ не прошел проверку и не может быть доставлен. -8. UX-дефект: frontend показывает «Не удалось завершить вход» при ошибке отправки отложенного сообщения, хотя вход завершён. Это следует исправить: завершать экран авторизации после bootstrap, а ошибку Bitrix показывать уже в чате (если сообщение отклонено сервисом message-safety, учесть реализацию предыдущего пункта) -22. Ограничить кол-во символов в сообщении на фронте. Показывать в моменте счетчик: n/max, где n сколько символов уже напечатано, max сколько может быть отправлено. Максимальное кол-во символов - положить в app_settings. -7. Убрать с экрана ввода номера телефона тексты согласий внизу экрана: Нажимая «Получить код», вы соглашаетесь с условиями использования и политикой конфиденциальности. Согласия пользователь дает ранее на отдельном экране. - - +## Подключить OTLP-провайдер +## Отправлять на UI информацию разные ошибки при попытках авторизации в зависимости от события: код неверен, истёк или уже использован; превышен лимит попыток авторизации, попробуйте через 24 часа (в случаях превышения otp.phone.max_send_attempts_per_24h); превышен лимит неуспешных авторизаций, начните процедуру заново (в случае превышения otp.phone.max_verify_attempts). +## При отрицательном результате проверки сообщения через message-safety, если сообщение отправлялось с главного экрана, то пользователь не переводится в чат, ему под окном главного экрана выпадает сообщение об ошибке. Не на всех устройствах это видно. Воспринимается как UX-дефект. Как надо: вне зависимости от решения message-safety, если пользователь отправил сообщение, то он переводится на экран с чатом. Далее, сейчас отрицательный результат message-safety выводится пользователю как техническая ошибка (красным цветом под полем ввода сообщения) и опять же воспринимается не как бизнес-логика, а как техническая ошибка. Это поведение нужно поменять. Если сообщение пользователя не прошло проверку, нужно ему в окне чата прислать ответ: Для сообщений: К сожалению, ваше сообщение не соответствует правилам данного чата и не может быть отправлено. Попробуйте переформулировать. Для документов: К сожалению, ваш документ не прошел проверку и не может быть доставлен. +## UX-дефект: frontend показывает «Не удалось завершить вход» при ошибке отправки отложенного сообщения, хотя вход завершён. Это следует исправить: завершать экран авторизации после bootstrap, а ошибку Bitrix показывать уже в чате (если сообщение отклонено сервисом message-safety, учесть реализацию предыдущего пункта) +## Ограничить кол-во символов в сообщении на фронте. Показывать в моменте счетчик: n/max, где n сколько символов уже напечатано, max сколько может быть отправлено. Максимальное кол-во символов - положить в app_settings. +## Убрать с экрана ввода номера телефона тексты согласий внизу экрана: Нажимая «Получить код», вы соглашаетесь с условиями использования и политикой конфиденциальности. Согласия пользователь дает ранее на отдельном экране. +## Перенести секреты из .env в KM Selectel. +## Провести аудит безопасности вм +## Унифицированы гостевые экраны Центра уведомлений, Профиля и Чата: единый стиль сообщения о необходимости входа и кнопка «Авторизоваться». # В разработку: -3. Унифицировать сообщения гостевого режима о необходмости -На экране профиля в гостевом режиме добавить кнопку "Авторизоваться" - - 2. После интеграции с смс провайдером, реализовать debounce механизм при авторизации - каждая след. смс можно отправить через все большее окно. -3. аудит безопасности вм - 5. Store-review вход: точечный bypass в Keycloak OTP SPI по номеру из `.env` (`STORE_REVIEW_ENABLED` / `STORE_REVIEW_PHONE` / `STORE_REVIEW_OTP`) — для этого телефона SMS не шлётся, verify принимает фиксированный OTP; остальные номера идут обычным OTP/SMS. Не путать с глобальным `KEYCLOAK_OTP_MOCK_*`. Учётные данные только в Review Notes стора (не в бинарнике/UI); пользователь с демо-контентом; в production включать только на время ревью. 6. Хранить историю устройств, с которых пользователь входил в ЛК (Ид юзера, идентификатор устройства, дата последнего входа, способ входа - веб\приложение) 9. Веб-пуши для PWA @@ -40,7 +35,7 @@ 12. Описание бизнес сущностей: Пользователь 12. Описание бизнес сущностей: Сообщение 13. Вынести за пределы ВМ1 сервисы message-safety и sync-service. -14. Сделать страницу с инстркцией по установке приложения +14. Сделать страницу с инструкцией по установке приложения 15. Написать пользовательское соглашение. 16. Разработка message-safety 17. Разработка sync-service @@ -49,7 +44,6 @@ 21. Спрятать сеть за балансировщиком нагрузки 22. Автопродление TLS падает при перезагрузке nginx; сертификат действует до 14.10.2026. (Исправить reload внутри контейнера и проверить systemctl start an-chat-ssl-renew.service до успешного завершения.) 23. WireGuard-only SSH. -25. Перенести секреты из .env в KMS Selectel. 26. Запрет входа под root: В /etc/ssh/sshd_config установите PermitRootLogin no. Заходите под обычным пользователем (например, deploy) и используйте sudo для админских задач. 27. Удалите все ненужные пакеты, компиляторы (gcc, make) и сервисы. Чем меньше программ на сервере, тем меньше потенциальных уязвимостей. 28. Монтирование с флагами безопасности: Разделы диска (особенно /tmp и /var/tmp) следует монтировать с флагами noexec (запрет запуска исполняемых файлов) и nosuid (игнорирование битов setuid). @@ -58,7 +52,6 @@ ProtectSystem=strict # Делает всю ОС доступной только для чтения PrivateTmp=yes # Дает процессу свой изолированный /tmp ProtectHome=yes # Скрывает домашние директории пользователей - 24. Добавить логи (Для Python-сервисов добавить OTLP Log Exporter: api-backend; sms-service; sms-worker. Подключить LoggerProvider, BatchLogRecordProcessor и bounded queue. Передавать resource attributes: service.name; service.version; deployment.environment; service.namespace=han-chat.) Экспортировать структурированные поля request_id, trace_id, span_id, severity и event name. Оставить stdout как аварийный локальный журнал. Добавить canary-тесты, запрещающие экспорт токенов, cookie, телефонов, email, текстов сообщений, SQL и object keys.). 25. Nginx metrics/tracing в signoz @@ -66,7 +59,6 @@ На будущее (после доработки отдельных функциональностей): 1. Определение итогового перечня мнемоник, перевод фронтенда на мнемоники, seed заливка мнемоник в БД (?) 2. Моделирование профиля клиента. -3. Реализация мнемоник. 4. Реализовать в полноценном `bitrix-sync` обработчик `document.client_uploaded`: claim/retry/DLQ, идемпотентность по `client_document_id`, группировка по `submission_id`; до этого stub задачи не claim-ит. На анализ: diff --git a/codebase/backend/frontend-test-site/app/dialogs/[dialogId].tsx b/codebase/backend/frontend-test-site/app/dialogs/[dialogId].tsx index b09f888..545de33 100644 --- a/codebase/backend/frontend-test-site/app/dialogs/[dialogId].tsx +++ b/codebase/backend/frontend-test-site/app/dialogs/[dialogId].tsx @@ -5,6 +5,7 @@ import { FlatList, Platform, Text, View } from "react-native"; import { useApp } from "../../src/app-context"; import { ChatInputBar } from "../../src/components/ChatInputBar"; import { ChatScreenHeader } from "../../src/components/ChatScreenHeader"; +import { GuestAuthGate } from "../../src/components/GuestAuthGate"; import { MessageBubble } from "../../src/components/MessageBubble"; import { ScreenShell } from "../../src/components/ScreenShell"; import { isMessageBlockedError } from "../../src/api"; @@ -179,11 +180,12 @@ export default function ChatScreen() { if (app.authStatus !== "authenticated") { return ( - - - Для просмотра чата требуется авторизация. -