我们正试图从Openfire切换到ejabberd XMPP服务器。 我在本地Windows 10工作站上安装了带有默认选项的ejabberd。 我设置
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 名片。 vcard似乎区分大小写,因此我同时设置了小写字母和大写字母的变体,因为我不确定搜索使用哪些变体。我还为 N个家庭和 N GIVEN 设置了 vcard2 值。
对于Openfire,我们将CandyJ与自定义搜索插件一起使用。目前,我们继续将其与ejabberd一起使用。 出于测试目的,我设置了
mod_vcard:
search: true
allow_return_all: true
这样,输入字段为空的搜索操作会返回所有向其vCard添加了一些信息的用户(根据ejabberd docs)。
我们的CandyJS Search插件向ejabberd BOSH监听器发出以下POST请求:
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值匹配的搜索字词来找到用户?我在做什么错了?
我被困住了。我在Jabber Search上找不到任何其他的ejabberd文档。我不明白标准vcard字段名称与标准Jabber搜索字段名称(或者也许Data Forms字段名称)如何对应。
同一个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:
我正在尝试从邮递员向ejabberd发送一个简单的请求(不带<x xmlns='jabber:x:data' type='submit'>
的请求)
<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并摆脱,然后将其插入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>
答案 0 :(得分:0)
简单的搜索类型(一个没有<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所没有的便捷性和效率:它允许聊天客户端显示一个搜索框,然后搜索在多个字段中键入的用户值(搜索 OR 功能)。在客户端,您需要发送搜索请求,例如
<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搜索插件会将此请求解释为执行三个搜索请求的命令:查找与Username
匹配的your_search_term
的用户,然后查找与Name
匹配的用户,以及Email
个匹配项。这三个搜索结果都将使用逻辑 OR 进行合并。
客户只需要向Openfire发送 一个 Http搜索请求,即可在 三个 字段中搜索your_search_term
。使用ejabberd,客户端需要发送 三个 Http请求...
最好在ejabberd模块中实现类似的功能...