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

How to allow Ejabberd external XMPP component to send presence packets on behalf of a user

我为 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",目标用户实际上收到了包裹。

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

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

知道我可能遗漏了什么或者为什么在未指定 "to" 字段时出现 400 错误吗?

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

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