ejabberd BOSH поиск ничего не приносит - PullRequest
0 голосов
/ 16 мая 2019

Мы пытаемся перейти с Openfire на XMPP-сервер ejabberd. У меня установлен ejabberd с параметрами по умолчанию на моей локальной рабочей станции Windows 10. Я установил

  mod_vcard:
    search: true

Я зарегистрировал пару пользователей, использующих ejabberd ReST API. Я также установил некоторые значения vcard для этих пользователей (насколько я понимаю, записи vcard необходимы для работы поиска ejabberd, верно?) Используя Почтальон, я могу подтвердить наличие карточек для пользователя "testfouoles":

POST http://localhost:5281/api/get_vcard
Body:
{
      "host": "planetrisk.com",
      "user": "testfouoles",
      "name": "FN"
}

Response:
{
    "content": "Test UnclassifiedFouoLes"
}

Помимо FN , EMAIL , NICKNAME и NICK vcard установлены. vcards, похоже, чувствительна к регистру, поэтому я установил варианты с маленькими буквами и заглавными буквами, потому что я не уверен, какие варианты используются при поиске. Я также установил vcard2 значения для N FAMILY и N GIVEN .

Для Openfire мы использовали CandyJs с пользовательским поисковым плагином. Пока мы продолжаем использовать его с ejabberd. Для целей тестирования я установил

  mod_vcard:
    search: true
    allow_return_all: true

Таким образом, операции поиска с пустыми полями ввода возвращают всех пользователей , которые добавили некоторую информацию в свою vCard (согласно ejabberd docs ).

Наш плагин CandyJS Search выдает следующий запрос POST для слушателя ejabberd BOSH:

Request URL:http://localhost:5443/bosh?b=101
Request Method:POST
Status Code:200 OK
Remote Address:127.0.0.1:5443
...
Request Payload
<body rid='55271928' xmlns='http://jabber.org/protocol/httpbind' sid='5633a7a6184041b173970798227fddadea5e8742'>
  <iq type='set' id='search2' to='vjud.planetrisk.com' xmlns='jabber:client'>
    <query xmlns='jabber:iq:search'>
      <x xmlns='jabber:x:data' type='submit'>
        <field var='first'><value/></field>
        <field var='last'><value/></field>
        <field var='nick'><value/></field>
        <field var='email'><value/></field>
        <field var='fn'><value/></field>
      </x>
    </query>
  </iq>
</body>

И ejabberd отвечает данными vcard единственного зарегистрированного пользователя (кроме запрашивающего пользователя):

<body xmlns='http://jabber.org/protocol/httpbind'>
  <iq xml:lang='en' to='army.dudeFOUO(at)everbridge.mil@planetrisk.com/planetrisk_Candy_b4a02de8' from='vjud.planetrisk.com' type='result' id='search2' xmlns='jabber:client'>
    <query xmlns='jabber:iq:search'>
      <x type='result' xmlns='jabber:x:data'>
        <title>Search Results for vjud.planetrisk.com</title>
        <reported>
          <field var='jid' type='text-single' label='Jabber ID'/>
          <field var='fn' type='text-single' label='Full Name'/>
          <field var='first' type='text-single' label='Name'/>
          <field var='middle' type='text-single' label='Middle Name'/>
          <field var='last' type='text-single' label='Family Name'/>
          <field var='nick' type='text-single' label='Nickname'/>
          <field var='bday' type='text-single' label='Birthday'/>
          <field var='ctry' type='text-single' label='Country'/>
          <field var='locality' type='text-single' label='City'/>
          <field var='email' type='text-single' label='Email'/>
          <field var='orgname' type='text-single' label='Organization Name'/>
          <field var='orgunit' type='text-single' label='Organization Unit'/>
        </reported>
        <item>
          <field var='jid'><value>testfouoles@planetrisk.com</value></field>
          <field var='fn'><value>Test UnclassifiedFouoLes</value></field>
          <field var='last'><value>UnclassifiedFouoLes</value></field>
          <field var='first'><value>Test</value></field>
          <field var='middle'><value/></field>
          <field var='nick'><value>testfouoles</value></field>
          <field var='bday'><value/></field>
          <field var='ctry'><value/></field>
          <field var='locality'><value/></field>
          <field var='email'><value>testfouoles@planetrisk.com</value></field>
          <field var='orgname'><value/></field>
          <field var='orgunit'><value/></field>
        </item>
      </x>
    </query>
  </iq>
