#!/usr/bin/perl
#
#YuiEdit 1.0(edit.cgi)
#1997.10.11製作
#すくりぷと　ばい　ゆいちゃっと　
#　　　　　　　　　Since  1996
#
#アンケートCGI　yuivote2.cgiの改造版 Fvote.cgi専用に改造
# arranged by Falcon Taka (1998/08/15)
# fvotedit.cgi (2000/02/10)
# http://www7.big.or.jp/~falcon/
$ver = '2.20';	#バージョン
#設置方法：
#voteedit.cgi(755)を編集したいファイルと
#同一ディレクトリに設置。
#
#$| = 1;

#初期設定など。正しく設定してくださいね。

$method = 'POST';
$cginame = './fvotedit.cgi';#このＣＧＩのファイル名
$votecgi = './fvote.cgi';	#投票用ＣＧＩのファイル名
$title = 'FvoteEdit';	#これは書き換え可能
$body='<BODY BGCOLOR="#EEFFEE" TEXT="#000000" LINK="#ff0000" VLINK="#ff0000" ALINK="#FF0000">';
$cgidir = '.';	#他のサイトからのアクセスを制限する場合に使用。通常はこのまま
$edit_file='./fvote.dat';	#編集したいファイルを指定します。
$passwd = '0709';		#編集に必要なパスワード
#投稿者のリモートホスト名は、管理人パスワードが合致しているときだけ表示します。

#初期設定ここまで
##### メイン ###########
&decode;
&readlog;
&jikan;
&edit;
exit;
#####################
sub decode{		#一般的なデコード＆変数への代入
	if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
	else { $buffer = $ENV{'QUERY_STRING'}; }
	@pairs = split(/&/,$buffer);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$FORM{$name} = $value;
	}
	$pass = $FORM{'pass'};
	$page = $FORM{'page'};
	$page=0 unless($page);
	$lmax = $FORM{'lm'};
	$lmax=30 unless($lmax);
	$page2 = $page*$lmax;
	$cmax = $FORM{'cm'};
	$cmax=500 unless($cmax);
}#decode END

