Linux下Subversion自助修改密码

前阵儿公司内部配置好了subverion来做版代码管理,为了便于个人修改密码,所以网上找了很多关于自助修改密码的资料,结果发现很多都是针对windows版的,即使有针对linux版的,但还是有一些问题,不能直接拿来用,说明文字也比少。下面是我自己用的配置文件,99%来源于网络,只有很少一点点是我根据自己的实际情况修改的。希望对大家有用。需要俩个文件:svnpass.inisvnpass.cgisvnpass.ini中的内容如下:[path]authuserfile=/opt/svn/svnuserlogfile=/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 -wuse 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()){#8my $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.”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;}#6else{#7 &Writer_Log($authuserfile.”:no found”); &otherhtml($title,$file_not_found,$back);}#7}}#8else{&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><TR><TD>$yourname</TD><TD><input type=”text” /></TD></TR><TR><TD>$oldpwd</TD><TD><input type=”password” /></TD></TR><TR><TD>$newpwd1</TD><TD><input type=”password” /></TD></TR><TR><TD>$newpwd2</TD><TD><input type=”password” /></TD></TR></TABLE><br><TABLE><TR><TD><input type=”submit” 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><font size=”5″>$_[1]</font></p><p><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即可

不求与人相比,但求超越自己,要哭就哭出激动的泪水,要笑就笑出成长的性格。

Linux下Subversion自助修改密码

相关文章:

你感兴趣的文章:

标签云: