ejabberd поиск BOSH ничего не приносит

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

  mod_vcard:
    search: true

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

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

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

Помимо FN, EMAIL, NICKNAME и NICK устанавливаются vcards. Кажется, что 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)[email protected]/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>[email protected]</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>[email protected]</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)[email protected]/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 Search (или, возможно, формам данных названия полей?).

Тот же плагин 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'>) от Postman на 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".

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

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

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

person vkelman    schedule 16.05.2019    source источник
comment
Опции комбинируются с AND. Вам необходимо согласовать все варианты.   -  person Mickaël Rémond    schedule 17.05.2019
comment
Я обнаружил, что плагин Openfire Search реализует следующий расширенный поиск (xmpp.org/extensions/xep- 0055.html # extensibility) логика: - Если в поисковом запросе присутствует предложение <x xmlns='jabber:x:data'> XML, он ищет ‹field var = 'search'› ‹value› _a_search_term_ ‹/value› ‹/field›, а затем ищет поля поиска со значениями, равными 1 или истинным, заменяют значения каждого из них на a_search_term и эффективно выполняет поиск с использованием ИЛИ: Имя пользователя = a_search_term ИЛИ Имя = a_search_term < / i> OR Email = a_search_term Делает ли ejabberd что-то подобное?   -  person vkelman    schedule 21.05.2019
comment
Я думаю, что по крайней мере некоторые клиентские библиотеки XMPP (например, Smack) отправляют поиск на сервер XMPP в этом формате ... github.com/igniterealtime/openfire-search-plugin/blob/master/   -  person vkelman    schedule 21.05.2019
comment
Я пытаюсь отправить простой запрос (без ‹x xmlns = 'jabber: x: data' type = 'submit'›) от Почтальона на ejabberd: ‹body rid = '1106091871' xmlns = 'http://jabber.org/protocol/httpbind 'sid =' 2afabe5b07c316685e25a2d407617a534ca6b2bb '› ‹iq type =' set 'id =' search2 'в = 'vjud.planetrisk.com' xmlns = 'jabber: client' ›‹ query xmlns = 'jabber: iq: search' ›‹last› UnclassifiedFouoLes ‹/last› ‹/query› ‹/iq› ‹/body› Результат всегда пусто - ничего не возвращает. И есть пользователь с последней vCard = UnclassifiedFouoLes. Почему это? Требуется ли пункт from в запросе?   -  person vkelman    schedule 23.05.2019
comment
ejabberd не поддерживает этот расширенный поиск, добавленный в Openfire. Это не стандарт XEP и не задокументирован. Что касается Bosh, вам не следует пытаться использовать его вручную с помощью Postman, так как трудно получить права вручную с идентификатором и т. Д. Bosh не предназначен для использования в качестве API. Он предназначен для использования с клиентом XMPP.   -  person Mickaël Rémond    schedule 23.05.2019
comment
Еще раз спасибо, @ MickaëlRémond. Да, я понял, что использование Postman - не лучший вариант, потому что трудно предоставить правильный rid. Я разместил ответ себе ниже. Моя ошибка со стандартным расширенным поисковым запросом не отправляла предложение <field type="hidden" var="FORM_TYPE"><value>jabber:iq:search</value></field>. Openfire допускал упущения, а ejabberd - нет. Есть преимущества в нестандартном способе реализации поиска плагином Openfire - я говорю об этом в своем ответе ниже.   -  person vkelman    schedule 23.05.2019


Ответы (1)


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

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

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

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

Тем не менее, Openfire Search plugin обеспечивает удобство и эффективность, которую я не обнаружил в 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 ...

person vkelman    schedule 23.05.2019
comment
Правильный формат расширенного поискового запроса ejabberd был найден здесь: stackoverflow.com/questions / 20243370 / effective-xmpp-user-search Спасибо, @Uscher - person vkelman; 23.05.2019
comment
Спасибо за подробности / объяснения. Если вы чувствуете, что это сделает запрос на вытягивание хорошего качества, вы можете рассмотреть возможность отправки патча в проект ejabberd. - person Mickaël Rémond; 25.05.2019
comment
Я собираюсь купить книгу и сначала изучить Erlang (я разработчик .NET). Тогда может быть ... - person vkelman; 30.05.2019