feat: DrHider MVP — two-pass document obfuscation service
Deploy contracts-flask / validate (push) Successful in 0s
Deploy contracts-flask / validate (push) Successful in 0s
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
# Запрос Opus — ревью реализации DrHider
|
||||
|
||||
Дата: 29.06.2026
|
||||
|
||||
## Контекст
|
||||
|
||||
Написан MVP сервиса обфускации документов. Код в трёх файлах. Нужно ревью: что упущено, что сломается, что улучшить.
|
||||
|
||||
## Файлы (все в contracts-flask)
|
||||
|
||||
1. **`deploy/services/drhider.py`** — ядро (≈280 строк)
|
||||
2. **`site/templates/drhider.html`** — страница загрузки
|
||||
3. **`site/app.py`** — добавлены роуты `/DrHider` и `POST /api/drhider`
|
||||
|
||||
## Что реализовано
|
||||
|
||||
### Двухпроходная обфускация
|
||||
- **Проход 1 (сбор сущностей):** regex-паттерны (телефон, email, ИНН/ОГРН/КПП, БИК, р/с, к/с, паспорт) + COMPANY_PATTERN (ООО/ЗАО/АО/ИП) + опционально LLM-NER для имён/адресов.
|
||||
- Глобальный словарь `_mapping[оригинал] = замена` обеспечивает согласованность: одна сущность → одна замена во всех файлах.
|
||||
- **Проход 2 (замена):** docx — замена в `paragraphs.runs` и `tables.cells` (python-docx). PDF — read-only через pdfplumber, замена по тексту (без сохранения форматирования — осознанное ограничение MVP).
|
||||
|
||||
### Генераторы фиктивных значений
|
||||
- Телефон: `+7 (XXX) XXX-XX-XX` с реальными кодами городов.
|
||||
- Email: `<random>@example.ru` (фиктивные домены).
|
||||
- ИНН/ОГРН: валидные контрольные суммы.
|
||||
- Компании: ООО «<существительное>» из словаря.
|
||||
- ФИО: русские фамилия + инициалы из словарей.
|
||||
- Адреса: город + улица + дом из словарей.
|
||||
- Паспорт: `XX XX XXXXXX`.
|
||||
|
||||
### Безопасность
|
||||
- Вся обработка в памяти.
|
||||
- Temp-директория для конвертации `.doc` → `.docx` — удаляется в `finally`.
|
||||
- Никакой БД, никакого логирования реальных данных.
|
||||
- `mapping.csv` — внутри ZIP, уходит пользователю.
|
||||
|
||||
### UI
|
||||
- Drag&drop, выбор файлов, прогресс.
|
||||
- Кнопка «Обфусцировать» → POST /api/drhider → скачивание ZIP.
|
||||
|
||||
## Вопросы к ревью
|
||||
|
||||
### 1. Согласованность замены
|
||||
Сейчас `_mapping` — плоский словарь `строка → строка`. Если в одном файле «Иванов И.И.», а в другом «Иванов Иван Иванович» — это разные ключи, получат разные замены. Как правильно решить?
|
||||
|
||||
### 2. PDF
|
||||
MVP: текст из PDF извлекается, заменяется, отдаётся как `.txt` внутри ZIP. Реальное решение — pymupdf (AGPL) или reportlab? Что посоветуешь?
|
||||
|
||||
### 3. .doc → .docx конвертация
|
||||
Не реализована в этом MVP — файлы .doc просто читаются как текст. Нужно libreoffice (как в `convert_doc.py`) или есть способ проще?
|
||||
|
||||
### 4. LLM-NER
|
||||
Сейчас опционален. Промпт просит JSON-массив сущностей. Не слишком ли медленно для 100+ файлов? Как оптимизировать?
|
||||
|
||||
### 5. Замена в docx через runs
|
||||
python-docx разбивает текст на runs. Слово может быть разбито на несколько runs — замена ломается. Как обойти?
|
||||
|
||||
### 6. Номера договоров
|
||||
Сейчас НЕ заменяются (нужны для группировки). Но это реальные данные — утечка. Как сделать чтобы были уникальные псевдонимы, но группировка не ломалась?
|
||||
|
||||
### 7. Упущенные типы данных
|
||||
Что ещё нужно заменять, чего нет в текущих паттернах? (Колонтитулы? Сноски? Изображения с текстом? Подписи?)
|
||||
|
||||
### 8. Архитектура
|
||||
Код в одном файле drhider.py — нормально для MVP или уже пора разбивать?
|
||||
|
||||
### 9. Edge cases
|
||||
- Пустой файл?
|
||||
- ZIP с вложенным ZIP?
|
||||
- PDF без текста (сканированный)?
|
||||
- Файл с паролем?
|
||||
|
||||
## Ожидаемый ответ
|
||||
По каждому вопросу: **что не так → как исправить → приоритет (MVP/позже/опционально)**.
|
||||
Reference in New Issue
Block a user