#!/usr/bin/perl

## -----------------------------------------------------------------------------+
## LIGHT BOARD v5.52
## (c)1997-1999 KENT WEB (1999/11/25) 
## E-MAIL: webmaster@kent-web.com
## WWW: http://www.kent-web.com/

$ver = 'LIGHT v5.52'; # バージョン情報（修正不要）

## -----------------------------------------------------------------------------+
## [注意事項・合意事項]
## 1.このスクリプトはフリーソフトです。このスクリプトを使用したいかなる損害に
##   対して作者はその責任を一切負いません。
## 2.設置に関する質問はサポート掲示板にお願いいたします。メールによる質問には
##   お答えできません。
## -----------------------------------------------------------------------------+
## [設置例] かっこ内はパーミッション
##    public_html / index.html (ホームページ)
##       |
##       +-- light [777] / light.cgi  [755]
##                         light.log  [666]
##                         jcode.pl   [644]
##                         light2.cgi [755] .. 補助プログラム(過去ログ/ログ編集)
##                         pastno.dat [666] .. 過去ログ用カウントファイル
##
## -----------------------------------------------------------------------------+

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

# 文字コード変換ライブラリ
require './jcode.pl';

# 管理者用マスタパスワード(半角英数字)
$pass = 'cai0803';

# 過去ログ機能 (0=no 1=yes) : light2.cgi必須
$pastkey = 0;

# 過去ログのあるディレクトリ
$past_dir  = "./";

# 過去ログカウントファイル
$nofile = './pastno.dat';

# 過去ログ１ファイル当りの行数の限度
$log_line  = '50';

# 補助プログラムのファイル名
$light2 = './light2.cgi';

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

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

# 日付のタイプ (0=洋式 1=和式)
$date_type = 0;

# スクリプト名
$script  = './light.cgi';

# ログファイル名
$logfile = './light.log';

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

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

# ファイルロック形式 (0=no 1=symlink 2=open)
$lockkey = 0;

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

# コメント欄改行形式 (soft=手動 hard=強制)
$wrap = 'soft';

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

# 自分の記事をメール送信する (0=no 1=yes)
$mail_me = 0;

# 他サイトから投稿排除する時 (http://からURLを記述)
$base_url = ".";

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

## LIGHT BOARDのメイン処理
&decode;
if ($mode eq "howto") { &howto; }
elsif ($mode eq "find") { &find; }
elsif ($mode eq "usr_del") { &usr_del; }
elsif ($mode eq "msg") { &regist; }
&html_log;

## --- HTMLのヘッダー
sub header { 
	print "Content-type: text/html\n\n";
	print "<html>\n<head>\n";
	print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
	print "<title>$title</title></head>\n";

	if ($bgr) {
	  print "<body background=\"$bgr\" bgcolor=$bgc text=$text link=$link vlink=$vlink alink=$alink>\n";
	} else {
	  print "<body bgcolor=$bgc text=$text link=$link vlink=$vlink alink=$alink>\n";
	}
}

## --- HTMLのフッター
sub footer {
	## 著作権表示（削除不可）
	print "<P><center><small><!-- $ver -->\n";
	print "- <a href=\"http://www.kent-web.com/\" target='_top'>Light Board</a> -\n";
	print "</small></center>\n";
	print "</body></html>\n";
}

