diff --git a/doc/encrypted_attachments.md b/doc/encrypted_attachments.md index 9813d1f8..099c4b4e 100644 --- a/doc/encrypted_attachments.md +++ b/doc/encrypted_attachments.md @@ -137,8 +137,15 @@ REQUEST=1, REQUEST_ACK=2, GRANT=3, DENY=4, RESULT_ACK=5 контейнера. Конфликтующие ключи и результаты отклоняются. REQUEST_ACK отправляется после сохранения запроса. GRANT/DENY появляются -в outbox только после сохранения решения. Полученный ключ сохраняется до -RESULT_ACK и до запуска расшифровки. Повторы возвращают прежнее решение и не +в outbox только после сохранения решения. Штатно полученный ключ сохраняется до +RESULT_ACK и до запуска расшифровки. Аудит 26.10.2026 выявил открытый дефект этого +подтверждения: ошибка bind ключа при GRANT не проверяется. Получатель может +зафиксировать `key=NULL` вместе со `state=2`, отправить настоящий RESULT_ACK, +а автор — отметить доставку и удалить GRANT из outbox. Это проверено с точечным +SQLITE_NOMEM на собственных узлах через реальный подписанный и зашифрованный обмен; +при UPDATE-ошибке через SQL-триггер откат и повтор работают штатно. +Подробности и граница проверки — в [chat_audit_findings.txt](chat_audit_findings.txt), аудит приёма GRANT. +Повторы возвращают прежнее решение и не создают новых строк. Таймер обрабатывает ограниченную порцию очереди с backpressure и повтором через 5 секунд; restart продолжает очереди. diff --git a/src/chat/chat_attachment.h b/src/chat/chat_attachment.h index 442f6034..7cee9a70 100644 --- a/src/chat/chat_attachment.h +++ b/src/chat/chat_attachment.h @@ -2,7 +2,9 @@ * send готовит контейнер и публикует сообщение; downloaded/want запускают получение ключа и расшифровку. * Автор отвечает на запрос через decide. Ключи и очередь доставки сохраняются в локальной БД. * Все вызовы, кроме identity, — uasync. init после media_async; quiesce до остановки workers, destroy после них. - * Обмен ключами подписан и зашифрован; для доставки нужен живой маршрут обеих сторон. */ + * Обмен ключами подписан и зашифрован; для доставки нужен живой маршрут обеих сторон. + * Известный дефект приёма GRANT: ошибка bind ключа может привести к RESULT_ACK при key=NULL. + * Подтверждение пока не гарантирует сохранение ключа; см. doc/chat_audit_findings.txt, аудит приёма GRANT. */ #ifndef CHAT_ATTACHMENT_H #define CHAT_ATTACHMENT_H #include "../media_async/attachment.h"