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

Do not allow any owner to revoke ownership of the user who created the room/MUC - Ejabberd XMPP

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

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

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

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

您应该实现自定义 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 中这无关紧要!
实际上有一个黑客。每个从属关系都可以设置一个自定义原因,它只是 <reason>...</reason> 标签内的一个文本。您可以在 MUCState.
中查看所有者的归属原因 房间创建者(第一任所有者)没有从属关系的理由。因此,当有人授予所有权时,您可以将某些内容放入 'reason' 字段(您需要在用户范围内进行,例如 user_send_packet 挂钩)并让 MUC 处理它,当有人撤销所有权时检查目标是否所有者已 'reason' 在上述功能中提交或未提交。
还有更先进和标准的方法来做到这一点。您可以更改 MUC config state 并在 mod_muc_room.erl 中添加创建者 jid 和一些更改。所以你可以在上面的函数 MUCState 中包含创建者的 jid。