v0.0.75: кнопка disabled при 0 файлов, фильтр документов в expand_zips, README-риски
Deploy drhider / validate (push) Canceled after 0s

This commit is contained in:
“Naeel”
2026-08-24 20:18:44 +03:00
parent 6c51df96d9
commit eaa064a721
6 changed files with 46 additions and 2 deletions
+1
View File
@@ -106,6 +106,7 @@
- **2026-08-24-time-tickers-estimates.md** — v0.0.640.0.65: тикер текущего файла на всех этапах, мгновенные оценки времени по файлам и суммарно.
- **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-v075-small-fixes.md** — v0.0.75: кнопка при 0 файлов, фильтр zip (idx-мисматч), README-риски; замечен закоммиченный LLM_API_KEY.
- **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-pull-retry-limit-counter.md** — v0.0.72: ретраи pull из ВМ, корректная ошибка лимита сессии, счётчик дедупа.
@@ -0,0 +1,27 @@
# v0.0.75 — кнопка при 0 файлов, фильтр zip, README-риски (2026-08-24)
_code-fixes. Закрытие отложенных пунктов списка «что далее»._
## Что сделано
1. **Кнопка «Обфусцировать» активна при 0 файлов** (`index.html::resetAll`) —
убрано перекрытие `ub.disabled = false` после `rr()` (rr() уже ставит disabled при пустом списке).
Из TODO (`docs/WhatTODO.md`, пункт 1).
2. **idx-мисматч `expand_zips`** (`drhider/extractor.py`) — синхронизирован фильтр расширений
с фронтом `listZipFiles`: из zip берутся ТОЛЬКО документы (`.pdf .doc .docx .txt .md`)
и вложенные `.zip`. Unit-тест: zip [txt,pdf,xlsx,ini] → раскрыты только txt,pdf.
3. **README** — добавлена секция «Известные ограничения / риски»: LLM prompt injection,
кейс «zip без документов».
## Не сделано (решение)
- **`session_files` оставлен** — используется для диагностики (тесты),
SID теперь 128-бит (не угадывается), риск мал.
## ⚠️ Замечено (требует решения)
- В `README.md` в открытом виде закоммичен `LLM_API_KEY` (секрет!). Желательно вынести
в переменные окружения Штурвала и убрать из README.
## Проверка
- `py_compile` (app.py, extractor.py) — OK; `node --check` — OK.
- `expand_zips` unit-тест — OK (только документы).
- `resetAll` больше не содержит `ub.disabled = false` (5 оставшихся мест — нужные ветки).
- Версия 0.0.74 → 0.0.75.
+12
View File
@@ -118,6 +118,18 @@ git add -A && git commit -m "подробное описание" && git push
---
## Известные ограничения / риски
- **LLM prompt injection**: текст документа вставляется в LLM-промпт дословно; вредоносный
документ может содержать инструкции, подавляющие обнаружение персональных данных.
Итог — неполная обфускация без явной ошибки. Известный класс риска (не фикс кода),
обнаружен при код-ревью (2026-08-24, `History/sonnet/2026-08-24-code-review-sonnet.md`).
- **ZIP без документов**: фронт добавляет такой ZIP в список как есть (v0.0.69), бэк
раскрывает из него только документы (фильтр расширений, v0.0.75); файлы без документов
в результат не попадают.
---
## Связь с ВМ contracts (legacy)
На ВМ `5.172.178.213` (contracts.kube5s.ru) есть старая версия drhider:
+4
View File
@@ -336,6 +336,10 @@ def expand_zips(files: List[Tuple[str, bytes, str]]) -> List[Tuple[str, bytes, s
name = os.path.basename(name)
if not name:
continue
# Синхронизация с фронтом (listZipFiles): из zip берём ТОЛЬКО документы
low = name.lower()
if not (low.endswith('.zip') or low.endswith(('.pdf', '.doc', '.docx', '.txt', '.md'))):
continue
inner_data = zf.read(info)
total_uncompressed += len(inner_data)
+1 -1
View File
@@ -21,7 +21,7 @@ if _sys_path_root not in sys.path:
sys.path.insert(0, _sys_path_root)
# Версия приложения (меняется при изменениях)
VERSION = "0.0.74"
VERSION = "0.0.75"
def setup_logging():
+1 -1
View File
@@ -264,7 +264,7 @@ function resetAll() {
db.classList.remove('show');
document.getElementById('statsBlock').classList.remove('show');
document.getElementById('liveBlock').classList.remove('show');
ub.disabled = false;
// Кнопку «Обфусцировать» НЕ перекрываем: rr() уже поставил disabled при пустом списке
}
// При F5 / закрытии вкладки — обрубить всё