v0.0.74: отмена в extract-фазе — прерывание не ждёт все .doc-конвертации
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
@@ -106,6 +106,7 @@
|
|||||||
- **2026-08-24-time-tickers-estimates.md** — v0.0.64–0.0.65: тикер текущего файла на всех этапах, мгновенные оценки времени по файлам и суммарно.
|
- **2026-08-24-time-tickers-estimates.md** — v0.0.64–0.0.65: тикер текущего файла на всех этапах, мгновенные оценки времени по файлам и суммарно.
|
||||||
- **2026-08-24-folder-select-implemented.md** — v0.0.68: кнопка «Выбрать папку» (webkitdirectory, рекурсивно, относительный путь).
|
- **2026-08-24-folder-select-implemented.md** — v0.0.68: кнопка «Выбрать папку» (webkitdirectory, рекурсивно, относительный путь).
|
||||||
- **2026-08-24-folder-zip-not-lost.md** — v0.0.69: архивы из папки без документов не теряются (добавляются как есть); раскрытие zip с документами; склонение счётчика.
|
- **2026-08-24-folder-zip-not-lost.md** — v0.0.69: архивы из папки без документов не теряются (добавляются как есть); раскрытие zip с документами; склонение счётчика.
|
||||||
|
- **2026-08-24-v074-cancel-extract.md** — v0.0.74: отмена в extract-фазе (не ждём все .doc).
|
||||||
- **2026-08-24-v073-security-fixes.md** — v0.0.73: 6 фиксов по ревью Соннета (SSRF, path traversal, слабый SID, proc_error, zip-бомба, self-XSS); 1 отклонено (cleanup), 5 отложено.
|
- **2026-08-24-v073-security-fixes.md** — v0.0.73: 6 фиксов по ревью Соннета (SSRF, path traversal, слабый SID, proc_error, zip-бомба, self-XSS); 1 отклонено (cleanup), 5 отложено.
|
||||||
- **2026-08-24-pull-retry-limit-counter.md** — v0.0.72: ретраи pull из ВМ, корректная ошибка лимита сессии, счётчик дедупа.
|
- **2026-08-24-pull-retry-limit-counter.md** — v0.0.72: ретраи pull из ВМ, корректная ошибка лимита сессии, счётчик дедупа.
|
||||||
- **2026-08-24-code-review-sonnet.md** — код-ревью Соннета: 15 багов (SSRF, path traversal, слабый SID, zip-бомба и др.), промпт в docs/code-review-sonnet.md.
|
- **2026-08-24-code-review-sonnet.md** — код-ревью Соннета: 15 багов (SSRF, path traversal, слабый SID, zip-бомба и др.), промпт в docs/code-review-sonnet.md.
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# v0.0.74 — отмена в extract-фазе (2026-08-24)
|
||||||
|
|
||||||
|
_code-fixes. Доработка по код-ревью Соннета (пункт «отмена не работает в extract-фазе»)._
|
||||||
|
|
||||||
|
## Что сделано (`drhider/obfuscator.py`)
|
||||||
|
- В проходе 1 (извлечение) добавлена проверка `cancel_event.is_set()` между файлами:
|
||||||
|
при отмене цикл извлечения прерывается (`break`), LLM-сканирование пропускается,
|
||||||
|
результат помечается `cancelled` (processed=0, пустой ZIP + mapping.csv только заголовок).
|
||||||
|
- Раньше отмена ждала завершения ВСЕХ извлечений, включая медленные `.doc` (liberta, до 120с/файл).
|
||||||
|
|
||||||
|
## Проверка
|
||||||
|
- `py_compile` — OK, `import` drhider — OK.
|
||||||
|
- Unit-тест: `cancel_event` установлен до старта → `meta={'cancelled': True, 'processed': 0, 'total': 2}`,
|
||||||
|
пустой ZIP (22 Б), CSV только заголовок.
|
||||||
|
|
||||||
|
## Критично к Соннету (по итогам проверки)
|
||||||
|
- **«LLM-таймаут тихо обнуляет чанк»** — ОТКЛОНЕНО: `_call_llm` уже логирует
|
||||||
|
(`log.warning("LLM NER failed: %s", e)`) в `except Exception`. Таймаут не «тихий».
|
||||||
|
- **«cleanup после /download»** — ОТКЛОНЕНО ранее (ZIP и CSV скачиваются раздельно, см. v0.0.73).
|
||||||
|
|
||||||
|
## Осталось (не трогаем, задокументировано)
|
||||||
|
- idx-мисматч `expand_zips` (фильтр расширений) — краевой случай, спорное поведение.
|
||||||
|
- LLM prompt injection — класс риска, не фикс кода.
|
||||||
|
- debug-эндпоинт `session_files` — мелочь, может сломать тесты.
|
||||||
|
|
||||||
|
Версия 0.0.73 → 0.0.74.
|
||||||
@@ -140,7 +140,13 @@ class TwoPassObfuscator:
|
|||||||
# Без параллельности: liberta не выдерживает конкурентные вызовы
|
# Без параллельности: liberta не выдерживает конкурентные вызовы
|
||||||
# (libreoffice падает с javaldx).
|
# (libreoffice падает с javaldx).
|
||||||
|
|
||||||
|
cancelled_extract = False
|
||||||
for i, (fname, content, ctype) in enumerate(files):
|
for i, (fname, content, ctype) in enumerate(files):
|
||||||
|
# Мягкая остановка в фазе извлечения (между файлами) — не ждём все .doc
|
||||||
|
if cancel_event is not None and cancel_event.is_set():
|
||||||
|
log.info("obfuscate: cancelled during extract, processed=%d/%d", i, total)
|
||||||
|
cancelled_extract = True
|
||||||
|
break
|
||||||
display_name = os.path.basename(fname) or fname
|
display_name = os.path.basename(fname) or fname
|
||||||
if progress_cb:
|
if progress_cb:
|
||||||
progress_cb("start", i, total, display_name, 0.0)
|
progress_cb("start", i, total, display_name, 0.0)
|
||||||
@@ -168,8 +174,8 @@ class TwoPassObfuscator:
|
|||||||
per_file={fname: len(t) for fname, t in all_texts.items()})
|
per_file={fname: len(t) for fname, t in all_texts.items()})
|
||||||
|
|
||||||
# LLM-сканирование (получает уже найденное regex'ом чтобы не дублировать)
|
# LLM-сканирование (получает уже найденное regex'ом чтобы не дублировать)
|
||||||
cancelled_llm = False
|
cancelled_llm = cancelled_extract
|
||||||
if self._llm_client:
|
if not cancelled_llm and self._llm_client:
|
||||||
try:
|
try:
|
||||||
scanner.scan_llm_ner(
|
scanner.scan_llm_ner(
|
||||||
all_texts, self._mapping, self._llm_client, self._counters,
|
all_texts, self._mapping, self._llm_client, self._counters,
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ if _sys_path_root not in sys.path:
|
|||||||
sys.path.insert(0, _sys_path_root)
|
sys.path.insert(0, _sys_path_root)
|
||||||
|
|
||||||
# Версия приложения (меняется при изменениях)
|
# Версия приложения (меняется при изменениях)
|
||||||
VERSION = "0.0.73"
|
VERSION = "0.0.74"
|
||||||
|
|
||||||
|
|
||||||
def setup_logging():
|
def setup_logging():
|
||||||
|
|||||||
Reference in New Issue
Block a user