Files
drhider/docs/code-review-sonnet.md
T

71 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Код-ревью 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/<sid>` (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. **Что я мог пропустить** — любые реальные баги/риски, не перечисленные выше.
## Правила ответа
- БЕЗ воды. Только конкретика: файл, функция, строка, суть бага, серьёзность (🔴/🟠/🟡), фикс.
- Не предлагай «улучшения» вне рамок ревью (рефакторинг, стиль) — только баги и риски.
- Если тебе нужен контекст, которого нет выше (назначение функции, формат данных,
ожидаемое поведение), — **задай уточняющий вопрос, не домысливай**.
- В конце — итоговая таблица: баг | файл | строка | серьёзность | что делать.