Первая версия вложенных файлов работает

This commit is contained in:
AidarKC
2026-09-11 02:38:02 +03:00
parent ea0098d705
commit f9ae811702
29 changed files with 1463 additions and 57 deletions
@@ -228,3 +228,22 @@ DeleteMessage принимает type=5/6. DeleteConversation принимает
- при удалении чата с `friend`/`close_friend` UI должен отдельно предупредить, что одна очистка истории не уберёт строку чата, и при подтверждении снять социальную связь и очистить историю.
Это правило не меняет wire/API-формат DM и не меняет байтовый формат tombstone.
## 15. Файлы в личных сообщениях
Файл не встраивается байтами в `SHiNE_DM`. До отправки DM официальный браузерный клиент:
1. генерирует отдельные случайные `AES-256-GCM` key и IV;
2. шифрует исходный файл локально;
3. вычисляет `fileId = Base58(SHA-256(ciphertext))`;
4. подписанным HTTP `PUT` загружает ciphertext на свой текущий access-сервер;
5. отправляет обычный контентный DM `type=1/2`, plaintext которого начинается с `<S:file...>`.
Внутри `<S:file...>` находятся `fileId`, абсолютный URL сервера отправителя, AES-key/IV и исходная метаинформация файла. Так как весь plaintext контентного DM уже шифруется на ключ получателя/отправителя, сервер не получает ключ файла.
Получатель после E2EE-расшифровки DM скачивает ciphertext непосредственно с указанного access-сервера отправителя, сверяет `SHA-256`, расшифровывает файл в браузере и сохраняет исходный файл.
Отключение функции «Передача файлов» в локальных дополнительных настройках запрещает только отправку новых файлов; ранее полученные `<S:file...>` остаются скачиваемыми.
Хранение ciphertext и HTTP-контракт описаны в `docs/API/18_DM_File_Storage_API.md`.