Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7739642
  • 博文数量: 637
  • 博客积分: 10265
  • 博客等级: 上将
  • 技术积分: 6165
  • 用 户 组: 普通用户
  • 注册时间: 2004-12-12 22:00
文章分类

全部博文(637)

文章存档

2011年(1)

2010年(1)

2009年(3)

2008年(12)

2007年(44)

2006年(156)

2005年(419)

2004年(1)

分类:

2006-03-19 21:09:31

有时候,人懒的话,就啥事也觉得不想干不想做,觉得做起来都麻烦,一直都想做一个通过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
# 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的一个补充,有其他需要的朋友可以在此基础上进行修改。

阅读(5026) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~