ejabberd BOSH搜索一无所获

时间:2019-05-16 17:39:14

标签: xmpp ejabberd bosh ejabberd-module ejabberd-api

我们正试图从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>

1 个答案:

答案 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模块中实现类似的功能...