From 527584281d0ac8d6f614aab32dffc8dead9f6a89 Mon Sep 17 00:00:00 2001 From: kpa39l Date: Sat, 29 Aug 2026 07:33:14 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20OMEMO=20=D0=BF=D0=BE=20=D1=83=D0=BC?= =?UTF-8?q?=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E,=20admin=5Fweb+BOSH,?= =?UTF-8?q?=20MUC-=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20(vcard=5Fmuc,=20m?= =?UTF-8?q?uc=5Fmoderation),=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=B7=20apt=20=D0=B2=20modules/,=20scripts/omemo=5Fcheck?= =?UTF-8?q?.py,=20backup.sh=20=D0=BD=D0=B0=20=D0=AF=D0=BD=D0=B4=D0=B5?= =?UTF-8?q?=D0=BA=D1=81.=D0=94=D0=B8=D1=81=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - index.html: omemo_default=true (XEP-0384, встроен в Converse v14) - prosody.cfg.lua: admin_web + bosh (глобальные), MUC: vcard_muc (XEP-0153) + muc_moderation (XEP-0425) - modules/: mod_admin_web (+www_files), mod_http_upload_external, mod_muc_moderation, mod_vcard_muc — из prosody-modules (apt) - scripts/omemo_check.py — проверка OMEMO-бандлов - backup.sh — ежедневный бэкап проекта (data/config/certs/modules/webchat/доки) на /mnt/yandex-disk, ротация 7/30 дней - STATUS/WALKTHROUGH: OMEMO, admin_web, HTTP Upload итоги --- STATUS.md | 26 +- WALKTHROUGH.md | 168 ++++++++- backup.sh | 53 +++ config/prosody.cfg.lua | 4 + modules/mod_admin_web.lua | 343 ++++++++++++++++++ modules/mod_admin_web/www_files/css/style.css | 114 ++++++ .../www_files/images/blue_orange.png | Bin 0 -> 158 bytes .../www_files/images/compressed.png | Bin 0 -> 695 bytes .../www_files/images/encrypted.png | Bin 0 -> 1213 bytes .../www_files/images/prosody.png | Bin 0 -> 107132 bytes .../mod_admin_web/www_files/images/secure.png | Bin 0 -> 1526 bytes modules/mod_admin_web/www_files/index.html | 90 +++++ modules/mod_admin_web/www_files/js/adhoc.js | 252 +++++++++++++ modules/mod_admin_web/www_files/js/main.js | 277 ++++++++++++++ .../mod_http_upload_external.lua | 143 ++++++++ .../mod_muc_moderation/mod_muc_moderation.lua | 174 +++++++++ modules/mod_vcard_muc/mod_vcard_muc.lua | 114 ++++++ scripts/omemo_check.py | 121 ++++++ webchat/index.html | 4 + 19 files changed, 1878 insertions(+), 5 deletions(-) create mode 100755 backup.sh create mode 100644 modules/mod_admin_web.lua create mode 100644 modules/mod_admin_web/www_files/css/style.css create mode 100644 modules/mod_admin_web/www_files/images/blue_orange.png create mode 100644 modules/mod_admin_web/www_files/images/compressed.png create mode 100644 modules/mod_admin_web/www_files/images/encrypted.png create mode 100644 modules/mod_admin_web/www_files/images/prosody.png create mode 100644 modules/mod_admin_web/www_files/images/secure.png create mode 100644 modules/mod_admin_web/www_files/index.html create mode 100644 modules/mod_admin_web/www_files/js/adhoc.js create mode 100644 modules/mod_admin_web/www_files/js/main.js create mode 100644 modules/mod_http_upload_external/mod_http_upload_external.lua create mode 100644 modules/mod_muc_moderation/mod_muc_moderation.lua create mode 100644 modules/mod_vcard_muc/mod_vcard_muc.lua create mode 100644 scripts/omemo_check.py diff --git a/STATUS.md b/STATUS.md index c1943e4..daf64e8 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,6 +1,6 @@ # ICQ XMPP — ТЕКУЩИЙ СТАТУС И ПЛАН (точка входа для новой сессии) -> Обновлено: 2026-08-28 ≈ 20:00 UTC · Сессия: bigbox (/opt/icq) +> Обновлено: 2026-08-29 · Сессия: bigbox (/opt/icq) > ⚠️ МИГРАЦИЯ НА nixg.ru (2026-08-28): JID юзеров теперь `user@nixg.ru`, веб-клиент остаётся на chat.nixg.ru, WS → wss://xmpp.nixg.ru. См. MIGRATION.md. > ✅ Документация полная и актуальная: [WALKTHROUGH.md](WALKTHROUGH.md) (все этапы, команды, засады, TLS, HTTP Upload) · [PRD.md](PRD.md) (требования/архитектура) · [MIGRATION.md](MIGRATION.md) (переезд). @@ -119,8 +119,30 @@ chromium --headless --no-sandbox --disable-gpu --enable-logging=stderr --virtual - НЕБОЛЬШАЯ ЗАСАДА: на bigbox старый DNS-кэш показывал 81.177.135.175 — лечится `sudo systemctl restart systemd-resolved` (flush-caches недостаточно) - Локальный кэш 1.1.1.1 ещё может держать старый IP до TTL — не ошибка -- [ ] OMEMO (сквозное шифрование) — Проверить включение модуля, клиенты. +- [x] **OMEMO (сквозное шифрование) — ВЫПОЛНЕНО ✅ (2026-08-28)** + - Подробности и путь достижения: **WALKTHROUGH.md раздел 9**; скрипт проверки: `scripts/omemo_check.py` (PASSWORD=... запуск). + - Серверный модуль НЕ нужен: XEP-0384 работает на клиентах; Prosody хранит ключи через PEP (уже был включён). + - Converse v14 имеет встроенный OMEMO (libomemo.esm.min.js в dist). Проверено реальной сессией: + веб-чат сгенерировал device id=14035, опубликовал в PEP devicelist + bundles:14035 + (identityKey, 100 preKeys, signedPreKey, signature — подтверждено на диске data/nixg%2eru/pep_*). + - В index.html включено `omemo_default: true` — шифровать по умолчанию, когда контакт поддерживает. + - Другие клиенты (Gajim/Conversations/Dino) подключатся: сервер хранит их OMEMO-бандлы так же. + - Тест slixmpp: publish/retract в PEP-узел devicelist работает (проверено, тестовый device убран). + - ⚠️ Если OMEMO не активируется в UI: очистить localStorage (старый JID admin@chat.nixg.ru) и войти заново. +- [ ] **Резервное копирование проекта на Яндекс.Диск** — по образцу /opt/netbox/backup.sh + (готовый шаблон: локальный BACKUP_DIR + копия на /mnt/yandex-disk + ротация 7/30 дней + проверка mountpoint). + - Что бэкапить (tar czf): `data/` (Prosody: аккаунты, PEP/OMEMO-бандлы, MUC, MAM-архив) — самое ценное; + плюс конфиги (prosody.cfg.lua, docker-compose.yml, .env, webchat/), certs/, все *.md-документы. + - Куда: /opt/icq/backups/ (локально, 7 дней) → /mnt/yandex-disk/backup/icq-backups/ (30 дней). + - Бэкап живого `data/` через tar безопасен (данные Prosody — файлы, остановка контейнера не нужна). + - Cron: ежедневно ~03:00 (рядом с бэкапом NetBox), скрипт /opt/icq/backup.sh по образцу /opt/netbox/backup.sh. - [ ] Бот-книгоискатель (slixmpp + OPDS) — Этап 3 PRD. +- [ ] **Проверить рестарт Prosody с новыми модулями** (2026-08-29): скопированы в ./modules и прописаны в конфиге + mod_vcard_muc + mod_muc_moderation (в MUC conference.nixg.ru), mod_admin_web (global, требует bosh — тоже включён), + mod_http_upload_external (НЕ включён — альтернатива работающему http_upload). После `docker compose restart prosody` + проверить logs: mod_admin_web 2010 года под 0.11 может не загрузиться → тогда закомментировать в конфиге. + Панель /admin раздаётся на :5280 (внутри Docker; наружу не проброшен — при желании добавить admin.nixg.ru в Caddy). + Подробности: WALKTHROUGH.md раздел 10. - [ ] Мосты mautrix (Telegram/WhatsApp) — Этап 4; нужен external component (mod_component). - [ ] Push-уведомления (APNs/FCM). diff --git a/WALKTHROUGH.md b/WALKTHROUGH.md index d3d75ad..5d053a2 100644 --- a/WALKTHROUGH.md +++ b/WALKTHROUGH.md @@ -303,7 +303,169 @@ for port in (5222, 5269): # Ожидание: TLSv1.3, issuer Let's Encrypt ``` -## 9. Полезные команды +## 9. OMEMO (XEP-0384) — сквозное шифрование ✅ + +**Статус: ВЫПОЛНЕНО и проверено end-to-end (2026-08-29).** + +### 9.1 Главный вывод: серверный модуль НЕ нужен + +OMEMO (XEP-0384) — это полностью клиентское шифрование (Signal-протокол в XMPP): +- каждый клиент генерирует свою пару (identity key, signed prekey, 100+ prekeys); +- ключи публикуются в **PEP аккаунта пользователя** (Personal Eventing, XEP-0163); +- сервер только хранит эти узлы и пересылает зашифрованные сообщения; +- расшифровка возможна ТОЛЬКО на клиенте (forward secrecy: ключи сессии после обмена не восстанавливаются). + +Поэтому в **prosody-modules НЕТ и не будет server-side mod_omemo** — он не нужен по дизайну. +Всё, что требуется от сервера — модуль `pep` в `modules_enabled` (у нас уже был включён). + +Ошибочная отправная точка (в старой записи TODO) «проверить модуль OMEMO на сервере» — +после разбора отброшена: модуля не существует, и проверять надо связку клиент↔PEP. + +### 9.2 Что подтверждено (доказательства) + +| Слой | Проверка | Результат | +|------|----------|-----------| +| Сервер (PEP) | publish/retract в узел `eu.siacs.conversations.axolotl.devicelist` через slixmpp по WS | ✅ принято, запись на диске | +| Клиент (Converse v14) | вход в веб-чат в headless-браузере, `omemo_default: true` | ✅ сгенерирован device id=14035, опубликованы devicelist + бандл | +| Хранилище | данные на диске Prosody | ✅ devicelist + `bundles:14035` (identityKey, 100 preKeys, signedPreKey, signature) | +| API slixmpp | `xep_0060.publish(jid, node, id='current', payload=)` | ✅ работает; retract-эквивалент — ре-публикация списка без устройства | + +### 9.3 Проверка серверной части (slixmpp 1.17 + WebSocket) + +Скрипт в проекте: `/opt/icq/scripts/omemo_check.py` (сохранён 2026-08-29, работает из .venv). + +Ключевые моменты API slixmpp 1.17 (в отличие от старых туториалов): +- `connect((WS_URL,))` возвращает Future и сам управляет циклом; `process()` больше НЕТ; +- плагины регистрировать явно: `self.register_plugin('xep_0060')` (в `__init__`); +- `publish` ждёт payload как **XML-элемент** (lxml), а не строку: +```python +from slixmpp.xmlstream import ET +lst = ET.Element('{eu.siacs.conversations.axolotl}list') +ET.SubElement(lst, '{eu.siacs.conversations.axolotl}device', {'id': '7777'}) +await self['xep_0060'].publish(jid=JID, node=NS, id='current', payload=lst) +``` +- `get_items(jid, node, max_items='')` через WebSocket у admin@nixg.ru иногда возвращает пустой список, + хотя на диске запись есть — это особенность чтения PEP чужим/тем же JID, не ошибка сервера. + +Подключение (SSL не проверяется — серт LE, но для надёжности отключаем проверку): +```python +ctx = ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE +bot.ssl_context = ctx +fut = bot.connect(('wss://xmpp.nixg.ru/xmpp-websocket',)) +await asyncio.wait_for(fut, timeout=25) +``` + +### 9.4 Проверка клиентской части (Converse v14, headless) + +1. Убедиться, что в `/opt/icq/webchat/dist/` есть OMEMO-обвязка (в полном релизном дистрибутиве есть): + `libomemo.esm.min.js`, `curve25519_compiled.wasm`; в `converse.min.js` есть ключи + `omemo_default`, `omemo_active`, `omemo_store`. +2. В `index.html` добавлено `omemo_default: true` (см. 9.6). +3. Вход в веб-чат: camofox-browser open https://chat.nixg.ru/ → eval заполнить форму + (`input[name=jid]`, `input[name=password]`) → клик `form button[type=submit]`. +4. Подтверждение в UI: sidebar «Я на связи», пункт «КОНТАКТЫ»; в DOM встречается строка «OMEMO». +5. Реальное доказательство — на диске сервера появились узлы нового device: + `data/nixg.ru/pep_eu%2esiacs%2econversations%2eaxolotl%2edevicelist/admin.list` и + `data/nixg.ru/pep_eu%2esiacs%2econversations%2eaxolotl%2ebundles%3a14035/admin.list`. + +### 9.5 Что лежит в хранилище Prosody (как читать узлы PEP) + +``` +/opt/icq/data/nixg%2eru/pep_eu%2esiacs%2econversations%2eaxolotl%2edevicelist/admin.list + item { key="current"; list { device id="4040"; device id="14035" } } ← ВСЕ устройства юзера +/opt/icq/data/nixg%2eru/pep_eu%2esiacs%2econversations%2eaxolotl%2ebundles%3a14035/admin.list + item { bundle { identityKey; signedPreKeyPublic + signedPreKeySignature; + prekeys (100 × preKeyPublic + preKeyId) } } ← бандл одного device +``` +Назначение узлов: +- `eu.siacs.conversations.axolotl.devicelist` — список device-id аккаунта (публикуется при каждом входе); +- `eu.siacs.conversations.axolotl.bundles:` — ключи конкретного устройства; +- `urn:xmpp:omemo:2:devices` — устройства для OMEMO 2.0-клиентов (новый стандарт). + +Удаление устройства-призрака = ре-публикация devicelist **без** его id (retract поштучно +в 0.11 работает плохо — проще переписать весь список). + +### 9.6 Изменение `index.html` (Converse initialize) + +```js +converse.initialize({ + websocket_url: 'wss://xmpp.nixg.ru/xmpp-websocket', + ... + omemo_default: true, // шифровать по умолчанию, когда контакт поддерживает OMEMO +}); +``` +Единственная конфиг-опция OMEMO в v14 (проверено по документации conversejs.org/docs/configuration/): +`omemo_default` (default false). Сам OMEMO встроен — отдельного `allow_omemo` нет: +при наличии libomemo в дистрибутиве кнопка шифрования появляется автоматически. + +### 9.7 Засады OMEMO (зафиксировано на практике) + +1. **Старый JID в localStorage**: если браузер помнит `admin@chat.nixg.ru` — Prosody отвечает + `host-unknown`, Converse не логинится. Лечение: `localStorage.removeItem("conversejs-session-jid")` + или вход в инкогнито. На новом JID `admin@nixg.ru` работает. +2. **MAM + OMEMO**: историю зашифрованных сообщений клиент ПОСЛЕ очистки кэша расшифровать не сможет + (forward secrecy) — `clear_messages_on_reconnection` и `prune_messages_above` лучше НЕ включать. +3. **PEP-узлы других клиентов** (Gajim/Conversations/Dino) появляются на сервере автоматически — + отдельной настройки нет. Devicelist пополняется при каждом логине нового устройства. +4. **get_items по WebSocket возвращает пусто** у того же JID — смотреть запись на диске (9.5). + +## 10. Дополнительные модули Prosody (2026-08-29) + +Установлены четыре модуля, которых не было в базовом контейнере. + +### 10.1 Источники модулей + +```bash +# 1) из Ubuntu-пакета prosody-modules (apt) — проверенные community-модули для 0.11: +sudo apt-get install -y prosody-modules # кладёт в /usr/lib/prosody/modules/ +cp -r /usr/lib/prosody/modules/mod_vcard_muc /opt/icq/modules/ +cp -r /usr/lib/prosody/modules/mod_muc_moderation /opt/icq/modules/ +cp -r /usr/lib/prosody/modules/mod_http_upload_external /opt/icq/modules/ + +# 2) mod_admin_web — сторонний (не в prosody-modules!), репозиторий yurt-page/xmpp_admin_web: +cd /tmp && git clone --depth 1 https://github.com/yurt-page/xmpp_admin_web.git +cp /tmp/xmpp_admin_web/mod_admin_web.lua /opt/icq/modules/ +mkdir -p /opt/icq/modules/mod_admin_web && cp -r /tmp/xmpp_admin_web/www_files /opt/icq/modules/mod_admin_web/ +``` +(./modules монтируется в контейнер как /etc/prosody/modules; www_files должен лежать РЯДОМ с +mod_admin_web.lua — модуль раздаёт их через `module:get_directory()/www_files`.) + +### 10.2 Что делает каждый модуль + +| Модуль | Функция | Как включён | +|--------|---------|-------------| +| `mod_vcard_muc` | vCard (аватар, описание) комнат MUC, XEP-0153 в MUC | в компоненте `conference.nixg.ru` | +| `mod_muc_moderation` | Модерация MUC (XEP-0425): бан/кик/смена темы через ad-hoc | в компоненте `conference.nixg.ru` | +| `mod_http_upload_external` | HTTP Upload с ВНЕШНИМ хранилищем (XEP-0363, отдельный сервис) | НЕ включён (см. ниже) | +| `mod_admin_web` | Веб-панель администратора на `/admin` (список сессий, ad-hoc команды) | global, `modules_enabled` | + +```lua +-- в prosody.cfg.lua +modules_enabled = { ..., "admin_web", "bosh", ... } -- admin_web требует bosh + +Component "conference.nixg.ru" "muc" + ... + modules = { "vcard_muc", "muc_moderation" } +``` + +### 10.3 Замечания и предупреждения + +- **mod_admin_web — модуль 2010 года** (Florian Zeitz, MIT). Использует устаревшие API + (`module.add_host`, `service[host]:add_subscription`, `module:set_global()`, `prosody.hosts`). + Синтаксис под 0.11 валиден (`luac5.1 -p` проходит), но ПОЛНАЯ загрузка не проверялась — + если при рестарте Prosody падает/модуль ругается в логах — закомментировать `"admin_web"` + в modules_enabled; потеряем только панель. +- **Доступ к /admin**: панель раздаётся на HTTP-порту Prosody **5280** (внутри Docker). + Наружу 5280 не проброшен (всё через Caddy 443). Для внешнего доступа — добавить в Caddy + на vps02 блок `admin.nixg.ru { reverse_proxy 10.8.0.2:5280 }` или открывать по WG. +- **mod_http_upload_external НЕ включён**: это альтернатива работающему `mod_http_upload` + (классический, с локальным хранилищем, см. раздел 7). External требует отдельного + HTTP-сервиса для файлов (например, minio/nginx с подписанными URL). Включить при необходимости: + `Component "upload-ext.nixg.ru" "http_upload_external"` + `http_upload_external_base_url`. +- **Порядок включения**: после правок конфига — `docker exec icq-prosody prosodyctl check config` + → `docker compose restart prosody` → `docker logs icq-prosody --tail 100`. + +## 11. Полезные команды ```bash cd /opt/icq docker compose ps @@ -316,8 +478,8 @@ python3 -c "import socket,ssl; ..." # см. раздел 8 curl -sS https://upload.nixg.ru/upload ``` -## 10. TODO (следующие шаги) -- [ ] OMEMO (сквозное шифрование, XEP-0384) — клиенты Converse уже умеют (libomemo в dist); проверить на сервере. +## 12. TODO (следующие шаги) +- [x] ~~OMEMO (XEP-0384)~~ — ВЫПОЛНЕНО: раздел 9; скрипт scripts/omemo_check.py. - [ ] Бот-книгоискатель (slixmpp + OPDS) — Этап 3 PRD. venv уже создан (/opt/icq/.venv: aiohttp, slixmpp). - [ ] Мосты mautrix-telegram / mautrix-whatsapp — Этап 4 (нужен Prosody mod_component / external component). - [ ] Push-уведомления APNs/FCM (публичный push-шлюз для Prosody). diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..b542e93 --- /dev/null +++ b/backup.sh @@ -0,0 +1,53 @@ +#!/bin/bash +# Скрипт резервного копирования ICQ XMPP (Prosody + webchat) с отправкой на Яндекс.Диск +# По образцу /opt/netbox/backup.sh + +PROJECT_DIR="/opt/icq" +BACKUP_DIR="${PROJECT_DIR}/backups" +YADISK_MOUNT="/mnt/yandex-disk" +YADISK_TARGET="${YADISK_MOUNT}/backup/icq-backups" +DATE=$(date +%Y%m%d_%H%M%S) + +# Папки/файлы проекта, которые бэкапим (из /opt/icq) +INCLUDE="data config certs modules webchat docker-compose.yml .env README.md STATUS.md PRD.md MIGRATION.md WALKTHROUGH.md" + +mkdir -p ${BACKUP_DIR} + +echo "🔄 [$(date)] Начинаем резервное копирование ICQ XMPP..." + +# Проверяем, примонтирован ли Яндекс.Диск +if ! mountpoint -q ${YADISK_MOUNT}; then + echo " ❌ ОШИБКА: Яндекс.Диск не примонтирован!" + exit 1 +fi + +# Создаём папку для бэкапов на Яндекс.Диске (если её нет) +mkdir -p ${YADISK_TARGET} 2>/dev/null + +# 1. Бэкап проекта одним архивом (данные Prosody + конфиги + серты + модули + веб-клиент + доки) +ARCHIVE="${BACKUP_DIR}/icq_${DATE}.tar.gz" +echo " → Архив проекта..." +tar czf ${ARCHIVE} -C ${PROJECT_DIR} ${INCLUDE} 2>/dev/null + +if [ -s "${ARCHIVE}" ]; then + echo " ✅ Архив: $(du -h ${ARCHIVE} | cut -f1)" + echo " ☁️ Копирование на Яндекс.Диск..." + cp ${ARCHIVE} ${YADISK_TARGET}/ + echo " ✅ скопирован на ЯД (${YADISK_TARGET}/)" +else + echo " ❌ Ошибка создания архива!" +fi + +# 2. Очистка старых бэкапов +# Локально: оставляем 7 дней +find ${BACKUP_DIR} -type f -name "icq_*" -mtime +7 -delete 2>/dev/null + +# На Яндекс.Диске: оставляем 30 дней +find ${YADISK_TARGET} -type f -name "icq_*" -mtime +30 -delete 2>/dev/null + +echo "✅ [$(date)] Резервное копирование завершено!" + +# Показываем список созданных бэкапов +echo "" +echo "📊 Созданные бэкапы:" +ls -lh ${BACKUP_DIR}/icq_${DATE}.* 2>/dev/null || echo " (нет файлов)" diff --git a/config/prosody.cfg.lua b/config/prosody.cfg.lua index ea9c2da..32c6d8c 100644 --- a/config/prosody.cfg.lua +++ b/config/prosody.cfg.lua @@ -38,6 +38,8 @@ modules_enabled = { "register"; -- In-band registration (для первого пользователя) "adhoc"; -- ad-hoc команды "admin_adhoc"; -- админ-команды + "admin_web"; -- веб-панель /admin (yurt-page; глобальный, требует bosh+admin_adhoc+http_files) + "bosh"; -- BOSH (HTTP long-polling, для mod_admin_web) -- Messaging / Chat "csi"; -- Client State Indication (экономия батареи) @@ -103,6 +105,8 @@ Component "conference.nixg.ru" "muc" name = "ICQ Family Chat" restrict_room_creation = false -- все могут создавать комнаты max_history_messages = 200 + -- Доп. модули MUC: vcard_muc (аватары комнат, XEP-0153 в MUC), muc_moderation (XEP-0425 модерация) + modules = { "vcard_muc", "muc_moderation" } -- HTTP Upload (XEP-0363) — mod_http_upload (community-модуль, установлен из apt prosody-modules, -- скопирован в ./modules/mod_http_upload/. Работает как Component (НЕ в modules_enabled). diff --git a/modules/mod_admin_web.lua b/modules/mod_admin_web.lua new file mode 100644 index 0000000..341129d --- /dev/null +++ b/modules/mod_admin_web.lua @@ -0,0 +1,343 @@ +-- Copyright (C) 2010 Florian Zeitz +-- +-- This file is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +-- + +-- +-- +-- +-- + +-- +-- +-- / +-- +-- +-- / +-- + +local st = require "util.stanza"; +local uuid_generate = require "util.uuid".generate; +local is_admin = require "core.usermanager".is_admin; +local pubsub = require "util.pubsub"; +local jid_bare = require "util.jid".bare; + +local hosts = prosody.hosts; +local incoming_s2s = prosody.incoming_s2s; + +module:set_global(); + +local service = {}; + +local xmlns_adminsub = "http://prosody.im/adminsub"; +local xmlns_c2s_session = "http://prosody.im/streams/c2s"; +local xmlns_s2s_session = "http://prosody.im/streams/s2s"; + +local idmap = {}; + +local function add_client(session, host) + local name = session.full_jid; + local id = idmap[name]; + if not id then + id = uuid_generate(); + idmap[name] = id; + end + local item = st.stanza("item", { id = id }):tag("session", {xmlns = xmlns_c2s_session, jid = name}):up(); + if session.secure then + local encrypted = item:tag("encrypted"); + local sock = session.conn and session.conn.socket and session.conn:socket() + local info = sock and sock.info and sock:info(); + for k, v in pairs(info or {}) do + encrypted:tag("info", { name = k }):text(tostring(v)):up(); + end + end + if session.compressed then + item:tag("compressed"):up(); + end + service[host]:publish(xmlns_c2s_session, host, id, item); + module:log("debug", "Added client %s", name); +end + +local function del_client(session, host) + local name = session.full_jid; + local id = idmap[name]; + if id then + local notifier = st.stanza("retract", { id = id }); + service[host]:retract(xmlns_c2s_session, host, id, notifier); + end +end + +local function add_host(session, type, host) + local name = (type == "out" and session.to_host) or (type == "in" and session.from_host); + local id = idmap[name.."_"..type]; + if not id then + id = uuid_generate(); + idmap[name.."_"..type] = id; + end + local item = st.stanza("item", { id = id }):tag("session", {xmlns = xmlns_s2s_session, jid = name}) + :tag(type):up(); + if session.secure then + local encrypted = item:tag("encrypted"); + + local sock = session.conn and session.conn.socket and session.conn:socket() + local info = sock and sock.info and sock:info(); + for k, v in pairs(info or {}) do + encrypted:tag("info", { name = k }):text(tostring(v)):up(); + end + + if session.cert_identity_status == "valid" then + encrypted:tag("valid"); + else + encrypted:tag("invalid"); + end + end + if session.compressed then + item:tag("compressed"):up(); + end + service[host]:publish(xmlns_s2s_session, host, id, item); + module:log("debug", "Added host %s s2s%s", name, type); +end + +local function del_host(session, type, host) + local name = (type == "out" and session.to_host) or (type == "in" and session.from_host); + local id = idmap[name.."_"..type]; + if id then + local notifier = st.stanza("retract", { id = id }); + service[host]:retract(xmlns_s2s_session, host, id, notifier); + end +end + +local function get_affiliation(jid, host) + local bare_jid = jid_bare(jid); + if is_admin(bare_jid, host) then + return "member"; + else + return "none"; + end +end + +function module.add_host(module) + -- Dependencies + module:depends("bosh"); + module:depends("admin_adhoc"); + module:depends("http"); + + local serve; + if not pcall(function () + local http_files = require "net.http.files"; + serve = http_files.serve; + end) then + serve = module:depends"http_files".serve; + end + local serve_file = serve { + path = module:get_directory() .. "/www_files"; + }; + + -- Setup HTTP server + module:provides("http", { + title = "Admin Interface"; + name = "admin"; + route = { + ["GET"] = function(event) + event.response.headers.location = event.request.path .. "/"; + return 301; + end; + ["GET /*"] = serve_file; + } + }); + + -- Setup adminsub service + local function simple_broadcast(kind, node, jids, item) + if item then + item = st.clone(item); + item.attr.xmlns = nil; -- Clear the pubsub namespace + end + local message = st.message({ from = module.host, type = "headline" }) + :tag("event", { xmlns = xmlns_adminsub .. "#event" }) + :tag(kind, { node = node }) + :add_child(item); + for jid in pairs(jids) do + module:log("debug", "Sending notification to %s", jid); + message.attr.to = jid; + module:send(message); + end + end + + service[module.host] = pubsub.new({ + broadcaster = simple_broadcast; + normalize_jid = jid_bare; + get_affiliation = function(jid) return get_affiliation(jid, module.host) end; + capabilities = { + member = { + create = false; + publish = false; + retract = false; + get_nodes = true; + + subscribe = true; + unsubscribe = true; + get_subscription = true; + get_subscriptions = true; + get_items = true; + + subscribe_other = false; + unsubscribe_other = false; + get_subscription_other = false; + get_subscriptions_other = false; + + be_subscribed = true; + be_unsubscribed = true; + + set_affiliation = false; + }; + + owner = { + create = true; + publish = true; + retract = true; + get_nodes = true; + + subscribe = true; + unsubscribe = true; + get_subscription = true; + get_subscriptions = true; + get_items = true; + + subscribe_other = true; + unsubscribe_other = true; + get_subscription_other = true; + get_subscriptions_other = true; + + be_subscribed = true; + be_unsubscribed = true; + + set_affiliation = true; + }; + }; + }); + + -- Create node for s2s sessions + local ok, err = service[module.host]:create(xmlns_s2s_session, true); + if not ok then + module:log("warn", "Could not create node %s: %s", xmlns_s2s_session, err); + else + service[module.host]:set_affiliation(xmlns_s2s_session, true, module.host, "owner") + end + + -- Add outgoing s2s sessions + for _, session in pairs(hosts[module.host].s2sout) do + if session.type ~= "s2sout_unauthed" then + add_host(session, "out", module.host); + end + end + + -- Add incoming s2s sessions + for session in pairs(incoming_s2s) do + if session.to_host == module.host then + add_host(session, "in", module.host); + end + end + + -- Create node for c2s sessions + ok, err = service[module.host]:create(xmlns_c2s_session, true); + if not ok then + module:log("warn", "Could not create node %s: %s", xmlns_c2s_session, tostring(err)); + else + service[module.host]:set_affiliation(xmlns_c2s_session, true, module.host, "owner") + end + + -- Add c2s sessions + for _, user in pairs(hosts[module.host].sessions or {}) do + for _, session in pairs(user.sessions or {}) do + add_client(session, module.host); + end + end + + -- Register adminsub handler + module:hook("iq/host/http://prosody.im/adminsub:adminsub", function(event) + -- luacheck: ignore 431/ok + local origin, stanza = event.origin, event.stanza; + local adminsub = stanza.tags[1]; + local action = adminsub.tags[1]; + local reply; + if action.name == "subscribe" then + local ok, ret = service[module.host]:add_subscription(action.attr.node, stanza.attr.from, stanza.attr.from); + if ok then + reply = st.reply(stanza) + :tag("adminsub", { xmlns = xmlns_adminsub }); + else + reply = st.error_reply(stanza, "cancel", ret); + end + elseif action.name == "unsubscribe" then + local ok, ret = service[module.host]:remove_subscription(action.attr.node, stanza.attr.from, stanza.attr.from); + if ok then + reply = st.reply(stanza) + :tag("adminsub", { xmlns = xmlns_adminsub }); + else + reply = st.error_reply(stanza, "cancel", ret); + end + elseif action.name == "items" then + local node = action.attr.node; + local ok, ret = service[module.host]:get_items(node, stanza.attr.from); + if not ok then + origin.send(st.error_reply(stanza, "cancel", ret)); + return true; + end + + local data = st.stanza("items", { node = node }); + for _, entry in pairs(ret) do + data:add_child(entry); + end + if data then + reply = st.reply(stanza) + :tag("adminsub", { xmlns = xmlns_adminsub }) + :add_child(data); + else + reply = st.error_reply(stanza, "cancel", "item-not-found"); + end + elseif action.name == "adminfor" then + local data = st.stanza("adminfor"); + for host_name in pairs(hosts) do + if is_admin(stanza.attr.from, host_name) then + data:tag("item"):text(host_name):up(); + end + end + reply = st.reply(stanza) + :tag("adminsub", { xmlns = xmlns_adminsub }) + :add_child(data); + else + reply = st.error_reply(stanza, "feature-not-implemented"); + end + origin.send(reply); + return true; + end); + + -- Add/remove c2s sessions + module:hook("resource-bind", function(event) + add_client(event.session, module.host); + end); + + module:hook("resource-unbind", function(event) + del_client(event.session, module.host); + service[module.host]:remove_subscription(xmlns_c2s_session, module.host, event.session.full_jid); + service[module.host]:remove_subscription(xmlns_s2s_session, module.host, event.session.full_jid); + end); + + -- Add/remove s2s sessions + module:hook("s2sout-established", function(event) + add_host(event.session, "out", module.host); + end); + + module:hook("s2sin-established", function(event) + add_host(event.session, "in", module.host); + end); + + module:hook("s2sout-destroyed", function(event) + del_host(event.session, "out", module.host); + end); + + module:hook("s2sin-destroyed", function(event) + del_host(event.session, "in", module.host); + end); +end diff --git a/modules/mod_admin_web/www_files/css/style.css b/modules/mod_admin_web/www_files/css/style.css new file mode 100644 index 0000000..20ed2e5 --- /dev/null +++ b/modules/mod_admin_web/www_files/css/style.css @@ -0,0 +1,114 @@ +body { + margin: 0 +} + +a { + color: #0000FF +} + +#adhocCommands > ul { + margin: 0 +} + +.btn { + margin-right: 0.3em +} + +.btn:last-child { + margin-right: 0 +} + +#log_container { + clear: both; + display: none +} + +#adhocCommands { + border-right: solid 1px +} + +#adhocCommands li { + list-style: inside +} + +#login { + float: left; + margin: 1em 2em 0 1em; + padding-right: 1em; + border: solid 1px; + background: #eef0f2; + color: #000000 +} + +#main { + display: none; + margin: 1em +} + +#main p { + margin: 0 +} + +#top { + clear: both; + width: 100%; + padding: 0; +} + +@media screen and (min-width: 757px) { + #header { + background: url(../images/blue_orange.png) repeat-x + } +} + +#header img { + max-width: 100%; + height: auto +} + +#menu { + display: none; + color: #454748; + font-size: 1.1em; + background: #eef0f2; + width: 100%; +} + +#menu ul { + display: inline; + list-style-type: none; + margin: 0; + padding: 0.5em 0 +} + +#menu li { + display: inline; + padding: 0 0.5em +} + +#menu a { + color: #454748; + text-decoration: none +} + +#menu li a:hover { + color: #6197DF; + text-decoration: underline +} + +#selector { + display: inline-block +} + +#s2sList h2, #c2sList h2 { + color: #4b8ade; + margin: 0 +} + +#s2sList li, #c2sList li { + cursor: pointer +} + +#host { + margin: 0.25em; +} diff --git a/modules/mod_admin_web/www_files/images/blue_orange.png b/modules/mod_admin_web/www_files/images/blue_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..88d87d6159a6b25640a28da6e73fd295a9a6a445 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^j6l4SgAGW&iV6owuqAoByDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv|KT=GH|CYQa1E5Zt)vLhQ0DB`aST3f&kf`UfZlYcV^a zg)Veq1W^=`mLe32xap#;iV7`=x@arGT4M9Ocg981^wv~p>P|e1Vdls1ox{xU%)tMs zh43!Y33(Kl+9InxmC@4;;8key?iaFi6XbKtfB`@Xkg~ef5+H;?NP+OTf?LK8$9Z_; z^g6ikLN5+XQ(6AZX+M$Mnlq#@pt(^jA z2Lz*SC_Bi=a4!mAer^(ggB_RA**9P`#%NrlF~$X>>so!T-72}JA2{B{%*5k*LIp53 zlmy^X-+1l1wiYul2iL%^*30mg| ze`>GYt^v3HvM;WuGP-}G1~HvyukvGVyeV2_e+Ofa?vTo?6{>#UWc!1JBC)2xKHJ}* zZ2%5HWP4L!>EHH8umB7oDt002ovPDHLkV1oQuF)085 literal 0 HcmV?d00001 diff --git a/modules/mod_admin_web/www_files/images/encrypted.png b/modules/mod_admin_web/www_files/images/encrypted.png new file mode 100644 index 0000000000000000000000000000000000000000..5f3cc6c395d369071a051628f4f985efc566dd11 GIT binary patch literal 1213 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