</body>

Пока все отлично работает. Теперь, если я отправлю запрос на поиск с непустыми критериями поиска, независимо от наличия allow_return_all: true или false, поиск ничего не найдет:

Request Payload
<body rid='839156118' xmlns='http://jabber.org/protocol/httpbind' sid='39d0d2e120960757f97eeb15488ba6820b509bf7'>
  <iq type='set' id='search2' to='vjud.planetrisk.com' xmlns='jabber:client'>
    <query xmlns='jabber:iq:search'>
      <x xmlns='jabber:x:data' type='submit'>
        <field var='first'><value>UnclassifiedFouoLes</value></field>
        <field var='last'><value>UnclassifiedFouoLes</value></field>
        <field var='nick'><value>UnclassifiedFouoLes</value></field>
        <field var='email'><value>UnclassifiedFouoLes</value></field>
        <field var='fn'><value>UnclassifiedFouoLes</value></field>
      </x>
    </query>
  </iq>
</body>

Здесь я попытался найти "UnclassifiedFouoLes" , который является правильным значением N FAMILY. Я пытался найти правильный адрес электронной почты, ник и т. Д. - ничего не работает. ejabberd возвращает пустой результат.

<body xmlns='http://jabber.org/protocol/httpbind'>
  <iq xml:lang='en' to='army.dudeFOUO(at)everbridge.mil@planetrisk.com/planetrisk_Candy_0d46391c' from='vjud.planetrisk.com' type='result' id='search2' xmlns='jabber:client'>
    <query xmlns='jabber:iq:search'>
      <x type='result' xmlns='jabber:x:data'>
        <title>Search Results for vjud.planetrisk.com</title>
        <reported>
          <field var='jid' type='text-single' label='Jabber ID'/>
          <field var='fn' type='text-single' label='Full Name'/>
          <field var='first' type='text-single' label='Name'/>
          <field var='middle' type='text-single' label='Middle Name'/>
          <field var='last' type='text-single' label='Family Name'/>
          <field var='nick' type='text-single' label='Nickname'/>
          <field var='bday' type='text-single' label='Birthday'/>
          <field var='ctry' type='text-single' label='Country'/>
          <field var='locality' type='text-single' label='City'/>
          <field var='email' type='text-single' label='Email'/>
          <field var='orgname' type='text-single' label='Organization Name'/>
          <field var='orgunit' type='text-single' label='Organization Unit'/>
        </reported>
      </x>
    </query>
    </iq>
  </body>

Итак, почему ejabberd не находит пользователей по правильно заданным (?) Условиям поиска, которые соответствуют значениям vcard? Что я делаю не так?

Я застрял. Я не могу найти дополнительную документацию по ejabberd для Jabber Search . Я не понимаю, как стандартные имена полей vcard соответствуют стандартным именам полей поиска Jabber (или, может быть, формы данных имена полей?).

Тот же плагин CandyJS Search выдает очень похожий запрос к серверу Openfire XMPP и получает результаты. Единственное отличие состоит в том, что Openfire требует некоторых нестандартных дополнений к полезной нагрузке поискового запроса, чтобы указать, в каких полях искать:

<field var='Username'><value>1</value></field>
<field var='Name'><value>1</value></field>
<field var='Email'><value>1</value></field>

И Openfire возвращает результаты с дополнительным

<field var="FORM_TYPE" type="hidden"/>

пункт. Это дает какую-то подсказку?

Я застрял и очень благодарен, что указал мне правильное направление.

Обновление:

Собственно, вот первый вопрос: Когда мы отправляем следующий запрос поиска на сервер XMPP

