From 82acc84311ba039abd088bf15fa2d537be6ce573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 24 Aug 2026 19:37:36 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=BF=D1=80=D0=BE=D0=BC=D0=BF=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=B4-=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E=20=D0=A1=D0=BE=D0=BD=D0=BD=D0=B5=D1=82=D0=BE=D0=BC?= =?UTF-8?q?=20=E2=80=94=20=D1=81=D1=82=D1=80=D0=BE=D0=B3=D0=BE=20=D0=BE?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=BE=D0=B2=20+=208=20=D0=B2=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/code-review-sonnet.md | 70 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 docs/code-review-sonnet.md diff --git a/docs/code-review-sonnet.md b/docs/code-review-sonnet.md new file mode 100644 index 0000000..b569255 --- /dev/null +++ b/docs/code-review-sonnet.md @@ -0,0 +1,70 @@ +# Код-ревью DrHider — промпт для Соннета + +Ты — строгий ревьюер. Проведи код-ревью сервиса DrHider (Flask + vanilla JS) — +обфускация персональных данных в документах. + +## СТРОГО просматривай ТОЛЬКО эти файлы (больше ничего не читай) + +- `site/app.py` +- `site/routes/api_bp.py` +- `site/session.py` +- `site/templates/index.html` +- `drhider/__init__.py` +- `drhider/builder.py` +- `drhider/config.py` +- `drhider/extractor.py` +- `drhider/llm_client.py` +- `drhider/obfuscator.py` +- `drhider/replacer.py` +- `drhider/scanner.py` + +НЕ смотри: `History/`, `docs/`, `tests/`, `file_list.csv`, `files/`, `TMP/`, `TSTFILES/`. + +## Контекст (кратко, не лезь в файлы) + +- Загрузка файлов: браузер → PUT на ВМ-буфер (`contracts.kube5s.ru/drhider-upload/`), + затем `POST /api/upload_refs` → Flask тянет файлы egress-GET (pull) в сессию. +- Обработка: `GET /api/process_stream/` (SSE) → воркер-поток → `obfuscate_files()` + → извлечение текста → regex+LLM-сканирование → замена → ZIP + mapping.csv. +- Лимиты: 50 МБ/файл, 500 МБ/сессия. +- Есть мягкая отмена (кнопка «Прервать», `cancel_event`). + +## Вопросы — ответь по каждому, с указанием файла и строки + +1. **Корректность загрузки** (`api_bp.py::upload_refs`, `index.html::uploadFiles`): + - атомарность pull при ошибке на середине списка файлов; + - ретраи при DNS/сетевых сбоях — покрыты ли все transient-ошибки; + - различимы ли «сессия не найдена» vs «превышен лимит сессии». + +2. **SSE/потоки** (`api_bp.py::process_stream`, `obfuscator.py`): + - корректна ли обработка disconnect клиента и остановка воркера; + - нет ли гонок при `cancel_event`/`queue`/`pause_ttl`/`resume_ttl`; + - TTL сессии: не умирает ли сессия во время долгой обработки. + +3. **Соответствие индексов** фронт↔бэк (события `start/done/file_*` с `idx`): + - `obfuscator.py::expand_zips` и `_dedupe_file_names` могут изменить число/порядок файлов + после того, как фронт уже построил список — не ломается ли `sendIdx[d.idx]`? + +4. **Статусы файлов** (`index.html`): консистентность «пропущен (лимит)» / «не извлечён» / + «done» / «analyzed» / «pending»; нет ли путей, где статус зависает или перетирается. + +5. **Безопасность** (`extractor.py`, `session.py`, `api_bp.py`): + - path traversal через имена файлов (в т.ч. из ZIP); + - zip-бомба (расширение, сжатие, суммарный размер); + - инъекции/экранирование имён в HTML (`index.html` — вывод имён файлов). + +6. **Утечки/ресурсы**: закрытие `httpx`-сессий, `zipfile`, `EventSource`/`XHR`, таймеры + (`setInterval`) — всё ли очищается в `resetAll`/`finishProcUI`/`finally`. + +7. **Краевые случаи**: пустой файл, файл без текста, битый PDF, дубли имён, отмена + на каждом этапе, 0 файлов, все файлы сверх лимита. + +8. **Что я мог пропустить** — любые реальные баги/риски, не перечисленные выше. + +## Правила ответа + +- БЕЗ воды. Только конкретика: файл, функция, строка, суть бага, серьёзность (🔴/🟠/🟡), фикс. +- Не предлагай «улучшения» вне рамок ревью (рефакторинг, стиль) — только баги и риски. +- Если тебе нужен контекст, которого нет выше (назначение функции, формат данных, + ожидаемое поведение), — **задай уточняющий вопрос, не домысливай**. +- В конце — итоговая таблица: баг | файл | строка | серьёзность | что делать.