« 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分钟内就可以完成:

利用该方法生成的blog 样板可以看看:Extmail邮件开发博客

一些Links

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的两大特色:

后来,GMail的相关软件和第三方工具就由爱好者大量地开发出来了,在CPAN上有不少GMail的工具模块,但最想找到的还是自动补齐的实现,毕竟从头自己来做,工作量可真不小。

这两天碰巧在一个eba(企业级别商业应用程序)的网站上看到了demo,又发现了一些用户的评论,于是就“拿来主义”,测试了一下,感觉效果还可以。后又在google上找到一些其他的自动补齐的实现,最后选了一个较好的,作为目前webmail的测试版自动补齐。

为了提高速度,我对js程序进行了大量的修改,将原来的14.5K的体积压缩到9.2K,并修补了几个bug,并增加了列出全部地址的快捷键。截图见下:

webmail-autocomplete2.gif

要实现自动补齐,其基本的设计思路我认为是这样的:

在这个过程中,自己增加了一个快捷键“空格(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的结构图

extmail_bigpicture.gif

注意:

该图将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%的进度了,可以开始筹备发行的事情了,粗略想了一下,大致的发行流程有如下几点:

.....

此外,配套的一些工作也需要加紧完成,大致包括了:

如果有任何的建议或批评,请在本页下方留言。

并希望能通过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的开发/发行/维护/更新/优化等一系列软件产品的实施工作,逐步锻炼出一支经验丰富、素质高,能与国际水平开齐的开源软件开发、维护队伍。

这个目标虽然高了点大了点,但正所谓事在人为,没有不可能的事,按目标按计划按部就班的一点一点实现,总是有所得的,至少软件工程的思想和各种实际能力会大幅度提高,希望有兴趣的朋友积极参与。

联系: MSN hzqbbc (a t) hotmail.com 或 QQ 27914407
邮件: hzqbbc (a t) hzqbbc (dot) com

Posted by hzqbbc at 01:22 PM | Comments (0)