Ejabberd MUC-Sub неприятности
Я использую сервер ejabberd (версия 18.3.0) со следующей конфигурацией для mod_muc:
mod_muc:
host: "conference.@HOST@"
...
default_room_options:
allow_subscription: true
persistent: true
mam: true
Я пытаюсь получить доступ к комнатам muc на этом сервере от различных клиентов (ios с xmppframework, js с node-xmpp-client - создание команд xmpp вручную). Клиенты могут получать сообщения - ТОЛЬКО ЕСЛИ после подключения я отправляю сообщение о присутствии.
Однако, не отправляя информацию о присутствии, я не получаю никаких сообщений от клиента (даже если подписка прошла успешно). Насколько я понял, присутствие сообщения не требуется для получения сообщений (для mucsub).
Любая помощь высоко ценится!
Дополнительные подробности в ответ на ответ Badlop
Я сравнил xml-сообщения на моем клиенте / сервере с теми, которые вы опубликовали. Продолжая пример user1/user2, я вижу успех для подписки user2:
<iq xmlns="jabber:client"
lang="en"
to="rk3@localhost/abcd"
from="tr21@conference.localhost"
type="result" id="D7550060-E2AE-4369-878C-261A02BA48A2">
<subscribe xmlns="urn:xmpp:mucsub:0" nick="rk3n">
<event node="urn:xmpp:mucsub:nodes:messages"/>
<event node="urn:xmpp:mucsub:nodes:presence"/>
</subscribe>
</iq>
Кроме того, запрос службы muc от user2 приводит к следующему:
<iq xmlns="jabber:client"
lang="en"
to="rk3@localhost/abcd"
from="conference.localhost" type="result" id="B28A237A-5D54-4AE2-821A-195272B05A88">
<subscriptions xmlns="urn:xmpp:mucsub:0">
<subscription jid="tr21@conference.localhost"/>
</subscriptions>
</iq>
Однако, когда я отправляю групповое сообщение от user1:
<message
from="rk1@localhost" to="tr21@conference.localhost"
type="groupchat">
<body> hi there777hi there778</body>
</message>
Пользователь2 все еще не получает вышеуказанное сообщение.
Я включил уровень ведения журнала 5 на сервере ejabberd и вижу, что сервер пытается отправить вышеуказанное сообщение пользователю 2 (rk3). Однако последний журнал, который я вижу для этого сообщения на сервере, находится ниже (я не вижу никакого журнала "Отправить XML в потоке" для этого сообщения).
2018-05-14 16:28:57.808 [debug] <0.646.0>@ejabberd_sm:do_route:656 processing message to bare JID:
#message{
id = <<>>,type = normal,lang = <<>>,
from =
#jid{
user = <<"tr21">>,server = <<"conference.localhost">>,resource = <<>>,
luser = <<"tr21">>,lserver = <<"conference.localhost">>,lresource = <<>>},
to =
#jid{
user = <<"rk3">>,server = <<"localhost">>,resource = <<>>,
luser = <<"rk3">>,lserver = <<"localhost">>,lresource = <<>>},
subject = [],body = [],thread = undefined,
sub_els =
[#ps_event{
items =
#ps_items{
xmlns = <<>>,node = <<"urn:xmpp:mucsub:nodes:messages">>,
items =
[#ps_item{
xmlns = <<>>,id = <<"15241958194312511749">>,
sub_els =
[#message{
id = <<>>,type = groupchat,lang = <<"en">>,
from =
#jid{
user = <<"tr21">>,server = <<"conference.localhost">>,
resource = <<"rk1">>,luser = <<"tr21">>,
lserver = <<"conference.localhost">>,lresource = <<"rk1">>},
to =
#jid{
user = <<"rk3">>,server = <<"localhost">>,resource = <<>>,
luser = <<"rk3">>,lserver = <<"localhost">>,lresource = <<>>},
subject = [],
body = [#text{lang = <<>>,data = <<"hi there777hi there778">>}],
thread = undefined,
sub_els =
[#mam_archived{
by =
#jid{
user = <<"tr21">>,server = <<"conference.localhost">>,
resource = <<>>,luser = <<"tr21">>,
lserver = <<"conference.localhost">>,lresource = <<>>},
id = <<"1526283878998040">>},
#stanza_id{
by =
#jid{
user = <<"tr21">>,server = <<"conference.localhost">>,
resource = <<>>,luser = <<"tr21">>,
lserver = <<"conference.localhost">>,lresource = <<>>},
id = <<"1526283878998040">>}],
meta =
#{ip => {172,17,0,1},
mam_archived => true,stanza_id => 1526283878998040}}],
node = <<>>,publisher = <<>>}],
max_items = undefined,subid = <<>>,retract = undefined},
purge = undefined,subscription = undefined,delete = undefined,
create = undefined,configuration = undefined}],
meta = #{stanza_id => 1526283879010097}}
Я, вероятно, пропускаю что-то очень простое (по отношению к пользователю / нику / комнате и т. Д.), Но понятия не имею, что.
Не могли бы вы дать мне шаги, которые вы использовали для создания user1/user2, регистрации их ников и т. Д. На сервере (используя ejabberdctl)?
1 ответ
Насколько я понял, присутствие сообщения не требуется для получения сообщений (для mucsub).
Ты прав. Есть что-то странное. Итак, я попробовал себя и предоставил вам точные отправленные и полученные строфы, чтобы вы могли сравнить, может быть, вы видите что-то важное.
Вы также можете попытаться отправить эти разделы вручную, используя консоль XML настольного Jabber-клиента, такого как Gajim, Psi или Tkabber, так что вам не нужно писать код для этого тестирования.
Я настраиваю модуль, как вы. Затем пользователь1 присоединяется к комнате2 (поэтому он создается). И user2 подписывается на комнату:
<iq to='room2@conference.localhost'
type='set'
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
<subscribe xmlns='urn:xmpp:mucsub:0'
nick='mynick'
password='roompassword'>
<event node='urn:xmpp:mucsub:nodes:messages' />
<event node='urn:xmpp:mucsub:nodes:affiliations' />
<event node='urn:xmpp:mucsub:nodes:subject' />
<event node='urn:xmpp:mucsub:nodes:config' />
</subscribe>
</iq>
<iq xml:lang='es'
to='user2@localhost/tka1'
from='room2@conference.localhost'
type='result'
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
<subscribe nick='mynick'
xmlns='urn:xmpp:mucsub:0'>
<event node='urn:xmpp:mucsub:nodes:messages'/>
<event node='urn:xmpp:mucsub:nodes:affiliations'/>
<event node='urn:xmpp:mucsub:nodes:subject'/>
<event node='urn:xmpp:mucsub:nodes:config'/>
</subscribe>
</iq>
Сразу после этого user1 отправляет сообщение в комнату, а user2 получает его, не отправляя ни слова о присутствии.
<message to='user2@localhost/tka1'
from='room2@conference.localhost'>
<event xmlns='http://jabber.org/protocol/pubsub#event'>
<items node='urn:xmpp:mucsub:nodes:messages'>
<item id='1625407893684208871'>
<message xml:lang='es'
to='user2@localhost'
from='room2@conference.localhost/user1'
type='groupchat'
id='53:939858'
xmlns='jabber:client'>
<archived by='room2@conference.localhost'
id='1526291787755131'
xmlns='urn:xmpp:mam:tmp'/>
<stanza-id by='room2@conference.localhost'
id='1526291787755131'
xmlns='urn:xmpp:sid:0'/>
<body>hi allll</body>
</message>
</item>
</items>
</event>
</message>
Просто чтобы быть уверенным, user2 запрашивает у службы MUC список своих подписок, а MUC возвращает room2, и еще одну, которую он также подписал:
<iq
to='conference.localhost'
type='get'
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
<subscriptions xmlns='urn:xmpp:mucsub:0' />
</iq>
<iq xml:lang='es'
to='user2@localhost/tka1'
from='conference.localhost'
type='result'
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
<subscriptions xmlns='urn:xmpp:mucsub:0'>
<subscription jid='room2@conference.localhost'/>
<subscription jid='room3@conference.localhost'/>
</subscriptions>
</iq>