#!/usr/local/bin/perl

## -------------------------------------------------------------------
## COM BOARD v4.0
## (c)1997-1999 KENT WEB (1999/10/31)
## E-MAIL    webmaster@kent-web.com
## HomePage  http://www.kent-web.com/

$ver = 'COMBBS v4.0'; # バージョン情報（修正不要）

## ---[注意事項ほか]--------------------------------------------------
## 1. このスクリプトはフリーソフトです。このスクリプトを使用したいか
##    なる損害に対して作者は一切の責任を負いません。
## 2. 設置に関する質問はサポート掲示板にお願いいたします。メールによる
##    質問にはお答えできません。
## -------------------------------------------------------------------

#============#
#  設定項目  #
#============#

# jcode.plが同一ディレクトリにある場合
require('jcode.pl');

# タイトル
$title   = "スキー部掲示板";

# タイトルの色
$t_color = "#008080";

# タイトルの大きさ（ポイント数：スタイルシート適用）
$t_point  = '18pt';

# タイトル文字のフォントタイプ
$t_face  = "ＭＳ Ｐゴシック";

# 背景色、文字色など
$backgif = "";		# 壁紙 (http://から記述)
$bgcolor = "#F5F5F5";	# 背景色
$text    = "#000000";	# 文字色を指定
$link    = "#0000FF";	# リンク色を指定（未訪問）
$vlink   = "#800080";	# リンク色を指定（既訪問）
$alink   = "#FF0000";	# リンク色を指定（訪問中）

# 戻り先のURL (index.htmlなど)
$homepage = 'http://www6.freeweb.ne.jp/sports/oumski/';

# 最大記事数
$max = 100;

# パスワード(英数字で指定)
$pass = '2tgp3yn';

# 横割フレーム (0=no 1=yes)
$yoko_frame = 0;

# 投稿項目に「題名」を使う (0=no 1=yes)
$sbjkey = 1;

# 投稿項目に「ＵＲＬ」を使う (0=no 1=yes)
$urlkey = 0;

# タグの許可 (0=no 1=yes)
$tagkey = 0;

# スクリプトファイル名
$script  = "combbs.cgi";

# ログファイル名（フルパスで記述する場合は / から始まるパス）
$logfile = "./combbs.log";

# 記事 [タイトル] の色
$sbj_color = "#006400";

# methodの形式 (POST/GET)
$method = 'POST';

# １ページ当たりの記事表示数
$pagelog = 10;

# ロック有無 (0=no 1=symlink 2=open)
$lockkey = 0;

# ロックファイル名
$lockfile = "./combbs.lock";

# URL自動リンク機能 (0=no 1=yes)
$autolink = 1;

# 投稿があるとメール通知する(0=no 1=yes) : sendmail必須
$mailing = 0;

# メール通知先 (メール通知する時)
$mailto = '';

# sendmailパス（メール通知する時）
$sendmail = '';

# タイトルに画像を使用する場合（画像ファイルをhttp://から記述）
$t_gif = "";
$t_g_w = 150;	# タイトル画像の横幅
$t_g_h = 50;	# 　　〃　　　　縦幅

#=============
#  設定完了
#=============

## bodyタグを定義
if ($backgif) {
	$body = "<body background=\"$backgif\" bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink>";
} else {
	$body = "<body bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink>";
}

## --- COM BOARDのメイン処理
&get_form;
if (!$buffer) {
	if ($yoko_frame) { &y_frame; }
	else { &t_frame; }
}
else {
	&decode;
	if ($mode eq "admin") { &admin1; }
	if ($mode eq "del") { &admin2; }
	if ($mode eq "form") { &form; }
	if ($mode eq "msg") { &regist; }
	if ($mode eq "howto") { &howto; }
	if ($mode eq "find") { &find; }
	if ($mode eq "enter") { &enter; }
	if ($mode eq "msg_del") { &msg_del; }
}
&html_log;

