Record verified GRANT fix before integrating upstream chat revisions

This commit is contained in:
evgeny committed 2026-10-26 23:22:57 +01:00
1 parent b8b6636644
commit 012bd650ea
3 files changed
+63 -11

No files matched your search

+51
View File
@@ -17,6 +17,7 @@ Chat: исправление приглашений и проверка конт
По согласованному плану этот дефект исправлен;итоговые контракты и проверки — в разделе исправления chat_attachment ниже.
Продолжение от030336ea:в приёме GRANT подтверждён отдельный дефект — RESULT_ACK при key=NULL;
описание настоящего сетевого обмена,контролей и остановки аудита приведено в конце отчёта.
По поручению пользователя приём GRANT исправлен;до Pull native/sanitizer-профили прошли,интеграция описывается ниже.
Реализация
@@ -558,3 +559,53 @@ ACK и уведомление допустимы после подтверждё
исправление авторской подготовки сохранено. chat_attachment.h и encrypted_attachments.md
остаются[~] в чеклисте,прочие отметки не менялись. По AGENTS.md:10 аудит остановлен на
подтверждённой несогласованности;новая задача открыта. Коммиты локальные,push не выполнялся.
Исправление приёма GRANT — 26.10.2026, до Pull
ak_apply_result выполняет собственный BEGIN IMMEDIATE/COMMIT для четырёх ответов:
REQUEST_ACK/GRANT/DENY/RESULT_ACK. Проверяются prepare,каждый bind,step,ожидаемые числа строк,
finalize и commit. Исходные request.state/incoming и команда outbox читаются вместе;
ключ и состояние требуют одну изменённую строку. DELETE требует одну строку только если
ожидаемая команда существовала:предыдущий REQUEST_ACK или дубликат может уже удалить её.
Это позволяет обнаружить RAISE(IGNORE) для DELETE,сохраняя штатную идемпотентность.
Состояния и конфликты прежнего ключа/решения проверяются до записи;поздний REQUEST_ACK
сохраняет уже применённое решение. Ответы внутри внешней транзакции отклоняются без её изменения.
ACK и уведомление остаются в вызывающем обработчике и выполняются только после commit.
На отказе вся операция откатывается. Общая локальная ak_rollback используется также авторской
подготовкой:если транзакция осталась открыта,модуль quiesce и utun_instance_stop запрашивают
освобождение владельцем после poll. RELEASE после неудачного rollback больше не может
зафиксировать частичное применение ответа. REQUEST/decide/delete/recovery этим не закрываются.
Канальный wire,схема ключей и политика SQLite WAL/NORMAL не менялись.
Постоянный Linux test_attachment_results проверяет105 SQL-отказов и столько же повторов
для четырёх ответов. Это обработчик после router с настоящими core/SQLite и подменой только
доставки ACK:криптографию проверяет отдельный сетевой тест. Все read/key/state/outbox
prepare/bind/step/finalize/changes,BEGIN и COMMIT покрыты точечными wrappers.
В ACK и событии отдельное readonly-соединение проверяет точные committed key/state/outbox;
на отказе нет ACK/события,прежние поля и соседняя запись сохранены. Дополнительно:
настоящий commit hook veto,ABORT/IGNORE для key/state/outbox,внешняя транзакция,
backpressure,повторы GRANT/DENY/ACK,поздний REQUEST_ACK,конфликт ключа/решения,
неудачный rollback с quiesce/stop и закрытием БД владельцем. Баланс u_malloc восстановлен.
Штатный test_encrypted_attachment расширен одним отказом bind первого настоящего GRANT:
снимок до записи совпадает после rollback,ACK=0,автор сохраняет GRANT для повтора.
После реального повтора ключ виден readonly-соединению до отправки ACK,файл расшифровывается;
restart/дубликат/очистка/отказ второму участнику проходят прежний сценарий до phase10.
Сетевые отправки wrapper наблюдает и передаёт настоящему router без изменений.
До Pull native build PASS;профиль attachment_results,chat_attachment,encrypted_attachment,
attachment_send,chat_admin,services,instance_contract,media_primitives —8/8 PASS.
Тот же профиль ASAN/UBSan/LSan8/8 PASS,detect_leaks=1,halt_on_error=1.
Отдельная копия /tmp/utun-grant-key-sanitizers:core/libuasync/Opus инструментированы согласованно,
sanitizer-настройки Opus унаследованы только в копии. Логи /tmp/grant-key-fix-{build,native-results,
asan-build,asan-tests-build,asan-results}.log;полные /tmp/grant-key-fix-{native,asan}-logs.
Исходный диагностический стенд переведён на ожидание rollback без ACK и последующего повтора;
неизменённая старая сетевая фикстура сохранена в /tmp/grant-key-fixture-baseline.c.
Теперь bind-сценарий phase10/PASS,exit0,одна инъекция и два ACK с32 сохранёнными байтами.
Лог /tmp/grant-key-fix-original.log,подробный /tmp/utun_encrypted_attachment_eiewV8/test.log.
Задача исправления закрыта;заголовок и encrypted_attachments.md согласованы.
Отметки attachment/chat остаются[~],полный аудит не возобновляется. По просьбе пользователя
после завершения этой правки выполняется Pull с сохранением входящих доработок чата.
Последующие результаты интеграции и общего прогона будут приведены отдельным разделом.
+1 -1
View File
@@ -37,7 +37,7 @@ Desktop и Android проверяют `instance->running` вместе со св
включая Android-цикл после restart. Запрос из callback завершает цикл после возврата
из текущего poll; уже начатая обработка остальных callbacks этого poll не прерывается.
Владелец затем снимает media-привязки, уничтожает ядро и освобождает uasync.
Это используется также при отказе rollback авторской подготовки вложения, если SQL-транзакция
Это используется также при отказе rollback авторской подготовки вложения или применения ответа о ключе, если SQL-транзакция
осталась открыта: модуль вложений предварительно прекращает приём и снимает свой таймер/router.
Create уже подготавливает listeners, топологию/SQLite, router/proxy и мониторинг;
+11 -10
View File
@@ -4,16 +4,17 @@
## Текущие задачи
[ ] **chat_attachment: не подтверждать GRANT без сохранённого ключа получателя** — подтверждено26.10.2026.
ak_receive игнорирует bind ключа в UPDATE. Один SQLITE_NOMEM оставляет key=NULL,но фиксирует state=2,
отправляет настоящий RESULT_ACK;автор получает его,фиксирует state=4 и удаляет GRANT из outbox.
Проверено на настоящем подписанном/зашифрованном обмене собственных A/S/B/C и readonly SQLite.
Без отказа phase10 PASS;bind-fault ожидаемо exit1 после доказательства ложного ACK;
UPDATE ABORT:нет ACK,state=1,GRANT остаётся у автора,штатный повтор затем phase10 PASS.
Нужна проверенная атомарная операция key+state+outbox с commit до ACK и корректным rollback/fault/retry.
Стенд /tmp/attachment-grant-audit.c/.mk;логи /tmp/attachment-grant-audit-{control,bind,trigger}.log
и test.log в каталогах артефактов;точные пути/контракты — в [chat_audit_findings.txt](chat_audit_findings.txt),аудит приёма GRANT.
По AGENTS.md аудит остановлен;runtime/wire/штатные тесты не менялись,предыдущий фикс send сохранён.
[+] **chat_attachment: не подтверждать GRANT без сохранённого ключа получателя** — исправлено26.10.2026.
Ответы REQUEST_ACK/GRANT/DENY/RESULT_ACK применяются собственной проверенной транзакцией key+state+outbox.
Проверяются все SQL-этапы и ожидаемые числа строк;ACK/событие — после commit,внешняя транзакция отклоняется.
Полный rollback сохраняет прежний ключ/запрос/очередь;оставшаяся открытой БД требует stop владельцем после poll.
Новый test_attachment_results:105 отказов/повторов четырёх ответов,readonly-снимки в ACK/событии,
commit veto,ABORT/IGNORE,внешняя транзакция,дубликаты/конфликты/backpressure и rollback fault.
Штатный сетевой test_encrypted_attachment дополнен bind-fault→без ACK→повтор GRANT→расшифровка.
До Pull native8/8 и ASAN/UBSan/LSan8/8 PASS,detect_leaks=1;исходный сетевой стенд теперь phase10 PASS.
Итоги интеграции с доработками редактирования чата и полный прогон приводятся отдельно в
[chat_audit_findings.txt](chat_audit_findings.txt),исправление приёма GRANT;/tmp/grant-key-fix-*.log.
Полный аудит attachment/chat остаётся частичным;дальнейший аудит остановлен по просьбе пользователя перед Pull.
[+] **chat_attachment: проверять сохранение ключа до передачи source и запуска worker** — исправлено26.10.2026.
Авторская подготовка фиксируется собственной BEGIN IMMEDIATE/COMMIT до передачи source и запуска worker.