Document the 'archive redo baseline changed in place' failure, the runtime session isolation, the offline storage-checkpoint repair, and the Prosody native-format comparison (list_append in-place vs list_store atomic rename).
27 KiB
Совместимость с предоставленной установкой
Цель — конкретная Prosody cafd74b9c5ea и предоставленные community/custom
модули ревизии dddb6c34b964, а не все существующие модули Prosody.
Известные встроенные и выбранные модули предоставленной установки отображаются
на обработчики Rust. Произвольные Lua/community-модули не исполняются;
неизвестные явно включённые MUC-модули отклоняются при запуске.
Это не означает полного совпадения поведения с Prosody.
| Область | Что реализовано | Существенные пределы |
|---|---|---|
| Конфигурация | Lua/JSON/YAML/YML/TOML, Include, глобальные и локальные области, наследование модулей | Lua VM ограничена; не все функции окружения конфигуратора Prosody доступны. Runtime обслуживает один VirtualHost и его компоненты |
| Хранилище | internal .dat, .list, бинарные строки, смешанные ключи Lua, атомарные записи, потоковые архивы, инвалидирование .lidx |
SQL, external storage остальных модулей и произвольные драйверы не реализованы; S3 uploads поддержаны. Каталог блокируется между процессами Rust; Prosody в блокировке не участвует |
| Аккаунты, saslauth | internal_hashed SHA-1/SHA-256, SASLprep, PLAIN внутри TLS, SCRAM и PLUS с tls-exporter/tls-server-end-point, SSDP, SASL2 | Только internal_hashed; опциональный sasl2_bind2 (alias bind2) поддерживает inline bind/SM/CSI/Carbons. SASL2 inline SM resume и takeover живого транспорта реализованы; Bind2/MAM metadata читает endpoints без полного scan; полные MAM queries всё ещё могут сканировать историю |
| Сообщения и presence | локальная маршрутизация, приоритеты ресурсов, контакты/подписки/probes, offline, carbons, блокировки | Полная совместимость всех пограничных сценариев маршрутизации ещё не подтверждена |
| MAM | личный и комнатный MAM2, prefs, формы, RSM, фильтры времени/контакта/ID, extended queries, metadata, stanza-id, expiry | Нет доказательства совпадения каждой ошибки и порядка результатов при всех комбинациях запроса |
| MUC | комнаты, несколько ресурсов, роли/affiliations, owner/admin, конфигурация, приглашения, история без MAM и MAM, occupant-id/avatar, hats, PM/presence policies, регистрация, административные ad-hoc команды; журнал конфигурации, членства и истории до ответа, crash recovery persistent/temporary комнат | Rust-журнал авторитетен, native config/state — экспорт. Без SM восстановление требует новой аутентификации точного полного JID; grace по умолчанию 300 с, muc_recovery_grace_period 1..604800. Действующая приватная SM-запись восстанавливает логическое членство до listeners. Произвольные Lua-модули не запускаются; MUC-RECOVERY.md |
| PEP/pubsub | persistent nodes/items, ACL, subscriptions, publish/retract/purge/delete, owner/configuration, caps, OMEMO XML как payload | Не все необязательные политики узлов Prosody реализованы; OMEMO шифруют клиенты, криптография OMEMO не часть сервера |
| private/bookmarks/vCard | private XML, старые и новые закладки, vCard/temp-vCard4 и avatar-переходы | Межклиентное поведение нужно дополнительно проверить настоящими клиентами |
| SM/push | acknowledgements после обработки, resumable XEP-0198 sessions, replay, ограниченные очереди, приватный durable snapshot, heartbeat и shutdown checkpoint; legacy SASL/SASL2 resume после restart; native регистрации push | Нужны новый TLS/SASL-транспорт и токен того же владельца; TCP/TLS-сокеты не сохраняются. SM-снимок не native Prosody: 256 MiB суммарно, 8 MiB/4096 stanza на сессию. При неопределённой отправке возможен replay. Есть coalescing и watchdog первого push; реальный APNs/FCM цикл не подтверждён |
| CSI | active/inactive, ограниченный буфер, native importance function + runtime defaults для OMEMO/receipts/markers, delay, flush при клиентской активности и grace period | Defaults0.8.2 важнее по доставке, чем строгая native policy; явный csi_important_payloads заменяет defaults. Событие socket drain приближено завершением записи; необязательные расширенные XPath-фильтры поддержаны не полностью |
| Федерация | входящие/исходящие STARTTLS, CA/DNS-ID, SASL EXTERNAL, DNS SRV, проверка домена каждого stanza, ограниченный пул соединений | Нет dialback/DANE/OtherName-only/SRV-ID/bidi/direct TLS |
| HTTP upload | Несколько XEP-0363 components, Host/path isolation, local/S3 gateway, multipart/SigV4, streaming PUT, GET/HEAD/range/conditional, квоты/expiry, native metadata/JWT; offline local↔S3/S3↔S3 migration с SHA-256/resume; intent/exact-key recovery и quarantine; реальный 10 GiB PUT/GET через MinIO проверен | MinIO single-node с описанным netlink adapter тестовой среды; AWS/distributed deployment не проверены. Миграция требует остановки сервера и временного места под один файл; source сохраняется. Потерянные ownership metadata и неопределённый Complete требуют отдельного разбора; HTTP-UPLOAD.md |
| WebSocket/BOSH | WS/WSS и HTTP/HTTPS, общая XMPP-сессия, origin rules, BOSH RID/retry/hold/reorder/restart; http_altconnect XRD/JRD discovery; http_paths, HTTP Host/fallback, внешний URL, доверенные IP/CIDR и forwarded headers для TLS reverse proxy | Один VirtualHost с компонентами; нет PROXYv1/v2, произвольных Lua HTTP-приложений и горячей перенастройки. См. HTTP-PROXY.md |
| admin_shell | протокол admin socket, status/version/uptime, списки, основные операции аккаунтов | Нет произвольного Lua, горячей загрузки модулей и полного набора prosodyctl |
| Остальные модули | disco, ping, time, version, uptime, register, TURN extdisco/HMAC, каталог seclabels | Нет встроенного TURN. Coturn работает отдельно. pep_simple пуст в предоставленном исходнике |
Особенности именно вашего конфига
allow_registration = trueдействительно разрешает регистрацию, несмотря на противоречащий этому комментарий в исходном файле.- Личная история настроена
never, комнатная — на неделю. Очистка выполняется периодически; append не переписывает весь архив. - Лимит отдельного файла — 10 GiB, общий — 100 GiB. В 0.7.8 фактические HTTPS PUT/GET 10 GiB с local backend проверены с совпадением SHA-256, Range за 4 GiB и выборочным RSS. В 0.7.9 дополнительно проверены 10 GiB через MinIO single-node с описанным adapter тестовой среды; см. VALIDATION-0.7.9.md.
- Структура
security_labels.default_policy/policies/classificationsотличается от nativemod_seclabels. С0.7.1 её точная schema может использоваться как catalog metadata: выбранный default_policy и его classifications. ACL и обязательное enforcement не реализуются; неизвестные поля отвергаются. - Настройки
limitsсами по себе не включаютmod_limits; он не указан среди включённых модулей исходного конфига и не является autoload-модулем предоставленной Prosody. В этой реализации транспортного rate limiting пока нет. - Чужие Lua-плагины из каталога
custom_pluginsавтоматически не запускаются. Наличие исходников 479 каталогов не означает, что все они были включены.
Что осталось для утверждения «полная замена»
Нужны подтверждённый запуск на копии реальных данных, проверки настоящими
Monal/Conversations/Gajim и используемым push-шлюзом, совместимость с внешними
XMPP-доменами и сертификатами, проверка целевого Docker/UID/TLS, откат, долгий
нагрузочный прогон и устранение оставшихся различий из таблицы.
Текущие автоматические проверки покрывают конкретные сценарии и не заменяют
эти критерии. Проект намеренно сохраняет флаг --experimental.
Исправления discovery и pre-auth в 0.5.0
PEP описывается identity pubsub/pep на bare JID аккаунта. Push feature
urn:xmpp:push:0 возвращается на собственном bare JID при включённом
cloud_notify, в том числе без PEP. Серверный JID остаётся server/im.
PEP leaf nodes сохраняют node, собственные ACL и ошибки отсутствующего узла.
Функции MAM, блокировок и другие account features не теряются в раннем PEP reply.
С roster доступны RFC6121 subscription preapproval и контактная часть
XEP-0379/XEP-0401: ad-hoc urn:xmpp:invite#invite, одноразовые токены
с истечением срока, автоматическое подтверждение и обратная подписка.
Неизвестный клиентский preauth сохраняется при пересылке и в pending presence,
чтобы владелец мог подтвердить подписку вручную или в своём клиенте.
Нет приглашений на создание/сброс аккаунта и landing page; ibr=y не выдаётся.
Unscoped токены используют native per-user invite_token map; scoped токены
хранятся отдельно, чтобы Prosody без поддержки scope не мог выдать лишние права.
Токен потребляется до нескольких roster-записей: при дисковой ошибке между
записями нет multistore rollback, ошибка передаётся вызывающему коду, токен
повторно автоматически не авторизует подписку. Возможен ручной fallback.
Переподключение в 0.6.0
conflict_resolve следует native sessionmanager: default/kick_old, kick_new,
increment и random. Новая привязка отзывает прежний resume token при замене;
она не наследует старые SM acknowledgements. Успешный resume сохраняет SM,
Carbons, push identifier и очередь, изолируя старый transport от нового состояния.
BOSH terminate ждёт engine cleanup, WebSocket close/EOF закрывает input и даёт engine завершиться перед ограниченным timeout abort. Сетевой тест использует kick_new, чтобы случайное hibernation не скрылось takeover-политикой.
Android SASL в 0.6.1
На TLS1.2 предлагается certificate endpoint binding, на TLS1.3 также exporter. Проверены SHA1/256, SASL1/2, SSDP on/off, tampered bindings, WSS без CB и явно отключённый PLUS. Monocles имеет версионные различия fallback; настоящие устройства не запускались. Certificate signature algorithms EdDSA/unknown не используются для endpoint binding; TLS1.3 exporter при этом сохраняется.
Логирование в 0.7.0
Native-style log level maps и explicit sinks, console/file, JSON/plain, UTC millis и SIGHUP reopen реализованы. В scope входят TLS/SASL/bind/SM, startup, maintenance и основные входящие S2S события. Syslog/plugin sinks, mixed Lua log tables, полный hot reload и журналы всех модулей не реализованы. PLAIN теперь нормализует имя/authorization identity; wire abort/retry проверены отдельно. Журнал нужен для диагностики оставшегося реального Android отказа.
Cached SASL2 и Gajim в 0.7.1
Bind2 остаётся явно включаемым. Сохранённый Quickstart request к недоступному optional extension не мешает credentials exchange и последующей обычной привязке. Inline SM при отключённом smacks также не обрабатывается. Host/account discovery объявляет seclabels/register по наличию реальных обработчиков; создание новых аккаунтов по-прежнему зависит от allow_registration. Gajim predicates проверены по python source, реальные приложения не запускались. Policy catalog adapter — расширение для supplied config, а не ACL implementation.
PEP и DNSSEC в 0.7.2
Добавлены проверки OMEMO/аватаров с публикацией без to, recoverable missing bundles, publish-options/config retry, сохранением после restart и скрытой от журнала полезной нагрузкой. IQ errors адресуются от имени исходной цели; notification defaults совпадают с эффективной конфигурацией при preconditions. Конкретный production IQ отказ из INFO-лога0.7.1 неизвестен. DNSSEC клиент проверяет до XMPP; текущая зона wthome.ru не имеет обнаруженных DS/DNSKEY. Требуется настройка DNS/регистратора, docs/DNSSEC.md. Эта сборка не добавляет DNSSEC validation в outbound federation.
PEP порядок в 0.7.3
PEP/PubSub items выдаются newest-first, как реальный supplied mod_pep. Протокольный regression сохраняет старую пустую и новую populated devicelist, проверяет первый item как Android parser, замену current и restart. Native oracle отдельно подтверждает порядок. Это не гарантирует исправления каждого production индикатора: реальная конфигурация/содержимое узлов не предоставлены.
HTTP и диагностика0.7.4
HTTPS учитывает https_interfaces (включая* → IPv4+IPv6), HTTP — http_interfaces, с fallback к interfaces. Добавлена безопасная HTTP/TLS/status диагностика. Закрытие до SASL обрабатывается штатно и завершает WebSocket. Для подтверждённой страницы Converse https://conversejs.wthome.ru добавлен точный allowed Origin в примеры; рабочий конфиг требуется обновить отдельно. Runtime wire test подтверждает original403 → configured101, IPv4/IPv6 и TLS validation. PEP production причина по-прежнему не доказана; новая диагностика различает parser-valid IDs и форму уведомлений. Нет подтверждения Android UI, живого production WSS, DNSSEC signing или полной замены Prosody.
Восстановление MUC и SM в 0.8.0
MUC-журнал хранит последнее согласованное поколение конфигурации, ролей, членства и ограниченной истории, включая временные комнаты без MAM. Неудачная фиксация откатывает изменение комнаты; внешний MAM-архив и прочие побочные эффекты не составляют единую транзакцию с журналом. Heartbeat обновляет живое состояние, но не продлевает deadline уже ожидающих записей.
При действующей сохранённой SM-сессии bootstrap восстанавливает логическую сессию и связанное MUC-членство до начала приёма соединений. Offline-доставка попадает в SM-очередь, а не в несуществующий сокет. Для сетевого resume нужны новая TLS/SASL-аутентификация и действующий токен владельца. Без такой SM-записи действует обычное повторное подтверждение полного JID и MUC admission.
Учтены muc_max_rooms, restrict_room_creation,
allow_unaffiliated_register, enforce_registered_nickname,
muc_registration_include_form, muc_tombstone_expiry и component-admin
ad-hoc destroy/set-affiliation. Общие и host modules_disabled применяются
к vCard и occupant-id. Эти встроенные обработчики не запускают Lua-плагины.
Ограничения журнала, native-экспорта и отката:
MUC-RECOVERY.md. Итоги проверки:
VALIDATION-0.8.0.md.
Durable IO0.8.3
MAM/SM используют authoritative redo sidecars. Перед сменой writer или откатом
на старую версию требуется offline storage-checkpoint CONFIG; после аварии
нельзя просто удалить sidecars. Подробности — DURABLE-MESSAGE-IO.md.
Внешний перезапись MAM baseline
Внешняя перезапись native .list поверх зафиксированного redo-baseline (бакап,
копия data_path, Prosody, старая версия) давала «archive redo baseline changed
in place»: каждый MAM-append падал и через ? ронял session, клиент
реконнектился, сообщение не доставлялось. В 0.8.4 MAM-архивация на личной
доставке стала best-effort (storage-ошибка не роняет session и не роняет доставку;
в лог — mam-archive-skipped), а storage-checkpoint получил ремонт непроверенного
baseline: текущий синхронизированный native считается авторитетным и неприменимый
журнал удаляется. Живой append остаётся fail-closed: журнал не удаляется молча.