initial commit

This commit is contained in:
wt committed 2026-10-20 15:59:55 +07:00
commit c260d7bab8
235 files changed
+49786

No files matched your search

+144
View File
@@ -0,0 +1,144 @@
# Журнал сервера и диагностика авторизации — 0.7.4
После сборки/перезапуска строка `starting`/`ready` должна показывать 0.7.4.
Это позволяет проверить, что запущен новый binary/container image.
Без настройки журнал пишет info/warn/error в stderr (виден в Docker logs).
Для диагностики одной попытки входа добавьте в Lua-конфиг:
```lua
log = { debug = "*console" }
log_format = "json"
```
В JSON-конфиге это поля `global.log = {"debug":"*console"}` и
`global.log_format = "json"`. Обычный текст: `log_format = "plain"`.
`debug = true` включает debug по умолчанию, если `log` не задан.
Настройки наследуются из global, локальный `log` VirtualHost имеет приоритет.
Файлы в стиле Prosody:
```lua
log = {
info = "/var/log/prosody/rust-xmpp.log";
error = "/var/log/prosody/rust-xmpp.err";
debug = "*console";
}
log_format = "plain"
```
Каталоги должны существовать и быть доступны UID процесса. Файлы открываются
append с правами 0600. Level-map включает указанный уровень и старшие уровни.
Explicit sinks поддерживают диапазон и точный набор уровней:
```lua
log = {
{ to = "file"; filename = "/var/log/prosody/debug.log";
levels = { min = "debug"; max = "warn" } };
{ to = "console"; levels = { "error" } };
}
```
`levels = "warn"` в explicit sink — только warn, как у native loggingmanager.
`log = "*console"` и `log = { "*console" }` включают debug и старше.
Дополнительное сокращение runtime `log = "debug"` также пишет debug в консоль.
Вся строка JSON/plain записывается под общим mutex, ID не смешиваются.
Файлы ротируются внешним logrotate: после rename отправьте процессу SIGHUP.
Журнал переоткроет destinations и запишет `logs-reopened`. При ошибке
переоткрытия старые файловые дескрипторы сохраняются. SIGHUP здесь не означает
горячую перезагрузку конфигурации или Lua-модулей. Автоматической ротации и
retention нет. Native syslog sink, mixed Lua tables, timestamp templates и
произвольные plugin sinks пока не реализованы.
## Как собрать одну попытку
В JSON есть `timestamp`, `level`, `module`, `connection`, `event`, `fields`.
`connection` — случайный ID одного transport, не SM resume token. Поля в
`fields` — массив `{key,value}`, который можно преобразовать через jq
`from_entries`. Проследите один ID от `connection-open` до `connection-closed`:
1. `connection-open`: host, transport, peer.
2. `tls-established`: фактическая версия TLS и cipher.
3. `sasl-features`: объявленные механизмы, CB-типы, account_hash и SSDP.
4. `sasl-attempt`: номер попытки, механизм, SASL1/SASL2.
5. `account-lookup`: нормализованный user, hash и состояние записи.
6. `sasl-challenge`, затем `auth-success` либо `sasl-rejected`.
7. `resource-bound`/`session-resumed`, затем `connection-closed`.
При закрытии есть phase, reason, duration_ms и io_kind. Если клиент отключился
после challenge, сервер видит только `phase=sasl-client-final` и disconnect;
его внутреннюю причину (например, локальное отклонение SSDP) сервер узнать
не может. Для этого потребуется клиентский журнал. Для HTTP adapter peer
помечается not-forwarded: внутренний duplex не получает адрес HTTP-запроса.
| Событие/причина | Что проверять |
|---|---|
| account-lookup: missing-or-disabled | Правильный host, data_path/volume, наличие и enabled-состояние аккаунта |
| account-record-invalid | Lua account record повреждён или не поддержан |
| account-hash-or-record-invalid | stored/server key length и настроенный SHA-1/SHA-256 должны соответствовать |
| invalid-client-proof | Proof не проверилась: пароль, устаревшие credentials либо несовместимый расчёт клиента; это не доказательство конкретно неверного пароля |
| channel-binding-mismatch | Выбранный CB не соответствует данному TLS-сеансу/сертификату |
| channel-binding-downgrade-detected | Клиент отправил y при доступном серверном CB |
| mechanism-not-offered | Клиент выбрал механизм, которого нет в sasl-features |
| invalid-authzid | Authorization identity не совпадает с нормализованным владельцем |
| client-aborted-after-challenge | Клиент явно отменил обмен; wire-ответ aborted |
| inline-request-malformed | Ошибка Bind2/resume, поле detail уточняет класс |
| bind-rejected/resource-conflict | Авторизация прошла, проблема уже на этапе ресурса |
Дополнительно пишутся listener-ready, resource-replaced, session-disconnected
(removed/hibernating и unacked count), session-expired, maintenance-failed,
базовые открытия/закрытия входящих S2S и shutdown-requested. Это начальное
покрытие операций, не полная замена всех журналов модулей Prosody.
В журнал не передаются пароли, соль/ключи, SASL base64, nonce/proof, resume/push
токены и XML/тела сообщений. Имена аккаунтов и peer-адреса присутствуют для
диагностики, как в Prosody. Дополнительный фильтр редактирует sensitive field
keys; escaping исключает вставку новых строк/control characters в запись.
Нужен фрагмент одной неуспешной попытки Conversations/monocles, включая version
и перечисленные события. До получения этого фрагмента причина конкретного
оставшегося отказа на вашей установке не установлена.
## Изменения 0.7.1
Одинаковые console destinations (включая aliases) и одинаковые строки путей
файлов объединяются с union уровней; overlapping rules не создают дубликаты.
Разные destinations получают независимые копии записи согласно своим уровням.
`sasl-attempt` теперь записывается до inline validation. `sasl-inline-options`
содержит только requested/available flags без payload. Необъявленный cached
Bind2/SM логируется как `inline-request-ignored` с причиной bind2-disabled или
sm-disabled и fallback=post-auth-stream-features. Это не ошибка пароля.
Malformed enabled inline extensions сохраняют rejection и более точный detail.
## PEP/PubSub в 0.7.2
INFO pubsub-iq-result содержит классифицированные action/node_kind/status/condition,
precondition_not_met и счётчик deliveries. Для disco — pep_identity,
persistent_items, publish_options. Идентификаторы устройства/элемента/запроса,
полные имена узлов и payload не печатаются. WARN iq-dispatch-failed содержит
безопасный io_kind. Значение deliveries не доказывает получение клиентом.
Интерпретация ошибок и проверка после обновления — PEP-DIAGNOSTICS.md.
## Содержимое результата PEP в 0.7.3
`target_scope` классифицирует цель запроса без её адреса. У successful items
result `items_count` — число непосредственных item, `first_content_kind` —
известный класс первого payload или none/other/nested-item, `first_device_count`
— количество непосредственных device в распознанном списке первого item.
Никаких значений device ID или bundle bytes. Это структура XML, не проверка
валидности ключей, доверия или числовых ID. Для других операций этих счётчиков нет.
`implicit` означает отсутствие to; сам по себе он не утверждает выбор аккаунта.
## HTTP и PEP0.7.4
HTTP diagnostics: listener-ready, connection-open, tls-established,
request-complete route/status, connection-closed phase/reason. Routes ограничены
websocket/bosh/other; raw URLs, queries, Origin/headers/bodies не пишутся.
Для подключения Converse: CONVERSE-WSS.md.
PEP IQ: device_protocol legacy/omemo2/other, valid_device_count и
invalid_device_count. notification-generated: content_present и такие же
счётчики локально созданного сообщения ДО routing, не подтверждение доставки.
ID/JID/ключевые данные не добавляются. Подробности — PEP-DIAGNOSTICS.md.