sub jikan{#$dateに時刻を代入します。
	$ENV{'TZ'}	 = 'JST-9';$times = time;
	($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime($times);
	$min = "0$min" if ($min < 10);	$month++; $year += 1900;
	$youbi = ('日','月','火','水','木','金','土') [$wday];
	$date = "$year/$month/$mday($youbi)$hour:$min";
}#jikan END

sub readlog{	#配列@linesにログを読み込む
	open(DB,"$edit_file") || &err('ファイルが開けません');
	seek(DB,0,0);  @lines = <DB>;	close(DB);
}#readlog END

sub writelog{	#@linesを書き込む
	return unless( ($ENV{'HTTP_REFERER'} eq '') || ($ENV{'HTTP_REFERER'} =~/$cgidir/));
	@lines=grep(!/^\n/,@lines);
	open(DB,"+<$edit_file") || &err('書き込みできません');
	eval 'flock(DB,2);';
	truncate(DB,0);
	seek(DB,0,0);
	print DB @lines;
	#eval 'flock(DB,8);';
	close(DB);
}#writelog END

sub edit {
	if($buffer=~/erase/){
		&err('パスワードがちがうよぉ') if($pass ne $passwd);
		$buffer=~s/&pass=.*//;#余分な部分を削除
		$buffer=~s/&tag=.*//;#余分な部分を削除
		$buffer=~s/&//;#余分な部分を削除
		(@erase) = split(/erase=/, $buffer);#削除リストを作成
		$dmy = shift( @erase);	
		foreach $erase(@erase){
			$lines[$erase]='';
			#@lines=grep(!/$erase/,@lines);
		}
	&writelog;&readlog;
	}

print "Content-type: text/html\n\n";
print <<"_HTML_";
<HTML><HEAD><TITLE>$title</TITLE>
</HEAD>$body
[<A HREF="$votecgi?">Edit終了</A>]<BR>
<FONT SIZE=+2 COLOR="green"><B>$title</B></FONT><BR>
<HR SIZE=5>
<FORM METHOD="$method" ACTION="$cginame">
<INPUT TYPE="HIDDEN" NAME=lm value=$lmax>
<INPUT TYPE="HIDDEN" NAME=cm value=$cmax>
<INPUT TYPE="HIDDEN" NAME=tag value=$FORM{'tag'}>
<INPUT TYPE="HIDDEN" NAME=tag2 value=$FORM{'tag2'}>
<INPUT TYPE="HIDDEN" NAME=pass value=$pass>
<TABLE BORDER=0><TR><TD>
Page選択
</TD><TD>
<SELECT NAME="page" SIZE="1">
_HTML_
$roomtotal = @lines;
$count = int(($roomtotal-1)/$lmax);
for($i=0;$i<=$count;$i++){
	$j=$i+1;
	if($i eq $page){ print "<OPTION VALUE=\"$i\" SELECTED>$j\n";
		}else{
		print "<OPTION VALUE=\"$i\">$j\n";
	}
}
print "</SELECT>\n";
print "</TD><TD><INPUT TYPE=submit VALUE=\"　選択　\">\n";
print "</TD></TR></TABLE></FORM>\n";
if(@lines < $lmax){
	$start=0;
	}else{
	@lines = @lines[$page2 .. $page2+$lmax-1];
	$start=$page2;
}
print "<FORM METHOD=\"$method\" ACTION=\"$cginame\">\n";
print "<INPUT TYPE=HIDDEN name=page value=$page>\n";
print "<BR>削除するものにチェックをいれます。<BR>\n";
print "<TABLE BORDER=2 width=95%>\n";
print "<TR><TD BGCOLOR=orange><B>削除</B></TD><TH NOWRAP>選択項目</TH><TH NOWRAP>投稿者</TH><TH NOWRAP>コメント</TH><TH>日付</TH><TH>ホスト名</TH></TR>\n" ;
foreach $line(@lines){

	if($FORM{'tag'} eq 'on'){
		$line=~s/<[^>]*>//ig;}elsif($FORM{'tag2'} eq 'esq'){$line=~s/</&lt;/ig;}
		($id,$koumoku,$namae,$comment,$date,$host,$dmy) = split(/:#/,$line);
		$comment = substr($comment,0,$cmax);#文字数制限
		$host ='' if($pass ne $passwd);
		print "<TR><TD BGCOLOR=\"#CCCCFF\"><INPUT TYPE=checkbox NAME=\"erase\" VALUE=\"$start\">　</TD><TD NOWRAP>$koumoku</TD><TD NOWRAP>$namae</TD><TD>$comment</TD><TD NOWRAP>$date</TD><TD>$host</TD></TR>\n" if($line);
		$start++;
	}
	print "</TABLE>\n";
	&jikan;
	print <<"_HTML_";
<hr>$date現在、$roomtotal行登録されています。
<BR>
タグを表\示しない<INPUT TYPE=checkbox NAME="tag" VALUE="on"><BR>
タグをエスケープ<INPUT TYPE=checkbox NAME="tag2" VALUE="esq"><BR>
パスワード:<INPUT TYPE=password NAME="pass" VALUE="$pass" SIZE="20"><BR>
表\示件数/頁:<INPUT TYPE=text NAME="lm" VALUE="$lmax" SIZE="5"><BR>
表\示文字数/一行:<INPUT TYPE=text NAME="cm" VALUE="$cmax" SIZE="5"><BR>
<INPUT TYPE=submit NAME="edit" VALUE="　送信　">　
<INPUT TYPE=reset VALUE="リセット"></FORM>
<BR>
_HTML_
	&footer;
	exit;
}#html END

sub err{
	$error = $_[0];
	print "Content-type: text/html\n\n";
	print <<"_HTML_";
<HTML><HEAD><TITLE>$title</TITLE></HEAD>$body
<H1>エラーが発生しました。</H1>
<HR>
$error
<BR><BR><BR><BR><BR>
_HTML_
	&footer;
	exit;
}

sub footer{
	print "<H5 ALIGN=right><A HREF=\"http://www.cup.com/yui/\">YuiEdit</A></H5>\n";
	print "<!-- $ver --><H4 ALIGN=right> FvoteEdit<A HREF=\"http://www7.big.or.jp/~falcon/\">Falcon World</A></H4></BODY></HTML>\n";
#この行だけは消さないでください！！
}
__END__