Files
rust-xmpp/docs/COMPATIBILITY.md
wt b30fc524d8 - Offline CLI `upload-migrate OLD_CONFIG NEW_CONFIG --component HOST
[--execute]`: dry run по умолчанию, local ↔ S3 и S3 ↔ S3 без удаления
  source.
- Последовательное копирование с проверкой размера и полным SHA-256
  readback
  destination; конфликтующий объект не перезаписывается. Временный диск
  —
  максимум один переносимый файл дополнительно к постоянному
  destination.
- Durable migration journal позволяет продолжить прерванную операцию с
  теми
  же конфигурациями. Незавершённый или повреждённый journal блокирует
  startup;
  backend identity меняется только после проверки всех файлов.
- Native `uploads`/`upload_stats`, slots и JWT сохраняются;
  поддерживаются
  native локальные файлы без Rust completion sidecar. Миграция требует
  остановки RustXMPP и Prosody, использующих общий `data_path`.
- Multipart intent сохраняется до создания удалённого upload. Recovery
  находит потерянный UploadId через paginated listing и очищает только
  точный
  key принадлежащего slot. При сохранных metadata cleanup не зависит от
  lifecycle; lifecycle остаётся дополнительной защитой, а не гарантией.
- Перед completion сохраняется durable marker. Неопределённый результат
  completion при отсутствии подтверждённого объекта помещает только этот
  slot в quarantine: PUT 409, retention не удаляет его, maintenance
  повторяет
  сверку. Startup продолжается; сохраняется single-use семантика.
- Добавлены network regressions миграции и расширены проверки multipart
  recovery, потерянных ответов, отмены запросов и конфликтов
  destination.

Настройка, команды миграции, recovery и ограничения отката:
[docs/HTTP-UPLOAD.md](docs/HTTP-UPLOAD.md).

Команды, результаты и границы подтверждения, включая qualification
реального
object store и 10 GiB:
[docs/VALIDATION-0.7.9.md](docs/VALIDATION-0.7.9.md).

Итог: 265 тестов, нагрузка 500 TLS клиентов и native reference —
успешно.
Реальные 10 GiB через MinIO (описанный test adapter), 1280parts и полный
SHA-256
пройдены; подробности — [VALIDATION-0.7.9](docs/VALIDATION-0.7.9.md).
2026-10-20 17:06:14 +07:00

144 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Совместимость с предоставленной установкой
Цель — конкретная Prosody `cafd74b9c5ea` и предоставленные community/custom
модули ревизии `dddb6c34b964`, а не все существующие модули 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 живого транспорта реализованы; MAM metadata при Bind2 читает весь архив синхронно |
| Сообщения и 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 policies, presence broadcast, native metadata/state checkpoints и восстановление после штатной остановки | Восстановление после повторной аутентификации точного полного JID в300-секундном grace и при неизменной конфигурации. Нет сохранения TCP/SM между процессами и checkpoint на SIGKILL. Произвольные community-расширения не запускаются; 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 sessions, replay, ограниченные очереди, native регистрации push и ответы сервисов | Есть coalescing и watchdog первого push; полный цикл с настоящим APNs/FCM шлюзом не проверен. Состояние живых сессий не переживает перезапуск процесса |
| CSI | active/inactive, ограниченный буфер, native importance rules, delay, flush при клиентской активности и grace period | Событие 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` отличается
от native `mod_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.