安恒网管员手记: vpopmail的密码自学习功能
2004-08-09    刘世伟   
打印自: 安恒公司
地址: HTTP://anheng.com.cn/news/article.php?articleid=378
vpopmail的密码自学习功能




[安恒原创]
转载请注明出处  
 http://www.anheng.com.cn/news/15/378.html

vpopmail有一个密码自学习功能,就是在建立信箱时,密码设为空,就会从客户端学习密码,也就是第一个pop3连上来的密码,会被纪录并在以后的认证中使用。
可以通过察看vpasswd文件来看到这个过程。
在编译vpopmail时通过 --enable-learn-passwords=y 来打开这个功能。

遗憾的是这个功能只能在新建邮件账号时使用,在修改密码时不能用。
http://www.anheng.com.cn/news/15/378.html
我修改了一下源代码,是vpopmail在修改密码时也可以开启密码学习功能,大大方便了网管员.需要修改2个文件,给vpasswd命令增加了1个命令行参数 -n 空密码

下面是patch,在vpopmail源代码目录下执行patch <nulpasswd.patch
=====================nulpasswd.patch

diff -u ../vpopmail-5.4.5/vpasswd.c ./vpasswd.c
--- ../vpopmail-5.4.5/vpasswd.c 2003-10-08 05:16:40.000000 +0800
+++ ./vpasswd.c 2004-09-09 08:58:01.000000000 +0800
@@ -39,6 +39,8 @@
 char Passwd[MAX_BUFF];
 int apop;
 int RandomPw;
+int NoPassword=0;
+

 void usage();
 void get_options(int argc,char **argv);
@@ -54,7 +56,8 @@
             vexit(i);
         }

-       if ( strlen(Passwd) <= 0 ) {
+       if (( strlen(Passwd)) <= 0 && (NoPassword==0)) {
+
                snprintf(Passwd, sizeof(Passwd), "%s", vgetpasswd(Email));
        }

@@ -72,6 +75,7 @@
        printf("vpasswd: usage: [options] email_address [password]\n");
        printf("options: -v (print version number)\n");
        printf("         -r generate a random password\n");
+        printf("         -n no_password\n");
 }

 void get_options(int argc,char **argv)
@@ -87,7 +91,7 @@
        RandomPw = 0;

        errflag = 0;
-    while( !errflag && (c=getopt(argc,argv,"vr")) != -1 ) {
+    while( !errflag && (c=getopt(argc,argv,"vrn")) != -1 ) {
                switch(c) {
                        case 'v':
                                printf("version: %s\n", VERSION);
@@ -96,6 +100,11 @@
                                RandomPw = 1;
                                vrandom_pass (Passwd, 8);
                                break;
+                       case 'n':
+                               memset(Passwd, 0, sizeof(Passwd));
+                               NoPassword = 1;
+                               break;
;==========================over 

责任编辑: admin