Отправка сообщений неизвестным пользователям в 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 изменяется для доступа к модели.

Другие вопросы по тегам