perl client for Authlib - 一个courier认证库的客户端

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

 

本文网址:http://www.hzqbbc.com/blog/arch/2005/09/perl_client_for.html

 类似资料: