Мы пытаемся перейти с 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>