我正在尝试使用 OMEMO 加密构建一个 MUC 平台,以在 Android 应用程序上使用。我正在使用 Ejabberd (v17.11) 和 Smack 库 (v4.2.1)。
MUC 房间用于 Muc/Sub 支持persistent
,allow_subscription
用于离线消息。
当客户作为“所有者”开始一个新房间并从他的名册中添加“成员”时;所有的客户都加入了房间,一切看起来都很好。所有者可以向群组发送消息,并将消息传递给每个成员。
但是,当组成员尝试发送消息时,如果他不“知道”组中的所有成员(如果他们不在他的名册中),他就无法发送消息!
我发现,在向群发 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>
接收:
<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:subscription-required - auth
那么,我该如何解决呢?在聊天组中,每个用户都不必见面。当他们聚在一起时,我应该将每个人都添加到每个人的名单中吗?
或者这与房间隶属关系或角色有关?
或者关于 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,<<>>}]