#!/usr/local/bin/perl

#┌─────────────────────────────────
#│ SUN BOARD : admin.cgi - 2011/07/10
#│ Copyright (c) KentWeb
#│ http://www.kent-web.com/
#└─────────────────────────────────

# モジュール宣言
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use lib "./lib";
use Jcode;

# 設定ファイル認識
require "./init.cgi";
my %cf = &init;

# データ受理
$CGI::POST_MAX = $cf{maxdata};
my $cgi = CGI->new;
&error($cgi->cgi_error) if ($cgi->cgi_error);
my %in = &parse_form($cgi);

# 認証
&check_passwd;

# 管理モード
&admin_mode;

#-----------------------------------------------------------
#  管理モード
#-----------------------------------------------------------
sub admin_mode {
	# 削除処理
	if ($in{job} eq "dele" && $cgi->param('no')) {

		# 削除情報
		my %del;
		foreach ( $cgi->param('no') ) {
			$del{$_}++;
		}

		# 削除情報をマッチング
		my @data;
		open(DAT,"+< $cf{logfile}") || &err("open err: $cf{logfile}");
		eval "flock(DAT, 2);";
		while (<DAT>) {
			my ($no,$dat,$nam,$eml,$sub,$com,$url) = split(/<>/);

			if (!defined($del{$no})) {
				push(@data,$_);
			}
		}

		# 更新
		seek(DAT, 0, 0);
		print DAT @data;
		truncate(DAT, tell(DAT));
		close(DAT);

		# HTMLファイル更新
		&make_html(@data);

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

		my @data;
		open(IN,"$cf{logfile}") || &err("open err: $cf{logfile}");
		while (<IN>) {
			my ($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pwd,$tim) = split(/<>/);

			if ($in{no} == $no) {
				@data = ($no,$dat,$nam,$eml,$sub,$com,$url);
				last;
			}
		}
		close(IN);

		# 修正フォームへ
		&edit_form(@data);

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

		# 未入力の場合
		if ($in{url} eq "http://") { $in{url} = ""; }
		$in{sub} ||= "無題";

		# コード変換
		Jcode::convert(\$in{name}, 'sjis');
		Jcode::convert(\$in{sub}, 'sjis');
		Jcode::convert(\$in{comment}, 'sjis');

		# 読み出し
		my @data;
		open(DAT,"+< $cf{logfile}") || &err("open err: $cf{logfile}");
		eval "flock(DAT, 2);";
		while (<DAT>) {
			my ($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pwd,$tim) = split(/<>/);

			if ($in{no} == $no) {
				$_ = "$no<>$dat<>$in{name}<>$in{email}<>$in{sub}<>$in{comment}<>$in{url}<>$hos<>$pwd<>$tim<>\n";
			}
			push(@data,$_);
		}

		# 更新
		seek(DAT, 0, 0);
		print DAT @data;
		truncate(DAT, tell(DAT));
		close(DAT);

		# HTMLファイル更新
		&make_html(@data);

		# 完了メッセージ
		&message("記事を修正しました");
	}

	# 削除画面を表示
	&header("管理モード");
	print <<EOM;
<form>
<input type="button" value="&lt; 掲示板" onclick="javascript:window.location='$cf{html_url}/index.html'">
</form>
<ul>

<li>処理を選択して送信ボタンを押してください。
</ul>
<form action="$cf{admin_cgi}" method="post">
<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="送信する">
<br><br><a href="http://www.naja.jp/bbs/sunbbs.cgi?mode=form">記事を投稿する</a>
<dl>
EOM

	# 記事を展開
	open(IN,"$cf{logfile}") || &err("open err: $cf{logfile}");
	while (<IN>) {
		my ($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pwd,$tim) = split(/<>/);
		$nam = qq|<a href="mailto:$eml">$nam</a>| if ($eml);
		$com =~ s/<[^>]*(>|$)//g;
		if (length($com) > 60) {
			$com = substr($com,0,60) . '...';
		}

		print qq|<dt><hr><input type="checkbox" name="no" value="$no">\n|;
		print qq|[$no] <b>$sub</b> $nam - $dat [ $hos ]\n|;
		print qq|<dd>$com\n|;
	}
	close(IN);

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

#-----------------------------------------------------------
#  修正フォーム
#-----------------------------------------------------------
sub edit_form {
	my ($no,$dat,$nam,$eml,$sub,$com,$url) = @_;

	$com =~ s/<br>/\n/g;
	$url ||= "http://";

	&header("管理モード ＞ 修正フォーム");
	print <<EOM;
<form action="$cf{admin_cgi}" method="post">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="pass" value="$in{pass}">
<input type="submit" value="&lt; 前画面へ">
</form>
<ul>
<li>変更する部分のみ修正して送信ボタンを押してください。
</ul>
<form action="$cf{admin_cgi}" method="post">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="job" value="edit2">
<input type="hidden" name="no" value="$no">
<input type="hidden" name="pass" value="$in{pass}">
<table cellpadding="1" cellspacing="1">
<tr>
  <td><b>おなまえ</b></td>
  <td><input type="text" name="name" size="28" value="$nam"></td>
</tr><tr>
  <td><b>Ｅメール</b></td>
  <td><input type="text" name="email" size="28" value="$eml"></td>
</tr><tr>
  <td><b>タイトル</b></td>
  <td><input type="text" name="sub" size="36" value="$sub"></td>
</tr><tr>
  <td><b>参照先</b></td>
  <td><input type="text" name="url" size="50" value="$url"></td>
</tr><tr>
  <td colspan="2">
    <b>メッセージ</b><br>
    <textarea name="comment" cols="56" rows="7">$com</textarea><br>
	<input type="submit" value="送信する"><input type="reset" value="リセット">
  </td>
</tr>
</table>
</form>
</body>
</html>
EOM
	exit;
}

#-----------------------------------------------------------
#  HTMLヘッダー
#-----------------------------------------------------------
sub header {
	my $ttl = shift;

	print $cgi->header(-charset => 'shift_jis');
	print <<EOM;
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="content-style-type" content="text/css">
<style type="text/css">
<!--
body,td,th { font-size:80%; background:#f0f0f0; }
.ttl { color:#004040; }
p.err { color:#dd0000; }
p.msg { color:#006400; }
-->
</style>
<title>$ttl</title>
</head>
<body>
EOM
}

#-----------------------------------------------------------
#  パスワード認証
#-----------------------------------------------------------
sub check_passwd {
	# パスワードが未入力の場合は入力フォーム画面
	if ($in{pass} eq "") {
		&enter_form;

	# パスワード認証
	} elsif ($in{pass} ne $cf{password}) {
		&err("認証できません");
	}
}

#-----------------------------------------------------------
#  入室画面
#-----------------------------------------------------------
sub enter_form {
	&header("入室画面");
	print <<EOM;
<div align="center">
<form action="$cf{admin_cgi}" method="post">
<table width="380" style="margin-top:50px">
<tr>
	<td height="40" align="center">
		<fieldset><legend>管理パスワード入力</legend><br>
		<input type="password" name="pass" value="" size="20">
		<input type="submit" value=" 認証 "><br><br>
		</fieldset>
	</td>
</tr>
</table>
</form>
<script language="javascript">
<!--
self.document.forms[0].pass.focus();
//-->
</script>
</div>
EOM
	print $cgi->end_html;
	exit;
}

#-----------------------------------------------------------
#  エラー
#-----------------------------------------------------------
sub err {
	my $err = shift;

	&header("ERROR!");
	print <<EOM;
<div align="center">
<hr width="350">
<h3>ERROR!</h3>
<p class="err">$err</p>
<hr width="350">
<form>
<input type="button" value="前画面に戻る" onclick="history.back()">
</form>
</div>
EOM
	print $cgi->end_html;
	exit;
}

#-----------------------------------------------------------
#  完了メッセージ
#-----------------------------------------------------------
sub message {
	my $msg = shift;

	&header("完了");
	print <<EOM;
<div align="center" style="margin-top:3em;">
<hr width="350">
<p class="msg">$msg</p>
<hr width="350">
<form action="$cf{admin_cgi}" method="post">
<input type="hidden" name="pass" value="$in{pass}">
<input type="submit" value="管理画面に戻る">
</form>
</div>
EOM
	print $cgi->end_html;
	exit;
}