<body rid='839156118' xmlns='http://jabber.org/protocol/httpbind'
sid='39d0d2e120960757f97eeb15488ba6820b509bf7'>
  <iq type='set'id='search2' to='vjud.planetrisk.com' xmlns='jabber:client'>
    <query xmlns='jabber:iq:search'>
      <x xmlns='jabber:x:data' type='submit'>
        <field var='first'><value>UnclassifiedFouoLes</value></field>
        <field var='last'><value>UnclassifiedFouoLes</value></field>
        <field var='nick'><value>UnclassifiedFouoLes</value></field>
        <field var='email'><value>UnclassifiedFouoLes</value></field>
        <field var='fn'><value>UnclassifiedFouoLes</value></field>
      </x>
    </query>
 </iq>
</body>

Объединены ли условия поиска по "ИЛИ" или "И"? Ищем ли мы пользователя, у которого любое значений полей ('first', 'last', 'nick', email ',' fn ') равно' UnclassifiedFouoLes 'или все поля равны?

Обновление 2: Я пытаюсь отправить простой запрос (один без <x xmlns='jabber:x:data' type='submit'>) от Почтальона к ejabberd:

<body rid='1106091871' xmlns='jabber.org/protocol/httpbind' sid='2afabe5b07c316685e25a2d407617a534ca6b2bb'>
  <iq type='set' id='search2' to='vjud.planetrisk.com' xmlns='jabber:client'>
    <query xmlns='jabber:iq:search'><last>UnclassifiedFouoLes</last></query>
  </iq>
</body>

Результат всегда пуст - он не возвращает никаких элементов. И есть пользователь с "last" vCard = "UnclassifiedFouoLes".

Почему это? Требуется ли условие from из запроса?

Два существующих клиента могут видеть друг друга и общаться в чате. Но когда я захожу как client1, беру sid и рид, вставляю их в пост почтальона, результат пуст, как

<body xmlns='http://jabber.org/protocol/httpbind' sid='67c6c7ee389a99e3491bbeab9ab198766ffa5ca8' rid='1287825358'>
    <iq xmlns='jabber:client' type='set' id='search2' to='vjud.planetrisk.com'>
        <query xmlns='jabber:iq:search'>
            <last>UnclassifiedFouoLes</last>
        </query>
    </iq>
</body>

1 Ответ

0 голосов
/ 23 мая 2019

Простой тип поиска (один без <x xmlns="jabber:x:data" type="submit">) как-то возвращал ошибку.

Для расширенного поиска, оказалось, я не отправлял

<field type="hidden" var="FORM_TYPE"><value>jabber:iq:search</value></field>

пункт. Это упущение прекрасно работало против Openfire, ejabberd требует этого.

Тем не менее, Плагин Openfire Search обеспечивает удобство и эффективность, которых я не нашел в ejabberd: он позволяет клиенту чата отображать одно окно поиска и затем искать значение, введенное пользователем в нескольких полях ( поиск ИЛИ функциональность). На стороне клиента вам нужно отправить запрос на поиск, например

<body rid='273260412' xmlns='http://jabber.org/protocol/httpbind' sid='961w8ipmo2'>
  <iq type='set' id='search2' to='yourSearchDomain.com' xmlns='jabber:client'>
    <query xmlns='jabber:iq:search'>
      <x xmlns='jabber:x:data' type='submit'>
        <field var='search'><value>your_search_term</value></field>
        <field var='Username'><value>1</value></field>
        <field var='Name'><value>1</value></field>
        <field var='Email'><value>1</value></field>
      </x>
    </query>
  </iq>
</body>

Плагин Openfire Search интерпретирует этот запрос как команду для выполнения трех поисковых запросов: для поиска пользователей с Username, который соответствует your_search_term, затем для поиска пользователей с Name соответствием и Email соответствием. Все три результата поиска будут объединены с использованием логического ИЛИ .
Клиенту нужно только отправить один Http-запрос поиска в Openfire для поиска your_search_term в трех полях. С ejabberd клиент должен будет отправить три Http-запросов ...

Было бы неплохо реализовать аналогичные функции в модуле ejabberd ...

...