## --- HTMLのヘッダー
sub header {
	print "Content-type: text/html\n\n";
	print <<"EOM";
<html>
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<STYLE TYPE="text/css">
<!--
body, tr, td { font-size: 10pt }
a:hover      { font-size: 10pt; text-decoration: underline; color: $alink; }
span         { font-size: $t_point }
small        { font-size: 9pt }
-->
</STYLE>
<title>$title</title></head>
EOM
}

## --- 縦割フレーム出力
sub t_frame {
	&header;
	print <<"HTML";
<frameset cols="*,283">
<frame name="log" src="$script?mode=log">
<frame name="form" src="$script?mode=form">
<noframes>
$body
<h3>フレーム非対応のブラウザの方はご利用できません。</h3>
</body></noframes>
</frameset>
</html>
HTML
	exit;
}

## --- 横割フレーム出力
sub y_frame {
	&header;
	print <<"HTML";
<frameset rows="*,200">
<frame name="log" src="$script?mode=log">
<frame name="form" src="$script?mode=form">
<noframes>
$body
<h3>フレーム非対応のブラウザの方はご利用できません。</h3>
</body></noframes>
</frameset>
</html>
HTML
	exit;
}

## --- 投稿フォーム
sub form {
	# クッキーを取得
	&get_cookie;

	$nam_wid = 16;
	$com_wid = 33;
	$url_wid = 27;

	# ブラウザ情報を取得
	$agent = $ENV{'HTTP_USER_AGENT'};

	# MSIE3 の場合フォーム長を調整
	if ($agent =~ /MSIE 3/i) {
		$nam_wid = 25;
		$com_wid = 50;
		$url_wid = 48;

	# MSIE4 の場合フォーム長を調整
	} elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) {
		$nam_wid = 25;
		$com_wid = 34;
		$url_wid = 48;
	}

	# HTMLを出力
	print "Content-type: text/html\n\n";
	print <<"HTML";
<html>
<head><title>$title</title>
<SCRIPT LANGUAGE="JavaScript">
<!--
function autoclear() {
  if (self.document.send) {
   if (self.document.cmode && self.document.cmode.autoclear) {
    if (self.document.cmode.autoclear.checked) {
     if (self.document.send.subj) {
      self.document.send.subj.value = "";
      self.document.send.subj.focus();
     }
    if (self.document.send.comment) {
      self.document.send.comment.value = "";
      self.document.send.comment.focus();
    }
    if (self.document.send.url) {
      self.document.send.url.value = "http://$c_url";
      self.document.send.url.focus();
    }
   }
  }
 }
}
// -->
</SCRIPT></head>
$body
<form name="send" method="$method" action="$script" target="log" ONSUBMIT="setTimeout(&quot;autoclear()&quot;,10)">
<input type=hidden name=mode value="msg">
HTML

	# よこフレーム
	if ($yoko_frame) {
		print "<center><table><tr><td><font face=\"ＭＳ ゴシック\">\n";
		print "<b>おなまえ</b> \n";
		print "<input type=text name=name size=\"$nam_wid\" value=\"$c_name\"><br>\n";
		print "<b>Ｅメール</b> \n";
		print "<input type=text name=email size=\"$nam_wid\" value=\"$c_email\"><br>\n";
		$sub_wid = $nam_wid + 5;
		print "<b>題　　名</b> <input type=text name=subj size=\"$sub_wid\">\n";

		print "<input type=submit value=\"投稿する\">";
		print "<input type=reset value=\"リセット\">\n";
		print "削除キー<input type=password name=dkey size=8 value=\"$c_dkey\"><br>\n";

		$com_wid = $com_wid + 20;
		$url_wid = $url_wid + 25;

		print "<b>コメント</b><br>";
		print "<textarea cols=\"$com_wid\" rows=6 name=comment></textarea><br>\n";

		if ($urlkey) { 
			print "<B>ＵＲＬ</B><br>\n";
			print "<input type=text name=url size=\"$url_wid\" value=\"http://$c_url\">\n";
		}

		print "</font></form>\n";
		print "<form name=\"cmode\"><input type=checkbox name=\"autoclear\" checked>\n";
		print "<small>発言自動消去</small></form>\n";
		print "</td></tr></table></center>\n";

	# たてフレーム
	} else {
		print "<b>お名前</b><br>";
		print "<input type=text name=name size=\"$nam_wid\" value=\"$c_name\"><br>\n";
		print "<b>Ｅメール</b><br>";
		print "<input type=text name=email size=\"$nam_wid\" value=\"$c_email\"><br>\n";

		# 題名を使用する場合
		if ($sbjkey) {
			print "<b>題　名</b><br>\n";
			print "<input type=text name=subj size=\"$nam_wid\"><br>\n";
		}

		print "<br><b>コメント</b></font><br>";
		print "<textarea cols=\"$com_wid\" rows=8 name=comment></textarea><br>\n";
		print "<input type=submit value=\"投稿する\">";
		print "<input type=reset value=\"リセット\">\n";
		print "削除キー<input type=password name=dkey size=8 value=\"$c_dkey\"><br>\n";

		if ($urlkey) {
			print "<P><B>ＵＲＬ</B><br>\n";
			print "<input type=text name=url size=\"$url_wid\" value=\"http://$c_url\">\n";
		}
		print "</form>\n";
		print "<form name=\"cmode\"><input type=checkbox name=\"autoclear\" checked>\n";
		print "<small>発言自動消去</small></form>\n";
	}

	print "</body></html>\n";
	exit;
}

## --- 記事表示部
sub html_log {
	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	&header;
	print "$body\n<center>\n";

	# タイトル部
	if ($t_gif) {
		print "<img src=\"$t_gif\" width=\"$t_g_w\" height=\"$t_g_h\">\n";
	}
	else {
		print "<font color=\"$t_color\" size=5 face=\"$t_face\">";
		print "<b><span>$title</span></b></font>\n";
	}

	print "<hr>[<a href=\"$homepage\" target='_top'>もどる</a>]\n";
	print "[<a href=\"$script?mode=howto\">掲示板の使い方</a>]\n";
	print "[<a href=\"$script?mode=find\">ワード検索</a>]\n";
	print "[<a href=\"$script?mode=enter\">管理用</a>]\n";
	print "<hr></center>\n";

	if ($FORM{'page'} eq '') { $page = 0; }
	else { $page = $FORM{'page'}; }

	# 記事数を取得
	$end_data = @lines - 1;
	$page_end = $page + ($pagelog - 1);
	if ($page_end >= $end_data) { $page_end = $end_data; }

	foreach ($page .. $page_end) {
		local($num,$date,$name,$email,$sub,
			$com,$url,$host) = split(/<>/, $lines[$_]);

		if ($email) { $name="<a href=\"mailto\:$email\">$name</a>"; }

	 	# 題名を使用する場合
		if ($sbjkey) {
		  if (!$sub) { $sub = "無題"; }
		  print "[$num] <font color=\"$sbj_color\"><b>$sub</b></font>\n";
		  print "投稿者：<font color=\"$link\"><b>$name</b></font>\n";
		  print "<small>投稿日：$date</small>\n";

		# 題名を使用しない場合
		} else {
		  print "[$num] <font color=$link><b>$name</b></font>\n";
		  print " - <small>($date)</small>\n";
		}

		# 自動リンク
		if ($autolink) { &auto_link($com); }

		if ($url) {
			$url = "<a href=http://$url target='_top'>http://$url</a>";
			print "<P><blockquote>$com<P>$url</blockquote><hr>\n";
		} else {
			print "<P><blockquote>$com</blockquote><hr>\n";
		}
	}

	print "<table width=100\%><tr>\n";

	# 改頁処理
	$next_line = $page_end + 1;
	if ($page_end ne $end_data) {
		print "<td align=left><form method=$method action=\"$script\" target=_self>\n";
		print "<input type=hidden name=page value=\"$next_line\">\n";
		print "<input type=submit value=\"次の$pagelog件\"></form></td>\n";
	}
	print "<td align=right><form method=\"$method\" action=\"$script\" target=_self>\n";
	print "<input type=hidden name=mode value=\"msg_del\">\n";
	print "記事No<input type=text name=no size=4>\n";
	print "削除キー<input type=password size=4 name=delkey>";
	print "<input type=submit value=\"削除\"></form></td></tr></table>\n";

	# 著作権を表示（削除禁止）
	print "<center><small><!-- $ver -->\n";
	print "- <a href=\"http://www.kent-web.com/\" target='_top'>Com Board</a> -\n";
	print "</small></center>\n";
	print "</body></html>\n";
	exit;
}

