使用Smack销毁MUC返回400 Bad-Request

时间:2015-11-25 15:07:12

标签: java xmpp openfire smack

我有一个Openfire服务器为我的Web应用程序提供一组群聊室(MUC),它使用Smack库与Openfire交互。我试图在应用程序中实现一项功能,允许MUC所有者销毁他们拥有的房间。 Smack的MultiUserChat类有一个方法 - MultiUserChat.destroy(String, String)。这很简单:

muc.destroy("This room isn't getting used", null);

以这种方式使用destroy时,我不会收到任何编译错误或警告。但是,在运行时,我在调用destroy时会收到XMPPErrorException。这是堆栈跟踪的顶部:

org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: bad-request - modify

我去阅读XMPP MUC规范(XEP-0045)以了解MUC销毁请求可能返回错误请求的原因:修改。我知道如果销毁请求的发件人不是房间的所有者,则会发生禁止的错误,但这不是正在发生的事情。我得到了一个不好的请求,而不是被禁止的。规范没有给出任何关于为什么在这里可能发生错误请求的指示,并且错误没有给出关于请求的错误的任何指示

在XMPP规范中看不到任何与错误请求错误相关的内容之后,我启动了Wireshark,这样我就可以看到实际的XMPP数据包在我的应用程序和Openfire服务器之间来回流动。除了一件事之外,所有内容基本上都符合预期:我的应用程序发送给Openfire的MUC销毁数据包在from元素中没有<iq>属性。

我的房间销毁请求:

<iq 
    to='theRoom@service.myserver.com' 
    id='Pk4om-935' 
    type='set'>
    <query
        xmlns='http://jabber.org/protocol/muc#owner'>
        <destroy jid=''>
            <reason>Nobody is using this room</reason>
        </destroy>
    </query>
</iq>

XEP-0045房间销毁请求样本:

<iq from='crone1@shakespeare.lit/desktop'
    id='begone'
    to='heath@chat.shakespeare.lit'
    type='set'>
  <query xmlns='http://jabber.org/protocol/muc#owner'>
    <destroy jid='coven@chat.shakespeare.lit'>
      <reason>Macbeth doth come.</reason>
    </destroy>
  </query>
</iq>

正如您所看到的,我的请求没有from属性,但两者几乎完全相同(jid的{​​{1}}属性明确是可选的,I不想用它)。我挖掘了Smack代码并找到了构建销毁请求的位置,并且很明显没有设置destroy属性。代码状态的这一部分中的注释from通常是可选的,因此通常可以省略,这可能很正确。 但是,我希望在销毁房间时需要from,因为只允许房间所有者执行此操作。

之前有没有人使用Smack破坏Openfire MUC房间?如果Smack总是使用MultiUserChat.destroy(String,String)方法生成错误的请求,这似乎是库的一个主要缺陷。但是,我可能更倾向于误解如何使用该方法。任何Smack / Openfire / XMPP专家都可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)