不允许任何所有者撤销创建房间/MUC 的用户的所有权 - Ejabberd XMPP

Posted

技术标签:

【中文标题】不允许任何所有者撤销创建房间/MUC 的用户的所有权 - Ejabberd XMPP【英文标题】:Do not allow any owner to revoke ownership of the user who created the room/MUC - Ejabberd XMPP 【发布时间】:2020-11-23 18:52:12 【问题描述】:

我正在使用 ejabberd XMPP 为 android 开发一个消息传递应用程序。应用程序具有房间聊天功能 (MUC)。 我有一个关于 MUC 所有者隶属关系的问题。

userA(Creator) 创建一个新房间 (MUC)。 用户 B 加入房间,用户 A(创建者)将所有权授予用户 B。 userB 撤销 userA(Creator) 的所有权 userA(Creator) 现在没有了(这是问题所在)

我想知道如何配置 XMPP 服务器以不允许任何所有者撤销创建房间/MUC 的用户的所有权?

https://xmpp.org/extensions/xep-0045.html

【问题讨论】:

您可能会为自己的自定义用例找到一些解决方法。但从长远来看,您最终会在服务器上编写自定义模块,并且必须偏离标准的 XMPP。 【参考方案1】:

您应该实现一个自定义 ejabberd 模块并使用 muc_process_iq 挂钩。 当有人试图撤销所有权时,它会向 MUC 发送一个 IQ 节,您可以通过上述挂钩捕获它。 你的钩子的回调函数应该是这样的:

my_callback(IQ, MUCState) ->
    % check if it's for granting/revoking ownership
    % ...
    NewIQ. % or atom 'ignore'

但是MUCState 中没有创建者 jid,因为在 XMPP 中这无关紧要! 实际上有一个hack。每个隶属关系都可以使用自定义原因进行设置,该原因只是 <reason>...</reason> 标记内的文本。您可以在MUCState查看业主的隶属原因。 房间创建者(第一任所有者)的隶属关系没有理由。因此,当有人授予所有权时,您可以将某些内容放入“原因”字段(您需要在用户范围内进行,例如 user_send_packet 钩子)并让 MUC 处理它,当有人撤销所有权时检查目标所有者是否有“原因” ' 是否在上述函数中归档。 还有更先进和标准的方法来做到这一点。您可以更改MUC config state 并在mod_muc_room.erl 中添加创建者jid 和一些更改。这样你就可以在上面的函数中MUCState拥有创作者的jid。

【讨论】:

感谢您的回答,但我是 Erlang 的新手。对我来说,很难对模块文件进行任何更改。你能给我提供更多细节或一些代码sn-ps吗?。 我明白了。实际上,没有具体的文档。唯一的方法是读取源代码并在其上编写/修改模块。 好的兄弟,谢谢

以上是关于不允许任何所有者撤销创建房间/MUC 的用户的所有权 - Ejabberd XMPP的主要内容,如果未能解决你的问题,请参考以下文章

使用 Conversejs 加入房间时清除所有 MUC 消息

从房间配置 MUC 中删除一些选项

XMPP MUC 最大用户数

XMPP MUC问题

strophe js MUC房间

如何使用 Smack 确定 MUC 是不是存在?