- 浏览: 10479 次
最新评论
Jabberd2源代码分析:c2s与router SASL验证过程
2011年03月29日
c2s启动后,主动连接router服务器的消息流程:
c2s->router:
发送完数据后,c2s进入循环状态,在mio_run等待事件
router->c2s:
当c2s收到router发送的数据后mio_run函数内检测到有数据可读,这时调用:
c2s_router_mio_callback(mio_action_t = action_READ)
首先调用ioctl(fd, FIONREAD, &nbytes)得到socket缓冲区中有多少数据可读, 如果有数据可读调用sx_can_read函数。
在sx_can_read(sx_t s)函数中:
in = _sx_buffer_new()
创建in用于保存读到的数据
read = _sx_event(s, event_READ, in)
_sx_event会调用函数c2s_router_sx_callback(sx_event_t = event_READ)
case event_READ:
调用recv读取数据,读数据的长度是确定的,因为在c2s_router_mio_callback中action_READ的时候已经通过ioctl函数获取了目前缓冲区中的数据长度
out = _sx_buffer_new(in->data, in->len, in->notify, in->notify_arg)
创建一个in的拷贝,用于将out传入到插件函数中
_sx_chain_io_read(s, out)函数的目的是调用插件函数rio
插件函数中没有发生错误的话,调用数据解析函数
_sx_process_read(s, out)
在_sx_process_read函数中调用了XML_Parse来解析XML数据,expat解析的特点是解析的过程中会调用特定的回调函数。
还记得么,在sx_client_init函数中,_sx_buffer_new函数中传入了一个回调函数_sx_client_notify_header函数,在该回调函数中又调用了XML_SetElementHandler(s->expat, _sx_client_element_start, _sx_client_element_end)。
当XML_Parse解析到stream头的时候,调用_sx_client_element_start函数, 解析出stream头,重新设置解析回调函数
XML_SetElementHandler(s->expat, _sx_element_start, _sx_element_end)
XML_SetCharacterDataHandler(s->expat, _sx_cdata)
XML_SetStartNamespaceDeclHandler(s->expat, _sx_namespace_start)
调用插件函数stream
插件sasl:
sasl插件注册了函数stream,这里会调用sasl注册的函数_sx_sasl_stream,此时Gsasl_session指针为空,所以什么也不做,直接返回。
如果当前状态小于state_STREAM设置状态为state_STREAM,并且调用_sx_event(event_STREAM)。
router->c2s:
D IGEST-MD5
mio检测到有数据可读,经过层层回调到sx_can_read->_sx_process_read, 这次成功解析到,将解析完成后的结果保存在NAD中,并且插入到s->rnadq队列解析完成后,继续在_sx_process_read函数中。
此时s->state的状态为state_STREAM,从s->rnadq队列中取出一个NAD,对解析的数据做错误检测,如果没有错误发生调用函数:
sx_chain_nad_read(s, nad),该函数会调用插件函数 rnad
调用插件函数 process
sasl
sasl注册了process插件函数_sx_sasl_process.
在_sx_sasl_process函数中会判断命名空间,只有urn:ietf:params:xml:ns:xmpp-sasl的命名空间才会处理,其他命名空间的数据包直接返回不处理。
调用_sx_event(s, event_PACKET, nad), 会调用c2s_router_sx_callback
s->state = state_STREAM
调用sx_sasl_auth(c2s->sx_sasl, s, "jabberd-router", "DIGEST-MD5", c2s->router_user, c2s->router_pass)
如果采用gsasl的话
初始化一个客户端gsasl session
ret = gsasl_client_start(ctx->gsasl_ctx, mech, &sd);
设置验证需要的数据
gsasl_session_hook_set(sd, (void *) ctx);
gsasl_property_set(sd, GSASL_AUTHID, user);
gsasl_property_set(sd, GSASL_PASSWORD, pass);
gsasl_property_set(sd, GSASL_SERVICE, appname);
gsasl_property_set(sd, GSASL_HOSTNAME, hostname);
// 设置插件数据
s->plugin_data[p->index] = (void *) sd;
// 构造一个nad
nad = nad_new();
ns = nad_add_namespace(nad, uri_SASL, NULL);
nad_append_elem(nad, ns, "auth", 0);
nad_append_attr(nad, -1, "mechanism", mech);
sx_nad_write(s, nad)
调用插件函数 wnad
构成生成字符串: 将要发送的数据放入队列s->wbufq中,调用_sx_event(event_WANT_WRITE)
c2s->router:
router->c2s:
cmVhbG09Im phYmJlcmQtcm91dGVyIiwgbm9uY2U9Ilo1SU4zSzRQNlVNYzViQ jlEZ0RkdUE9PSIsIHFvcD0iYXV0aCIsIGNoYXJzZXQ9dXRmLTgs IGFsZ29yaXRobT1tZDUtc2Vzcw==
进过一系列的回调函数,最终执行到_sx_process_read函数
调用插件函数process
这次还会调用sasl注册的process函数_sx_sasl_process, 这一次命名空间是一样的。继续处理。
一切顺利,将会调用_sx_sasl_response生成xml串发送给router
c2s->router:
dXNlcm5hbW U9ImphYmJlcmQiLCByZWFsbT0iamFiYmVyZC1yb3V0ZXIiLCBub 25jZT0ibVF3VlRVbjRtUXBweVd0UEoyTmdoQT09IiwgY25vbmNl PSI2UkpSSm53dlZJcnEvOERFaHBqSTV3PT0iLCBuYz0wMDAwMDA wMSwgcW9wPWF1dGgsIGRpZ2VzdC11cmk9ImphYmJlcmQtcm91dG VyL2Vhc3lqYWJiZXJkLmNvbSIsIHJlc3BvbnNlPWM2NGZjYTA3Y jAxMGE4ZmI4NmQ3OWVmZmFmOWY2OTg3LCBjaGFyc2V0PXV0Zi04
只有router继续发送challenge, c2s处理机制同上,最终router发回:
router->c2s:
c2s处理机制同上,调用_sx_sasl_process函数,但这次处理不同的分支。收到success后,将当前的sx_t重置,并调用sx_client_init(s, flags, ns, to, from, version) 重新开启一个stream.
进行第二次stream的时候,处理流程和第一次发送stream的时候有点区别。
解析到router返回的stream的时候,c2s会调用插件函数stream, sasl注册了stream插件函数, 但第一次的时候判断Gsasl_session指针为空,所以什么也没有执行;但第二次这个指针就不为空了,这次继续往下执行,调用了函数_sx_sasl_open函数,来校验stream是否已经通过sasl验证,最终会执行到:
_sx_state(s, state_OPEN);
_sx_event(s, event_OPEN, NULL);
此时当前通道的状态已经从state_STREAM转变成state_OPEN。 并且触发事件event_OPEN;
在c2s_router_sx_callback的event_OPEN处理部分,开始一个新的请求:
c2s->router:
发表评论
-
VC中使用自定义消息在进程间通讯
2012-01-20 09:19 480VC中使用自定义消息在进程间通讯 2011年06月14日 ... -
重叠IO 通信模型,函数记录。
2012-01-20 09:19 769重叠IO 通信模型,函数记录。 2010年12月07日 ... -
apache2 安装与配置
2012-01-20 09:19 900apache2 安装与配置 2010年11月09日 v0 ... -
Heritrix源码分析(二) 配置文件order.xml介绍
2012-01-20 09:19 733Heritrix源码分析(二) 配 ... -
2011,感恩年
2012-01-19 14:20 4922011,感恩年 2012年01月14 ... -
快乐并成长着的2011年
2012-01-19 14:19 507快乐并成长着的2011年 2 ... -
写给河南新精疯狂英语班同学们的一封信
2012-01-19 14:19 607写给河南新精疯狂英语班同学们的一封信 2012年01月05日 ... -
2011年度优秀员工获奖感想
2012-01-19 14:19 5602011年度优秀员工获奖感 ... -
晒晒孩子们的作文(一)
2012-01-19 14:19 547晒晒孩子们的作文(一) ... -
和老外对训练理念的交流,中英文,翻译好了
2012-01-17 04:09 792和老外对训练理念的交流,中英文,翻译好了 2011年08月2 ... -
为单位的
2012-01-17 04:09 302为单位的 2011年08月23日 这人写了一篇文章,已经 ... -
口袋英语5
2012-01-17 04:09 656口袋英语5 2011年06月26 ... -
jhhg
2012-01-16 02:57 634jhhg 2009年07月06日 > 24) &a ... -
最新qq空间软件,软件下载-----わ 。
2012-01-16 02:57 566最新qq空间软件,软件下载-----わ 。 2009年08月 ... -
FLEX
2012-01-16 02:57 467FLEX 2009年12月04日 ... -
QQ 空间软件制作大全
2012-01-16 02:57 356QQ 空间软件制作大全 2010年05月31日 ★★★★ ... -
as学习经验之谈
2012-01-16 02:57 422as学习经验之谈 2009年11 ...
相关推荐
在源代码中,我们可以通过分析auth模块,学习如何实现安全的用户身份验证。 2. **路由模块**:这是Jabberd的核心功能之一,负责将消息路由到正确的目的地。通过查看router模块,我们可以学习如何处理XML流、解析JID...
Jabberd2由MetaMatrix公司开发,后来成为开放源代码项目。它的设计目标是提供高可扩展性和灵活性,支持大规模的分布式部署。Jabberd2使用C语言编写,具有模块化架构,允许开发者根据需求添加或移除功能模块。 ### ...
Jabberd2 作为新一代的 Jabberd 项目,与原来的 Jabberd 1.x 有着显著的不同,它不仅提供了更高效、可扩展和安全的架构,还引入了许多改进和优化。 Jabberd2 的核心特性包括: 1. **模块化设计**:Jabberd2 的设计...
不是我写的,不过还不错。 使用配置参数安装jabberd2:
通过`jabberd2-master`这个文件名,我们可以推断这是一个Jabberd2的源代码仓库,可能包含了项目的主分支或最新版本。对于开发者来说,这将是一个深入理解Jabberd2内部工作原理、定制功能或者贡献代码的良好资源。在...
在`jabberd2-master`这个压缩包中,包含的是Jabberd2的源代码仓库。开发者可以通过编译这些源代码来安装和运行Jabberd2服务器。在部署和配置过程中,可能需要了解以下方面: - **安装依赖**:在编译Jabberd2前,...
Jabberd2s 是根据开源XMPP服务器项目Jabberd2修改而来.基于Jabberd-2.3.2稳定版源码修改,主要添加以下功能: 1.通过直接修改配置文件动态配置XMPP服务器的离线与上线功能; 2.重新加载配置文件机制,通过SIGUSR1触发...
4. **认证与身份验证**:Jabberd支持多种认证机制,如本地数据库、LDAP、RADIUS等,确保用户身份的安全验证。 5. **跨平台**:虽然我们讨论的是Windows版本,但Jabberd也支持Linux、FreeBSD等其他操作系统。 **...
Exodus是一款基于Delphi编程语言开发的即时通讯软件的源代码,它能够与...通过对源代码的分析,开发者不仅可以了解即时通讯客户端的构建过程,还能掌握如何与特定服务器(如Jabberd2)进行交互,为自己的项目提供参考。
2. 编译源代码,这通常需要安装必要的依赖库和开发工具。 3. 配置 jabberd,包括设置服务器地址、端口、认证方式、日志记录等参数。 4. 安装服务器软件到系统路径,如 `/usr/local/sbin`。 5. 启动 jabberd 服务,并...
此软件为jabberd2服务器端,其中包含了常用组件.jcr组件很能弄到手啊!!!!!! <br>如果你遇到了安装的问题,可以联系我qq:47393039
1. **源代码**:C语言编写的服务器核心代码和模块,开发者可以查看和修改源码以适应特定需求。 2. **配置文件**:服务器的初始化配置,用于设置服务器的基本属性,如监听端口、认证方式等。 3. **文档**:安装指南、...
- jabberd2可以与其他IM系统如MSN、Yahoo Messenger、ICQ实现互联互通,但需要相应的插件支持。 - jabberd2支持客户端间文件传输,这通常由客户端软件实现,如Pidgin的文件发送功能。 - jabberd2理论上可以支持语音...
jabberd-2.2.5.tar.bz2
虽然描述中没有明确指出AnyQ是否兼容jabberd2,但考虑到XMPP协议的兼容性,理论上AnyQ应该也能与jabberd2服务器进行通信。 即时通讯作为现代通信的重要组成部分,其技术涵盖了网络编程、数据加密、身份验证等多个...
Jabberd2服务器的架构是高度组件化的,由c2s、router、sm、s2s和resolver五个组件构成,每个组件在一个独立的进程中运行,内部采用单线程事件驱动。router组件作为核心,负责组件间的通信和消息转发,而组件间通过...
jabberd14服务器端,包含所有常用的插件.