Отправка сообщений неизвестным пользователям в XMPP MultiUserChat с шифрованием OMEMO
Я пытаюсь создать платформу MUC с шифрованием OMEMO для использования в приложении Android. Я использую Ejabberd (v17.11) и библиотеку Smack (v4.2.1).
MUC комнаты persistent
И они allow_subscription
для поддержки Muc/Sub, для автономных сообщений.
Когда клиент открывает новую комнату как "владелец" и добавляет "члена" из своего списка; все клиенты присоединяются к комнате, и все выглядит хорошо. Владелец может отправлять сообщения группе, и она доставляется каждому участнику.
Но когда член группы пытается отправить сообщение, если он не "знает" всех членов группы (если они не входят в его список), он не может отправить сообщение!
Я обнаружил, что при отправке сообщения OMEMO группе необходимо зашифровать сообщение отдельно для каждого участника, и это требует получения каждого участника. devicelist
!
На этом шаге:
mOmemoManager.encrypt(muc, msgBody);
Он пытается зашифровать всех получателей, но получение списка устройств неизвестного пользователя приводит к сбою.
ПОСЛАЛ:
<iq to='unknownuser@server.com' id='141' type='get'><query xmlns='http://jabber.org/protocol/disco#info' node='eu.siacs.conversations.axolotl.devicelist'></query></iq>
RECV:
<iq xml:lang='en' to='myuser@server.com/mobile' from='unknownuser@server.com' type='error' id='141'><query node='eu.siacs.conversations.axolotl.devicelist' xmlns='http://jabber.org/protocol/disco#info'/><error code='407' type='auth'><subscription-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Not subscribed</text></error></iq>
Ошибка Smack:
Не удалось получить список устройств unknownuser@server.com:.....
XMPPError: требуется подписка - авторизация
Итак, как я могу решить это? В чат-группах каждый пользователь не должен встречаться друг с другом. Должен ли я добавить всех в свой список, когда они собираются вместе в группе?
Или это что-то о принадлежности к комнате или роли?
Или что-то о конфигурации Ejabberd?
[{title,<<"groupName">>},
{allow_query_users,true},
{allow_private_messages,true},
{allow_private_messages_from_visitors,anyone},
{allow_visitor_status,true},
{allow_visitor_nickchange,true},
{public,false},
{public_list,false},
{persistent,true},
{moderated,true},
{members_by_default,true},
{members_only,true},
{allow_user_invites,true},
{anonymous,false},
{logging,false},
{allow_voice_requests,true},
{allow_subscription,true},
{mam,true},
{presence_broadcast,[moderator,participant,visitor]},
{voice_request_min_interval,1800},
{vcard,<<>>},
{captcha_whitelist,[]},
{affiliations,[{{<<"user1">>,<<"server.com">>,<<>>},{member,<<>>}}, {{<<"user2">>,<<"server.com">>,<<>>},{owner,<<>>}}, {{<<"user3">>,<<"server.com">>,<<>>},{member,<<>>}}]},
{subject,[]},
{subject_author,<<>>}]
0 ответов
OMEMO требует, чтобы отправитель мог прочитать получающий узел OMEMO pubsub. Это необходимо для получения пакета PreKey получателей для создания сеанса.
Современные реализации настраивают общедоступный узел OMEMO pubsub - также существует конфигурация ejabberd для принудительного использования этого для устаревших клиентов.
Поэтому большинство клиентских реализаций OMEMO ограничивают доступ к функции шифрования только в частных групповых чатах. В этом сценарии все контакты находятся в списках друг друга и имеют доступ к узлам OMEMO друг друга. Шифрование общедоступных групповых чатов в любом случае не имеет смысла, поскольку злоумышленник может просто присоединиться к чату, чтобы читать сообщения.
Если вы хотите настроить общедоступные узлы OMEMO pubsub в своем клиенте, посмотрите, как smack-openpgp изменяется для доступа к модели.