## --- 記事表示部
sub html_log {
	# ブラウザを判断
	&get_agent;

	# ログを読み込み
	open(LOG,"$logfile") || &error("Can't open $logfile");
	@lines = <LOG>;
	close(LOG);

	# 環境設定部を認識
	$init = $lines[0];
	($head,$title,$t_color,$t_size,$t_face,$bgr,$bgc,$text,$link,
		$vlink,$alink,$home,$max,$subj_color,$name_color,$mail1,$mail2)
								 = split(/<>/,$init);

	# ログチェック
	unless ($init =~ /^LIGHT/) { &error("ログが正しくありません。"); }

	shift(@lines);

	# クッキーを取得
	&get_cookie;

	# 表示開始
	&header;
	print "<center><font color=\"$t_color\" size=\"$t_size\" face=\"$t_face\">\n";
	print "<b>$title</b></font><hr width='90%' size=2>\n";
	print "[<a href=\"$home\" target=\"_top\">トップにもどる</a>]\n";
	print "[<a href=\"$script?mode=howto\">掲示板の使い方</a>]\n";
	print "[<a href=\"$script?mode=find\">ワード検索</a>]\n";

	# 過去ログのリンク
	if ($pastkey) { print "[<a href=\"$light2\">過去ログ</a>]\n"; }

	# ログ編集機能のリンク
	print "[<a href=\"$light2\?mode=edit_in\">管理用</a>]\n";

	# 返信モードの場合
	if ($mode eq "res") {
		foreach $line (@lines) {
			($number,$date,$name,$email,$subj,$comment) = split(/<>/,$line);
			if ($number eq "$FORM{'resmode'}") { last; }
		}
		$res_comment = "\&gt\; $comment";
		$res_comment =~ s/<br>/\r\&gt\; /g;

		# 返信用項目を作成
		if ($subj =~ /^Re/) {
			$subj =~ s/Re//;
			$res_sub = "Re\[$number\]" . "$subj";

		} else {
			$res_sub = "Re\[$number\]\: $subj";
		}

		$com_wid = $com_wid + 2;

	} else {
		$res_subj = "";
		$res_comment = "";
	}

	print <<"EOM";
<hr width=90% size=2></center>
<form method="$method" action="$script">
<input type=hidden name=mode value="msg">
<blockquote><table border=0>
<tr><td nowrap><b>おなまえ</b></td>
<td><input type=text name=name size="$nam_wid" value="$c_name"></td></tr>
<tr><td nowrap><b>Ｅメール</b></td>
<td><input type=text name=email size="$nam_wid" value="$c_email"></td></tr>
<tr><td nowrap><b>題　　名</b></td>
<td><input type=text name=sub size="$subj_wid" value=\"$res_sub\">
　<input type=submit value="投稿する"><input type=reset value="リセット"></td></tr>
<tr><td colspan=2><b>コメント</b><br>
<textarea cols="$com_wid" rows=7 name=comment wrap="$wrap">$res_comment</textarea></td></tr>
<!--
<tr><td nowrap><b>ＵＲＬ</b></td>
<td><input type=text size="$url_wid" name=url value="http://$c_url"></td></tr>
-->
<tr><td nowrap><b>削除キー</b></td>
<td><input type=password name=pwd size=8 maxlength=8 value="$c_pwd">
<small>(記事削除時に使用。英数字で8文字以内)</small></td></tr>
</table></form></blockquote><hr>
EOM
	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) {
		($number,$date,$name,$email,$subj,$comment,$url,$host,$pwd)
						 = split(/<>/,$lines[$_]);
		if ($email) { $name = "<a href=\"mailto:$email\">$name</a>"; }
		if ($url) { $url = "<a href=\"http://$url\" target='_top'>http://$url</a>\n"; }

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

	print "<table border=0 cellpadding=0 cellspacing=0><tr>\n";
	print "<td valign=top>[$number] <font color=\"$subj_color\"><b>$subj</b></font> ";
	print "投稿者：<font color=\"$name_color\"><b>$name</b></font> ";
	print "<small>投稿日：$date</small></td><td>&nbsp;</td>\n";
	print "<td valign='top'><form action=\"$script\" method=\"$method\">\n";
	print "<input type=submit value=\"返信\">\n";
	print "<input type=hidden name=mode value=\"res\">\n";
	print "<input type=hidden name=resmode value=\"$number\">\n";
	print "</td></form></tr></table>\n";
	print "<blockquote>$comment</blockquote><hr>\n";

	}
	print "<table border=0 width='100%'><tr>\n";

	# 改頁処理
	$next_line = $page_end + 1;
	$back_line = $page - $pagelog;

	# 前頁処理
	if ($back_line >= 0) {
		print "<td><form method=\"$method\" action=\"$script\">\n";
		print "<input type=hidden name=page value=\"$back_line\">\n";
		print "<input type=submit value=\"前の$pagelog件\">\n";
		print "</form></td>\n";	
	}

	# 次頁処理
	if ($page_end ne $end_data) {
		print "<td><form method=\"$method\" action=\"$script\">\n";
		print "<input type=hidden name=page value=\"$next_line\">\n";
		print "<input type=submit value=\"次の$pagelog件\">\n";
		print "</form></td>\n";
	}

	# ユーザ記事削除フォーム
	print "<td align=right><table border=0><tr><td align=center>\n";
	print "<form acion=\"$script\" method=\"$method\">\n";
	print "<font color=$t_color size=2>以下のフォームから自分の投稿記事を削除できます</font><br>\n";
	print "■記事No<input type=text name=usr_no size=4>\n";
	print "■削除キー<input type=password name=usr_key size=6>\n";
	print "<input type=submit value=\"記事削除\">\n";
	print "<input type=hidden name=mode value=\"usr_del\">\n";
	print "</form></td></tr></table></td></tr></table>\n";
	&footer;
	exit;
}

