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