#!/usr/local/bin/perl

## G-LIGHT : admin.cgi ( 2003/10/13 )
## Copyright (c) KentWeb
## webmaster@kent-web.com
## http://www.kent-web.com/
## 
## Modified by isso. Mar, 2006
## http://swanbay-web.hp.infoseek.co.jp/index.html

#------------#
#  管理画面  #
#------------#
sub admin {
	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	# 削除
	if ($in{'job'} eq "dele" && $in{'no'}) {

		# ロック開始
		&lock if ($lockkey);

		@data=();
		open(IN,"$logfile") || &error("Open Error: $logfile");
		while (<IN>) {
			($no) = split(/<>/);

			$f=0;
			foreach $del ( split(/\0/, $in{'no'}) ) {
				if ($no == $del) { $f++; last; }
			}
			if (!$f) { push(@data,$_); }
		}
		close(IN);

		# 更新
		open(OUT,">$logfile") || &error("Write Error: $logfile");
		print OUT @data;
		close(OUT);

		# ロック解除
		&unlock if ($lockkey);

	# 修正画面
	} elsif ($in{'job'} eq "edit" && $in{'no'}) {

		if ($in{'no'} =~ /\0/) { &error("修正/レスは記事の選択は１つのみです"); }

		open(IN,"$logfile") || &error("Open Error: $logfile");
		while (<IN>) {
			@f = split(/<>/);

			last if ($in{'no'} == $f[0]);
		}
		close(IN);

		&edit_form(@f);

	# 修正実行
	} elsif ($in{'job'} eq "edit2") {

		# ロック開始
		&lock if ($lockkey);

		@data=();
		open(IN,"$logfile") || &error("Open Error: $logfile");
		while (<IN>) {
			($no,$dat,$nam,$eml,$area,$ico,$icom,
				$com,$res,$url,$hos,$pw,$sub,$tim) = split(/<>/);

			if ($in{'no'} == $no) {
				$_ = "$no<>$dat<>$in{'name'}<>$in{'email'}<>$in{'area'}<>$in{'icon'}<>$in{'icom'}<>$in{'comment'}<>$in{'comment2'}<>$in{'url'}<>$hos<>$pw<>$in{'sub'}<>$tim<>\n";
			}
			push(@data,$_);
		}
		close(IN);

		# 更新
		open(OUT,">$logfile") || &error("Write Error: $logfile");
		print OUT @data;
		close(OUT);

		# ロック解除
		&unlock if ($lockkey);

	}

	# 初期画面
	&header;
	print <<EOM;
<form action="$script">
<input type=submit value="掲示板に戻る">
</form>
EOM

	if (-e $spamdata) {
	print <<EOM;
<hr>
<h3>設定画面</h3>
<table border=0><tr>
<td>
<UL>
<li>NGワードの一括編集
<form action="$script" method="$method">
<input type=hidden name=mode value="spamdata">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value='NGワードの一括編集'><br>
</form>
</ul>
</td>
EOM
	}

	if(-s $spamlogfile) {
	print <<EOM;
<td>
<UL>
<LI>投稿拒否された迷惑投稿を閲覧できます。
<form action="$script" method="$method">
<input type=hidden name=mode value="spam">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value="迷惑投稿を閲覧">
</form>
</UL>
</td>
EOM
	}
	print "</tr></table>\n";
	print <<EOM;
<ul>
<li>処理を選択して送信ボタンを押してください。
</ul>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=hidden name=pass value="$in{'pass'}">
処理：<select name=job>
<option value="edit">修正/レス
<option value="dele">記事削除
</select>
<input type=submit value="送信する">
<dl>
EOM

	# ログ展開
	open(IN,"$logfile") || &error("Open Error: $logfile");
	while (<IN>) {
		($no,$dat,$nam,$eml,$area,$ico,$icom,
			$com,$res,$url,$hos,$pw,$sub,$tim) = split(/<>/);
		$sub ||= '無題';
		$com =~ s/<br>//g;
		if (length($com) > 60) {
			$com = substr($com,0,58) . '...';
		}
		$res =~ s/<br>//g;
		if (length($res) > 60) {
			$res = substr($res,0,58) . '...';
		}

		print "<dt><hr><input type=checkbox name=no value=\"$no\">
		<b style='color:$sub_col'>$sub</b> - <b>$nam</b> $dat<dd>[本文] $com\n";
		if ($res) { print "<dd>[返信] $res\n"; }
	}
	close(IN);

	print <<EOM;
<dt><hr>
</dl>
</form>
</body>
</html>
EOM
	exit;
}

