如何允许 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 上打开了一个会话,其次是因为他发送了在线状态。通过为用户伪造从组件发送的状态,您不能保证该用户将打开一个会话。在那种情况下,整体行为肯定不是您期望的那样。
我为 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 上打开了一个会话,其次是因为他发送了在线状态。通过为用户伪造从组件发送的状态,您不能保证该用户将打开一个会话。在那种情况下,整体行为肯定不是您期望的那样。