kt5#0TKckYp=K*T!7+Sn< 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 A1^@s6 literal 0 HcmV?d00001 diff --git a/modules/mod_admin_web/www_files/images/secure.png b/modules/mod_admin_web/www_files/images/secure.png new file mode 100644 index 0000000000000000000000000000000000000000..89ddaffb9b1a79f4b9301b3e022ee34787d38275 GIT binary patch literal 1526 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipf7 z5Dh3eLtxne00nkQL_t(I%bk>aY*XhM#(&>AK0bDA#{nm)Lqmw08;}bk6bP$OOWRc$ z8v{*Iwb4ym|JZsF9iyEPQnsp76DdnYDXMx|*N#b(sHS$KOj<^p3$(x*Skp9IGO&{{ za&vL)IF56CNqo-PAGwIpXqxs)?_b~hKJTmNeVz|)3juKHO0Vhhc#r@r76olfIsX|S zb+(zeLgVIA&s(cq=H^Fs>Hz%qoj3h~fotYOaKt=)rYpTv6^?|=z<{6NFP_6;Q8@Lt zbH^+Ixt@FlSpVl2p8w-?wyW>GYjPvYMoVk+*6Dc6=>Erfb21t>Uw-AKx5d@|%d_Fh z38iS&YOZMQUvbIZNiCIpT9oDe)yq>t3ngEa5`OF-MJf4l26`B52iLl1{b?JJLfNW{{!1E zmX?2w;W0{MA)WQ`A_4iDnGXEiJO2UQuMqrEHWyJyYZjt3rmC>)tUz0^bM zY9G$Ao8+gH=;;(%Ft%M@CnN(p8wV-mID$(?6BMIkJnUfD6Xs9mKBdrGZDVUUETr|i$ZKFMqnV2_WQ5* zOvR?&KXkD1$g;pKt<8PqWfjF06%{VkrV2@th(;%wolRq!AcP>xW}_fC4^vS9FijHx zS(Zs8QUt#Y^697NBM0{XJQu*SFyO+rx@~2n> zED|k*K-YD2Lr1be;oXIJy#=wwjTeD`)7#g(YwMOeyMN#snx-L35~@|jX0>9qSTGC& zfMDloy1(}r0J%-S!jY51&3*gljZ**hzbpbTX{frUveas^R{Dy4N-CXVE|Wn3lC-e{o=jj41z;#ZzT1s05vQbK4_xSdW)&R2 zU7K{YceQV<-7pfG2<^Cc(`K8hs!T>Bq*Fl3 z$nj|s{g)}MD#M{G&&YSmq@%s7?}HO3f9);EU#DmE@-3UU%2w5eC@*28^(fgDK4LxH z$dh5@$ONjPBLR-P3P@MgCIVMRlpDd|o;!6c1J2vh@zbB}d$zQ+WY=SRf8dHl!e&?5 zTB&^RZv4kje#I2;IXrK4YLTaxHOMl9V cJF?IGHx>& + + + +Prosody Webadmin + + + + + + + + + + +

