[ Content | Sidebar ]

Archives for 十一月, 2010

使用gsasl模拟smtp认证

使用gsasl模拟smtp认证

gsasl -a username --service=smtp -m LOGIN --verbose -c smtp.sina.com 25
Trying `smtp.sina.com'...
220 irxd5-187.sinamail.sina.com.cn ESMTP
EHLO [127.0.0.1]
250-irxd5-187.sinamail.sina.com.cn
250-8BITMIME
250-SIZE 83886080
250-AUTH PLAIN LOGIN
250 AUTH=PLAIN LOGIN
EHLO [127.0.0.1]
250-irxd5-187.sinamail.sina.com.cn
250-8BITMIME
250-SIZE 83886080
250-AUTH PLAIN LOGIN
250 AUTH=PLAIN LOGIN
AUTH LOGIN
334 VXNlcm5hbWU6
eHh4eAo=
334 UGFzc3dvcmQ6
Enter password: 
bGFuc2VkZWh1YQ==
235 #2.0.0 OK Authenticated
客户端认证完成(服务器可信)……
输入应用程序数据(用 EOF 结束输入):
^C
Copy Code 

试了一下sina,163,qq,都只支持PLAIN LOGIN两种验证方式。。

———–
post by gmail~

终于可以直接在vim里编辑日志了

最终我还是给blogo2增加了一个不实用的通过邮件编辑日志的功能,需要加一个#edit:BLOGID的标记,但是因为邮件客户端跟本不知道已发blog的id,所以功能略显鸡肋。这绝对是我专用的功能,在bin目录又加了一个小命令,只需在vim里输入:r!wpblog bluehua.org 便可以把最新的blog拽回来,包括blogid

wpblog的内容

#!/usr/bin/env python
import sys 
import xmlrpclib
import getpass
import os
 
'''
A simple tool for dump blog powered by wordpress
For example: in vim, dump the last webblog into current buffer
:r!wpblog myblog.domain
'''
 
#make sure the stderr is the control terminal 
if os.name == 'posix':
    sys.stderr = open('/dev/tty', 'a')
 
if len(sys.argv) < 2: 
    print >> sys.stderr,'''
Usage:
wpblog myblog.domain [blogid]
    '''
    exit(1)
 
rpc = 'http://%s/xmlrpc.php' % sys.argv[1]
 
print >> sys.stderr, '\r\nUsername:'
user = raw_input()
passwd = getpass.getpass('Password:')
 
api = xmlrpclib.ServerProxy(rpc)
 
try:
    if len(sys.argv) > 2:
        blog = api.metaWeblog.getPost(sys.argv[2], user, passwd)
    else:
        blogs = api.metaWeblog.getRecentPosts('', user, passwd, 1)
        if not len(blogs):
            print >> sys.stderr, 'no blog returned~'
            exit(1)
        blog = blogs[0]
except xmlrpclib.Fault, ex:
        print >> sys.stderr, ex.faultString.encode('utf-8')
        exit(1)
 
print '#cats:%s' % u','.join(blog['categories']).encode('utf-8')
print '#tags:%s' % blog['mt_keywords'].encode('utf-8')
print '#edit:%s' % str(blog['postid'])
print blog['description'].encode('utf-8')
Copy Code 

———–
post by gmail~

jabberd2源码分析备忘:mio和sx部分

jabberd2的mio和sx目录是灰常重要的两个目录,关系底层逻辑:
mio封装了一套多路io的实现,支持kqueue,epoll,poll,select,可以在configure的时候通过–enable-mio=指定。
sx目录的代码则在mio的上层实现了一条支持插件的逻辑通道,一些非核心xmpp协议都可以通过插件的形式加入,例如sx/compress.c可以实现流的压缩。

代码包装层次比较深,看起来比较绕,所以以c2s目录里的main.c为入口,画了一张c2s与router的第一次写读的流程,当然这里没有错误处理部分。基本上展现了jabberd2的io逻辑。

      +--------------------------------------------------------------+
      | main.c                                                       |
      | 初始化mio和sx                                                |
      | 调用sx_client_init                                           |
      | 调用注册client初始化的插件                                   |
      | 构造stream头                                                 |
      | 调用注册stream头处理的插件                                   |
      | 将头追加到写缓存                                             |
    +-+ 触发event_WANT_WRITE:_sx_event(s, event_WANT_WRITE, NULL);   |
    | |                                                              |
    | | main loop(mio_run())                                         |
    | | while true:                                                  |
 +--|-+>if FD(m,fd)->type == type_NORMAL && MIO_CAN_READ(m,iter)     |
 |  | | 触发:action_READ                                             |
 |  | | 回调:c2s_router_mio_callback                                 |
 |  | | 调用:sx_can_read                                             |
 |  | | 触发:event_READ                                       -------------------------+
 |  | | if 读入.length > 0                                           |                 |
 |  | | 调用注册io读的插件:_sx_chain_io_read(s, out);                |                 |
 |  | | 调用:_sx_process_read(s, out);                               |                 |
 |  | | xml->nad                                                     |                 |
 |  | | 调用注册xml处理的插件                                        |                 |
 |  | | 触发:event_PACKET -|                                         |                 |
 |  | +--------------------+-----------------------------------------+                 |
 |  |                      |                                                           |
 |  |                      |                                                           |
 |  |                      |                                                           |
 |  |                      v                                                           |
 |  | +-----------------------------------------+                                      |
 |  | |  event_PACKET                           |                                      |
 |  | +-----------------------------------------+                                      |
 |  | |  回调:c2s_router_sx_callback            |                                      |
 |  | |  接收到的xml在这里已经被解成nad结构体   |                                      |
 |  | |  正式逻辑开始                           |                                      |
 |  | +-----------------------------------------+                                      |
 |  |                                                                                  |
 |  |                                                                                  |
 |  |                                                                                  |
 |  | +--------------------------------+       +------------------------------+        |
 |  |>  event_WANT_WRITE               | +---> |  event_WRITE                 |        |
 |    +--------------------------------+ |     +------------------------------+        |
 |    | 回调:c2s_router_sx_callback    | |     |  回调:c2s_router_sx_callbac  |        |
 |    | 调用:_mio_write                | |     |  调用:send()将数据送出       |        |
 |    | 触发:action_WRITE              | |     +------------------------------+        |
 |    | 回调:c2s_router_mio_callback   | |                                             |
 |    | 调用:sx_can_write              | |                                             |
 |    | if 写缓存.length > 0           | |                                             |
 |    | 触发:event_WRITE            -----+                                             |
 |    | endif                          |                                               |
 |    | 触发:event_WANT_READ        -------+                                           |
 |    |                                |   |                                           |
 |    +--------------------------------+   |                                           |
 |                                         |                                           |
 |    +----------------------------------+ |   +-------------------------------+       |
 |    | event_WANT_READ                 <+-+   | event_READ                   <+-------+
 |    +----------------------------------+     +-------------------------------+
 |    | 回调:c2s_router_sx_callback      |     | 回调:c2s_router_sx_callback   |
 |    | 调用:_mio_read                   |     | 调用:recv()将数据读入         |
 +----+-调用:MIO_SET_READ(m, FD(m,fd));  |     |                               |
      |                                  |     |                               |
      +----------------------------------+     +-------------------------------+

-----------
post by gmail~

centos5安装jabberd2备忘

11.29日更正配置文件编辑部份
————————————-
之前已经yum安装过gcc和mysql

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
yum install expat expat-devel libidn libidn-devel udns udns-devel libgsasl libgsasl-devel openssl openssl-devel mysql-devel
cd ~
mkdir src
mkdir /opt/jabberd
cd src
wget http://codex.xiaoka.com/pub/jabberd2/releases/jabberd-2.2.11.tar.bz2
tar jxvf jabb*
cd jabb*
#初始化mysql
mysql -uroot -pxxxxx < tools/db-setup.mysql
./configure --prefix=/opt/jabberd --enable-mio=epoll --enable-mysql --enable-debug --enable-mio-debug
#因为我是开发之用所以加了调试选项--enable-debug --enable-mio-debug
make
make install
#为启动服务添加一个用户
useradd -d /dev/null jabber
cd /opt/jabberd
chown jabber:jabber -R ./
#然后按照文档改配置文件,下面直接写成sed表达式,方便以后自动化完成:http://www.jabberdoc.org/AdminGuide
#<id register-enable='true'>example.com</id>
sed -i "s/\(<id reg[^>]*>\)[^<]*/\1example.com/" etc/c2s.xml
#<id>example.com</id>
sed -i "s/\(<id>\)[^<]*/\1example.com/" etc/sm.xml
#存储方式改成mysql
sed -i "s/<module>sqlite<\/module>/<module>mysql<\/module>/" etc/c2s.xml etc/sm.xml
#设置用户名和密码
sed -i "30,\$s/<user>.*<\/user>/<user>DBUSER<\/user>/" etc/c2s.xml etc/sm.xml
sed -i "30,\$s/<pass>.*<\/pass>/<pass>DBPASS<\/pass>/" etc/c2s.xml etc/sm.xml
Copy Code 

安装和配置到此结束,启动一下~
sudo -u jabber bin/jabberd
输出调试信息
sudo -u jabber bin/jabberd -D

———–
post by gmail~

drawit~

ft,发出来就变形了,加个pre~

+---------------+
| Router        |
+---------------+
| logic         |
| callback      |
| SX (plugins)  |
| callback      |
| MIO (listen)  |
+---------------+

—————–
以前还以为文档里的字符表是手工加的,才发现vim有插件的
http://www.vim.org/scripts/script.php?script_id=40

试用了一下,很顺手~

+—————+
| Router |
+—————+
| logic |
| callback |
| SX (plugins) |
| callback |
| MIO (listen) |
+—————+

———–
post by gmail~