注意:

1、ChangePasswd.ini、ChangePasswd.cgi必须放在apache的cgi-bin(根据自己电脑上的路径来,我的是/var/www/cgi-bin)下。

2、修改密码文件的所有者是apache,如果不是,执行chown apache:apache passwd(密码文件)。

3、如果密码是用htpasswd -c 或-m所建,执行htpasswd -b /etc/httpd/passwd usrname password更新。


一、创建ChangePasswd.ini文件

创建一个空文件:

a.将其命名为ChangePasswd.ini并将以下内容复制到此文件中。

b.注意将以下红色部分改为你自己的路径。第一行为所建用户和密码文件的路径。第二行为修改密码的日志的路径(该文件是自己建的)。


[path]

authuserfile=/etc/httpd/passwd

logfile=/var/www/cgi-bin/ChangePasswd.log

[setup]

pwdminlen=6

[html]

title=SVN用户密码自助修改

description=SVN用户密码自助修改

yourname=用户名

oldpwd=旧密码

newpwd1=新密码

newpwd2=确认新密码

btn_change=修 改

btn_reset=重 置


changepwdok=成功修改密码

changepwdfailed=修改密码失败

servererror=服务器错误

passmustgreater=新密码位数必须大于

twopassnotmatched=两密码不一致

entername=请输入用户名

enterpwd=密码未输入

errorpwd=你的密码不正确

back=返回



二、创建ChangePasswd.cgi文件并设置其权限

创建一个空文件,将以下内容复制到创建的文件里并更名为ChangePasswd.cgi,设置其权限为755(可执行)

命令:chmod 755 ChangePasswd.cgi.


#!/usr/bin/perl -w


use strict;

use CGI;

my $time        = localtime;

my $remote_id   = $ENV{REMOTE_HOST} || $ENV{REMOTE_ADDR};

my $admin_email = $ENV{SERVER_ADMIN};


my $cgi = new CGI;

my $pwd_not_alldiginal = "密码不能全为数字";

my $pwd_not_allchar = "密码不能全为字符";

my $user_not_exists ="该用户不存在";

my $file_not_found ="文件不存在,请联系管理员";


my $authuserfile;

my $logfile;

my $pwdminlen;

my $title;

my $description;

my $yourname;

my $oldpwd;

my $newpwd1;

my $newpwd2;

my $btn_change;

my $btn_reset;


my $changepwdok;

my $changepwdfailed;

my $oldpwderror;

my $passmustgreater;

my $twopassnotmatched;

my $entername;

my $enterpwd;

my $errorpwd;

my $back;


&IniInfo;


if ($cgi -> param())

{#8

my $User = $cgi->param('UserName');

my $UserPwd = $cgi->param('OldPwd');

my $UserNewPwd = $cgi->param('NewPwd1');

my $MatchNewPwd = $cgi->param('NewPwd2');


if (!$User)

     {&Writer_Log("Enter no user name");

       &otherhtml($title,$entername,$back);}

elsif (!$UserPwd )

    {&Writer_Log("Enter no OldPasswd");

     &otherhtml($title,$enterpwd,$back); }

elsif (length($UserNewPwd)<$pwdminlen)

    {&Writer_Log("Password's length must greater than".$pwdminlen);

     &otherhtml($title,$passmustgreater.$pwdminlen,$back);}

elsif ($UserNewPwd =~/^\d+$/)

    {&Writer_Log("New Passwd isn't all diginal");

     &otherhtml($title,$pwd_not_alldiginal,$back);}

elsif ($UserNewPwd =~/^[A-Za-z]+$/)

    {&Writer_Log("New Passwd isn't all char");

     &otherhtml($title,$pwd_not_allchar,$back);}

elsif ($UserNewPwd ne $MatchNewPwd)

    {&Writer_Log("Two new passwords are not matched");

     &otherhtml($title,$twopassnotmatched,$back);}

else

{if($authuserfile)

{#6

open UserFile, "<$authuserfile" or die "打开文件失败:$!";

while (<UserFile>)

    {#5

       my $varstr=$_;


       if($varstr =~/($User)/)

    {#3

     my $eqpos =index($varstr, ":");

     my $UserName = substr($varstr,0,$eqpos);

     my $cryptpwd = substr($varstr,$eqpos + 1,13);

   

     next if($UserName ne $User);

       

     if(crypt($UserPwd,$cryptpwd) eq $cryptpwd)

     {#a

      my $rc = system("/usr/bin/htpasswd -b $authuserfile $User $UserNewPwd");

      if ($rc == 0)

         {#1

            &Writer_Log( $User.":Change Passwd");

            &otherhtml($title,$changepwdok,$back);

          }#1

       else

          {#2

           &Writer_Log( $User.":Change Passwd Failed");

           &otherhtml($title,$changepwdfailed,$back);

          }#2

       exit;

     }#a

     else

     {#b

      &Writer_Log("Old Passwd is Incorrect ");

      &otherhtml($title,$errorpwd,$back);

     }#b

     exit;      

    }#3

       else

    {#4

     if(eof)

     { &Writer_Log($User.":no this user");

       &otherhtml($title,$user_not_exists,$back);

       exit;

     }

     else

     {next;}

    }#4  

     }#5

   close UserFile;

}#6

else

{#7

   &Writer_Log($authuserfile.":no found");

   &otherhtml($title,$file_not_found,$back);

}#7

}

}#8

