« August 2005 | Main | October 2005 »
September 27, 2005
perl client for Authlib - 一个courier认证库的客户端
有时候,人懒的话,就啥事也觉得不想干不想做,觉得做起来都麻烦,一直都想做一个通过courier套件中的authlib认证用户信息的插件模块,却因懒惰而拖延。
今天,不知道哪里来的动力,翻开cyrus-sasl 2.1.19的source,看了一把,用perl简单的实现了一个courier-authlib的客户端,支持查询和修改密码。
这样这个模块应用到extmail中,就成为了目前为止第四个认证模块了。
Authdamond 认证基本原理
注意:这个所谓原理只是我看checkpw.c 粗浅的认识,详细的原理请直接在courier官方网站查找,或直接联系Mr Sam(courier作者)认证(查询信息):
1. 客户端搜集用户名/密码,并计算查询信息总长度
2. 创建Unix socket,连接到authdaemond的socket绑定文件
3. 将查询信息总长度,服务名,login,用户名,密码等信息以新行间隔开,发送到
socket,最后以两个新行newline (回车)结束
4. 读authdaemond的返回信息,如果返回信息结尾包括"."则表示成功,否则
将返回FAIL等出错信息
5. 关闭该socket
修改密码
1. 客户端搜集用户名/密码和新密码 2. 创建Unix socket,连接到authdaemond的socket绑定文件 3. 将服务名,用户名,旧密码,新密码发送到该socket,注意与查询不同,信息之间 以\t间隔,结束以一个新行结束。 4. 检查返回结果,如果是成功则返回OK,失败则返回FAIL 5. 关闭socket
authdameond_cli.pl源码
具体代码见下文,请阅读本文的读者注意:
程序代码以GPL版权释出,作者不对代码作出任何担保,不回答有关问题,使用与否与作者无关
#!/usr/bin/perl -w
# vim: set cindent expandtab ts=4 sw=4:
#
# authdaemond_cli.pl
# ==================
# A small progarme to query/change user information via courier
# authlib, only test on courier-authlib 0.5x, use it as your risk!
#
# License: GPL v2
# Author: He zhiqiang <hzqbbc@hzqbbc.com>
# Copyright (c) 1998-2005
use IO::Socket::UNIX;
use vars qw($socket_path);
$socket_path = '/var/spool/authdaemon/socket';
usage() unless(scalar @ARGV>1);
my $sock = IO::Socket::UNIX->new($socket_path) or die "Error: $!\n";
my ($user, $pass) = ($ARGV[0], $ARGV[1]);
my ($serv, $type) = ('authdaemond', 'login');
if($ARGV[2]) {
print STDOUT "Changing password for $user ...\n";
printf($sock "PASSWD %s\t%s\t%s\t%s\n",
$serv,
$user,
$pass,
$ARGV[2]
);
print while(<$sock>);
}else {
my $len = length($user.$pass.$serv.$type)+4;
print STDOUT "Querying information for $user ...\n";
printf($sock "AUTH %s\n%s\n%s\n%s\n%s\n\n",
$len,
$serv,
$type,
$user,
$pass
);
print while(<$sock>);
}
# close the socket
$sock->shutdown(1);
# ===================== #
# small function to use #
# ======================#
sub usage {
print STDERR "$0 username passwd [newpasswd]\n";
exit(255);
}
使用方法
修改程序中$socket_path,指向系统中authdaemond绑定的socket路径(必须是全路径),假设数据库中有一个用户叫demo@extmail.dns0755.net,密码是demo,则按如下格式执行:
perl authdaemond_cli.pl demo@demo.dns0755.net demo
结果:
Querying information for demo@extmail.dns0755.net ... UID=1000 GID=1000 HOME=/home/domains/extmail.dns0755.net/demo/ ADDRESS=demo@extmail.dns0755.net NAME=demo me QUOTA=104857600S PASSWD=$1$BdJPD$oBV5a/25BAO2B8B2zOexx0 PASSWD2=demo .
修改密码则按如下格式执行:
perl authdaemond_cli.pl demo@extmail.dns0755.net demo newpwd
正常的话结果如下:
Changing password for demo@extmail.dns0755.net ... OK
该小程序还可以作为courier-authlib的authtest的一个补充,有其他需要的朋友可以在此基础上进行修改。
Posted by hzqbbc at 03:32 PM | Comments (1)
September 22, 2005
MT filename tweak - 调整MT生成blog的文件名
MT 2.x默认生成的日志文件名一般是/archives/yyyy/mm/0000134.html 这样的格式,而MT 3.x则有所改进,默认生成的是按标题的英文来生成的,例如本文的mt_filename_twe.html 这样子,截取前15个字节的内容。
但是想自定义文件名就得改动其Archives template了,虽然很早MT就提供了这个功能,不过一直却没想到用这功能。
本来想对mt进行修改,但mt本来是一个强大的系统,一定有解决方法的,于是google搜索到了不少方法,其中使用Brad Choate的MTIfemtry 插件的解决方法比较好。
利用该插件配合Keywords栏目,即可按自己的想法随意变更对应entry的文件名,方法如下:
将以下代码拷贝到Individial archives template里就可以了:
<MTIfEmpty var="EntryKeywords"><$MTEntryTitle dirify="1"$> </MTIfEmpty><MTIfNotEmpty var="EntryKeywords"> <$MTEntryKeywords dirify="1"$></MTIfNotEmpty>.html
注意:上述代码其实是在一行,为显示方便,我折成了几行,请使用时注意!
下载了MTIfempty之后,解包并将ifempty.pl拷贝到mt/plugins目录,然后Rebuild site即可。
不过重建entry之前,最好做一下清理工作,将archives里的老文章删除,这样就不会形成垃圾了。
如果希望保存老的文章并保证没有死链,那么就得辛苦一点,手工改动老文章里的链接了。
最后,再回顾一下,方法非常简单,10分钟内就可以完成:- 下载MTifempty
- 解包并将ifempty.pl放到plugins里
- 设置Archives template(参照上文)
- 重建所有文章
利用该方法生成的blog 样板可以看看:Extmail邮件开发博客
一些Links- http://www.elise.com/mt/archives/000286file_names_and_urls.php
- http://jade.mcli.dist.maricopa.edu/alan/archives/2004/01/12/archive_scheme.html
Posted by hzqbbc at 11:05 AM | Comments (0)
September 18, 2005
Sun 18 September - 九月18日:中秋/国耻日/新域名
今天是公元2005年9月18日,星期日,是中国传统节日:中秋节,但今天也是“九一八”事件74年纪念日。电视里CCTV4报道了当年被日军抓去做随军慰安妇的悲惨遭遇和晚年的不幸生活,而作为今天的我们,却有太多人不记得了这些耻辱的过去,年轻的一代,很多压根就不了解,妻子的一个小妹对这些事情了解甚少,而她相对而言算是80-90年代出生的孩子中懂得算多的了。心里真的有种悲凉的感觉,提醒自己“勿忘国耻,将记忆的种子一代接一代的往下传“!
碰巧的是,今天刚注册了新的域名:extmail.org 作为新开发webmail的官方网站域名。
发此文以做纪念。
Posted by hzqbbc at 10:09 PM | Comments (0)
September 14, 2005
mail address Autocomplete - 邮件地址自动补齐实现
GMail正如google其他服务一样,是富有创新的产品,新一代的电子邮件服务。领先的界面体验和贴心的功能,使用户真正在使用电子邮件,而不是靠界面或花哨的功能吸引客户。
第一次试用GMail时惊叹GMail的两大特色:- JS框架的用户界面,速度超快
GMail在浏览器支持的情况下,使用了纯javascript的用户接口(UI),利用js来输出所有的内容。同时还利用其它DHTML/XML等相关技术,使得切换页面速度飞快,客户端能缓存页面及数据,并只下载变动的数据。使用起来就和本地应用程序差不多。
而且使用很便利。真的是觉得GMail很体贴人,和传统的Hotmail/Yahoo有很大区别。
- 贴心的自动补齐功能
对于经常用email的人而言,贴心便利的地址本是必不可少的。一般的地址本实现,再复杂也大抵和OutLook 的差不多,虽然功能强大,但使用起来还是不太舒服和方便。
而GMail的地址本出奇的简单,完全没有那些几乎都用不上的属性,如家庭地址,备用电话,国家地区等,只有简单的几项,而且收/发邮件时,能自动将发送/转发/回复的邮件地址加到地址本里,发邮件时在输入框内输入邮件地址,能自动补齐,方便之极。当时就有冲动想自己也实现一个。
后来,GMail的相关软件和第三方工具就由爱好者大量地开发出来了,在CPAN上有不少GMail的工具模块,但最想找到的还是自动补齐的实现,毕竟从头自己来做,工作量可真不小。
这两天碰巧在一个eba(企业级别商业应用程序)的网站上看到了demo,又发现了一些用户的评论,于是就“拿来主义”,测试了一下,感觉效果还可以。后又在google上找到一些其他的自动补齐的实现,最后选了一个较好的,作为目前webmail的测试版自动补齐。
为了提高速度,我对js程序进行了大量的修改,将原来的14.5K的体积压缩到9.2K,并修补了几个bug,并增加了列出全部地址的快捷键。截图见下:

- 获取在输入框内的键盘输入,获得inPut = keyCode
- 将inPut和邮件地址列表(例如放到数组中)进行匹配
- 如果匹配的话,则将列表以层(Div)+表格(Table)的形式显示
- 高亮(加)匹配那部分字符
- 如果遇到回车则将当前选中的mail地址放在输入框内
- 等待下一个输入的字符
在这个过程中,自己增加了一个快捷键“空格(space)”,程序将检测是否有合理的空格输入,如果有则显示所有的邮件地址。

Posted by hzqbbc at 08:30 PM | Comments (4)
September 13, 2005
Protect files in Apache - 使用AUTH保护特定文件
最近一个web虚拟主机用户提出一个要求,需要保护其几个特定的文件,凡是访问那个文件必须提供用户名和密码,而且不能对其程序或文件进行修改。
例如http://www.vhostuser.com/secret/noallowfiles.txt
这个文件如果要保护的话,可以利用Apache的mod_auth及core模块中提供的
假设要保护某个secret目录的.doc文件,则可以在虚拟主机配置中增加:
<Directory "/path/to/vhost/home/secret/"> AllowOverride All </Directory>
然后在secret目录里,编辑.htaccess文件:
<Files ~ ".txt">
AuthType Basic
AuthGroupFile /dev/null
AuthName "Restricted Files"
AuthUserFile /path/to/secret/.htpasswd
<limit GET POST>
require valid-user
</limit>
</Files>
这样凡是请求xxx.txt的文件都会要求认证。密码就保存在.htpasswd里了。
这样做就不需要修改程序里,而且可以保护一些非程序文件。这是用一般的php/perl cgi程序等实现不了的。非常好用。
Posted by hzqbbc at 09:04 AM | Comments (0)
September 06, 2005
Webmail Bigpicture - Webmail的结构图