## --- ログ書き込み処理
sub regist {
	# 名前とコメントは必須
	if ($name eq "") { &error("名前が入力されていません。"); }
	if ($com eq "") { &error("コメントが入力されていません。"); }

	# クッキーを発行
	&set_cookie;

	# ホスト名を取得
	&get_host;

	# 時間を取得
	&get_time;

	# ファイルロック
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	# ログを開く
	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	# 二重投稿の禁止
	($knum,$kdate,$kname,$kemail,$ksubj,$kcom) = split(/<>/, $lines[0]);
	if ($name eq "$kname" && $com eq "$kcom") { &error("二重投稿は禁止です"); }

	# 記事Noカウント処理
	$number = $knum + 1;

	# 最大記事数を超える記事を切り捨て
	@new = ();
	for($i=0;$i<$max-1;$i++) { push(@new,$lines[$i]); }

	# 削除キーを暗号化
	$ango = &pwd_encode($dkey);

	# ログをフォーマット
	unshift (@new,"$number<>$date<>$name<>$email<>$subj<>$com<>$url<>$host<>$ango<>\n");

	# ログを更新
	open(OUT,">$logfile") || &error("Can't write $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if (-e $lockfile) { unlink($lockfile); }

	# メール処理
	if ($mailing && $email ne "$mailto") { &mail_to; }
}

## --- フォームからのデータ処理
sub get_form {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます。"); }
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else { $buffer = $ENV{'QUERY_STRING'}; }
}

## --- 管理モード入室画面
sub enter {
	&header;
	print <<"EOM";
$body
<center>
<h4>管理用パスワードを入力して下さい。</h4>
<form action="$script" method="$method">
<input type=hidden name=mode value="admin">
<input type=password name=pass size=10><input type=submit value=" 認証 ">
</form>
</center>
</body></html>
EOM
	exit;
}

## --- 自分の記事削除
sub msg_del {
	# ロック開始
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	$dflag=0;
	@new=();
	foreach $line (@lines) {
		($num,$date,$name,$email,$sub,$com,$url,$host,$pw)
						 = split(/<>/, $line);

		if ($FORM{'no'} eq "$num") {
			if ($pw) { $ango = $pw; $dflag = 1; }
			else { $dflag = 2; }
			next;
		}
		else { push(@new,$line); }
	}

	if ($dflag == 0) { &error("記事Noが不正です。"); }
	elsif ($dflag == 2) { &error("削除キーが設定されていません。"); }

	# パスワードを照合
	&pwd_decode($FORM{'delkey'});
	if ($check eq "no") { &error("削除キーが違います。$ango"); }

	# ログを更新
	open(OUT,">$logfile") || &error("Can't write $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if (-e $lockfile) { unlink($lockfile); }

	# 記事表示画面に戻る
	&html_log;
}

## --- フォームからのデータ処理
sub decode {
	@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;

		# 文字コード変換
		&jcode'convert(*value,'sjis');

		# タグ処理
		if ($tagkey) {
			$value =~ s/<!--(.|\n)*-->//g;
			$value =~ s/<>/&lt;&gt;/g;
		} else {
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
		}

		$FORM{$name} = $value;
	}
	$name  = $FORM{'name'};
	$email = $FORM{'email'};
	$com   = $FORM{'comment'};
	$com   =~ s/\r\n/<br>/g;
	$com   =~ s/\r/<br>/g;
	$com   =~ s/\n/<br>/g;
	$url   = $FORM{'url'};
	$url   =~ s/^http\:\/\///;
	$mode  = $FORM{'mode'};
	$subj  = $FORM{'subj'};
	$dkey  = $FORM{'dkey'};
}

## --- 管理モード：削除記事表示
sub admin1 {
	# パスワードチェック
	if ($FORM{'pass'} ne "$pass") { &error("パスワードが違います。"); }

	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	&header;
	print "$body\n";
	print "[<a href=\"$script?mode=log\">管理モード解除</a>]\n";
	print "<form action=\"$script\" method=$method>\n";
	print "<input type=hidden name=mode value=\"del\">\n";
	print "<input type=hidden name=pass value=\"$FORM{'pass'}\">\n";
	print "<CENTER><FONT COLOR=$t_color><H3>管理者削除モード</H3>\n";
	print "記事No：</FONT><input type=text size=10 name=delmode>\n";
	print "<input type=submit value=\"削除する\"><br></form></CENTER><hr>\n";

	foreach $line (@lines) {
		($number,$date,$name,$email,$subj,$comment,$url,$host) = split(/<>/,$line);

		# 削除用記事の表示
		if ($sbjkey) {
			if ($subj eq "") { $subj = "no title"; }
			if ($url) { $url = "<a href=\"http://$url\" target='_top'>http://$url</a>"; }

			print "[$number] <b>$subj</b> - <b>$name</b> ($date)";
		}
		else { print "[$number] <b>$name</b> - ($date)"; }

		print "<P><BLOCKQUOTE>$comment<P>$url\n";
		print "<P><FONT COLOR=$t_color>HOST - $host</FONT></BLOCKQUOTE><hr>\n";
	}

	print "</BODY></HTML>\n";
	exit;
}

## --- 管理モード：削除記事実行
sub admin2 {
	# パスワードチェック
	if ($FORM{'pass'} ne "$pass") { &error("パスワードが違います。"); }

	@CODE = split(/ /,$FORM{'delmode'});
	$keycount = @CODE;
	if ($keycount == 0) { &error("削除情報がありません。"); }

	# ファイルロック
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	@new = ();
	foreach $line (@lines) {
		($number,$date,$name,$email,$subj,$com,$url,$host) = split(/<>/,$line);
		$flag = 0;
		foreach $delmode (@CODE) {
			if ($number eq $delmode) { $flag = 1; }
		}
		if ($flag == 0) { push(@new,$line); }
	}

	open(OUT,">$logfile") || &error("Can't write $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if (-e $lockfile) { unlink($lockfile); }

	# 管理画面に戻る
	&admin1;
}

## --- ロックファイル（symlink関数）
sub lock1 {
	local($retry) = 5;
	while (!symlink(".", $lockfile)) {
		if (--$retry <= 0) { &error("LOCK is BUSY"); }
		sleep(1);
	}
}

## --- ロックファイル（open関数）
sub lock2 {
	local($flag) = 0;
	foreach (1 .. 5) {
		unless (-e $lockfile) {
			open(LOCK,">$lockfile");
			close(LOCK);
			$flag = 1;
			last;
		} else {
			sleep(1);
		}
	}
	if ($flag == 0) { &error("LOCK is BUSY"); }
}

## --- メール送信
sub mail_to {
	$mail_subj = "$title に投稿がありました。";

    	&jcode'convert(*mail_subj,'jis');
    	&jcode'convert(*name,'jis');
    	&jcode'convert(*subj,'jis');
    	&jcode'convert(*com,'jis');

	$com =~ s/<br>/\n/g;
	$com =~ s/&lt;/</g;
	$com =~ s/&gt;/>/g;

	open(MAIL,"| $sendmail $mailto") || &error("Can't open sendmail");
	print MAIL "X-Mailer: COMBBS MAILER\n";
	print MAIL "To: $mailto\n";

	# メールアドレスがない場合はダミーメールに置き換え
	if ($email eq "") { $email = "nomail\@xxx.xxx"; }

	print MAIL "From: $email\n";
	print MAIL "Subject: $mail_subj\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "Content-type: text/plain\n\n";
	print MAIL "$mail_subj\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "TIME : $date\n";
	print MAIL "HOST : $host\n";
	print MAIL "NAME : $name\n";
	print MAIL "EMAIL: $email\n";

	# 記事タイトル
	if ($subj) { print MAIL "TITLE: $subj\n"; }

	print MAIL "$com\n";
	print MAIL "--------------------------------------------------------\n";
	close(MAIL);
}

## --- クッキーの発行
sub set_cookie {
	($secg,$ming,$hourg,$mdayg,$mong,$yearg,
		$wdayg,$ydayg,$isdstg) = gmtime(time + 60*24*60*60);

	$yearg += 1900;
	if ($secg  < 10) { $secg  = "0$secg";  }
	if ($ming  < 10) { $ming  = "0$ming";  }
	if ($hourg < 10) { $hourg = "0$hourg"; }
	if ($mdayg < 10) { $mdayg = "0$mdayg"; }

	$month = ('Jan','Feb','Mar','Apr','May',
		'Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$mong];
	$youbi = ('Sunday','Monday','Tuesday',
		'Wednesday','Thursday','Friday','Saturday') [$wdayg];

	$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
	$cook="name\:$name\,email\:$email\,url\:$url\,dkey\:$dkey";
	print "Set-Cookie: COM_BBS=$cook; expires=$date_gmt\n";
}

## --- クッキーを取得
sub get_cookie {
	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});
	foreach $pair (@pairs) {
		local($name, $value) = split(/=/, $pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/,/, $DUMMY{'COM_BBS'});
	foreach $pair (@pairs) {
		local($name, $value) = split(/:/, $pair);
		$COOKIE{$name} = $value;
	}
	$c_name  = $COOKIE{'name'};
	$c_email = $COOKIE{'email'};
	$c_url   = $COOKIE{'url'};
	$c_dkey  = $COOKIE{'dkey'};

	if ($name) { $c_name = $name; }
	if ($email) { $c_email = $email; }
	if ($url) { $c_url = $url; }
	if ($dkey) { $c_dkey = $dkey; }
}

## --- エラー表示処理
sub error {
	if (-e $lockfile) { unlink($lockfile); }

	&header;
	print "$body\n";
	print "<center><hr width='75%'><P><h3>ERROR !</h3>\n";
	print "<P><font color=$t_color><B>$_[0]</B></font>\n";
	print "<P><hr width='75%'></center>\n";
	print "</body></html>\n";
	exit;
}

## --- 掲示板の使い方メッセージ
sub howto {
	if ($tagkey == 0) { $tag_msg = "投稿内容には、<b>タグは一切使用できません。</b>\n"; }
	else { $tag_msg = "コメント欄には、<b>タグを使用をすることができます。</b>\n"; }

	&header;
	print <<"HTML";
$body
[<a href="$script?mode=log">掲示板にもどる</a>]
<center><font color="$t_color"><h3>掲示板の利用上の注意</h3></font>
<P>
<table width=95% border=1 cellpadding=10>
<tr><td bgcolor=#FFFFFF>
  <OL>
  <LI>この掲示板は<b>クッキー対応</b>です。１度記事を投稿いただくと、
      おなまえ、Ｅメール、ＵＲＬの情報は２回目以降は自動入力されます。
     （ただし利用者のブラウザがクッキー対応の場合）<P>
  <LI>$tag_msg<P>
  <LI>記事を投稿する上での必須入力項目は<b>「おなまえ」</b>と<b>「メッセージ」</b>です。<P>
  <LI>記事には、<b>半角カナは一切使用しないで下さい。</b>文字化けの原因となります。<P>
  <LI>記事の保持件数は<b>最大 $max件</b>です。それを超えると古い順に自動削除されます。<P>
  <LI>過去の投稿記事から<b>「キーワード」によって簡易検索ができます。
     </b>トップメニューの<a href="$script?mode=find">「ワード検索」</a>
      のリンクをクリックすると検索モードとなります。<P>
  <LI>管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告\なく削除することがあります。
  </OL>
</td></tr></table>
</center>
</body></html>
HTML
	exit;
}

### --- ワード検索
sub find {
	&header;
	print <<"HTML";
$body
[<a href="$script?mode=log">掲示板へもどる</a>]
<center><hr width="90%">
<font color="$t_color" size=4><b>ワード検索</b></font>
<hr width="90%">
<P>
<table>
<tr>
  <td nowrap>
  <small>
  <UL>
  <LI>検索したい<b>キーワード</b>を入力し、検索領域を選択して「検索ボタン」
      を押してください。
  <LI>キーワードは「半角スペース」で区切って複数指定することができます。
  </UL>
  </small>
  </td>
</tr>
</table>
<form action="$script" method="$method">
<input type=hidden name=mode value="find">
<table border=3>
<tr><th colspan=2>キーワード <input type=text name=word size=30></th></tr>
<tr><td>検索条件</td>
<td><input type=radio name=cond value="and" checked>AND
<input type=radio name=cond value="or">OR</td></tr>
<tr><th colspan=2><input type=submit value="検索する"><input type=reset value="リセット"></th></tr>
</table>
</form></center>
HTML
	# ワード検索の実行と結果表示
	if ($FORM{'word'} ne "") {

		# 入力内容を整理
		$cond = $FORM{'cond'};
		$word = $FORM{'word'};
		$word =~ s/　/ /g;
		$word =~ s/\t/ /g;
		@pairs = split(/ /,$word);

		# ファイルを読み込み
		open(DB,"$logfile") || &error("Can't open $logfile");
		@lines = <DB>;
		close(DB);

		# 検索処理
		foreach $line (@lines) {
			$flag = 0;
			foreach $pair (@pairs) {
				if (index($line,$pair) >= 0) {
					$flag = 1;
					if ($cond eq 'or') { last; }
				} else {
					if ($cond eq 'and'){ $flag = 0; last; }
				}
			}
			if ($flag == 1) { push(@new,$line); }
		}

		## 結果を表示
		$count = @new;
		print "<hr><b><font color=$t_color>検索結果：$count件</font></b><P>\n";
		print "<OL>\n";

		foreach $line (@new) {
			($num,$date,$name,$email,$subj,$com,$url,$host) = split(/<>/,$line);

			if ($subj eq "") { $subj = "no title"; }
			if ($email) { $name = "<a href=mailto\:$email>$name</a>"; }

			# 結果を表示
			print "<LI>[$num] \n";
			if ($sbjkey) { print "<font color=$sbj_color><b>$subj</b></font> \n"; }
			print "投稿者：<font color=\"$link\"><b>$name</b></font>\n";
			print "<small>投稿日：$date</small>\n";
			print "<P><blockquote>$com</blockquote><hr>\n";
		}

		print "</OL>\n";

	}
	print "</body></html>\n";
	exit;
}

## --- 自動リンク
sub auto_link {
	$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<a href=\"$2\" target=\"_top\">$2<\/a>/g;
}

## --- ホスト名を取得
sub get_host {
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};
	if ($host eq "" || $host eq "$addr") {
		($p1,$p2,$p3,$p4) = split(/\./,$addr);
		$temp = pack("C4",$p1,$p2,$p3,$p4);
		$host = gethostbyaddr("$temp", 2);
	}
	if ($host eq "") { $host = $addr; }
}

## --- 時間の取得
sub get_time {
	$ENV{'TZ'} = "JST-9";

	($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
	$year += 1900;
	$mon++;
	if ($mon  < 10) { $mon  = "0$mon";  }
	if ($mday < 10) { $mday = "0$mday"; }
	if ($hour < 10) { $hour = "0$hour"; }
	if ($min  < 10) { $min  = "0$min";  }
	$week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];

	# 日時のフォーマット
	$date = "$year\/$mon\/$mday($week) $hour\:$min";
}

## --- パスワード暗号処理
sub pwd_encode {
	$times = time;
	$salt = substr($times,-2,2);
	return crypt($_[0],$salt);
}

## --- パスワード照合処理
sub pwd_decode {
	if ($ango =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応
	else { $crptkey = 0; }

	$check = "no";
	if (crypt($_[0], substr($ango,$crptkey,2)) eq "$ango") {
		$check = "yes";
	}
}
