如何允许 Ejabberd 外部 XMPP 组件代表用户发送状态数据包



我为 Ejabberd 编写了一个外部组件,但是当尝试代表用户发送状态节时,我收到 400 错误。

组件的名称是 bot.domain.com,Ejabberd 中的主机名是 domain.com 的,我已经为我的组件设置了"check_from"标志为 false。

下面是我尝试代表用户从组件发送的状态节的示例:

<presence from="user@domain.com">
    <status>Test status</status>
    <show>dnd</show>
</presence>

这是Ejabberd返回的错误消息:

<presence type="error" to="user@domain.com">
    <status>Test status</status>
    <show>dnd</show>
    <error code="400" type="modify">
         <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
    </error>
</presence>

如果我在发送的包中添加 to="user2@domain.com",目标用户实际上会收到包。

如果我添加 to="domain.com",我不会再收到 400 错误,但状态不会广播给用户名单中的任何人。

实际问题似乎是Ejabberd没有向用户名单中的每个人广播状态数据包。

知道我可能缺少什么或为什么在未指定"to"字段时出现 400 错误?

不能代表组件中的用户广播名单状态。组件服务不加载用户名单。只有ejabberd_c2s负责将名单加载到广播状态。它还负责检查隐私列表和XMPP的许多重要功能。

作为旁注,我不知道您希望使用这种方法做什么,但是您可以在XMPP中将状态与用户会话分开。用户首先在线,因为他在 XMPP 上打开了一个会话,其次是因为他发送了状态。通过为用户伪造从组件发送状态,不能保证该用户将打开会话。在这种情况下,整体行为肯定不会是您所期望的。

最新更新