feat: integrate upload-platform v0.2.2 into drhider (v0.0.78)
Deploy drhider / validate (push) Canceled after 0s

- Update upload/ module to v0.2.2 with modular Layer 1 (FilePicker) and Layer 2 (Streaming transit upload)
- Replace legacy manual file table in site/templates/index.html with FilePicker.initFilePicker
- Wire uploadViaVM with per-file status updates and abort signal support
- Add dist bundles to dist/ and site/static/dist/ with routes in site/routes/main_bp.py
- Add test_hardening.py and test_safe_name.py from upload-platform
- Bump version to 0.0.78 in site/app.py
- Document integration plan and report in History/upload-integration/
This commit is contained in:
Repinoid
2026-09-15 12:23:31 +03:00
parent 3fd6f1cffc
commit 49bb4d70d8
47 changed files with 6355 additions and 1561 deletions
+6
View File
@@ -18,6 +18,7 @@
| [infra/](infra/) | Инфраструктура: кластер, ingress, RST-диагностика, HTTP/2, ВМ-буфер |
| [ux-frontend/](ux-frontend/) | Фичи фронтенда: таймеры, имена файлов, ZIP-раскрытие, лимиты, прерывание/ETA |
| [upload/](upload/) | Загрузка файлов: диагностика, лимиты, стресс-тесты |
| [upload-integration/](upload-integration/) | Интеграция переиспользуемого модуля upload-platform |
| [code-fixes/](code-fixes/) | Исправления кода по версиям (баги, оптимизация, безопасность, логирование) |
| [tests/](tests/) | Тесты и бенчмарки: замеры UI, обфускация, нагрузка |
@@ -122,6 +123,11 @@
- **2026-08-23-upload-stress-test.md** — тесты загрузки и стресс (v0.0.59–0.0.60, кластер naeel-test-3).
- **2026-08-24-upload-limits.md** — v0.0.62: лимиты 50 МБ на файл, 500 МБ на сессию.
## upload-integration/ — интеграция платформы загрузки
- [README.md](upload-integration/README.md) — стандарт и журнал процесса интеграции `upload-platform`.
- [2026-09-15-upload-platform-integration-plan.md](upload-integration/2026-09-15-upload-platform-integration-plan.md) — детальный архитектурный план и этапы интеграции версии v0.2.2 в drhider.
## code-fixes/ — исправления кода (по версиям)
- **2026-08-31-vm-sync-readme.md** — документирован `rsync` текущего проекта на ВМ
@@ -0,0 +1,102 @@
# План интеграции upload-platform (v0.2.2) в drhider
**Дата:** 2026-09-15
**Статус:** План составлен, ожидает команды на выполнение
**Целевой сервис:** drhider (Managed Flask на платформе Штурвал)
**Источник модуля:** `upload-platform/` (релиз v0.2.2, commit `df0576a`)
---
## 1. Контекст и цели
В `drhider` (v0.0.77) модуль загрузки `upload/` зафиксирован в промежуточном состоянии:
- Фронтенд Слоя 1 использует устаревшую табличную вёрстку с ручным парсингом ZIP без поддержки древовидного сворачивания.
- Слой 2 работает по смешанной схеме, в то время как в `upload-platform` v0.2.2 реализован и протестирован чистый пофайловый транзит (Streaming transit: PUT $\to$ POST `/api/upload_refs` $\to$ исходящий pull в RAM $\to$ немедленный DELETE $\to$ repeat).
**Цель интеграции:**
Заменить устаревшие наработки в `upload/` и `site/templates/index.html` на проверенную автономную версию `upload-platform` v0.2.2 без нарушения бизнес-логики обфускации (Слой 3: LLM, SSE-стриминг, генерация ZIP).
---
## 2. Границы ответственности слоёв
```
┌────────────────────────────────────────────────────────────────────────┐
│ БРАУЗЕР │
│ [ Слой 1: FilePicker ] ──► [ Слой 2: uploadViaVM ] │
└─────────────────────────────────────┬──────────────────────────────────┘
│ 1. PUT файл
▼
┌─────────────────────────────┐
│ ВМ-буфер (RAM WebDAV) │
└──────────────┬──────────────┘
│ 3. Исходящий GET (pull в RAM)
│ 4. DELETE с ВМ
▼
┌────────────────────────────────────────────────────────────────────────┐
│ FLASK BACKEND │
│ [ Слой 2: Blueprint upload_refs ] ──► [ RAM-сессия: add_file ] │
│ │ │
│ [ Слой 3: drhider engine ] ◄─────────────────────┘ get_files(sid) │
│ (SSE-прогресс, обфускация, mapping, download) │
└────────────────────────────────────────────────────────────────────────┘
```
- **Слой 1 (Фронтенд)**: инициализация через `FilePicker.initFilePicker()`. Полностью изолирован от транспорта. Возвращает список объектов `File` через `picker.getFiles()`.
- **Слой 2 (Фронтенд + Бэкенд)**: `uploadViaVM` передаёт файлы по одному через буфер на ВМ в RAM сессии Flask.
- **Слой 3 (drhider)**: логика обфускации забирает готовые файлы из `upload.backend.session.get_files(sid)` и запускает существующий пайплайн (`/api/drhider/<sid>`).
---
## 3. Этапы интеграции
### Этап 1. Синхронизация модуля ядра (`upload/`)
1. Заменить содержимое `upload/` в корне `drhider` на актуальную версию из `upload-platform/upload/`:
- `upload/backend/`: актуальные `upload_refs/` (поддержка `httpxTransport`, безопасный pull, санитизация `safe_name`) и `session/` (хранилище в RAM, TTL, блокировки).
- `upload/frontend/`: чистые ES-модули (`index.js`, `table/`, `upload/`, `zip/` на базе `fflate`).
2. Скопировать готовые бандлы из `upload-platform/dist/` в `site/static/dist/` (или настроить прямую раздачу из `upload/frontend` через `main_bp.py`).
### Этап 2. Проверка и настройка бэкенда (`site/routes/`)
1. Проверить регистрацию Blueprint в [site/routes/__init__.py](site/routes/__init__.py):
```python
app.register_blueprint(create_upload_refs_blueprint({
"apiPrefix": "/api",
"vmUploadPrefix": "https://contracts.kube5s.ru/drhider-upload/",
"maxFileBytes": 50 * 1024 * 1024,
"maxSessionBytes": 500 * 1024 * 1024,
"ttlSeconds": 30 * 60,
"pullRetries": 3,
"pullRetryDelay": 2,
}))
```
2. Убедиться, что [site/routes/api_bp.py](site/routes/api_bp.py) бесшовно использует сессии из обновлённого `upload.backend.session`.
### Этап 3. Обновление пользовательского интерфейса (`site/templates/index.html`)
1. Заменить устаревшую ручную вёрстку таблицы и инпутов на контейнер для монтирования Слой 1:
```html
<div id="file-picker-container"></div>
```
2. Подключить модуль `initFilePicker` и сконфигурировать фильтрацию по `.pdf, .doc, .docx, .txt, .md`.
3. Модифицировать обработчик кнопки «🛡️ Обфусцировать»:
- Вызов `uploadViaVM(files, { vmUploadUrl, backendUploadUrl, onFileStatus, onProgress })`.
- По завершении загрузки всех файлов — автоматический переход к Стек/Фазе 2: запуск SSE-стрима `/api/drhider/<sid>`.
4. Сохранить существующий трёхсекционный рендер обработки (Готово / Обрабатывается / Ожидают) и индикацию ETA/статистики LLM.
### Этап 4. Тестирование и валидация
1. **Автономные тесты модуля `upload`**:
- Запуск pytest для `upload/` внутри `drhider`.
2. **Интеграционные тесты `drhider`**:
- Запуск существующих тестов `tests/test_builder.py`, `tests/test_extractor.py`, `tests/test_replacer.py`, `tests/test_scanner.py`.
3. **Ручная/Smoke проверка сквозного цикла**:
- Выбор одиночного документа, папки и архива ZIP.
- Проверка пофайловой загрузки через буфер и немедленного удаления с ВМ.
- Проверка успешного прохождения двухпроходной обфускации и скачивания результирующего архива.
---
## 4. Контрольные точки (Definition of Done)
- [ ] Все тесты `pytest tests/` завершаются успешно (PASS).
- [ ] Отсутствуют временные файлы на диске (всё в RAM).
- [ ] Не нарушена логика отмены (`cancel`) и работы со стримами SSE.
- [ ] Сборка и синтаксис проверены через `py_compile`.
- [ ] Документ с отчётом о завершении зафиксирован в `History/upload-integration/`.
@@ -0,0 +1,46 @@
# 2026-09-15: Интеграция upload-platform v0.2.2 в drhider
## 1. Цель и контекст
Интеграция протестированного модульного релиза `upload-platform` v0.2.2 в сервис `drhider`.
Версия сервиса повышена: `v0.0.77` $\rightarrow$ `v0.0.78`.
## 2. Выполненные изменения
### Ядро модуля `upload/`
- **Слой 1 (Frontend)**: переход на модульный `initFilePicker` с распаковкой ZIP через `fflate`, древовидным представлением папок и архивов, встроенным сворачиванием/разворачиванием групп и дедупликацией. Устаревшие ручные парсеры удалены.
- **Слой 2 (Transit Upload)**:
- **Frontend**: пофайловый стриминговый транзит `uploadViaVM` (PUT на ВМ $\rightarrow$ POST `/api/upload_refs` $\rightarrow$ исходящий pull $\rightarrow$ DELETE из буфера $\rightarrow$ повтор для следующего файла).
- **Backend**: обновлён Blueprint `create_upload_refs_blueprint`: добавлена поддержка локальных путей/mock-буфера (`is_path_only_prefix`), кастомного `httpxTransport` для безопасного тестирования, возвращение параметра `added`.
- **Session**: in-memory хранилище сессий с потокобезопасным TTL и проверкой лимитов.
### Приложение Flask и маршруты
- В [site/routes/main_bp.py](site/routes/main_bp.py) добавлены маршруты раздачи бандлов: `/file-picker/<path:filename>` и `/dist/<path:filename>`.
- Бандлы `file-picker.iife.js` и `file-picker.esm.js` размещены в `dist/` и `site/static/dist/`.
### Пользовательский интерфейс ([site/templates/index.html](site/templates/index.html))
- Вёрстка выбора файлов заменена контейнером `#filePicker`.
- Инициализирован `FilePicker.initFilePicker` с разрешёнными расширениями (`.pdf`, `.doc`, `.docx`, `.txt`, `.md`).
- Логика кнопки «🛡️ Обфусцировать» переведена на `FilePicker.uploadViaVM` с поддержкой отмены (`AbortController`) и пофайловым отображением статусов.
- Сохранён и адаптирован этап 2 обработки (SSE `/api/process_stream/<sid>`, тикеры времени, статистика LLM, выгрузка ZIP и CSV).
### Тесты
- Скопированы и адаптированы тесты:
- [tests/test_hardening.py](tests/test_hardening.py) (проверка устойчивости, malformed requests, SSRF, traversal).
- [tests/test_safe_name.py](tests/test_safe_name.py) (санитизация путей).
- Обновлён [tests/test_upload.py](tests/test_upload.py) (длина сессии `uuid4().hex` = 32 символа).
## 3. Проверки и верификация
- `pytest tests/`: **39 passed** в 4 тестовых файлах.
- `python3 tests/test_builder.py`: **20/20 PASS**.
- `python3 tests/test_extractor.py`: **10/10 PASS**.
- `python3 tests/test_replacer.py`: **10/10 PASS**.
- `python3 tests/test_scanner.py`: **20/20 PASS**.
- `python3 tests/test_zip.py`: **28/28 PASS**.
- Проверка синтаксиса `py_compile` по всем `.py` файлам проекта: **ALL PY FILES COMPILED OK**.
- Проверка импортов ядра: `from drhider import obfuscate_files, LLMClient` $\rightarrow$ **OK**.
- Проверка HTTP:
- `GET /` $\rightarrow$ **HTTP 200**, HTML отрендерен (28571 байт).
- `GET /health` $\rightarrow$ **HTTP 200**, `{"ok":true,"version":"0.0.78"}`.
- `GET /file-picker/file-picker.iife.js` $\rightarrow$ **HTTP 200** (44465 байт).
+21
View File
@@ -0,0 +1,21 @@
# History / upload-integration — Журнал интеграции upload-platform
В этом каталоге фиксируется полный жизненный цикл интеграции автономного модуля
`upload-platform` (Слой 1: File Picker + Слой 2: пофайловый транзит через ВМ-буфер)
в сервис `drhider`.
## Стандарт ведения документации по интеграции
Каждый этап или значимый результат документируется отдельным файлом по формату:
`YYYY-MM-DD-<краткое-действие>.md`
Обязательные разделы каждого документа:
1. **Цель и контекст**: что делалось, версии компонентов (`drhider`, `upload-platform`).
2. **Выполненные изменения**: затронутые файлы и границы слоёв (Слой 1, Слой 2, Слой 3).
3. **Проверки и тесты**: команды запуска тестов и результаты (PASS/FAIL).
4. **Обнаруженные нюансы/отклонения**: проблемы обратной совместимости, сетевые или платформенные особенности.
## Документы раздела
- [2026-09-15-upload-platform-integration-plan.md](2026-09-15-upload-platform-integration-plan.md) — детальный архитектурный план и этапы интеграции версии v0.2.2 в drhider.
- [2026-09-15-upload-platform-v022-integration-report.md](2026-09-15-upload-platform-v022-integration-report.md) — отчёт об успешной интеграции и верификации v0.2.2 (версия drhider v0.0.78).