44 lines
1.6 KiB
Markdown
44 lines
1.6 KiB
Markdown
# DrHider — Cyrillic filenames in ZIP fix (2026-07-07)
|
|
|
|
## Проблема
|
|
Кириллические имена файлов в выходном ZIP отображаются кракозябрами
|
|
(CP437 вместо UTF-8). Содержимое файлов — OK.
|
|
|
|
## Причина (двойная)
|
|
1. **Мультипарт-парсер** в `drhider_server.py` декодирует HTTP-заголовки как `latin-1`,
|
|
но браузеры/curl шлют имена файлов в UTF-8. Результат — Mojibake.
|
|
2. **`_build_zip`** в `drhider.py` — `zipfile.ZipFile` в режиме записи кодирует
|
|
имена в CP437, флаг UTF-8 не ставится.
|
|
|
|
## Решение
|
|
### Часть 1: мультипарт (drhider_server.py)
|
|
```python
|
|
name = os.path.basename(m.group(1))
|
|
try:
|
|
name = name.encode('latin-1').decode('utf-8')
|
|
except (UnicodeDecodeError, UnicodeEncodeError):
|
|
pass
|
|
```
|
|
|
|
### Часть 2: ZIP (drhider.py)
|
|
```python
|
|
# Было:
|
|
zf.writestr(fname, content)
|
|
|
|
# Стало:
|
|
info = zipfile.ZipInfo(fname)
|
|
info.flag_bits |= 0x800
|
|
zf.writestr(info, content)
|
|
```
|
|
|
|
## Затронутые файлы
|
|
- ВМ: `/home/naeel/contracts/drhider/drhider.py` → `_build_zip`
|
|
- ВМ: `/home/naeel/contracts/drhider/drhider_server.py` → multipart parser
|
|
- `contracts-flask/deploy/drhider/drhider.py`
|
|
- `contracts-flask/deploy/drhider/drhider_server.py`
|
|
- `contracts-flask/site/services/drhider.py`
|
|
|
|
## Важно
|
|
- `metadata_encoding='utf-8'` НЕ РАБОТАЕТ в Python 3.12.3 на запись
|
|
- После правки `.py` → `rm -rf __pycache__` перед перезапуском
|