Мы пытаемся переключиться с 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>
<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.2019rid
. Я разместил ответ себе ниже. Моя ошибка со стандартным расширенным поисковым запросом не отправляла предложение<field type="hidden" var="FORM_TYPE"><value>jabber:iq:search</value></field>
. Openfire допускал упущения, а ejabberd - нет. Есть преимущества в нестандартном способе реализации поиска плагином Openfire - я говорю об этом в своем ответе ниже. - person vkelman   schedule 23.05.2019