citadel学习笔记5——git版本XMPP BUG整理

本文是在git commit 6050cb23108ee10dafcceb65b9cafab51c013ae0 的XMPP模块上的BUG整理,部分相关的BUG已经有反馈给citadel团队了,其后期应该会fix掉吧。新版本的由于对XMPP进行了重构,可能测试没做完全吧,我在调试citadel的时候,发现了一些BUG,并做了整理,本文将会把BUG列举出来,并解决部分的BUG。

首先是新版本依旧没有解决的BUG,有一个,在函数 xmpp_presence_notify 上,有注释说明,内容如下。

/*
 * When a user logs in or out of the local Citadel system, notify all XMPP sessions about it.
 * THIS FUNCTION HAS A BUG IN IT THAT ENUMERATES THE SESSIONS WRONG.
 */
void xmpp_presence_notify(char *presence_jid, int event_type) {

我没有对该说明进行过测试,应该没有fix掉吧。在先前的版本中,还有一个BUG是由函数 xmlesc 而导致的BUG,但是新版本已经使用新的接口替换了,所以应该不会有xmlesc的BUG问题了。

新版本引入的BUG有3个:

第一个是在函数 xmpp_indicate_presence 中调用 XPrint 时缺少参数XCLOSED,原内容如下

void xmpp_indicate_presence(char *presence_jid)
{
        XPrint(HKEY("presence"),
               XPROPERTY("from", presence_jid, strlen(presence_jid)),
               XPROPERTY("to",  XMPP->client_jid, strlen(XMPP->client_jid)),
               TYPE_ARGEND);
}

解决该BUG为添加XCLOSED参数,fix如下

void xmpp_indicate_presence(char *presence_jid)
{
        XPrint(HKEY("presence"), XCLOSED,
               XPROPERTY("from", presence_jid, strlen(presence_jid)),
               XPROPERTY("to",  XMPP->client_jid, strlen(XMPP->client_jid)),
               TYPE_ARGEND);
}

该函数应该都是在最后输出的时候,也就是最后一个调用XPrint函数,必须带上XCLOSED这个参数去告知函数,已经结束了。否则,会出现发送报文的时候,部分字符比如双引号这类的,被转义成&quot,而导致部分客户端解析出错。

 

第二个BUG在函数 xmpp_roster_item 中,也是调用XPROPERTY时传递参数错误。原内容如下

void xmpp_roster_item(struct CitContext *cptr)
{
        struct CitContext *CCC=CC;

        XPrint(HKEY("item"), 0,
               XCPROPERTY("subscription", "both"),
               XPROPERTY("jid",  CCC->cs_inet_email, strlen(CCC->cs_inet_email)),
               XPROPERTY("name", cptr->user.fullname, strlen(cptr->user.fullname)),
               TYPE_ARGEND);

        XPrint(HKEY("group"), XCLOSED,
               XCFGBODY(c_humannode),
               TYPE_ARGEND);

        XPUT("</item>");
}

fix后的内容为

void xmpp_roster_item(struct CitContext *cptr)
{
//        struct CitContext *CCC=CC; // 注释该行,去掉可能出现的编译警告

        XPrint(HKEY("item"), 0,
               XCPROPERTY("subscription", "both"),
               XPROPERTY("jid",  cptr->cs_inet_email, strlen(cptr->cs_inet_email)),
               XPROPERTY("name", cptr->user.fullname, strlen(cptr->user.fullname)),
               TYPE_ARGEND);

        XPrint(HKEY("group"), XCLOSED,
               XCFGBODY(c_humannode),
               TYPE_ARGEND);

        XPUT("</item>");
}

该BUG会导致,发送的时候,jid传递错误,当用户上线的时候,会调用该接口去广播所有已经在线的用户,参数的错误,就导致出现了新的用户已经在线成功,而已在线的用户却没有收到在线的通知。

第三个BUG,是在函数  xmpp_end_message 中调用 xmpp_send_message 时,XMPP->message_to为’\0’,也就是并没有被赋值,导致出现的问题就是发送消息给某个客户端,客户端不能够接收到。原内容如下

void xmpp_end_message(void *data, const char *supplied_el, const char **attr)
{
        xmpp_send_message(XMPP->message_to, XMPP->message_body);
        XMPP->html_tag_level = 0;
}

fix后如下

void xmpp_end_message(void *data, const char *supplied_el, const char **attr)
{
        xmpp_send_message(ChrPtr(Xmpp->Message.to), XMPP->message_body);
        XMPP->html_tag_level = 0;
}

以上就是在 commit 6050cb23108ee10dafcceb65b9cafab51c013ae0 版本出现的几个BUG,fix后就可以正常使用了,如果你的版本是高于这个的,请看看citadel团队是否已经fix这些问题了,如果还未解决,那么就请修改一下吧。

转载请注明: 转载自elkPi.com

本文链接地址: citadel学习笔记5——git版本XMPP BUG整理

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top