From 9f11dcae0e46442b8df66968d80fabeac394fefe Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 3 Nov 2026 21:53:17 +0100 Subject: [PATCH] Document file and DM isolation and the custody reassignment boundary --- doc/group_isolation_plan.txt | 47 ++++++++++++++++++++++++++++++++++++ doc/tasks.md | 7 ++++++ 2 files changed, 54 insertions(+) diff --git a/doc/group_isolation_plan.txt b/doc/group_isolation_plan.txt index a1d5de89f..ba14305bb 100644 --- a/doc/group_isolation_plan.txt +++ b/doc/group_isolation_plan.txt @@ -3,6 +3,7 @@ Статус: этап 1 реализован; доработаны CONN_MGR, MEMBER_FILES, GROUP_AVATAR, ADMIN_KEY, RADIO_CALL, routed JOIN, CHAT NAT_DETECTION, MULTICAST_REPORT и ATTACHMENT_KEYS из этапа 2, RADIO/BROADCAST/MULTICAST из этапа 3. +Из этапа 4 добавлены FILE_TRANSFER и прямой DM; mailbox/custody ещё требуют отдельного перехода состояния. Полная матрица ещё не закрыта. Граница отмены дисковых операций согласована с пользователем и реализована (раздел 5). Уточнение объёма: по указанию пользователя UTUN пока не дорабатывать. @@ -359,3 +360,49 @@ test_gui_language: 22 PASS/1 FAIL на прежнем пользовательс эта отдельная задача уже есть в doc/tasks.md, строка не менялась текущей доработкой. Лог /tmp/attachment-gui-language.log; общий результат GUI-теста не считается успешным. STREAM, синхронизация, личные сервисы и полная матрица остаются открытыми. + +Продолжение в feature/chat-group-isolation (ветка от a3600c8a4, включает все предыдущие коммиты). +FILE_TRANSFER теперь требует SIGNED для DATA/controls и текущий допуск self/peer в CHAT. +Локальный pull проверяет право до fopen: запрещённая операция не усекает destination. +Отзыв отменяет операции, CM handles, таймеры и waiters своей группы до done(-2). +Отложенные sender/timer/CM callbacks сами проверяют допуск до продолжения I/O. +Предметный lookup по-прежнему проверяет право на конкретный неизменяемый объект. +Сетевой стенд проверил A/B на одном ETCP, удержанные DATA в reorder, поздний подписанный +пакет, отсутствие lookup запрещённого запроса, unsigned CLOSE и отзыв self перед sender callback. +Тот же объект после отказа в B полностью скачивается через A с новым transfer ID. +До исправления локальный pull портил destination, активная B не отменялась; исходный +стенд57/3 FAIL, /tmp/chat-file-transfer-before.log. Проверка записи затем отделена от +проверки callback и дополнена явным resume_receive/fflush. FILE_TRANSFER-стенд62/62, +/tmp/chat-file-transfer-controls.log. test_dm_media:17 фаз PASS, allocations0->0, +/tmp/chat-file-transfer-dm-media.log; это регрессия доставки, не полный аудит DM_MEDIA. + +Прямой DM получил обязательную подпись controls и авторизацию router. Подбор общей группы +и маршрута использует свежий допуск, не любое наличие строки участника. Личная история +и durable outbox сохраняются; повтор через другую разрешённую группу использует прежнее +подписанное тело и адресата. Вход через B после отзыва проверен до proactive teardown: +прежний код записывал сообщение и выбирал отозванную B; стенд63/2 FAIL, +/tmp/chat-dm-isolation-live-before.log. Первоначальный тест с teardown скрывал этот обход, +поэтому проверка входа перенесена до очистки сессии. После исправления65/65, +tests/logs/test_chat_group_isolation.log. Общий ./check.sh выполняется. + +Следующая архитектурная граница: mailbox и custody (по чтению кода, сетевого воспроизведения ещё нет). + - dm_mailbox_media_register сохраняет job по UUID и при повторе проверяет только body_hash; + group_id заказа остаётся прежним, даже если повтор пришёл через другую разрешённую группу. + - dm_custody_store при точном повторе отвечает через новую группу/source, но сохранённые + group_id/supernode не меняются. Фоновая обработка использует старые поля. + - dm_media_holders имеет ключ (id,node_id), без группы. Повторное назначение того же M + через B нельзя считать новым только заменой проверки допуска: оно пересекается с прежним A. + - mb_scope/dm_media_scope пока недостаточно проверяют admitted/source/self и третьего участника; + простое усиление этих условий остановит старые задания, но не даст корректного пересогласования. + +Предлагаемый следующий этап: + 1. Разделить идентичность неизменяемого файла (UUID/body hash) и контекст задания хранения. + Явно определить атомарную замену group/supernode при новом допустимом PUT/STORE. + Сохранить первоначальные TTL/политику удаления; смена маршрута не продлевает хранение. + 2. Связать holder и его ACK/DELETE/EXPIRED с конкретным назначением и группой, чтобы поздний + ответ A не изменял действующее назначение B; согласовать это с одной физической копией M. + 3. Добавить общий свежий допуск, проверки всех ролей/участников и отмену заданий/проб; + завершение custody worker проверяет актуальное назначение перед публикацией результата. + 4. Проверить реальными A–S–B/M: отзыв только одной группы, новый заказ через другую, + тот же UUID/M, поздние ответы, перезапуск, прежний TTL и сохранность локальной истории. +Изменения mailbox/custody остановлены на этой границе по правилу AGENTS о логических несоответствиях. diff --git a/doc/tasks.md b/doc/tasks.md index a69b0dfa0..345c47f91 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -39,6 +39,13 @@ /tmp/attachment-group-isolation.log, /tmp/attachment-delete-network.log. Общий ./check.sh:240/240, proxy9/9, burst/load PASS (203с), /tmp/attachment-isolation-full-check.log. Qt собран; test_gui_language повторил известный FAIL Deleted accounts → Deleted, отдельная задача ниже. + Продолжение в feature/chat-group-isolation; ветка включает прежние коммиты от a3600c8a4. + FILE_TRANSFER: допуск до fopen/lookup, подписанные controls, отмена операций/очередей и проверка callbacks. + Прямой DM: свежий допуск входа и выбора маршрута; сохранённое тело повторяется через другую общую группу. + Воспроизведены усечение файла до отказа, незакрытая операция и запись DM через отозванную живую сессию. + Сетевой стенд65/65; test_dm_media17 фаз PASS, allocations0->0. Общий прогон выполняется. + Следующая граница mailbox/custody: повтор через B отвечает в B, но сохраняет старое назначение A; + усиление допуска требует атомарного пересогласования и защиты от поздних ответов A. Схема — в конце плана. Подмена источника, raw JOIN/invite, личные DM и оставшиеся сервисы ещё не закрыты общей гарантией; точная граница проверок — раздел 5 плана. План исправления и критерии по четырём этапам: [group_isolation_plan.txt](group_isolation_plan.txt).