#------------#
#  修正画面  #
#------------#
sub edit_form {
	local(@f) = @_;

	# アイコン定義
	@ico1 = split(/\s+/, $ico1);
	@ico2 = split(/\s+/, $ico2);
	@ico3 = split(/\s+/, $ico3);

	&header;
	print <<EOM;
<form>
<input type=button value="前画面に戻る" onClick="history.back()">
</form>
<ul>
<li>変更する部分のみ修正して送信ボタンを押してください。
</ul>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=job value="edit2">
<input type=hidden name=no value="$in{'no'}">
EOM

	&form(@f);

	print <<EOM;
</form>
</body>
</html>
EOM
	exit;
}

#------------#
#  入室画面  #
#------------#
sub enter {
	&header;
	print <<EOM;
<div align="center">
パスワードを入力してください
<p>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=password name=pass size=8>
<input type=submit value="ログイン"></form>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  スパムログ
#-------------------------------------------------
sub spam {
	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	&header;
	print <<EOM;
<UL>
<table border=0>
<tr><td><form action="$script">
<input type=submit value="掲示板に戻る">
</form>
</td><td>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
</UL>
<UL><li>投稿拒否ログ<br>
「再投稿処理」をクリックすると誤ってスパム投稿として拒否された投稿を復活させることができます。<br>
必用な投稿を復活させたあとは、「投稿拒否ログを削除」しておいて下さい。
<form action="$script" method="$method">
<input type=hidden name=mode value="spamclear">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 投稿拒否ログを削除する ">
</form>
EOM
	open(IN,"$spamlogfile") || &error("Open Error : $spamlogfile");
	$i=0;
	while (<IN>) {
		local ($no,$date,$name,$email,$area,$icon,$x,$comment,$comment2,$url,$host,$pwd,$sub,$tim,
		$reason,$fcheck,$referer,$useragent) = split(/<>/);
		$date{$i}      = $date;
		$name{$i}      = $name;
		$email{$i}     = $email;
		$area{$i}      = $area;
		$icon{$i}      = $icon;
		$sub{$i}       = $sub;
		$msg{$i}       = $comment;
		$comment2{$i}  = $comment2;
		$url{$i}       = $url;
		$host{$i}      = $host;
		$pwd{$i}       = $pwd;
		$tim{$i}       = $tim;
		$reason{$i}    = $reason;
		$timecheck{$i} = &encode_bbsmode($fcheck);
		if ($fcheck) { $fcheck{$i} = &get_time($fcheck); }
		else { $fcheck{$i} = "アクセス記録なし"; }
		$useragent{$i} = $useragent;
		if ($keychange) {
			if ($url{$i} && $url{$i} =~ /\@/) { ($email{$i},$url{$i})=($url{$i},$email{$i}); }
			elsif ($email{$i} && $email{$i} !~ /\@/) { ($email{$i},$url{$i})=($url{$i},$email{$i}); }
		}
		$i++;
	}
	close(IN);

	# ソート処理
	$j=0;
	$x=0;
	$page = $in{'page'};
	foreach (sort { ($date{$b} cmp $date{$a}) } keys(%date)) {
		$j++;
		if ($j < $page + 1) { next; }
		if ($j > $page + $spamlog_page) { next; }

		$useragent = "<small>$useragents</small>";
		print "<P><table border='1'>\n<tr>";
		print "<tr><td>投稿日時</td><td>$date{$_}</td><td>タイトル</td><td>$sub{$_}</td></tr>",
		"<tr><td>アクセス日時</td><td>$fcheck{$_}</td><td>投稿拒否理由</td><td>$reason{$_}</td></tr>",
		"<tr><td>投稿者名</td><td>$name{$_}</td><td>URL</td><td>$url{$_}</td></tr>",
		"<tr><td>ホストアドレス</td><td>$host{$_}</td><td>ブラウザ</td><td>$useragent{$_}</td></tr>",
		"<tr><td rowspan=2>メールアドレス</td><td rowspan=2>$email{$_}</td><td>投稿内容</td><td> ";
	print <<EOM;
<form action="$script" method="$method">
<input type=hidden name=mode value="spammsg">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=msg value="$msg{$_}">
<input type=submit value="投稿内容を閲覧">
</form></td></tr>
<tr><td>再投稿(復活)</td><td>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin_repost_form">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=date  value="$date{$_}">
<input type=hidden name=name  value="$name{$_}">
<input type=hidden name=email value="$email{$_}">
<input type=hidden name=area value="$area{$_}">
<input type=hidden name=icon value="$icon{$_}">
<input type=hidden name=comment2 value="$comment2{$_}">
<input type=hidden name=sub   value="$sub{$_}">
<input type=hidden name=msg   value="$msg{$_}">
<input type=hidden name=url   value="$url{$_}">
<input type=hidden name=host  value="$host{$_}">
<input type=hidden name=pwd   value="$pwd{$_}">
<input type=hidden name=tim   value="$tim{$_}">
<input type=hidden name=reason value="$reason{$_}">
<input type=hidden name=$bbscheckmode value="$timecheck{$_}">
<input type=submit value="再投稿処理">
</form></td></tr></table>
EOM
	}

	print "</table><br>\n";
	$next = $page + $spamlog_page;
	$back = $page - $spamlog_page;

	print "<table><tr>\n";
	if ($back >= 0) {
		print "<td><form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=mode value=\"$in{'mode'}\">\n";
		print "<input type=hidden name=page value=\"$back\">\n";
		print "<input type=submit value=\"前画面\"></form></td>\n";
	}
	if ($next < $i) {
		print "<td><form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=mode value=\"$in{'mode'}\">\n";
		print "<input type=hidden name=page value=\"$next\">\n";
		print "<input type=submit value=\"次画面\"></form></td>\n";
	}
	print "</tr></table>\n";
	print <<EOM;
<form action="$script" method="$method">
<input type=hidden name=mode value="spamclear">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 投稿拒否ログを削除する ">
</form>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  投稿拒否ログ初期化
#-------------------------------------------------
sub spamclear {
	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	# 投稿拒否ログの削除
	unlink($spamlogfile);

	&header();
	print <<EOM;
<div align="center">
<h4>投稿拒否ログを削除しました</h4>
<table border=0>
<tr><td><form action="$script">
<input type=submit value="掲示板に戻る">
</form>
</td><td>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  投稿拒否コメント
#-------------------------------------------------
sub spammsg {
	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	$in{'msg'} =~ s/&lt;br&gt;/<br>/ig;

	&header();
	print <<EOM;
<div align="center">
<h4>コメント</h4>
<div align'left'>
<P><table border='1'>
<tr><td>$in{'msg'}</td></tr>
</table><BR>
<table border=0>
<tr><td><form action="$script" method="$method">
<input type=hidden name=mode value="spam">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 投稿拒否ログ閲覧に戻る ">
</form>
</td><td>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  NG URL(禁止フレーズ)編集
#-------------------------------------------------
sub spamdata {
	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	&header;
	print <<EOM;
<div align="left">
<table border=0>
<tr><td>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
<BR>
<li>NG URL(禁止フレーズ)を一括登録できます(半角のカンマで区切る)。<br>
たとえば <b>http://www.hogehoge.com/sample/inde.cgi?mode=test</b> を<br>
拒否したい場合は<b> www.hogehoge.com </b>を登録します。
<form action="$script" method="$method">
<input type=hidden name=mode value="editspam">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
EOM
	if (-e $spamdata) {
		open(IN,"$spamdata");
		$SPMLST = <IN>;
		close(IN);
	}

	print <<EOM;
<textarea name=SPMLST rows=30 cols=80 wrap=soft>$SPMLST</textarea><br>
<br>
<input type=submit value="更新する">
</form>
</ul>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  NG URL(禁止フレーズ)更新
#-------------------------------------------------
sub editspam {

	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	$SPMLST = $in{"SPMLST"};

	# 空データ・改行・空白を削除
	$SPMLST =~ s/，/\,/g;
	$SPMLST =~ s/<br>//ig;
	$SPMLST =~ s/\n//g;
	$SPMLST =~ s/\r//g;
	$SPMLST =~ s/　//g;
	$SPMLST =~ s/\,{2,}/\,/g;
	$SPMLST =~ s/^\,{1,}//;

	open(OUT,">$spamdata") || &error("Write Error");
	print OUT $SPMLST;
	close(OUT);

	&header;

	print <<EOM;
<div align="center">
<h4>NG URL(禁止フレーズ)を更新しました</h4>
<BR>
<table border=0>
<tr><td>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=hidden name=action value="$in{'action'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 管理画面に戻る ">
</form>
</td></tr>
</table></div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  管理者再投稿画面
#-------------------------------------------------
sub admin_repost_form {

	# POST限定
	if ($postonly && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'pass'} eq "") { &enter; }
	elsif ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	$in{'msg'} =~ s/<br>/\n/g;
	$in{'msg'} =~ s/&lt;br&gt;/\n/g;
	$in{"$bbscheckmode"} = &encode_bbsmode($in{"$bbscheckmode"});
	$f_c_d = int(rand(5E07)) + 11E08;

	local $iflag = 0;
	local $i = 0;
	foreach(split(/\s+/, $ico1)) {
		if ($in{'icon'} =~ /$_/) {
			$iflag = 1; $in{'icon'} = $i; last;
		}
		$i++;
	}
	if(!$iflag) { $in{'icon'} = 0; }

	local $aflag = 0;
	local $j = 0;
	foreach(@areas) {
		if ($in{'area'} =~ /$_/) {
			$aflag = 1; $in{'area'} = $j; last;
		}
		$j++;
	}
	if(!$aflag) { $in{'area'} = 0; }

	&header;
	print <<EOM;
<h3>スパム投稿として処理された下記の投稿を復活させます。</h3>
<hr>
<table border=0 cellspacing=1>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin_repost">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=date value="$in{'date'}">
<input type=hidden name=host value="$in{'host'}">
<input type=hidden name=area value="$in{'area'}">
<input type=hidden name=icon value="$in{'icon'}">
<input type=hidden name=comment2 value="$in{'comment2'}">
<input type=hidden name=pwd value="$in{'pwd'}">
<input type=hidden name=tim value="$in{'tim'}">
<input type=hidden name=$bbscheckmode value=$in{"$bbscheckmode"}>
<tr>
  <td><b>投稿拒否理由&nbsp;:&nbsp;$in{'reason'}</b><br><br></td>
</tr>
<tr>
  <td><b>お名前</b>&nbsp;:&nbsp;
    <input type=hidden name=name value="$in{'name'}" class=f>$in{'name'}</td>
</tr>
<tr>
  <td><b>Ｅメール</b>&nbsp;:&nbsp;
    <input type=text name=email size=28 value="$in{'email'}"></td>
</tr>
<tr>
  <td><b>タイトル</b>&nbsp;:&nbsp;
    <input type=hidden name=sub value="$in{'sub'}" class=f>$in{'sub'}
  </td>
</tr>
<tr>
  <td><input type=hidden name=$formcheck value="$f_c_d">
  </td>
</tr>
<tr>
  <td>
    <b>メッセージ</b><br>
    <textarea cols=56 rows=7 name=comment wrap="soft" class=f>$in{'msg'}</textarea>
  </td>
</tr>
<tr>
  <td><b>参照先</b>&nbsp;:&nbsp;
  <input type=text name=url size=50 value="$in{'url'}" class=f></td>
</tr>
</table>
<table><tr><td>
<input type=submit value="投稿復活処理する">
</form>
</td>
<td><form action="$script" method="$method">
<input type=hidden name=mode value="spam">
<input type=hidden name=pass value="$in{'pass'}">
<input type=submit value=" 投稿拒否ログ閲覧に戻る ">
</form>
</td></tr></table>
</body>
</html>
EOM
	exit;
}


1;


__END__

