Запретить любому владельцу отозвать право собственности на пользователя, создавшего комнату / MU C - Ejabberd XMPP - PullRequest
1 голос
/ 03 августа 2020

Я разрабатываю приложение для обмена сообщениями для Android с использованием ejabberd XMPP. В приложении есть функция чата в комнате (MU C). У меня вопрос относительно принадлежности владельца MU C.

userA (Creator) создает новую комнату (MU C).
UserB присоединяется к комнате, а userA (Creator) передает права собственности пользователю userB.
userB отменяет право собственности на userA (Creator)
userA (Creator) теперь отсутствует (это проблема)

Я хочу знать, как настроить сервер XMPP, чтобы не разрешать любому владельцу отзывать право собственности пользователя, создавшего комнату / MU C?

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

1 Ответ

1 голос
/ 07 августа 2020

Вы должны реализовать собственный модуль ejabberd и использовать muc_process_iq hook. Когда кто-то пытается отозвать право собственности, он отправляет строфу IQ на MU C, вы можете поймать его с помощью вышеуказанного крючка. Функция обратного вызова вашего хука должна быть примерно такой:

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

Но у вас нет jid создателя в MUCState, потому что в XMPP это не имеет значения! Собственно взлом есть. Для каждой принадлежности можно указать собственную причину, которая представляет собой просто текст внутри тега <reason>...</reason>. Вы можете узнать о причинах принадлежности владельцев в MUCState. Создатель комнаты (первый владелец) не имеет оснований для своей принадлежности. Поэтому, когда кто-то предоставляет право собственности, вы можете поместить что-то в поле «причина» (вам нужно сделать это в области действия пользователя, например, user_send_packet hook) и позволить MU C обработать это, а когда кто-то аннулирует право собственности, проверьте, является ли целевой владелец указана причина или нет в вышеуказанной функции. Также существует более продвинутый и стандартный подход к этому. Вы можете изменить MU C состояние конфигурации и добавить создатель jid и некоторые изменения в mod_muc_room.erl. Таким образом, у вас может быть jid создателя в MUCState в приведенной выше функции.

...