## --- ログ書き込み処理
sub regist {
	# 他サイトからのアクセスを排除
	if ($base_url ne ".") {
		$ref_url = $ENV{'HTTP_REFERER'};
		$ref_url =~ s/\?(.|\n)*//ig;
		$ref_url =~ s/\%7E/\~/ig;
		if ($ref_url && $ref_url !~ $base_url) { &error("不正なアクセスです。"); }
	}

	# フォームセキュリティ
	if ($name eq "") { &error("名前が入力されていません。"); }
	if ($comment eq "") { &error("コメントが入力されていません。"); }
	if ($email && $email !~ /(.*)\@(.*)\.(.*)/) {
		&error("Ｅメールの入力内容が正しくありません。");
	}
	
	# コメントでURLリンク禁止（いたずら対策）mod by hakamata 2005-12-12
	if ($comment =~ /https?:\/\//i) {
		&error("URLの書込みは禁止です");
	}
	
	# urlの送信禁止　mod by hakamata 2006-03-23
	if (length($url)>0) {
		&error("error");
	}

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

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

	# ログチェック
	$init = $lines[0];
	unless ($init =~ /^LIGHT/) { &error("ログが正しくありません。"); }

	# 設定を認識
	($head,$title,$t_color,$t_size,$t_face,$bgr,
		$bgc,$text,$link,$vlink,$alink,$home,$max,
			$subj_color,$name_color,$mail1,$mail2)
						 = split(/<>/,$init);


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

	shift(@lines);

	## 過去ログを取得する場合
	if ($pastkey && $#lines >= $max-1) { &pastlog; }

	# 記事Noカウント及び最大記事数超を切り捨て
	$number = $knum + 1;
	if ($#lines >= $max-1) { splice(@lines,$max-1); }

	# 削除キーを暗号化
	if ($pwd) { &pass_ango($pwd); }

	# ホスト名を取得
	&get_host;

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

	# ヘッダ部を付加
	unshift (@lines,$init);

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

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

	# クッキーを発行
	&set_cookie;

	# メール処理
	if ($mail1 && $mail_me == 0 && $email ne "$mail1") { &mailto; }
	elsif ($mail1 && $mail_me) { &mailto; }
}

## --- フォームからのデータ処理
sub decode {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます。"); }
		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;

		# S-JIS変換
		&jcode'convert(*value,'sjis');

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

		$FORM{$name} = $value;
	}

	$name = $FORM{'name'};
	$name =~ s/\r//g;
	$name =~ s/\n//g;
	$comment = $FORM{'comment'};
	$comment =~ s/\r\n/<br>/g;
	$comment =~ s/\r/<br>/g;
	$comment =~ s/\n/<br>/g;
	$email = $FORM{'email'};
	$email =~ s/\r//g;
	$email =~ s/\n//g;
	$url = $FORM{'url'};
	$url =~ s/\r//g;
	$url =~ s/\n//g;
	$url =~ s/^http\:\/\///;
	$mode = $FORM{'mode'};
	$pwd = $FORM{'pwd'};
	$pwd =~ s/\r//g;
	$pwd =~ s/\n//g;
	$sub = $FORM{'sub'};
	$sub =~ s/\r//g;
	$sub =~ s/\n//g;
	if ($sub eq "") { $sub = "無題"; }

	# 日時の取得
	$ENV{'TZ'} = "JST-9";
	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = 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";  }

	# 日時のフォーマット
	if ($date_type) {
		$youbi = ('日','月','火','水','木','金','土') [$wday];
		$date = "$year年$mon月$mday日 ($youbi) $hour時$min分";
	} else {
		$youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];
		$date = "$year/$mon/$mday($youbi) $hour\:$min";
	}
}

