#!/usr/bin/perl

#↑一行目のパスはサーバーによって違います。サーバに合わせて変更してください。
#このperlプログラムは、perl5に対応しています。
#-------------------------------------------------------------------------------
#
#   ++++  HANA board ver.4.7 会員制レスつき掲示板 ++++
#
#   ----- 掲示板発言登録画面／表示画面 ------
#   since 2002/6/12 by Mamiko.M(http://www.nmt.ne.jp/~mamiko/)
#
#  ・著作権表示は消さないで使ってください。
#  ・このプログラムを用いた結果、利用者に万一何らかの損害が生じても作者は責任を負えません。
#  ・スクリプトの再配布や有償で他人に設置するといった行為は固く禁じます。
#  ・sendmailの使える環境でご利用ください。
#
#   このPerlプログラムは営利を目的としない個人ホームページでの利用を前提として、
#   無料で提供しています。営利を目的としたサイトでご利用の場合は、
#   必ず http://www.nmt.ne.jp/~mamiko/よりご連絡ください。
#
#  === 履歴 ===
#  2006/05/18 スレ元記事削除時のバグを修正。
#  2006/05/18 ログファイル作成＆追加時のファイルロックを旧方式に変更。（改悪のため）
#  2006/02/13  bayashi.netより新しいファイルロックに変更。
#  2005/12/23 リンクの記述部分を変更。
#  2005/04/11 記事検索機能を追加。search_top.html,earch_bottom.html,search_main.html,search.htmlを追加。
#             ログファイル作成方法を変更。log_new.htmlを追加。
#  2004/09/12 クッキーのセットで、URLエンコードする
#             クッキーのセットで、URL情報を追加。画面（form_top.html,re_form.html）を変更。
#  2003/08/22 共通サブルーチンをまとめてtemp.cgiにする
#  2003/07/13 レスがあった発言を一番上に移動させる可否設定を追加。
#                     <---BBS_TITLE--->をテンプレートに追加。$bbs_titleに置き換わる。
#  2003/07/05 管理パスワードを暗号化して登録。
#                       管理パスワード設定画面（admin_pass_form.html）を追加。
#                       ver.2以前のcfg.cgiは使用できません。
#  2002/10/17 投稿のログを残す設定の場合、一部レスが反映されないバグを修正。
#  2002/10/4 レス画面に、他のレス表示を追加。これに合わせてテンプレートのre_form.htmlも若干変更。
#  2002/09/13 エラー画面に、mene-typeの指定を追加。
#  2002/09/10 投稿のログを残さない設定の場合、レス投稿もすべて消去するように修正。
#  2002/09/4 パスワード暗号化をDESとMD5に対応。
#  2002/07/3 レス投稿削除時のエラーを修正。
#
#-------------------------------------------------------------------------------

#----------（jcode.plを使用）

require './jcode.pl';
require './cfg.cgi';
require './temp.cgi';


#----------------------------------------------------------------------------------------
# ◇◆◇ 設定値の設定はcfg.cgiファイルにて行ってください。 ◇◆◇
#----------------------------------------------------------------------------------------

#-----------（著作権表示 ◆◇◆変更不可◆◇◆）
$copyright =<<END;

<a href="http://www.nmt.ne.jp/~mamiko/" target="_blank">(C)2006 HANA board</a>
<!--リンクを削除しないでね！-->

END

#-----------（時間の取得）
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + $zisa * 60 * 60);
$wday = ('Sun','Mon','Tues','Wed','Thur','Fri','Sat')[$wday];
$mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon];
$timestring = sprintf("%s %s %02d %d %02d:%02d:%02d",$wday,$mon,$mday,1900+$year,$hour,$min,$sec);


$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq $addr || !$host) { $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr; }

