perl client for Authlib - 一个courier认证库的客户端
2010-12-11 22:38
295 查看
有时候,人懒的话,就啥事也觉得不想干不想做,觉得做起来都麻烦,一直都想做一个通过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); }
[/code]
使用方法
修改程序中$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
相关文章推荐
- C#:一个增强的TcpClient(*)客户端演示程序及源代码下载
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(六)RTP音视频传输解析层之音视频数据传输格式
- 一个完整的新浪微博客户端android版OAuth认证示例
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(二)用户接口层之RtspClient类及其构造函数
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(四)用户接口层之处理SDP报文
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式
- MQTT Client library for C (MQTT客户端C语言库-paho)
- C H A P T E R 2 9 Building a Web Services Client 29章构建一个Web Services 客户端
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(三)一个简单的rtsp播放器
- Asynchronous MQTT client library for C (MQTT异步客户端C语言库-paho)
- CreateThread(NULL, 0, ClientThread, (LPVOID)sClient, 0, &dwThreadId);//每个客户端创建一个接收线程
- 一个HttpClient使用Windows认证请求WCF服务的例子
- Practical Multithreading for Client Apps (.net客户端程序使用多线程的实践)
- 用C语言实现一个简单的HTTP客户端(HTTP Client)
- DBMS客户端是否安装:Make sure DBMS client is installed and this required library is available for dynamic loading
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(五)用户接口层之提取媒体流数据
- socket client传文件到server,server端接收成功后给客户端反馈一个信息
- java Android Client客户端 SSL 证书 私钥 公钥 安全 双向认证 怎么解决?
- WCF客户端引用带有 int bool 类型的方法时,会自动加上一个Specified参数的 解决方法 Web Reference for a WCF Service has Extra “IdSpecified” Parameter -摘自网络
- 一个基于JRTPLIB的轻量级RTSP客户端——myRTSPClient详解