Linux下Subversion自助修改密码
前阵儿公司内部配置好了subverion来做版代码管理,为了便于个人修改密码,所以网上找了很多关于自助修改密码的资料,结果发现很多都是针对windows版的,即使有针对linux版的,但还是有一些问题,不能直接拿来用,说明文字也比少。
下面是我自己用的配置文件,99%来源于网络,只有很少一点点是我根据自己的实际情况修改的。希望对大家有用。
需要俩个文件:
svnpass.ini
svnpass.cgi
svnpass.ini中的内容如下:
[path]
authuserfile=/opt/svn/svnuser????
logfile=/opt/svn/changepwd.log
[setup]
pwdminlen=2
[html]
title=SVN用户密码自助修改
description=SVN用户密码自助修改
yourname=用户名
oldpwd=旧密码
newpwd1=新密码
newpwd2=确认新密码
btn_change=修 改
btn_reset=重 置
changepwdok=成功修改密码
changepwdfailed=修改密码失败
servererror=服务器错误
passmustgreater=新密码位数必须大于
twopassnotmatched=两密码不一致
entername=请输入用户名
enterpwd=密码未输入
errorpwd=你的密码不正确
back=返回
说明:
关键是红颜色是三行内容:
authuserfile=/opt/svn/svnuser?:subversion用户与密码文件存放位置
logfile=/opt/svn/changepwd.log?:修改密码的日志文件存放位置
pwdminlen=2?:密码的最小长度
以上三项,根据实际情况修改即可。
其他内容保持不变即可。
svnpass.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("htpasswd -b $authuserfile $User $UserNewPwd");
?????????????????????if ($rc == 0)
????????????????????????{#1
???????????????????????????&Writer_Log( $User."£oChange Passwd");
???????????????????????????&otherhtml($title,$changepwdok,$back);
?????????????????????????}#1
??????????????????????else
?????????????????????????{#2
??????????????????????????&Writer_Log( $User."£oChange 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."£ono 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/svnpass.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>
<center>
<HR>
<p>我的 SVN</P>
<P>主页:https://192.168.1.5/svn</p>
<font color="#FF0000">注意:新密码位数必需大于$pwdminlen,且为字母与数字组合</font>
<P></p>
</center>
<center><h1>$description</h1>
</center>
<form method="POST" enctype="multipart/form-data"??action="/cgi-bin/svnpass.cgi">
<br>
<TABLE align="center">
<TR><TD name="UserName"??/></TD></TR>
<TR><TD name="OldPwd"??/></TD></TR>
<TR><TD name="NewPwd1"??/></TD></TR>
<TR><TD 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>
<center>
<HR>
<p>如有问题请与管理员联系E-MAil:<A HREF="mailto:$admin_email">$admin_email</A>.</P>
</center>
</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/svnpass.cgi"><font size="4">$_[2]</font></a></p>
<HR>
<P>如有问题请与管理员联系E-Mail: <A HREF="mailto:$admin_email">$admin_email</A>.</P>
</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;
}
}
说明:
同样需要注意三个红颜色的地方:
system("htpasswd -b $authuserfile $User $UserNewPwd");??:注意其中的命令htpasswd,与windows下的不同
/var/www/cgi-bin/svnpass.ini";????:配置文件的位置,就是上面的svnpass.ini位置
<a href="/cgi-bin/svnpass.cgi">???:cgi脚本的相对位置,很重要,一般就放在apache的cgi-bin目录即可
这样就可以通过url:https://192.168.1.5/cgi-bin/svnpass.cgi
这样的方式来修改密码了。当然,如果你的apache没有配置加密http的话,可以不需要https,而直接用http即可
?
转自:?http://www.linuxidc.com/Linux/2011-01/31664.htm
?