本文是在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这个参数去告知函数,已经结束了。否则,会出现发送报文的时候,部分字符比如双引号这类的,被转义成",而导致部分客户端解析出错。
第二个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整理