diff --git a/doc/group_isolation_plan.txt b/doc/group_isolation_plan.txt index d617ad0f3..3beb81eea 100644 --- a/doc/group_isolation_plan.txt +++ b/doc/group_isolation_plan.txt @@ -1,7 +1,7 @@ Межгрупповой доступ: план изоляции CHAT-групп Дата: 03.11.2026 Статус: этап 1 реализован; доработаны CONN_MGR, MEMBER_FILES, GROUP_AVATAR, -ADMIN_KEY, RADIO_CALL, routed JOIN, CHAT NAT_DETECTION и MULTICAST_REPORT из этапа 2, +ADMIN_KEY, RADIO_CALL, routed JOIN, CHAT NAT_DETECTION, MULTICAST_REPORT и ATTACHMENT_KEYS из этапа 2, RADIO/BROADCAST/MULTICAST из этапа 3. Полная матрица ещё не закрыта. Граница отмены дисковых операций согласована с пользователем и реализована (раздел 5). @@ -330,19 +330,28 @@ test_multicast: PASS, /tmp/chat-group-multicast-unrestricted.log. Сетевой со старой эпохой, raw-инъекция и сохранение A на общем ETCP. Полный прогон после NAT/MULTICAST: 240/240, proxy9/9, burst/load PASS, /tmp/chat-group-nat-multicast-check.log (197с). -ATTACHMENT_KEYS — в работе, не считать завершённым. Добавлены обязательная crypto/admission -router, проверки local send/request/publication и атомарная отмена durable запросов/outbox. -State5 обозначает отмену; новый запрос после readmission требует нового решения автора. -Полученные ключи и локальная расшифровка сохраняются. Qt показывает отменённое состояние. -Ядро собирается, test_attachment_decisions PASS. test_chat_attachment обнаружил конфликт: -chat_core_delete_channel уничтожает группу до SQL-транзакции удаления канала. Новый teardown -отзывает attachment requests отдельным commit; последующий отказ удаления SQLite уже не может -сохранить прежний outbox. Лог: /tmp/chat-group-attachment-core.log, channel_state column3. -Нужна согласованная граница: сначала commit удаления метаданных, затем teardown и файлы, -с проверкой всех cleanup callbacks на работу после удаления таблиц. При SQL-отказе должны -сохраниться канал, его запросы и работающая группа. По правилу AGENTS о логических несоответствиях -работа остановлена на этой границе; новая часть не проверена полностью и не отправлена. -Оставшиеся тесты ATTACHMENT_KEYS ещё не запускались; fixtures с искусственными peer/state -потребуют актуализации (test_attachment_results peer123 без допуска, test_attachment_requests -считает state5 недопустимым). Новые тесты отмены/повторного допуска также ещё нужны. +ATTACHMENT_KEYS: обязательная crypto/admission router, проверки local send/request/publication +и атомарная отмена durable запросов/outbox. State5 обозначает отмену; повторный допуск сам +не запускает работу, новый явный запрос требует нового решения автора. Backfill и новая +загрузка контейнера не возобновляют отменённый запрос. Поздние ACK/GRANT/DENY не меняют state5. +Полученные ключи и локальная расшифровка сохраняются. Qt показывает причину отмены. +Проверены rollback всей отмены при ABORT/IGNORE/commit veto, внешняя транзакция, отзыв peer/self, +повтор без события, новый запрос/согласие. test_attachment_requests и test_attachment_results PASS; +логи /tmp/attachment-final-requests.log и /tmp/attachment-revoke-results.log. +Сетевой test_chat_group_isolation: 54/54, /tmp/attachment-group-isolation.log. Настоящие +SIGNED/ENCRYPTED запросы A/B создают авторские записи; отзыв B только на получателе +отменяет ожидающий GRANT, подписанный пакет со старой эпохой не возобновляет B; +ключ A и его RESULT_ACK доходят по тому же живому ETCP. + +Обнаруженный конфликт удаления канала исправлен: chat_core_delete_channel сначала +фиксирует удаление метаданных, затем помечает группу stopping и отменяет runtime/файлы. +При SQL-отказе сохраняются канал, ключи, запросы/outbox и работающие группа/DB_SYNC. +Поздний callback загрузки не трогает удалённое сообщение. test_chat_attachment PASS: +14 SQL-отказов удаления и дополнительные каскад/Merkle/commit/rollback сценарии, +сохранённый ключ расшифровывает локальный файл после отзыва self, подготовленное +исходящее вложение после отзыва не публикуется. Лог /tmp/attachment-worker-revoke.log. +Тестовые peer/state приведены к новому контракту. Исправлен отдельный дефект restart-fixture: +перезапуск теперь сохраняет прежнюю личность, а не создаёт узел без допуска в канал. +Реальный test_encrypted_attachment A–S–B/C PASS, /tmp/attachment-delete-network.log. +Полный повтор check.sh и сборка Qt выполняются; итог будет зафиксирован после завершения. STREAM, синхронизация, личные сервисы и полная матрица остаются открытыми. diff --git a/doc/tasks.md b/doc/tasks.md index 0945c0d9c..40576af3b 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -30,9 +30,13 @@ NAT unit/faults PASS; сетевой стенд 40/40. MULTICAST: отмена подписок/доставок и фильтрация общей FIFO, scoped-политика MULTICAST_REPORT; unit PASS, сетевой стенд 50/50. UTUN wire/допуск сохранены. Полный прогон после NAT/MULTICAST: 240/240, proxy9/9, burst/load PASS, /tmp/chat-group-nat-multicast-check.log. - ATTACHMENT_KEYS в работе: crypto/admission, durable отмена state5, новый запрос после readmission, Qt-статус. - Ядро собрано; test_attachment_decisions PASS. test_chat_attachment FAIL на атомарности удаления канала (задача ниже). - По правилу AGENTS работа остановлена до согласованного исправления границы SQL/teardown; эта часть не завершена. + ATTACHMENT_KEYS: crypto/admission, атомарная отмена state5, новый явный запрос после readmission, Qt-статус. + Отмена не возобновляется от backfill; поздние ответы отвергаются, полученные ключи/локальная расшифровка сохраняются. + requests/results/decisions/chat_attachment/encrypted_attachment PASS; rollback отмены, peer/self, новые запросы + и completion worker после отзыва проверены. Сетевой стенд54/54: ключ B не выдаётся, A работает по тому же ETCP. + Атомарность удаления канала исправлена (задача ниже); restart-fixture сохраняет прежнюю личность узла. + Логи: /tmp/attachment-final-requests.log, /tmp/attachment-revoke-results.log, /tmp/attachment-worker-revoke.log, + /tmp/attachment-group-isolation.log, /tmp/attachment-delete-network.log. Общий прогон и сборка Qt выполняются. Подмена источника, raw JOIN/invite, личные DM и оставшиеся сервисы ещё не закрыты общей гарантией; точная граница проверок — раздел 5 плана. План исправления и критерии по четырём этапам: [group_isolation_plan.txt](group_isolation_plan.txt). @@ -40,13 +44,15 @@ MEMBERS recovery и первичный JOIN требуют отдельных правил. Общие service ID должны сохранить поведение и crypto-требования UTUN. Этапы 2–4 остаются открытыми; выполненная часть и результаты — раздел 5 плана. -[ ] **Удаление CHAT-канала: commit должен предшествовать отзыву durable работы** — 03.11.2026. +[+] **Удаление CHAT-канала: commit предшествует отзыву durable работы** — 03.11.2026. test_chat_attachment воспроизвёл: chat_core_delete_channel сначала уничтожает TOPO_GROUP, teardown отменяет attachment outbox отдельной транзакцией, затем DELETE channels получает ABORT/IGNORE. Канал сохраняется, но outbox уже потерян; /tmp/chat-group-attachment-core.log, channel_state column3. - Предлагаемая граница: сначала успешный commit удаления метаданных, затем cleanup runtime/файлов; - проверить cleanup callbacks после удаления таблиц. При SQL-отказе сохранить также живую группу. - Не ослаблять тест атомарности и не обходить проверку допуска. ATTACHMENT_KEYS пока не считать готовым. + Исправлено: сначала успешный commit удаления метаданных, затем stopping и cleanup runtime/файлов. + Cleanup callbacks проверены; поздний callback медиа-загрузки не пишет в удалённую историю и не даёт событие. + При SQL-отказе сохранены точные записи/outbox/файлы и работающие группа/DB_SYNC. Проверки допуска сохранены. + test_chat_attachment PASS, /tmp/attachment-worker-revoke.log; SQL faults/ABORT/IGNORE/commit veto/внешняя + транзакция и неудачный rollback. Дополнены проверки runtime и callback после удаления. [ ] **Отложено: отдельный допуск UTUN и его API** — 03.11.2026. Не выполнять в текущей задаче по указанию пользователя. По чтению кода: TCP/UDP/ICMP proxy и routing DATA не проверяют входящий router group;