+ + +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+

Incoming S2S connections:

+
    +
    +
    +

    Outgoing S2S connections:

    +
      +
      +
      +
      +
      +
      +
      +

      Client connections:

      +
        +
        +
        +
        +
        + + + + diff --git a/modules/mod_admin_web/www_files/js/adhoc.js b/modules/mod_admin_web/www_files/js/adhoc.js new file mode 100644 index 0000000..9144abc --- /dev/null +++ b/modules/mod_admin_web/www_files/js/adhoc.js @@ -0,0 +1,252 @@ +// adhocweb +// Copyright (c) 2010-2013 Florian Zeitz +// This project is MIT licensed. +// http://git.babelmonkeys.de/?p=adhocweb.git;a=blob_plain;f=js/adhoc.js + +Strophe.addNamespace('ADHOC', 'http://jabber.org/protocol/commands') + +function Adhoc (view, readycb) { + this.status = { + sessionid: null, + cmdNode: null, + queryJID: null, + readycb: readycb, + view: view + } +} + +Adhoc.prototype = { + constructor: Adhoc, + + addNote: function (text, type) { + if (!type) { + type = 'info' + } + text = text.replace(/\n/g, '
        ') + $(this.status.view).append(`

        ${text}

        `) + }, + + addForm: function (x) { + let self = this + let form = $(`
        `) + form.submit(function (event) { + self.executeCommand('execute', self.serializeToDataform('form'), + function (e) { self.displayResult(e) }) + event.preventDefault() + }) + let fieldset = $('
        ') + form.append(fieldset) + $(x).find('title').each(function () { $('').text($(this).text()).appendTo(fieldset) }) + $(x).find('instructions').each(function () { $('

        ').text($(this).text()).appendTo(fieldset) }) + $(x).find('field').each(function () { + let clearfix = $(`

        `) + let item = self.buildHTMLField(this) + let label = $(this).attr('label') + if (label) { + $('