#---------- （ユーザエージェントの取得）
@usr_agnt = split(/\//,$ENV{'HTTP_USER_AGENT'}); 
if ($usr_agnt[0] eq "Mozilla"){
	if ($usr_agnt[0] eq "Mozilla"){
		@version = split(/\(/,$usr_agnt[1]);
		$agent = $version[1] ;
	}

}else{
	$agent = "none";
}

#----------（ホストの禁止）
foreach $ad(@illegal_host){
	if($host =~ /$ad/i){
		&error('エラー','ただいま工事中です。しばらく開きません。');
	}
}
#----------（工事中）
if($const_flg == 1){
	&error('エラー','ただいま工事中です。しばらく開きません。');
}

#----------（入力データの取得）
if($ENV{'REQUEST_METHOD'} eq 'GET'){
	$query_string=$ENV{'QUERY_STRING'};
}else{
	read(STDIN, $query_string,$ENV{'CONTENT_LENGTH'});
}

#----------（登録バイト数の制限）
$dmy = $query_string;
if(length($dmy) > 0 && $max_byte > 0){
	$dmy =~ s/%../%/g;
	if(length($dmy) > $max_byte){
		&error("登録エラー","投稿文字数が多すぎます。");
	}
}

&qs_decode;

#----------（処理の振り分け）
if(!$admin_pass){
	if($qs{'ACTION'} eq "admin_pass_regist"){
		&admin_pass_regist;
	}else{
		&admin_pass_form;
		exit;
	}
}

if($qs{'ACTION'} eq "regist"){ 	#-----（発言登録処理）
	&setcookie;
	&msg_regist;
	&getcookie;
}
elsif($qs{'ACTION'} eq "res_form"){ 	#-----（レス発言登録フォーム）
	&getcookie;
	&res_form;
	exit;
}
elsif($qs{'ACTION'} eq "remove"){	#-----（発言削除処理）
	&msg_remove;
	&getcookie;
}
elsif($qs{'ACTION'} eq "reset"){	#-----（クッキーリセット処理）
	&resetcookie;
}
elsif($qs{'ACTION'} eq "search_form"){	#-----（投稿検索処理）
	
	&search_form;
}
elsif($qs{'ACTION'} eq "search"){	#-----（投稿検索処理）
	
	&search_list;
}else{
	&getcookie;
}

if($mode == 1){		#-----（完全会員制のときクッキーを使用して認証を継続）
	$login_flg = 0;
	if($qs{'ACTION'} eq "login"){
		&setcookie;
		&getcookie;
		$login_flg = &login($qs{'ACCOUNT'},$qs{'PASSWORD'});
		$COOKIE{'account'} = $qs{'ACCOUNT'};			#-----（アカウントとパスワードをセット）
		$COOKIE{'password'} = $qs{'PASSWORD'};
	}elsif($qs{'ACTION'}=~/regist|remove|paging/){
		&getcookie;
		$login_flg = &login($COOKIE{'account'},$COOKIE{'password'});
	}elsif($qs{'ACTION'}=~/reset/){		#-----（クッキーをリセットすると外に出てしまう）
		&error("認証エラー","クッキーが消えたので認証できなくなりました。もう一度、ログインしてください。");
	}
	if ($login_flg == 1){
		&msg_view;						#-----（掲示板表示画面）
	}else{
		&login_form;					#-----（ログイン画面）
	}
}
else{
	&msg_view;						#-----（掲示板表示画面）
}



#-----------（投稿記事検索（ver.4より新機能））
sub search_form{
	print "Content-type: text/html\n\n";

	open(FORM,"<$temp_fold/search.html");
	while(<FORM>){
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/;
		$_ =~ s/<---COPYRIGHT--->/$copyright/g;
		print $_;
	}
	close(FORM);

	exit;
}

#-----------（投稿記事検索（ver.4より新機能））
sub search_list{

	local($line, $s_line, @Slog, $fl, $word, $i=0);

	if($qs{'KEYWORD'} eq ''){
		&error("入力エラー","検索ワードを入力してください。");	
	}

	if(($_=length($qs{'KEYWORD'})-(40*2))>0){
		&error("文字数オーバー(半角換算で$_文字分)","<b>検索キーワード</b>は全角<b>20</b>文字以内でご記入ください");
	}

	$qs{KEYWORD}=~ s/\n//g;

	if($qs{'MODE'} eq ''){
		$qs{'MODE'} = 'and';
	}

	#---（検索構文の解析を行います）
	$w_line = $qs{'KEYWORD'};
	$w_line =~ s/　/ /g;
	$qs{'KEYWORD'} = $w_line;
	$w_line =~ tr/[A-Z]/[a-z]/;

	if($qs{'MODE'} ne "or"){ @words_a = split(/ /,$w_line); }
	else{ @words_o=split(/ /,$w_line); }

	open(IN,"$bbs_file") || &error("ファイルオープンエラー","データファイルが開きません");

	while($line=<IN>){
		$fl = 1;
		$temp = $line;
		$temp =~ s/(?:\r\n|[\r\n])?$/,/;
		@Slog = map { /^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
					 ($temp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);

		$s_line = $Slog[2].' '.$Slog[3].' '.$Slog[4];
		$s_line =~ tr/[A-Z]/[a-z]/;

		if($#words_a>=0){
			if($fl){
				foreach $word(@words_a){
					if(index($s_line,$word) < 0){ $fl=0; last; }
				}
			}
		}

		if($#words_o>=0){
			if($fl){
				$fl=0;
				foreach $word(@words_o){
					if(index($s_line,$word) >= 0){ $fl=1; last; }
				}
			}
		}
		if($fl){ $line{$i}=$Slog[1]; push(@write,$line); $i++; }
	}
	close(IN);

	if($i){ 
		$msg = "<span style=\"color:f00;\">▼$i件のデータが見つかりました。</span>"; 
		if($i>$s_max){
			$msg = $msg. "そのうち$s_max件を\表\示します。";
		}
	}else{ 
		$msg = "▼該当するデータは見つかりませんでした。<br><br>"; 
		$msg = $msg. "・キーワードに誤字･脱字がないか確かめてください。<br>";
		$msg = $msg. "・違うキーワードを使ってみてください。";
	}

	print "Content-type: text/html\n\n";

	open(SEARCH,"<$temp_fold/search_top.html");
	while(<SEARCH>){
		if($_ !~ /<--/){ print $_; next; }
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/;
		$_ =~ s/<---ACCOUNT--->/$COOKIE{'account'}/;
		$_ =~ s/<---PASSWORD--->/$COOKIE{'password'}/;

		$_ =~ s/<---MSG--->/$msg/;
		print $_;
	}
	close(SEARCH);

	open(MAIN,"<$temp_fold/search_main.html") || &error('ファイルオープンエラー','mainファイルが開きません。');
	@mains = <MAIN>;
	close(MAIN);

	foreach $line(@write){
		($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($line=~ /("(?:[^"]|"")*"),/g);

		#-----（掲示板の出力）
		foreach $main(@mains){

			$main_ = $main;
			if($main_ !~ /<---/){ print $main_; next; }
			$main_ =~ s/<---BBS_SCRIPT--->/$bbs_script/g;
			$main_ =~ s/<---NUM--->/$number/g;
			if($subject eq ''){ $subject='（無題）'; }
			$main_ =~ s/<---SUBJECT--->/$subject/g;
			$main_ =~ s/<---HANDLE--->/$handle/g;
			$main_ =~ s/<---URL--->/$url/g;
			if($res_number){
				$comment = "<span style=\"color: #f00;\">NO.$res_numberの返答です</span><br><br>";
				$main_ =~ s/<---CONTENTS--->/$comment$contents/g;
			}else{
				$main_ =~ s/<---CONTENTS--->/$contents/g;
			}
			$main_ =~ s/<---TIME--->/$time/g;

			if($ipdisp_flg){
				$main_ =~ s/<---HOSTNAME--->/$hostname/g;
			}else{
				$main_ =~ s/<---HOSTNAME--->//g;
			}

			$main_ =~ s/<---TIME--->/$time/g;
			$main_ =~ s/<---REPLY--->//g;

			print $main_;
		}
	}
	open(BOTTOM,"<$temp_fold/search_bottom.html");
	while(<BOTTOM>){
		$_ =~ s/<---COPYRIGHT--->/$copyright/;
		print "$_";
	}
	close(BOTTOM);

	exit;
}

#-----------（管理パスが未設定の場合、設定画面を出す（ver.2より新機能））
sub admin_pass_form{
	print "Content-type: text/html\n\n";

	open(FORM,"<$temp_fold/admin_pass_form.html");
	while(<FORM>){
		if($_ !~ /<---/){ print $_; next; }
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---COPYRIGHT--->/$copyright/g;
		print $_;
	}
	close(FORM);

	exit;
}

#-----------（管理パスが未設定の場合、設定する（ver.2より新機能））
sub admin_pass_regist{

	#-----（新しいパスワードをチェックする）
	if($qs{'PASSWORD'} eq ''){
		&error("設定エラー","新しいパスワードを入力してください。");	
	}

	if(length($qs{'PASSWORD'}) > 16 || length($qs{'PASSWORD'}) < 1){
		&error("設定エラー","パスワードは半角英数字1〜16文字までです。");	
	}

	if($qs{'PASSWORD'} =~ /[^\w]/){
		&error("設定エラー","パスワードは半角英数字で入力してください。");	
	}

	($sec) = localtime(time);
	$salt = substr("0".$sec,-2,2);

	if($crypt_flg == 1){
		#-----（パスワード暗号化処理）
		$pwd = crypt($qs{'PASSWORD'}, $salt);
	}elsif($crypt_flg == 2){	#---（MD5）
		$pwd = crypt($qs{'PASSWORD'}, "\$1\$$salt");
	}else{
		$pwd = $qs{'PASSWORD'};
	}

	&lock("cfg");

	open(CFG,"./cfg.cgi") || &error('ファイルオープンエラー','CGI設定ファイルが開きません。');

	while(<CFG>){
		if($_ =~ /\$admin_pass/){
			$_ = "\$admin_pass = \"$pwd\";\n";
		}
		push(@NEW,$_ );
	}
	close(CFG);

	open(CFG,">./cfg.cgi") || &error('ファイルオープンエラー','CGI設定ファイルが開きません。');
	print CFG @NEW;	#-----（ファイルに書き出し）
	close(CFG);

	&unlock("cfg");
}

#-----------（完全会員制のときのログイン画面）
sub login_form{

	print "Content-type: text/html\n\n";

	open(FORM,"<$temp_fold/memb_login.html");
	while(<FORM>){
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/;
		$_ =~ s/<---COPYRIGHT--->/$copyright/g;
		print $_;
	}
	close(FORM);

	exit;
}
#-----------（会員認証処理）
sub certain($$){
	my($account,$password) = @_;
	my $flg = 0;

	#-----（会員リストファイルをオープン）
	open(DB,"$memb_file") || &error('ファイルオープンエラー','データ保存用ファイルが開きません。');
	flock(DB,2);
	@lines = <DB>;
	close(DB);
	flock(DB,8);

	#-----（アカウントとパスワードの認証処理をする。$now_passはグローバル変数。）
	foreach $line (@lines) {
		$temp = $line;
		@values = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);
		if ($values[0] eq $account) {
			if($values[3] eq 1){ &error("認証エラー1","現在このアカウントは利用停止中です。"); }
			$now_pass = $values[2];
			if($crypt_flg == 1){
				if(crypt($password,substr($now_pass,0,2)) eq $now_pass){
					$flg = 1;
				}else{
					&error("認証エラー1","パスワードが一致しません。");
				}
				last;
			}elsif($crypt_flg == 2){ #---（MD5の場合）
				if(crypt($password,substr($now_pass,0,5)) eq $now_pass){
					$flg = 1;
				}else{
					&error("認証エラー1","パスワードが一致しません。");
				}
				last;
			}else{
				if($password eq $now_pass){
					$flg = 1;
				}else{
					&error("認証エラー1","パスワードが一致しません。");
				}
				last;
			}
		}
	}
	$flg;
}

#-----------（完全会員制のときのログイン処理）
sub login($$){
	my($account,$password) = @_;
	my $flg = 0;
	my $temp;

	#-----（別のサーバにあるページからこのＣＧＩへの投稿を排除する処理）
	if($cabinet ne ""){
		$ref = $ENV{'HTTP_REFERER'};
		$ref =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/ge;
		if (!($ref =~ /$cabinet/i)) { &error('ログインできません','別のサーバからのログインは受付けません。'); }
	}

	#-----（管理者からのログインはOK）
	if($account eq "$admin_acount") {
		if($crypt_flg == 1){
			if(crypt($password,substr($admin_pass,0,2)) eq $admin_pass){
				$flg = 1;
			}
		}elsif($crypt_flg == 2){ #---（MD5の場合）
			if(crypt($password,substr($admin_pass,0,5)) eq $admin_pass){
				$flg = 1;
			}
		}else{
			if($password eq $admin_pass){
				$flg = 1;
			}
		}
	}else{
		$flg = certain($account,$password);
	}

	if($flg == 0){
		&error("認証エラー2","アカウントとパスワードが一致しません。");
	}
	
	$flg;
}


#-----------（レス発言記入フォーム）
sub res_form{

	my $hit_flg = 0;

	open(DB,"<$bbs_file") || &error('ファイルオープンエラー','データファイルが開きません。');
	@lines = <DB>;
	close(DB);

	open(REMAIN,"<$temp_fold/re_main.html") || &error('ファイルオープンエラー','remainファイルが開きません。');
	@remains = <REMAIN>;
	close(REMAIN);

	#-----（レス発言の表示）
	$res_contents = "";

	foreach $resline (@lines){

		($r_number,$r_time,$r_handle,$r_subject,$r_contents,$r_account,$r_password,$r_hostname,$useragent,$r_url,$r_http,$r_icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($resline =~ /("(?:[^"]|"")*"),/g);
		if($res_number == $qs{'RES_NUM'}){

			#-----（リンクの記述があれば、リンクタグを書く）
			#if($r_contents =~ /http:\/\/[^][^()<>=\s]*/){
			#	$r_contents =~ s/(http:\/\/[^][^()<>=\s]*)/<a href=\"$1\" target=\"_blank\">$1<\/a>/g;
			#}
			if($r_contents =~ /http:\/\/[\.\/\w]*/){
				$r_contents =~ s/(http:\/\/[\.\/\w~_\-]*)/<a href=\"$1\" target=\"_blank\">$1<\/a>/g;
			}

			foreach $remain(@remains){
				$remain_ = $remain;
				if($remain_ !~ /<---/){ $res_contents .= $remain_; next; }
				$remain_ =~ s/<---NUM--->/$r_number/g;
				$remain_ =~ s/<---SUBJECT--->/$r_subject/g;
				$remain_ =~ s/<---HANDLE--->/$r_handle/g;
				$remain_ =~ s/<---URL--->/$r_url/g;
				$remain_ =~ s/<---CONTENTS--->/$r_contents/g;
				$remain_ =~ s/<---TIME--->/$r_time/g;

				if($ipdisp_flg){
					$remain_ =~ s/<---HOSTNAME--->/$r_hostname/g;
				}else{
					$remain_ =~ s/<---HOSTNAME--->//g;
				}
				$res_contents .= $remain_;
			}
			$resline = undef;	#---（一旦表示したレス投稿を配列から除く）
		}
	}

	foreach $line (@lines){

		($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($line =~ /("(?:[^"]|"")*"),/g);
		if($number == $qs{'RES_NUM'}){
			$hit_flg = 1;
			last;
		}
	}
	if($hit_flg == 0 ){ &error("返信エラー","返信先発言が見つかりません。");};
	if($subject eq ''){	$subject = "（無題）";}

	#-----（リンクの記述があれば、リンクタグを書く）
	if($contents =~ /http:\/\/[\.\/\w]*/){
		$contents =~ s/(http:\/\/[\.\/\w~_\-]*)/<a href=\"$1\" target=\"_blank\">$1<\/a>/g;
	}

	print "Content-type: text/html\n\n";

	open(FORM,"<$temp_fold/re_form.html") || &error('ファイルオープンエラー','データファイルが開きません。');
	while(<FORM>){
		if($_ !~ /<---/){ print $_; next; }
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/;
		$_ =~ s/<---SUBJECT--->/$subject/g;
		$_ =~ s/<---NUM--->/$number/g;
		$_ =~ s/<---URL--->/$url/g;
		$_ =~ s/<---HANDLE--->/$handle/g;
		$_ =~ s/<---TIME--->/$time/g;
		$_ =~ s/<---CONTENTS--->/$contents/g;
		if($ipdisp_flg){
			$_ =~ s/<---HOSTNAME--->/$hostname/g;
		}else{
			$_ =~ s/<---HOSTNAME--->//g;
		}
		$_ =~ s/<---ACCOUNT--->/$COOKIE{'account'}/g;
		$_ =~ s/<---HANDLE_C--->/$COOKIE{'handle'}/g;
		if($COOKIE{'url'}){
			$_ =~ s/<---URL_C--->/http:\/\/$COOKIE{'url'}/g;
		}else{
			$_ =~ s/<---URL_C--->//g;
		}
		$_ =~ s/<---PASSWORD--->/$COOKIE{'password'}/g;
		$_ =~ s/<---COPYRIGHT--->/$copyright/g;
		$_ =~ s/<---REPLY--->/$res_contents/g;

		print $_;
	}
	close(FORM);
	
	exit;
}

#------------（掲示板表示画面）
sub msg_view{

	my @lines = ();
	my $line,$lines;
	my(@newlines, @reslines);
	my $line_start,$line_end,$temp,$line_next,$line_forward;

	print "Content-type: text/html\n\n";

	open(FORM,"<$temp_fold/form_top.html");
	while(<FORM>){
		if($_ !~ /<--/){ print $_; next; }
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/;
		$_ =~ s/<---ACCOUNT--->/$COOKIE{'account'}/;
		$_ =~ s/<---PASSWORD--->/$COOKIE{'password'}/;
		$_ =~ s/<---HANDLE--->/$COOKIE{'handle'}/;
		if($COOKIE{'url'}){
			$_ =~ s/<---URL--->/http:\/\/$COOKIE{'url'}/;
		}else{
			$_ =~ s/<---URL--->//;
		}
		print $_;
	}
	close(FORM);
	
	open(DB,"<$bbs_file") || &error('ファイルオープンエラー','データファイルが開きません。');
	@lines = <DB>;
	close(DB);

	#-----（ふつうの発言とレス発言を分ける）
	foreach $line(@lines){
		($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($line=~ /("(?:[^"]|"")*"),/g);
		if($res_number == 0 || $res_number eq ""){
			push(@newlines,$line);
		}else{
			push(@reslines,$line);
		}
	}
	@lines = @newlines;
	@lines = reverse(@lines);
	$lines = @lines;	#----（配列の要素数）

	if($qs{'LINENUM'} eq ''){ $line_start = 0; }else{ $line_start = $qs{'LINENUM'}; }

	$line_end = $line_start + $max -1;
	if($line_end >= $lines-1){$line_end = $lines - 1;}

	print "<form action=\"$bbs_script\" method=\"post\">\n";
	print "	<input type=\"hidden\" name=\"ACTION\" value=\"remove\">\n";

	open(MAIN,"<$temp_fold/main.html") || &error('ファイルオープンエラー','mainファイルが開きません。');
	@mains = <MAIN>;
	close(MAIN);

	open(REMAIN,"<$temp_fold/re_main.html") || &error('ファイルオープンエラー','remainファイルが開きません。');
	@remains = <REMAIN>;
	close(REMAIN);

	foreach $temp ($line_start..$line_end){

		$res_flg = 0;	#-----（レスがあるかどうか）

		($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($lines[$temp] =~ /("(?:[^"]|"")*"),/g);

		#-----（レス発言の表示）
		$res_contents = "";

		foreach $resline(@reslines){
			if(!$resline){ next; }
			($r_number,$r_time,$r_handle,$r_subject,$r_contents,$r_account,$r_password,$r_hostname,$useragent,$r_url,$r_http,$r_icon,$r_res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($resline =~ /("(?:[^"]|"")*"),/g);

			if($number == $r_res_number){

				#-----（リンクの記述があれば、リンクタグを書く）
				#if($r_contents =~ /http:\/\/[^][^()<>=\s]*/){
				#	$r_contents =~ s/(http:\/\/[^][^()<>=\s]*)/<a href=\"$1\" target=\"_blank\">$1<\/a>/g;
				#}
				if($r_contents =~ /http:\/\/[\.\/\w]*/){
					$r_contents =~ s/(http:\/\/[\.\/\w~_\-]*)/<a href=\"$1\" target=\"_blank\">$1<\/a>/g;
				}

				foreach $remain(@remains){
					$remain_ = $remain;
					if($remain_ !~ /<---/){ $res_contents .= $remain_; next; }
					$remain_ =~ s/<---NUM--->/$r_number/g;
					$remain_ =~ s/<---SUBJECT--->/$r_subject/g;
					$remain_ =~ s/<---HANDLE--->/$r_handle/g;
					$remain_ =~ s/<---URL--->/$r_url/g;
					$remain_ =~ s/<---CONTENTS--->/$r_contents/g;
					$remain_ =~ s/<---TIME--->/$r_time/g;

					if($ipdisp_flg){
						$remain_ =~ s/<---HOSTNAME--->/$r_hostname/g;
					}else{
						$remain_ =~ s/<---HOSTNAME--->//g;
					}
					$res_contents .= $remain_;
				}
				$resline = undef;	#---（一旦表示したレス投稿を配列から除く）
			}
		}

		#-----（リンクの記述があれば、リンクタグを書く）
		#if($contents =~ /http:\/\/[^][^()<>=\s]*/){
		#	$contents =~ s/(http:\/\/[^][^()<>=\s]*)/<a href=\"$1\" target=\"_blank\">$1<\/a>/g;
		#}
		if($contents =~ /http:\/\/[\.\/\w]*/){
			$contents =~ s/(http:\/\/[\.\/\w~_\-]*)/<a href=\"$1\" target=\"_blank\">$1<\/a>/g;
		}

		if($subject eq ''){	$subject = "（無題）";}

		#-----（掲示板の出力）
		foreach $main(@mains){
			$main_ = $main;
			if($main_ !~ /<---/){ print $main_; next; }
			$main_ =~ s/<---BBS_TITLE--->/$bbs_title/;
			$main_ =~ s/<---BBS_SCRIPT--->/$bbs_script/g;
			$main_ =~ s/<---NUM--->/$number/g;
			$main_ =~ s/<---SUBJECT--->/$subject/g;
			$main_ =~ s/<---HANDLE--->/$handle/g;
			$main_ =~ s/<---URL--->/$url/g;
			$main_ =~ s/<---CONTENTS--->/$contents/g;
			$main_ =~ s/<---TIME--->/$time/g;

			if($ipdisp_flg){
				$main_ =~ s/<---HOSTNAME--->/$hostname/g;
			}else{
				$main_ =~ s/<---HOSTNAME--->//g;
			}
			$main_ =~ s/<---TIME--->/$time/g;
			$main_ =~ s/<---REPLY--->/$res_contents/g;

			print $main_;
		}
	}
	print <<END;

	<hr size="1" align="center" width="$msg_width">
	<br><br>
	<table border="0" align="center" width="$msg_width">
		<tr>
		<td colspan="2">
		<b>■発言の削除</b><br>発言ごとの□にチェックし、パスワードを入れて「削除」を押してください。
			<table border="0">
				<tr>
				<td>パスワード<input type="password" name="PASSWORD\" size="16" maxlength="16" class="text"></td>
				<td><input type="submit" value="削除" class="btn"></td>
				</tr>
			</table>
		</td>
	</tr>
	</form>
	</table>


END

	$line_next = $line_end + 1;
	$i = $line_start + 1; $j = $line_end + 1;

	print "<table width=\"$msg_width\" border=\"0\" align=\"center\"><tr><td>\n";
	print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>\n";

	if($lines-1 >= 0){
		if($line_end ne $lines-1){
			print <<END;
			<br>
			<form method=POST action="$bbs_script?">
			<td>
				<input type=hidden name="ACTION" value="paging">
				<input type="hidden" name="STATUS" value="$status">
				<input type=hidden name="LINENUM" value="$line_next">
				<input type=submit value="次のページへ" class="btn">
			</td>
			</form>
END
		}
		if($line_start >= $max){
			$line_forward = $line_start - $max;    #-----（$max件前に戻る）
			print <<END;
			<br>
			<form method=POST action="$bbs_script?"><td>
				<input type=hidden name="ACTION" value="paging">
				<input type="hidden" name="STATUS" value="$status">
				<input type=hidden name="LINENUM\" value="$line_forward">
				<input type=submit value="前のページへ" class="btn">
			</td>
			</form>
END
		}
	}
	print <<END;

	</tr></table>
	</td></tr></table>


END

	open(FORM,"<$temp_fold/form_bottom.html");
	while(<FORM>){
		$_ =~ s/<---COPYRIGHT--->/$copyright/;
		print "$_";
	}
	close(FORM);

	exit;
}

#------------（発言の登録処理）
sub msg_regist{
	my $flg = 0;
	my $temp;
	my @neolines = undef;
	my @lines = undef;
	my $lfh_bbs, $lfh_app, $lfh_app_new; #ロックファイル名格納用
	my (@mains,@remains,@log_new,@loglines) = ();

	#-----（別のページからこのＣＧＩへの投稿を排除する処理）
	if($cabinet ne ""){
		$ref = $ENV{'HTTP_REFERER'};
		$ref =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/ge;
		if (!($ref =~ /$cabinet/i)) { &error('書きこみできません','別のサーバからの投稿は受付けません。'); }
	}

	#-----（連続書きこみを禁止する処理）
	if ((-M "./$bbs_file")*86400 < $sleeptime) {  $m = -M "./$bbs_file"; $m_= $m*86400; &error('書きこみできません',"最終書きこみ時より$m_秒経過。最終書きこみ時より$sleeptime秒以内は書きこみできません。[$m],");}

	#-----（半角数字や半角英字の繰り返し文字の排除）
	@chars = $qs{'CONTENTS'} =~ m/[a-zA-Z0-9]{$type_cnt,}/g;
	if(@chars > 0){
		&error("入力エラー","連続文字が多すぎます。区切りを入れて入力してください。");
	}

	#-----（管理者からの投稿はOK）
	if($qs{'ACCOUNT'}eq "$admin_acount") {
		if($crypt_flg == 1){
			if(crypt($qs{'PASSWORD'},substr($admin_pass,0,2)) eq $admin_pass){
				$flg = 1;
			}
		}elsif($crypt_flg == 2){ #---（MD5の場合）
			if(crypt($qs{'PASSWORD'},substr($admin_pass,0,5)) eq $admin_pass){
				$flg = 1;
			}
		}else{
			if($qs{'PASSWORD'} eq $admin_pass){
				$flg = 1;
			}
		}

		#-----（パスワード暗号化処理）
		($sec) = localtime(time);
		$salt = substr("0".$sec,-2,2);

		if($crypt_flg == 1){ 
			$now_pass = crypt($qs{'PASSWORD'}, $salt);

		}elsif($crypt_flg == 2){	#---（MD5の場合）
			$now_pass = crypt($qs{'PASSWORD'}, "\$1\$$salt");
		}else{
			$now_pass = $qs{'PASSWORD'};
		}

	}else{
		#-----（会員リストファイルをオープン）
		$flg = certain($qs{'ACCOUNT'}, $qs{'PASSWORD'});
	}

	if($flg == 0){
		&error("認証エラー2","アカウントとパスワードが一致しません。");
	}

	#------（発言の登録）
	# &lock("bbs");

	$lfh_bbs = &my_flock() or &error("ファイルロックエラー1","ロックされています。");

	open(DB,"$bbs_file") || &error('ファイルオープンエラー',"データ保存用ファイルが開きません。$bbs_file");
	@lines = <DB>;
	close(DB);

	#-----（ふつうの発言とレス発言を配列番号（添字）で分ける）
	my(@newlines, @reslines) = ();
	my $newline_sum = 0;

	foreach $num(0..$#lines){

		if(!$lines[$num]){ next; }
		($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($lines[$num]=~ /("(?:[^"]|"")*"),/g);

		if($res_flg && $number eq $qs{RES_NUM}){	#---（レス元の発言を探して前に持ってくる）
			push(@lines,$lines[$num]);
			$lines[$num] = undef;
			if($num == $#lines){ push(@newlines,$num); }
		}else{
			if($res_number > 0){
				push(@reslines,$num);
			}else{
				push(@newlines,$num);
			}
		}
	}

	$newline_sum = @newlines;			#-----（配列の要素数）
	#&error('エラー',"元データは$newline_sum件です");

	if(!$qs{RES_NUM}){ $newline_sum++; }	#-----（レス発言でないならプラス１）
	if($sum >= $newline_sum){
		@neolines = @lines;

	}elsif($sum < $newline_sum) { 

		$lognum = shift(@newlines); 
		$logline = splice(@lines,$lognum,1);	#-----（lines配列の要素から古い要素を1件取り出す）

		if($log_flg != 1){	#-----（ログを残さない設定のとき）

			#----（レス投稿も消去する 2002/9/10）
			($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($logline=~ /("(?:[^"]|"")*"),/g);		$del_num = $number;

			$dmy = $#lines;
			foreach $num(0..$dmy){
				($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($lines[$num]=~ /("(?:[^"]|"")*"),/g);
				if($res_number == $del_num){
					#-----（消去する）
				}else{
					push(@neolines,$lines[$num]);
				}
			}

		}elsif($log_flg == 1){

			#-----（ログファイル書き出しが有効のとき）
			open(MAIN,"<$temp_fold/log_main.html") || &error('ファイルオープンエラー1','ログファイルが開きません。');
			@mains = <MAIN>;
			close(MAIN);

			open(REMAIN,"<$temp_fold/log_re_main.html") || &error('ファイルオープンエラー2','ログファイルが開きません。');
			@remains = <REMAIN>;
			close(REMAIN);

			($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($logline =~ /("(?:[^"]|"")*"),/g);

			$res_contents = "";

			#-----（レス発言も探してくる）
			$dmy = $#lines;
			foreach $resnum(0..$dmy){
				($r_number,$r_time,$r_handle,$r_subject,$r_contents,$r_account,$r_password,$r_hostname,$r_useragent,$r_url,$r_http,$r_icon,$r_res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($lines[$resnum] =~ /("(?:[^"]|"")*"),/g);
				if($number == $r_res_number){

					foreach $remain(@remains){
						$remain_ = $remain;
						if($remain_ !~ /<---/){ $res_contents.= $remain_; next; }
						$remain_ =~ s/<---NUM--->/$r_number/g;
						$remain_ =~ s/<---TIME--->/$r_time/;
						$remain_ =~ s/<---SUBJECT--->/$r_subject/g;
						$remain_ =~ s/<---HANDLE--->/$r_handle/;
						$remain_ =~ s/<---URL--->/$r_url/g;
						$remain_ =~ s/<---CONTENTS--->/$r_contents/;
						if($ipdisp_flg){
							$remain_ =~ s/<---HOSTNAME--->/$r_hostname/;
						}else{
							$remain_ =~ s/<---HOSTNAME--->//;
						}
						$res_contents.= $remain_;
					}

				}else{
					push(@neolines,$lines[$resnum]);
				}
			}

			foreach $main(@mains){
				$main_ = $main;
				$main_ =~ s/<---NUM--->/$number/g;
				$main_ =~ s/<---TIME--->/$time/;
				$main_ =~ s/<---SUBJECT--->/$subject/;
				$main_ =~ s/<---HANDLE--->/$handle/;
				$main_ =~ s/<---URL--->/$url/g;
				$main_ =~ s/<---CONTENTS--->/$contents/;
				if($ipdisp_flg){
					$main_ =~ s/<---HOSTNAME--->/$hostname/;
				}else{
					$main_ =~ s/<---HOSTNAME--->//;
				}
				$main_ =~ s/<---REPLY--->/$res_contents/;
				$log .= $main_;
			}

			#-----（ログファイルNOを取出す）
			open(IN,"$logcount_file") || &error('ファイルオープンエラー','ログカウントファイルが開きません。');
			$log_count = <IN>; chop($log_count) if $log_count =~ /\n/;

			$append = "$log_folder/log$log_count\.html";

			@stats = lstat($append);	#---（ログファイル情報を取る）

			#-----（ログファイルのサイズが$sum * 1024に達したとき、
			#		またはログファイルが存在しないとき、新しいログファイルを作る）
			if(($stats[7] > $sum * 1024) || !(-e $append)){
				&logcount;
				$append = "$log_folder/log$log_count\.html";

				#-----（新しいログファイルのパーミッションを666に設定）
				chmod(0666,"$append");

				#-----（テンプレートを開く）
				open(LOG_NEW,"<$temp_fold/log_new.html") || &error('ファイルオープンエラー2','ログテンプレートが開きません。');
				@log_new = <LOG_NEW>;
				close(LOG_NEW);

				foreach $log(@log_new){
					$log_ = $log;
					$log_ =~ s/<---BBS_TITLE--->/$bbs_title/g;
					$log_ =~ s/<---LOG_COUNT--->/$log_count/;
					$log_ =~ s/<---MSG_WIDTH--->/$msg_width/;

					$log_new .= $log_;
				}
				
				&lock("log_new");#-----（ファイルロック変更 2005/05/18）

				#-----（新しいログファイルにテンプレートを書きこむ）
				open(APPEND,">$append")|| &error('ログファイルオープンエラー1','ファイルが開きません。');
				print APPEND $log_new;
				close(APPEND);

				&unlock("log_new");	#-----（ファイルロック変更 2005/05/18）
			}

			#-----（ログファイルを読みこむ）
			&lock("append");	#-----（ファイルロック変更 2005/05/18）
			
			open(APPENDIN,"$append")|| &error('ログファイルオープンエラー2','ログファイルが開きません。');
			@loglines = <APPENDIN>;
			close(APPENDIN);
			
			#-----（ログファイルにログを書きこむ）
			foreach(@loglines){
				if($_ =~ /<!----- start ----->\n/){
					$_ = "<!----- start ----->\n$log\n";
				}
			}

			open(APPEND,">$append")|| &error('ログファイルオープンエラー3','ログファイルが開きません。');
			print APPEND @loglines;
			close(APPEND);

			&unlock("append");	#-----（ファイルロック変更 2005/05/18）

		}
	}

	#-----（発言NOのカウントをする）
	&count;

	#-----（発言のレスNOがあるかどうか）
	if($qs{'RES_NUM'}){
		$res_num = $qs{'RES_NUM'};
	}else{
		$res_num = 0;
	}

	#-----（linesに新しい要素を追加する）
	push(@neolines,"\"$count\",\"$timestring\",\"$qs{'HANDLE'}\",\"$qs{'SUBJECT'}\",\"$qs{'CONTENTS'}\",\"$qs{'ACCOUNT'}\",\"$now_pass\",\"$host\",\"$ENV{'HTTP_USER_AGENT'}\",\"$qs{'URL'}\",\"$ENV{'HTTP_X_FORWARDED_FOR'}\",\"\",\"$res_num\",\n");

	open(DB,">$bbs_file") || &error('ファイルオープンエラー','データ保存用ファイルが開きません。');
	print DB @neolines;	#ファイルに書き出し
	close(DB);

	# &unlock("bbs");
	&my_funlock($lfh_bbs);

	if($mail_flg == 1){ &sendmail_to; } #-----（管理者へ発言内容をメールで知らせる）

	$flg;
}

#----------（登録者にメールを送る）

sub sendmail_to{
	if ($admin_mail eq '' || !($admin_mail =~ /([\w\-\+]+)\@([\w\-\+]+)\.([\w\-\+\.]+)/)) { 
		&error('送信できません','正しいメールアドレスが記入されていません。'); }

	if (!open(OUT,"| $sendmail $admin_mail")) { 
		&error('システム異常です','何らかの原因で処理できません。'); }

	print OUT "X-Mailer: MembBBS\n";
	print OUT "From: $admin_mail\n";
	print OUT "To: $admin_mail\n";
	print OUT "Reply-To: $admin_mail\n";

	print OUT "Subject:$mail_subject\n";
	print OUT "Content-Transfer-Encoding: 7bit\n";
	print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n";

	print OUT &jcode'jis("このメールは、掲示板へ発言登録があったことを管理者に伝えるために送信しています。")."\n\n";
	print OUT &jcode'jis("アカウント：$qs{'ACCOUNT'}")."\n";
	print OUT &jcode'jis("ハンドル：$qs{'HANDLE'}")."\n";
	print OUT &jcode'jis("タイトル：$qs{'SUBJECT'}")."\n";
	print OUT &jcode'jis("URL：$qs{'URL'}")."\n";
	print OUT &jcode'jis("メッセージ：$qs{'CONTENTS'}")."\n";

	print OUT "\n\n";
	print OUT "--------------------------------------------------\n";
	print OUT " TIME              : $timestring\n";
	print OUT " SERVER_NAME       : $ENV{'SERVER_NAME'}\n";
	print OUT " SERVER_PROTOCOL   : $ENV{'SERVER_PROTOCOL'}\n";
	print OUT " SERVER_PORT       : $ENV{'SERVER_PORT'}\n";
	print OUT " GATEWAY_INTERFACE : $ENV{'GATEWAY_INTERFACE'}\n";
	print OUT " REQUEST_METGHOD   : $ENV{'REQUEST_METGHOD'}\n";
	print OUT " SCRIPT_NAME       : $ENV{'SCRIPT_NAME'}\n";
	print OUT " HTTP_REFERER      : $ENV{'HTTP_REFERER'}\n";
	print OUT " HTTP_USER_AGENT   : $ENV{'HTTP_USER_AGENT'}\n";
	print OUT " REMOTE_HOST       : $host\n";
	print OUT " REMOTE_ADDR       : $ENV{'REMOTE_ADDR'}\n";
	print OUT "--------------------------------------------------\n";
	print OUT "\n";

	close(OUT);
}

#---------（発言削除処理）
sub msg_remove{
	my $admin_flg = 0;
	my $user_flg = 0;
	my $flg = 0;
	my @res_delnumber = ();
	my @NEW = ();
	my $lfh_bbs;	#ロックファイル名の格納
	my @lines = ();
	my $line,$temp;

	#-----（別のページからこのＣＧＩへの投稿を排除する処理）
	if($cabinet ne ""){
		$ref = $ENV{'HTTP_REFERER'};
		$ref =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/ge;
		if (!($ref =~ /$cabinet/i)) { &error('投稿できません','別のサーバからの投稿は受付けません。'); }
	}

	#-----（管理者のパスワードと同じとき）
	if($crypt_flg == 1){
		if(crypt($qs{'PASSWORD'},substr($admin_pass,0,2)) eq $admin_pass){
			$admin_flg = 1;
		}
	}elsif($crypt_flg == 2){ #---（MD5の場合）
		if(crypt($qs{'PASSWORD'},substr($admin_pass,0,5)) eq $admin_pass){
			$admin_flg= 1;
		}
	}else{
		if($qs{'PASSWORD'} eq $admin_pass){
			$admin_flg= 1;
		}
	}

	# &lock("bbs");
	$lfh_bbs = &my_flock() or &error("ファイルロックエラー1","ロックされています。");

	open(DB,"$bbs_file") || &error('ファイルオープンエラー','データ保存用ファイルが開きません。');
	@lines = <DB>;
	close(DB);

	foreach $line(@lines){
		$temp = $line;
		($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);

		#-----（引数の発言NOと一致するか）
		foreach $delnum(@delnumber){
			if($number == $delnum){ 
				$flg = 1;
				if(!$res_number){ push(@res_delnumber,$number); } #---（レス投稿が存在する可能性がある場合）
			}
		}

		if($flg == 1){
			if($password =~ /\n/){ chop($password); };
			if($password ne ''){
				if($crypt_flg == 1){
					if(crypt($qs{'PASSWORD'},substr($password,0,2)) eq $password){ 
						$user_flg = 1; 
					}
				}elsif($crypt_flg == 2){	#---（MD5の場合）
					if(crypt($qs{'PASSWORD'},substr($password,0,5)) eq $password){ 
						$user_flg = 1; 
					}
				}else{
					if($qs{'PASSWORD'} eq $password){ $user_flg = 1; }
				}
			}
			if(!$user_flg && !$admin_flg){
				#-----（入力されたパスワードと違う、管理者のパスワードとも違うとき）
				#-----（ パスワードが合わないときに$lineをNEWに出力	）

				push(@NEW,$line);
				@res_delnumber = ();	#---（空にする 2006/05/18）
			}

		}else{
			#-----（ナンバーが合わないときに$lineをNEWに出力）
			push(@NEW,$line);
		}
		$flg = 0;	#-----（フラグのリセット）
	}


	if(@res_delnumber){	#---（レス発言があるなら探してそれも削除）

		#&error('削除エラー',"\@res_delnumbe");

		#-----（配列全体をコピー）
		@lines = @NEW;
		@NEW = ();

		foreach $line(@lines){
			$temp = $line;
			($number,$time,$handle,$subject,$contents,$account,$password,$hostname,$useragent,$url,$http,$icon,$res_number) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);

			foreach $delnum(@res_delnumber){	
				if($res_number == $delnum){ 	#---（レスナンバーで一致する投稿を探す）
					$flg = 1;
				}
			}
			if(!$flg){
				#-----（ナンバーが合わないときに$lineをNEWに出力）
				push(@NEW,$line);
			}else{
				#-----（削除時）
				if(!$user_flg && !$admin_flg){
					#-----（入力されたパスワードと違う、管理者のパスワードとも違うとき）
					#-----（ パスワードが合わないときに$lineをNEWに出力	）
					push(@NEW,$line);
				}
			}
			$flg = 0;	#-----（フラグのリセット）
		}
	}
	#-----（配列全体をコピー）
	@lines = @NEW;

	open(DB,">$bbs_file") || &error('ファイルオープンエラー','データ保存用ファイルが開きません。');
	print DB @lines;	#ファイルに書き出し
	close(DB);

	# &unlock("bbs");
	&my_funlock($lfh_bbs);
}

#----------（会員情報クッキーのセット）
sub setcookie{
	
	#-----（有効期限は90日後）
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time + (90*24*60*60));
	$year += 1900;
	$sec  = "0$sec" if $sec < 10;
	$min  = "0$min" if $min < 10;
	$hour = "0$hour" if $hour < 10;
	$mday = "0$mday" if $mday < 10;
	$wday = ('Sun','Mon','Tues','Wed','Thur','Fri','Sat')[$wday];
	$mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon];

	$expDate = "$wday, $mday\-$mon\-$year $hour:00:00 GMT";

	my $handle = $qs{'HANDLE'};
	my $acc = $qs{'ACCOUNT'};
	my $pass = $qs{'PASSWORD'};
	my $url = $qs{'URL'};

	#---（http://部分をカット）
	$url =~ s/http:\/\///;

	$cook="handle\:$handle\%url\:$url\%account\:$acc\%password\:$pass";

	#-----（sjisに変換）
	&jcode::convert(\$cook,"sjis");

	#---（URLエンコードする）
	$cook =~ s/(\W)/sprintf("%%%02X", ord($1))/ego;

	print "Set-Cookie: keys=$cook; expires=$expDate\n";
}


#----------（入力データのURLデコード）
sub qs_decode{

	#-----（入力データのデコードとハッシュ変数への格納）
	for(split(/&/,$query_string)){
		tr/+/ /;
		s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/ge;
		($key,$value) = split(/=/,$_,2);

		#-----（一度EUCに変換して処理する）
		&jcode::convert(\$value,"euc");

		#-----（コメントにhtmlのタグを直接書けないようにする）
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;
		#<を&lt;に変換する

		#-----（改行コードの変換）
		$value =~ s/\r\n/\n/g;
		$value =~ s/\r/\n/g;
		$value =~ s/\n/<br>/g;

		#-----（記入されたくない文字列を＊＊＊に変換）
		foreach $str(@illegal_word){
			&jcode::convert(\$str,"euc");
			$len = length($str)/2;
			$rep = '';
			for(1..$len){$rep = '*'.$rep;}
			$value =~ s/$str/$rep/g;
		}


		#-----（"を""に変換する／擬似CSVのため）
		$value=~s/"/""/g;
		
		#-----（削除する発言NO）
		if($key eq "DELNUM"){
			 push(@delnumber,$value);
		}

		#-----（sjisに変換する）
		&jcode::euc2sjis(\$value);

		$qs{$key} = $value;

	}

}

#---------（発言NOのカウントしてます）
sub count{

	&lock("count");

	open(IN,"$count_file")||&error('ファイルオープンエラー','カウントファイルが開きません。');
	$count = <IN>; chop($count) if $count =~ /\n/;
	$count++; 
	close IN;

	open(OUT,">$count_file");
	print OUT $count;
	close OUT; 

	&unlock("count");
}

#---------（ログファイルNOのカウントしてます）
sub logcount{

	&lock("logcount");

	open(IN,"$logcount_file")||&error('ファイルオープンエラー','カウントファイルが開きません。');
	$log_count = <IN>; chop($log_count) if $log_count =~ /\n/;
	$log_count++; 
	close IN;

	open(OUT,">$logcount_file");
	print OUT $log_count;
	close OUT; 

	&unlock("logcount");
}