## --- 掲示板の使い方メッセージ
sub howto {
	# ログを読み込み
	open(LOG,"$logfile") || &error("Can't open $logfile");
	@lines = <LOG>;
	close(LOG);

	# 環境設定部を認識
	($head,$title,$t_color,$t_size,$t_face,$bgr,$bgc,$text,$link,$vlink,$alink,$home,$max,$subj_color,$name_color,$mail1,$mail2) = split(/<>/,$lines[0]);

	if ($tagkey == 0) { $tag_msg = "投稿内容には、<b>タグは一切使用できません。</b>\n"; }
	else { $tag_msg = "コメント欄には、<b>タグ使用をすることができます。</b>\n"; }

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

## --- ワード検索サブルーチン
sub find {
	# ログを読み込み
	open(LOG,"$logfile") || &error("Can't open $logfile");
	@lines = <LOG>;
	close(LOG);

	# 環境設定部を認識
	($head,$title,$t_color,$t_size,$t_face,$bgr,$bgc,$text,$link,$vlink,$alink,$home,$max,$subj_color,$name_color,$mail1,$mail2) = split(/<>/,$lines[0]);

	&header;
	print <<"HTML";
[<a href="$script?">掲示板にもどる</a>]
<table width="100%">
<tr><th bgcolor="$t_color">
<font color=#FFFFFF>ワード検索</font>
</th></tr></table><P>
<center>
<table><tr><td>
■検索したい<b>キーワード</b>を入力し、検索条件を選択し「検索する」を押してください。<br>
■複数のキーワードを入力するときは、<b>半角スペース</b>で区切って下さい。
</td></tr></table>
<P>
<form action="$script" method="$method">
<input type=hidden name=mode value="find">
<table border=1>
<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);

	shift(@lines);

	# 検索処理
	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) {
		($number,$date,$name,$email,$subj,$comment,$url) = split(/<>/,$line);
		if ($email) { $name = "<a href=\"mailto:$email\">$name</a>"; }
		if ($url) { $url = "<a href=\"http://$url\" target='_top'>http://$url</a>"; }

		# 結果を表示
		print "<LI>[$number] <font color=\"$subj_color\"><b>$subj</b></font>\n";
		print "投稿者：<b>$name</b> <small>投稿日：$date</small><P>\n";
		print "<blockquote>$comment<P>$url</blockquote><hr>\n";
	}

	print "</OL>\n";
  }

  &footer;
  exit;
}

## --- ブラウザを判断しフォーム幅を調整
sub get_agent {
	# ブラウザ情報を取得
	$agent = $ENV{'HTTP_USER_AGENT'};

	$nam_wid  = 20;
	$subj_wid = 25;
	$com_wid  = 56;
	$url_wid  = 50;

	# MSIE3の場合
	if ($agent =~ /MSIE 3/i) {
		$nam_wid  = 30;
		$subj_wid = 40;
		$com_wid  = 65;
		$url_wid  = 48;
	}

	# MSIE4の場合
	elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) {
		$nam_wid  = 30;
		$subj_wid = 38;
		$com_wid  = 58;
		$url_wid  = 68;
	}
}

