Files
2026-10-20 15:59:55 +07:00

6.3 KiB

MUC: расширения и восстановление0.7.6

Сопоставление выполнено с предоставленной Prosody cafd74b9c5ea: plugins/muc и mod_muc_mam.lua. Поддержка относится к встроенным расширениям этой ревизии, а не к произвольным community Lua plugins.

Добавлены hats из affiliation data, язык комнаты, политики PM/модераторских PM, фильтрация presence по ролям и формы конфигурации. Поддельные occupant-id/hats и MUC user identity из клиентского сообщения удаляются. muc_vcard и muc_occupant_id можно отключить. Настройки MAM включают muc_log_all_rooms, muc_log_presences, muc_log_include_total; presence хранится отдельными событиями, обычный MAM-запрос выбирает groupchat сообщения как в native.

История работает без MAM: ограниченный буфер, maxstanzas/maxchars/seconds/since, delay и раздельный subject. Архив MAM продолжает поддерживать историю persistent комнат. Удаление комнаты очищает её MAM-архив.

Как восстанавливается членство

При SIGTERM/Ctrl-C сервер сначала сохраняет метаданные комнаты и native state/<roomnode>.dat, затем завершает соединения. Сохраняются nick, полный JID, роль, show/status/priority и последнее сообщение истории. Это относится также к временным комнатам с участниками. Транспортное отключение во время shutdown не считается добровольным выходом из комнаты и не удаляет checkpoint.

После запуска сохранённые участники ожидают восстановления до300 секунд. Они не становятся активными адресатами маршрутизации автоматически. Когда тот же полный JID проходит SASL, bind и отправляет общую available presence, сервер повторно проверяет комнату и восстанавливает членство, nick, роль и presence. Одного совпадения bare JID или resource недостаточно. Клиент может по-прежнему явно войти обычной MUC presence.

Отпечаток конфигурации должен совпасть с сохранённым: изменение пароля или прав комнаты отменяет автоматическое восстановление; требуется обычный вход с актуальными параметрами. В presence state не записываются MUC-пароли и произвольные расширения. Пароль комнаты остаётся в исходной native config, как и до этого. Тот же checkpoint не продлевает grace при повторных перезапусках. Успешно использованная запись восстановления погашается на диске до отправки результата клиенту, чтобы авария не вернула старую роль после выхода или снятия модератора. Неактивированные временные комнаты очищаются после истечения срока.

Native формат читается/пишется и проверяется настоящей Prosody в обе стороны. Для автоматического восстановления используются checkpoint с отпечатком и временем Rust; старый native state без этих полей сам по себе не является разрешением на автоматический вход. Обычное повторное присоединение доступно.

Это восстановление XMPP-членства в комнате: старые TCP/TLS-сокеты после остановки процесса не существуют. SM resume между процессами не реализован. Аварийный SIGKILL/отказ питания не создаёт новый checkpoint: гарантируется проверенный штатный shutdown, а не полный crash recovery.

История ограничена max_history_messages: по умолчанию100, допустимый внутренний предел4096. Состояние комнаты ограничено4096 ресурсами. Необязательные presence поля слишком большого размера и последнее сообщение больше16KiB не включаются в checkpoint; это не мешает сохранить членство. Текущие сообщения доставляются по обычным транспортным лимитам.

Проверка и границы

Автоматические тесты используют отдельные временные данные. Сетевой сценарий останавливает процесс с живыми клиентскими socket, запускает его повторно, проверяет persistent и temporary комнаты, запрет чужих identity/resource, восстановленные роли/presence и доставку сообщений. Native oracle проверяет перенос state с несколькими ресурсами туда и обратно.

Полная production-миграция, непрерывные федеративные reconnect и все community расширения не проверены. Конкретные результаты — VALIDATION.md; общие пределы сервера — COMPATIBILITY.md. Реальные клиенты должны повторно аутентифицироваться.