#!/usr/bin/perl ############################################################################## # # # hboard_std_admin.cgi Rev 1.0 (10/12/1998) # # # ############################################################################## # # # 返事が書ける掲示板の管理メニュー # # # # Copyright (C) 1998 Web新撰組 # # WWW: http://www.web-shinsengumi.com # # 無断転載・複製を禁ずる # # # # 作成:萩原 逸郎(eMail:hagi2@kh.rim.or.jp) # # # ############################################################################## require './hmkpasswd.pl'; # 初期設定 # 初期設定以外はいじらんで下さい $cginame='./hboard_std_admin.cgi'; # このCGIのファイル名 $logdata="./hboard_std.log"; # ログファイル名 $passwd_file="./passwd"; # パスワードファイル $HOME='http://www.web-shinsengumi.com'; # ホームページのURL $CGI_TITLE='普通の掲示板管理メニュー'; # このCGIの見出し # 初期設定ここまで %FORM=&get_formdata; if($FORM{'action'}){ $action=$FORM{'action'}; $action =~ s/\n//g; }else{ $action='show'; } if($action eq 'show'){ &print_head; &print_form; &print_foot; }elsif($action eq 'purge_data'){ if($FORM{'passwd'}){ $passwd=$FORM{'passwd'}; }else{ &error(100,'パスワードがありませぬ'); } &check_passwd($passwd); if($FORM{'dnum'}){ $purgenum=$FORM{'dnum'}; }else{ &error(101,'消去する番号を入れて下さい'); } if($purgenum =~ /\D/){ &error(102,'しっぱい'); } &purge_data($purgenum); &print_head; print "OK\n"; &print_foot; }elsif($action eq 'change_passwd'){ if($FORM{'passwd'}){ $passwd=$FORM{'passwd'}; }else{ &error(200,'パスワードがありませぬ'); } &check_passwd($passwd); if($FORM{'passwd_a'}){ $passwd_a=$FORM{'passwd_a'}; }else{ &error(201,'パスワードが足りませぬ'); } if($FORM{'passwd_b'}){ $passwd_b=$FORM{'passwd_b'}; }else{ &error(202,'パスワードが足りませぬ'); } if($passwd_a ne $passwd_b){ &error(203,'パスワードがちゃいまする'); } $new_passwd=&hmkpasswd($passwd_a); open(OUT,"> $passwd_file"); print OUT $new_passwd; close(OUT); &print_head; print "OK\n"; &print_foot; }elsif($action eq 'bomb'){ if($FORM{'passwd'}){ $passwd=$FORM{'passwd'}; }else{ &error(200,'パスワードがありませぬ'); } &check_passwd($passwd); open(OUT,"> $logdata"); close(OUT); &print_head; print "OK\n"; &print_foot; } exit; sub check_passwd { local($passwd)=@_; open(IN,"$passwd_file"); $enc_passwd=; close(IN); $enc_passwd =~ s/\n//g; $dmy=crypt($passwd,$enc_passwd); &error(500,'パスワードがちゃいます') if($dmy ne $enc_passwd); } sub purge_data{ local($purgenum)=@_; open(IN,"$logdata"); flock(IN,2); while(){ $data=$_; chop($data); push(@old,$data); } flock(IN,8); close(IN); for($i=0;$i<=$#old;$i++){ $data=$old[$i]; if($data =~ /^'); } }else{ undef($bwd); undef($new_bwd); undef(@bwds); push(@new,$data); $i++; $data=$old[$i]; if($data =~ /\d/){ if($data =~ /\,/){ @bwds=split(/\,/,$data); }else{ $bwds[0]=$data; } foreach $bwd (@bwds) { if($bwd != $purgenum){ $new_bwd = $new_bwd . "\," . $bwd; } } $new_bwd =~ s/^\,//; }else{ $new_bwd=$data; } push(@new,$new_bwd); undef($bwd); undef($new_bwd); undef(@bwds); $i++; $data=$old[$i]; if($data =~ /\d/){ if($data =~ /\,/){ @bwds=split(/\,/,$data); }else{ $bwds[0]=$data; } foreach $bwd (@bwds) { if($bwd != $purgenum){ $new_bwd = $new_bwd . "\," . $bwd; } } }else{ $new_bwd=$data; } $new_bwd =~ s/^\,//; push(@new,$new_bwd); } }else{ push(@new,$data); } } flock(IN,8); close(IN); open(OUT,"> $logdata"); flock(OUT,2); foreach $data (@new){ print OUT $data,"\n"; } flock(OUT,8); close(OUT); } sub print_head { print <<"EOL"; Content-type: text/html $CGI_TITLE [HOME]

$CGI_TITLE
EOL $head_chk=1; } sub print_form { print <<"EOL"; データを消す
データ番号
管理者パスワード
パスワード変更
今のパスワード
新しいパスワード
新しいパスワード(確認用)
爆発
管理者パスワード
EOL } sub print_foot { print "\n"; } sub error { local($num,$line)=@_; if(!$head_chk){ &print_head; } print "\nError $num
\n$line
\n\n\n"; &print_foot; exit; } sub get_formdata{ local($buffer,@pairs,%FORM,$name,$value,$ename); if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach (@pairs) { ($name, $value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%(\w\w)/pack("C", hex($1))/eg; $value =~ s/[\r\n]//g; $FORM{$name} = $value; } return(%FORM); }