## --- クッキーの発行
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"; }

	$mong = ('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\-$mong\-$yearg $hourg:$ming:$secg GMT";

	$cook="name\:$name\,email\:$email\,url\:$url\,pwd\:$pwd";
	print "Set-Cookie: LIGHTBBS=$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{'LIGHTBBS'});
	foreach $pair (@pairs) {
		local($name, $value) = split(/\:/, $pair);
		$COOKIE{$name} = $value;
	}
	$c_name  = $COOKIE{'name'};
	$c_email = $COOKIE{'email'};
	$c_url   = $COOKIE{'url'};
	$c_pwd   = $COOKIE{'pwd'};

	if ($FORM{'name'}) { $c_name = $FORM{'name'}; }
	if ($FORM{'email'}) { $c_email = $FORM{'email'}; }
	if ($url) { $c_url = $url; }
	if ($FORM{'pwd'}) { $c_pwd = $FORM{'pwd'}; }
}

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

	print "Content-type: text/html\n\n";
	print "<html>\n<body bgcolor=#F5F5F5>\n";
	print "<center><hr width=75%><h3>ERROR !</h3>\n";
	print "<P><font color=#DD0000><B>$_[0]</B></font>\n";
	print "<P><hr width=75%></center>\n";
	&footer;
	exit;
}

## --- 記事削除処理
sub usr_del {
	if ($FORM{'usr_no'} eq "" || $FORM{'usr_key'} eq "") {
		&error("削除No又は削除キーが入力されていません。");
	}

	# ロック開始
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	# ログを読み込む
	open(DB,"$logfile") || &error("Can't open $logfile");
	@lines = <DB>;
	close(DB);

	# ログチェック
	$init = $lines[0];
	unless ($init =~ /^LIGHT/) { &error("ログが正しくありません。"); }
	shift(@lines);

	@new = ();
	$no_del = 0;
	## マスターパスワードによる記事削除 ##
	if ($FORM{'usr_key'} eq "$pass"){
		foreach $line (@lines){
			($number,$date,$name,$email,$subj,$comment,$url,$host,$ango)
				= split(/<>/,$line);
			$flag=0;
			if ($FORM{'usr_no'} eq "$number") { $flag=1; }
			if ($flag == 0) { push(@new,$line); }
		}
	}
	## 削除キーによる記事削除 ##
	else {
		foreach $line (@lines) {
			($number,$date,$name,$email,$subj,$comment,$url,$host,$ango)
				= split(/<>/,$line);
			$flag = 0;
			if ($FORM{'usr_no'} eq "$number") {
				if ($ango eq "") { $no_del = 1; last; }

				# パスワードを照合
				&pass_shogo($FORM{'usr_key'});

				if ($check eq "yes") { $flag = 1; }
				else { $no_del = 2; last; }
			}
		if ($flag == 0) { push(@new,$line); }
		}

		if ($no_del == 1) { &error("削除キーが設定されていません。"); }
		elsif ($no_del == 2) { &error("パスワードが違います。"); }
	}

	## ログを更新 ##
	unshift(@new,$init);

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

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

}

## --- ロックファイル（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) {
		if (-e $lockfile) { sleep(1); }
		else {
			open(LOCK,">$lockfile");
			close(LOCK);
			$flag = 1;
			last;
		}
	}
	if ($flag == 0) { &error("LOCK is BUSY"); }
}

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

    	&jcode'convert(*mail_sub,'jis');
    	&jcode'convert(*name,'jis');
    	&jcode'convert(*sub,'jis');
    	&jcode'convert(*comment,'jis');
	if ($date_type) { &jcode'convert(*date,'jis'); }

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

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

	if (!open(MAIL,"| $sendmail -t")) { &error("メール送信に失敗しました。");}
	print MAIL "To: $mail1\n";
	print MAIL "From: $email\n";
	if ($mail2) { print MAIL "CC: $mail2\n"; }
	print MAIL "Subject: $mail_sub\n";
	print MAIL "MIME-Version: 1.0\n";
	print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "X-Mailer: $ver\n\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "TIME : $date\n";
	print MAIL "NAME : $name\n";
	print MAIL "EMAIL: $FORM{'email'}\n";
	if ($url ne "") { print MAIL "URL  : http://$url\n"; }
	if ($FORM{'sub'} eq "") { $sub = "no title"; }
	print MAIL "TITLE: $sub\n\n";
	print MAIL "$comment\n\n";
	print MAIL "--------------------------------------------------------\n";
	close(MAIL);
}

## --- パスワード暗号処理
sub pass_ango {
	$now = time;
	($p1, $p2) = unpack("C2", $now);
	$wk = $now / (60*60*24*7) + $p1 + $p2 - 8;
	@saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
	$nsalt = $saltset[$wk % 64] . $saltset[$now % 64];
	$ango = crypt($_[0], $nsalt);
}

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

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

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

## --- 過去ログ生成
sub pastlog {
	$new_flag = 0;

	open(NUM,"$nofile") || &error("Can't open $nofile");
	$count = <NUM>;
	close(NUM);

	# 過去ログのファイル名を定義
	$pastfile  = "$past_dir\/$count\.html";

	# 過去ログがない場合、新規に自動生成する
	unless(-e $pastfile) { &new_log; }

	if ($new_flag == 0) {
		open (DB,"$pastfile") || &error("Can't open $pastfile");
		@past = <DB>;
		close(DB);
	}

	# 規定の行数をオーバーすると、次ファイルを自動生成する
	if ($#past > $log_line) { &next_log; }

	$pst_line = $lines[$max-1];
	$pst_line =~ s/\n//g;

	($pnumber,$pdate,$pname,$pemail,$psubj,$pcomment,$purl,$phost) = split(/<>/, $pst_line);
	if ($pemail ne "") { $pname = "<a href=\"mailto\:$pemail\">$pname</a>"; }
	if ($purl ne "") { $purl = "<a href=\"http://$purl\" target='_top'>http://$purl</a>"; }

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

	$html = <<"HTML";
[$pnumber] <font color=$subj_color><b>$psubj</b></font><!--T--> 投稿者：<font color=$name_color><b>$pname</b></font> <small>投稿日：$pdate</small><p><blockquote>$pcomment<p>$purl</blockquote><!--$phost--><hr>
HTML

@news = ();
foreach $line (@past) {
	if ($line =~ /<!--OWARI-->/i) { last; }
	push (@news,$line);
	if ($line =~ /<!--HAJIME-->/i) { push (@news,"$html"); }
}

push (@news,"<!--OWARI-->\n</body></html>\n");

open(DB,">$pastfile") || &error("Can't write $pastfile");
print DB @news;
close(DB);

}## --- 過去ログ完了 --- ##

# 過去ログ次ファイル生成ルーチン
sub next_log {
	# 次ファイルのためのカウントアップ
	$count++;

	# カウントファイル更新
	open(NUM,">$nofile") || &error("Can't write $nofile");
	print NUM "$count";
	close(NUM);

	$pastfile  = "$past_dir\/$count\.html";

	&new_log;
}

# 新規過去ログファイル生成ルーチン
sub new_log {
	$new_flag = 1;

	$past[0] = "<html><head><title>過去ログ</title></head>\n";
	$past[1] = "<body background=\"$bgr\" bgcolor=$bgc text=$text link=$link vlink=$vlink alink=$alink><hr>\n";
	$past[2] = "<\!--HAJIME-->\n";
	$past[3] = "<\!--OWARI-->\n";
	$past[4] = "</body></html>\n";

	# 新規過去ログファイルを生成更新
	open(DB,">$pastfile") || &error("Can't write $pastfile");
	print DB @past;
	close(DB);

	# パーミッションを666へ。
	chmod(0666,"$pastfile");
}

## --- ホスト名を取得
sub get_host {
	$host  = $ENV{'REMOTE_HOST'};
	$addr  = $ENV{'REMOTE_ADDR'};

	if ($host eq "" || $host eq "$addr") {
		$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
	}
	if ($host eq "") { $host = $addr; }
}
