71 lines
4.6 KiB
Markdown
71 lines
4.6 KiB
Markdown
# Код-ревью 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. **Что я мог пропустить** — любые реальные баги/риски, не перечисленные выше.
|
||
|
||
## Правила ответа
|
||
|
||
- БЕЗ воды. Только конкретика: файл, функция, строка, суть бага, серьёзность (🔴/🟠/🟡), фикс.
|
||
- Не предлагай «улучшения» вне рамок ревью (рефакторинг, стиль) — только баги и риски.
|
||
- Если тебе нужен контекст, которого нет выше (назначение функции, формат данных,
|
||
ожидаемое поведение), — **задай уточняющий вопрос, не домысливай**.
|
||
- В конце — итоговая таблица: баг | файл | строка | серьёзность | что делать.
|