注意:
该图将webmail的3个层次(UI/模板,应用,底层操作)展示了出来,并标明了一些重要的模块,但模块之间的工作和相互调用,由于关系复杂,如用线条标记将影响美观和视觉,因此这里没有标记出相互调用的关系。
深红色边框的内容代表了核心模块,负责最低级的操作,包括磁盘I/O,邮件解析,HTTP请求处理等。
兰色边框的内容表示应用层模块,负责高层应用,如收/发邮件,表单处理,模板调用和处理,登陆及个人设置等应用层面的功能。
黄色背景的方块表示关键模块,这些模块在整个webmail中至关重要,使用的频率最高,webmail高效,扩展性高等优点大部分都依靠这些模块实现。
兰色背景方块表示主要的应用模块,即收/发邮件模块
浅红色背景方块表示的是底层模块和应用模块的衔接模块(或插口对接模块)App.pm,它是连接上层应用和底层实现的桥梁。目前webmail只有这一个插口对接模块。
Posted by hzqbbc at 12:42 PM | Comments (0)
September 05, 2005
Webmail distribution plan - Webmail发行计划
Webmail的开发今天为止已接近了95%的进度了,可以开始筹备发行的事情了,粗略想了一下,大致的发行流程有如下几点:
- 9月6日开始计算,预算至9月15日前后发布
- 完成最基本的安装文档(中文),同步翻译成英文
- 完成最基本的webmail介绍性(宣传)文字,图片等(总括)
- 整理代码,并将少量POD文档集成到code里
- 建立webmail的官方网站,以及下载统计程序
- 召集2-3个测试人员,汇总测试结果并更新/bug fix
- 达到0.1版以上时发布0.1x Beta版
- 开始编写用户文档+相关配套文档,英文翻译
此外,配套的一些工作也需要加紧完成,大致包括了:
- 文章:Why Maildir++? 为什么选择maildir?
一篇从技术和实际应用的角度分析为什么webmail开发选择maildir作为存储方式的原因,包括了性能,可靠性,便利性和等效性等各个方面,其中对于imap的应用与maildir的对比,最主要的观点集中在imap的背后实际也是maildir或mbox,因此其性能原则上不会比直接操作maildir好,带来的便利性也由于安全和网络等因素打了折扣...... - 文章:The internal of extmail - webmail体系结构的深度分析介绍
主要从体系结构,设计初衷和设计思路,实现与一些面向应用的折中等方面,介绍了webmail的优点/缺点,并以图片的方式直观的介绍webmail的体系结构,可以为开发人员提供良好的参考,这是了解webmail的入口。
- 文章:Install/Config Manual 安装配置 最原始、最基本的安装配置文档,包括了Apache Suexec环境的配置和注意事项,webmail的配置,数据库的设计及与现有的一些方案(schema)兼容等问题。
- 程序:Misc tools
这是一个配套的工具集合,计划要包含安装前的预配置检测(看是否有些需要的包/模块或功能缺失等),会话(session)清理工具,迁移工具(例如从sqwebmail迁移到这个webmail等)
- 网站:配套的官方网站
计划用MovableType 建设一个简单的网站,主要是存放webmail的基本文档,如体系结构,安装配置,基本使用,faq等,其他还有少量的cgi/php程序,包括下载统计,反馈列表等。以后也许会建立一个讨论的论坛,同时邮件列表使用sf.net上的(要在sf.net注册一个project)
如果有任何的建议或批评,请在本页下方留言。
并希望能通过webmail这个项目,带动国内搞email方面的朋友,并提高大家的合作水平,并且逐步摆脱老纠缠于安装配置和一些很初级的应用局面。:)
Posted by hzqbbc at 09:08 PM | Comments (0)
harm food collection - 有害的食物组合
今天在大学同学QQ群里有人发了一则有关一些相克的食物的列表,以及一些不能混吃的搭配,看后有点毛骨悚然,原来很多食物的吃法居然会导致如此严重的后果。
帖出来希望读者能够避免发生问题:-)
食物相克小常识
同时进食物 导致后果 同时进食物 导致后果 1 猪肉+菱角 肚子疼 36 虾子+金瓜 会中毒 2 猪肚+莲子(用白茄枝烧) 中毒必死37 虾子+青枣 会中毒 3 牛肉+栗子 引起呕吐 38 鳖+芹菜 剧毒 4 牛肉+红糖 胀死人 39 田螺+木耳 会中毒 5 牛肉+盐菜 会中毒 40 田螺+玉米 会中毒 6 牛肉+鲶鱼 会中毒 41 鸡蛋+糖精 中毒,重则死亡7 牛肉+田螺 会中毒 42 皮蛋+红糖 中毒,发呕
8 羊肉+西瓜 伤元气 43 豆腐+蜂蜜 导致耳聋
9 羊肉+田螺 腹胀 44 豆腐渣+蜂蜜 会下痢
10 狗肉+绿豆 会中毒 45 蒜头+蜂蜜 会变疳积
11 狗肉+黄鳝 会中毒 46 洋葱+蜂蜜 伤眼睛
12 狗肉+葱 会中毒 47 葱+蜂蜜 会中毒
13 兔肉+芹菜 脱发 48 萝卜+人参 滞气
14 兔肉+人参 会中毒 49 萝卜+木耳 导致皮炎
15 兔肉+青姜 会中毒 50 蜂蜜+油炸物 会中毒
16 兔肉+红罗卜 会中毒 51 木瓜+油炸物 会下痢
17 鸡肉+芹菜 伤元气 52 西瓜+油炸物 会下痢
18 鹅肉+鸡蛋 伤元气 53 西瓜+八宝丹 会中毒
19 鹅肉+鸭梨 伤肾脏 54 金瓜+八宝丹 会中毒
20 甲鱼+苋菜 会中毒 55 马铃薯+香蕉 面部生斑
21 黑鱼+茄子 肚子疼 56 芋头+香蕉 引起腹涨,中毒
22 鲤鱼+猪肉 会中毒 57 红薯+柿子 会得结石
23 鲤鱼+甘草 会中毒 58 树薯粉+麻油 会中毒
24 鲤鱼+辣椒 成痔疾 59 花生+黄瓜 会伤身
25 鲤鱼+芹菜 患痢疾 60 白酒+柿子 导致胸闷
26 鲤鱼+黄瓜 成胎毒 61 热酒+红柿 会中毒
27 鲑鱼+河豚 有生命危险 62 牛奶+桔子+萝卜 会伤身
28 鲫鱼+树豆花 中毒必死 63 牛奶+醋 患痢疾
29 鳗鱼+桔子 会中毒 64 牛奶+菠菜 患痢疾
30 鱆鱼+螺肉 会中毒 65 葡萄+开水 引起腹泻
31 河豚鱼+烟灰 中毒死亡 66 番茄+绿豆 伤元气
32 生鲸肉+大面 中毒必死 67 海带+猪血 便秘
33 螃蟹+柿子 引起腹泻
34 螃蟹给癞病人吃 必死
35 虾类+维生素C 必死(相当于砒霜)
食物相克小常识
同时进食物 导致后果
1 猪肉+菱角 肚子疼
36 虾子+金瓜 会中毒
2 猪肚+莲子(用白茄枝烧) 中毒必死
37 虾子+青枣 会中毒
3 牛肉+栗子 引起呕吐
38 鳖+芹菜 剧毒
4 牛肉+红糖 胀死人
39 田螺+木耳 会中毒
5 牛肉+盐菜 会中毒
40 田螺+玉米 会中毒
6 牛肉+鲶鱼 会中毒
41 鸡蛋+糖精 中毒,重则死亡
7 牛肉+田螺 会中毒
42 皮蛋+红糖 中毒,发呕
8 羊肉+西瓜 伤元气
43 豆腐+蜂蜜 导致耳聋
9 羊肉+田螺 腹胀
44 豆腐渣+蜂蜜 会下痢
10 狗肉+绿豆 会中毒
45 蒜头+蜂蜜 会变疳积
Posted by hzqbbc at 03:06 PM | Comments (1)
September 04, 2005
Webmail Test invitation - 征集webmail测试人员
按预定计划,测试版的webmail开发目前已完成了90%以上的代码和功能了,剩余的是一些小的修补和完善。
因此,为了正式的发行,必须进行大量的测试和人机界面的设计,用户的需求分析、网站建设等工作。
希望看到本文的朋友大力支持,并在此征集测试人员数名,以测试该webmail软件的兼容性、性能和功能及界面等各方面情况,力图打造一个具有较高水平的开源软件,与国际接轨,不要让老外看不起我们,尤其不能输给小日本:-)
具体的测试内容包括:- 功能测试
主要测试webmail的各项功能,看功能上有没有缺少一些必备的功能;现有功能是否有bug,是否有明显的缺陷甚至是错误,locale是否有些地方还没翻译好,或者翻译不正确的。
- 安装测试
根据最基本的安装文档,在不同的系统(如Linux 2.4/2.6 kernel,FreeBSD 4.x /5.x 或Sun Solaris 及其他系统)上安装/调试,并记录出现的问题、解决办法。
此外,根据安装测试的经验和教训,共同完善文档。
- 多语言部分测试
利用Gmail,Becky!或其他支持多字符集的webmail/MUA,发各种不同字符集+不同长度+混合不同字符的邮件,测试webmail的多语言处理能力,并记录发生的各种情况。
- 性能测试
在不同的平台上,通过优化手段(通过官方建议的方法,以及自己摸索的方法),测试不同条件(尽量记录这些条件,参数)下webmail在不同的负载(包括不同cpu负载,不同的邮件数量,不同的邮件大小等)下的性能和资源消耗。并总结出优化的方法手段。
同时要做对比测试,对比的对象包括SqWebmail, openwebmail, igenus及squrriel 等典型的国/内外webmail系统。获得较准确公平的测试对比数据。
- 人机界面(模板)兼容性测试
在Internet Explorer , Mozilla 等浏览器上,测试各种webmail的模板的兼容性,以及html/javascript的兼容性,多语言支持是否有问题等。
结束语
希望通过webmail的开发/发行/维护/更新/优化等一系列软件产品的实施工作,逐步锻炼出一支经验丰富、素质高,能与国际水平开齐的开源软件开发、维护队伍。这个目标虽然高了点大了点,但正所谓事在人为,没有不可能的事,按目标按计划按部就班的一点一点实现,总是有所得的,至少软件工程的思想和各种实际能力会大幅度提高,希望有兴趣的朋友积极参与。
联系: MSN hzqbbc (a t) hotmail.com 或 QQ 27914407
邮件: hzqbbc (a t) hzqbbc (dot) com
Posted by hzqbbc at 01:22 PM | Comments (0)