else

{&Index_Html;}


sub IniInfo{

my $inifile = "/var/www/cgi-bin/ChangePasswd.ini";

open CGI_INI_FILE, "<$inifile" or die "打开文件失败:$!";;

while (<CGI_INI_FILE>)

{

my $eqpos =index($_,'=');

my $len = length($_);


if ($_ =~/authuserfile/)

{$authuserfile= substr($_, $eqpos + 1, $len - $eqpos -2);}

elsif ($_ =~/logfile/)

{$logfile= substr($_, $eqpos + 1);}

elsif ($_ =~/pwdminlen/)

{$pwdminlen= substr($_, $eqpos + 1);}

elsif ($_ =~/title/)

{$title = substr($_, $eqpos + 1);}

elsif ($_ =~/description/)

{$description = substr($_, $eqpos + 1);}

elsif ($_ =~/yourname/)

{$yourname = substr($_, $eqpos + 1);}

elsif ($_ =~/oldpwd/)

{$oldpwd= substr($_, $eqpos + 1);}

elsif ($_ =~/newpwd1/)

{$newpwd1= substr($_, $eqpos + 1);}

elsif ($_ =~/newpwd2/)

{$newpwd2= substr($_, $eqpos + 1);}

elsif ($_ =~/btn_change/)

{$btn_change = substr($_, $eqpos + 1);}

elsif ($_ =~/btn_reset/)

{$btn_reset = substr($_, $eqpos + 1);}

elsif ($_ =~/changepwdok/)

{$changepwdok = substr($_, $eqpos + 1);}

elsif ($_ =~/changepwdfailed/)

{$changepwdfailed = substr($_, $eqpos + 1);}

elsif ($_ =~/oldpwderror/)

{$oldpwderror = substr($_, $eqpos + 1);}

elsif ($_ =~/passmustgreater/)

{$passmustgreater = substr($_, $eqpos + 1);}

elsif ($_ =~/twopassnotmatched/)

{$twopassnotmatched = substr($_, $eqpos + 1);}

elsif ($_ =~/entername/)

{$entername = substr($_, $eqpos + 1);}

elsif ($_ =~/enterpwd/)

{$enterpwd= substr($_, $eqpos + 1);}

elsif ($_ =~/errorpwd/)

{$errorpwd= substr($_, $eqpos + 1);}

elsif ($_ =~/back/)

{$back = substr($_, $eqpos + 1);}

}

close CGI_INI_FILE;

}


sub Index_Html

{

print "Content-type: text/html\n\n";

print <<END_OF_PAGE;

<html >

<head>

<title>$title</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body>


<HR>


<center><h1>$description</h1>

</center>

<form method="POST" enctype="multipart/form-data" action="/cgi-bin/ChangePasswd.cgi">

<br>

<TABLE align="center">

<TR><TD class="t_text">$yourname</TD><TD><input type="text" name="UserName" /></TD></TR>

<TR><TD class="t_text">$oldpwd</TD><TD><input type="password" name="OldPwd" /></TD></TR>

<TR><TD class="t_text">$newpwd1</TD><TD><input type="password" name="NewPwd1" /></TD></TR>

<TR><TD class="t_text">$newpwd2</TD><TD><input type="password" name="NewPwd2" /></TD></TR>

</TABLE>

<br>

<TABLE align="center">

<TR><TD><input type="submit" name="chgpasswd" value="$btn_change"> <input type="reset" value="$btn_reset"></TD></TR>

</TABLE>

</form>

<HR>

<font color="#FF0000">注意:新密码位数必需大于$pwdminlen,且为字母与数字组合</font>


</body>

</html>

END_OF_PAGE

}


sub otherhtml{

print "Content-type: text/html\n\n";


print <<END_OF_PAGE;

<html>

<head>

<meta http-equiv="Content-Language" content="zh-cn">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>$_[0]</title>

</head>


<body>

<p align="center"><font size="5">$_[1]</font></p>

<p align="center"><a href="/cgi-bin/ChangePasswd.cgi"><font size="4">$_[2]</font></a></p>


<HR>

</body>


</html>

END_OF_PAGE

}


sub Writer_Log{

if($logfile)

{

my $loginfo ="[".$time."] "." [".$remote_id."] "." || ".$_[0];

open LOGFILE,">>$logfile" or die "Couldn't open LOG FILE for writing: $!";

print LOGFILE ("$loginfo\n");

close LOGFILE;

}

}



三、创建ChangePasswd.log文件并设置其权限。

进入目标位置(即你想创建ChangePasswd.log的位置),如: /var/www/cgi-bin(根据自己的位置定),创建一个名为ChangePasswd.log的文件并赋予该文件写的权限:


命令:chmod 666 ChangePasswd.log


四、修改密码

通过http://ip:80/cgi-bin/ChangePasswd.cgi修改密码。


80对应自己设置的端口。


PS:只针对svn://地址,这样的svn用户修改,如果是http的用户是识别不了的,会提示你的密码不正确。