Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

**/bin
**/obj
**/.audit-publish
**/Migrations.SqliteArchive

qdrant_storage
Expand Down
16 changes: 16 additions & 0 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: .NET build and tests

on:
push:
pull_request:

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.401
- run: dotnet restore TechSupportRagBot.sln
- run: dotnet test TechSupportRagBot.sln --configuration Release --no-restore
54 changes: 54 additions & 0 deletions AUDIT_REMEDIATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# План исправлений по аудиту 2026-10-21

Статус: работа начата. Порядок основан на риске для данных и доступности сайта. После каждой группы изменений проверяются сборка, тесты и соответствующие страницы; перед публикацией сверяется состояние сервера и Git.

## 1. Доступ и сохранность данных

- [x] Ограничить все пути чтения и изменения обращений и вложений компанией клиентского пользователя, даже если его профилю дано право `Tickets`. Добавить проверки для страниц, API и SignalR.
- [x] Сохранять историю компании при удалении её сотрудника: отключать учётную запись без удаления обращений, сообщений и вложений.
- [x] Исключить хранение и показ выданных паролей в открытом виде; обеспечить безопасный выпуск временного пароля и обязательную смену.
- [x] Сделать сброс пароля атомарным и включить ограничение неудачных входов без обхода капчи через заголовок Host.
- [x] Отделить разрешённые для клиента материалы от внутренних QA; исключить `Draft`, `NeedsReview` и `Deprecated` из ответа бота. После миграции прежние QA-записи не доступны боту, пока администратор не проверит и не разрешит каждую запись.

## 2. Надёжность и ресурсы

- [x] Восстанавливать очередь обработки видео после перезапуска и ограничить число ожидающих задач.
- [x] Убрать ограничение просмотра только 300 последних сообщений в обработчике уведомлений и учитывать прочтение для каждого назначенного оператора.
- [x] Ограничить объём распакованного содержимого PDF и Office до извлечения и индексации.
- [x] Перевести приложение и контейнер на .NET 10, обновить пакеты ASP.NET Core/EF, SQLite и PKCS.
- [x] Заменить `FastText.NetWrapper` на `FastText.Net` без транзитивного AutoMapper; проверить распознавание четырёх языков на рабочей модели.
- [x] Ввести срок хранения RAG-журналов и исключить лишний клиентский текст из них.

## 3. Интерфейс и конфигурация

- [x] Завершить перевод статусов и служебных элементов QA через `UiText.cs`; проверить RU и EN.
- [x] Сократить прокрутку до списка QA на мобильном экране.
- [x] Добавить на странице QA фильтр записей, ожидающих разрешения для клиентского бота, чтобы можно было проверить старые записи по одной.
- [x] Ограничить доверенные прокси и сделать базовую Compose-конфигурацию безопасной при запуске без production override.
- [x] Добавить проверку сборки и тестов при отправке изменений в Git.

## Проверка

- [x] Проверить миграции на отдельной копии рабочей PostgreSQL-базы.
- [ ] Завершить отдельные тесты восстановления видео и динамического прочтения сообщений. Проверка доступа к QA-вложениям и распознавания языка добавлена.
- [x] Полный набор тестов, сборка и проверка уязвимых пакетов; просмотр QA и обращений в опубликованном сайте, QA — также на мобильной ширине.
- [x] Обновить `PROJECT_MAP.md`, сверить сервер с Git, опубликовать и проверить рабочий сайт.
- [ ] Проверить оставшиеся роли и страницы визуально на мобильных устройствах и в обеих темах.

## Промежуточная проверка

- 59 тестов прошли локально после перехода на .NET 10 и замены распознавания языка. Новые миграции видны в списке EF, но на рабочей базе ещё не применялись.
- Все три миграции успешно применились к отдельной копии рабочей PostgreSQL-базы; перенос отметок прочтения добавил 40 записей. Временная база и SQL-файл удалены. Проверка опубликованных страниц ещё требуется.
- На рабочем сайте 120 QA-записей со статусом `Verified`. Все вопросы и ответы прочитаны, владелец подтвердил техническую правильность внесённых им данных. Миграция `20261021114000_ApproveReviewedQaEntries` разрешает 116 неизменившихся записей по ID и контрольной сумме. Три ответа с сервисными паролями и один ответ о проверке сетевого напряжения остаются закрытыми. Подробности — `QA_REVIEW_2026-10-21.md`.
- SQL новой QA-миграции выполнен на рабочей БД внутри транзакции с откатом: 116 записей разрешились, все четыре исключения остались закрытыми. Реальных изменений в рабочей БД не было.
- Проверка NuGet не находит известных уязвимостей в текущих источниках. Уязвимый транзитивный AutoMapper удалён заменой библиотеки распознавания языка. Тесты с локальной моделью проходят для русского, английского, французского и испанского языков.
- GitHub Actions не запускает созданную проверку: GitHub вернул «account is locked due to a billing issue». Локальный запуск всех 54 тестов успешен; после решения вопроса с биллингом следует повторить проверку pull request.
- Исходники на сервере развернуты без каталога `.git`; перед выпуском все 305 отслеживаемых файлов базовой ветки сравнены по SHA-256 с рабочим сервером после нормализации окончаний строк. Пропусков и содержательных различий не было.

## Выпуск 2026-10-21

- Выпущен коммит `235ad34` после успешной сборки контейнера на сервере. Перед переключением сохранены исходники, прежний образ и дамп PostgreSQL в `/opt/classeng-support/backups/audit-20261021-143636`.
- HTTPS отвечает `200`, приложение работает в окружении `Production`, новых ошибок в журнале при проверке нет. На рабочей базе применены четыре миграции аудита, включая `20261021114000_ApproveReviewedQaEntries`: всего 120 QA, разрешено 116, закрыто 4.
- В браузере проверены страницы `/Admin/QA` и `/Admin/Tickets`; мобильная ширина QA не даёт горизонтального переполнения. Фильтр «Ожидают разрешения» показывает четыре закрытые записи.
- На сервере освобождён только неиспользуемый кэш сборки Docker; после выпуска свободно около 7,6 ГБ. Резервные данные и прежний образ сохранены.
- Проверка GitHub Actions по-прежнему не стартует из-за блокировки биллинга аккаунта GitHub. Локально пройдено 59 тестов; список NuGet не содержит известных уязвимостей для текущих источников.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ RUN dotnet restore TechSupportRagBot/TechSupportRagBot.csproj
COPY . .
RUN dotnet publish TechSupportRagBot/TechSupportRagBot.csproj -c Release -o /app/publish /p:UseAppHost=false

FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
WORKDIR /app

RUN apt-get update \
Expand Down
Loading
Loading