Ejabberd MUC-Sub неприятности - PullRequest
0 голосов
/ 14 мая 2018

Я использую сервер ejabberd (версия 18.3.0) со следующей конфигурацией для mod_muc:

  mod_muc:
    host: "conference.@HOST@"
    ...
    default_room_options:
      allow_subscription: true
      persistent: true
      mam: true

Я пытаюсь получить доступ к комнатам слияния на этом сервере от различных клиентов (например, с помощью xmppframework,js with 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>

User2 все еще не получает вышеуказанное сообщение.

Я включил уровень ведения журнала 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}}

Возможно, мне не хватает чего-то очень простого(в отношении user / nick / muc room и т. д.), но понятия не имею, что.

Не могли бы вы дать мне шаги, которые вы использовали для создания user1 / user2, зарегистрировать их ники и т. д. на сервере (используя ejabberdctl)?

1 Ответ

0 голосов
/ 14 мая 2018

Насколько я понимаю, сообщение о присутствии не требуется для получения сообщений (для mucsub).

Вы правы.Есть что-то странное.Итак, я попробовал себя и предоставил вам точные отправленные и полученные разделы, чтобы вы могли сравнить, может быть, вы видите что-то важное.

Вы также можете попробовать отправить эти разделы вручную, используя консоль XMLнастольный Jabber-клиент, такой как Gajim, Psi или Tkabber, поэтому вам не нужно писать код для этого тестирования.

Я настраиваю модуль так же, как вы.Затем user1 присоединяется к room2 (поэтому он создается).И пользователь2 подписывается на комнату:

<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>

Сразу после этого пользователь1 отправляет сообщение в комнату, а пользователь2 получает его, не отправляя ни слова о присутствии.

<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>
...