分类:
2006-03-19 21:09:31
有时候,人懒的话,就啥事也觉得不想干不想做,觉得做起来都麻烦,一直都想做一个通过courier套件中的authlib认证用户信息的插件模块,却因懒惰而拖延。
今天,不知道哪里来的动力,翻开cyrus-sasl 2.1.19的source,看了一把,用perl简单的实现了一个courier-authlib的客户端,支持查询和修改密码。
这样这个模块应用到extmail中,就成为了目前为止第四个认证模块了。
认证(查询信息):
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
具体代码见下文,请阅读本文的读者注意:
程序代码以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
# 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的一个补充,有其他需要的朋友可以在此基础上进行修改。