Document file and DM isolation and the custody reassignment boundary

This commit is contained in:
evgeny committed 2026-11-03 21:53:17 +01:00
1 parent 47e0c99f64
commit 9f11dcae0e
2 files changed
+54

No files matched your search

+47
View File
@@ -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 о логических несоответствиях.
+7
View File
@@ -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).