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

4.6 KiB
Raw Blame History

Код-ревью 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. Что я мог пропустить — любые реальные баги/риски, не перечисленные выше.

Правила ответа

  • БЕЗ воды. Только конкретика: файл, функция, строка, суть бага, серьёзность (🔴/🟠/🟡), фикс.
  • Не предлагай «улучшения» вне рамок ревью (рефакторинг, стиль) — только баги и риски.
  • Если тебе нужен контекст, которого нет выше (назначение функции, формат данных, ожидаемое поведение), — задай уточняющий вопрос, не домысливай.
  • В конце — итоговая таблица: баг | файл | строка | серьёзность | что делать.