#!/usr/bin/perl

#↑一行目のパスはサーバーによって違います。サーバに合わせて変更してください。
#このperlは、perl5に対応しています。
#----------------------------------------------------------------------------------------
#
#   ++++  HANA board ver4.7 会員制レスつき掲示板 ++++
#   ----- 会員登録画面／結果画面 ------
#
#   since 2002/6/16 by Mamiko.S(http://www.nmt.ne.jp/~mamiko/)
#
#  ・著作権表示は消さないで使ってください。
#  ・このプログラムを用いた結果、利用者に万一何らかの損害が生じても作者は責任を負えません。
#  ・スクリプトの再配布や有償で他人に設置するといった行為は固く禁じます。
#  ・sendmailの使える環境でご利用ください。
#
#   このPerlプログラムは営利を目的としない個人ホームページでの利用を前提として、
#   無料で提供しています。営利を目的としたサイトでご利用の場合は、
#   必ず mamiko@nmt.ne.jp へご連絡ください。
#
#  === 履歴 ===
#  2003/09/22 会員一覧をテンプレート化。memblist.htmlを追加。
#  2003/08/22 共通サブルーチンをまとめてtemp.cgiにする
#  2003/07/13 <---BBS_TITLE--->をテンプレートに追加。$bbs_titleに置き換わる。
#  2003/07/03   会員登録時とパスワード再発行時のメール文を分けた。
#                      結果メッセージ画面をテンプレート（result_msg.html）使用に変更。
#                      ファイルロックをmkdirファイルロックに変更。
#  2003/05/29 パスワード変更処理のエラーを修正。（余計なlastを削除）
#  2002/10/7 322行目の;が無いエラーを修正。
#  2002/09/4 暗号化をDESとMD5に対応。
#
#----------------------------------------------------------------------------------------


#----------（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

#----------（入力データの取得）
if($ENV{'REQUEST_METHOD'} eq 'GET'){
	$query_string = $ENV{'QUERY_STRING'};
}else{
	if($ENV{'CONTENT_LENGTH'} > 65536){
		&error('エラー','入力データが多すぎます。');
	}
	read(STDIN, $query_string,$ENV{'CONTENT_LENGTH'});
}

#----------（ホスト名の取得）
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq $addr || !$host) { $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr; }

#----------（時間の取得）
($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);

#---------- （ユーザエージェントの取得）
@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";
}

&qs_decode;


#----------（メールアドレスの禁止）
foreach $mail_ad(@illegal_mail){
	if($qs{'EMAIL'} =~ /$mail_ad/i){
		&error('会員登録エラー','このメールアドレスでは会員登録できません。別のメールアドレスで登録してください。');
	}
}

if($qs{'ACTION'} eq 'regist'){ 		#-----（会員登録処理）
	&memb_regist;
	&result("送信完了","ご記入されたものは<b>$qs{'EMAIL'}</b>宛てに電子メールしました。");

}elsif($qs{'ACTION'} eq 'update'){	#-----（パスワード変更処理）
	&memb_update;
	&result("パスワード変更できました","変更したパスワードで発言ができます。");

}elsif($qs{'ACTION'} eq 'reissue'){	#-----（パスワード再発行処理）
	&memb_reissue;
	&result("パスワード再発行できました","アカウントとパスワードを$qs{'EMAIL'}宛てに電子メールしました。");

}elsif($qs{'ACTION'} eq 'updform'){	#-----（パスワード変更画面）
	&memb_upd_form;
}elsif($qs{'ACTION'} eq 'reisuform'){	#-----（パスワード再発行画面）
	&memb_reisu_form;
}elsif($qs{'ACTION'} eq 'login'){
	&admin_form;
}elsif($qs{'ACTION'} eq 'logout'){
	&resetcookie;
	&result("ログアウトしました","認証情報のクッキーを消去しました。");
}elsif($qs{'ACTION'} eq 'list'){
	&memb_list;
	
}elsif($qs{'ACTION'} eq 'remove'){
	&memb_remove;
	&memb_stop;
	&memb_start;
	&memb_list;
}else{								#-----（会員登録画面）
	&memb_form;
}

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

	for(split(/&/,$query_string)){
		tr/+//;
		tr/ //;
		s/%([\dA-Fa-f][\dA-Fa-f])/pack('C',hex($1))/ge;
		($key,$value) = split(/=/,$_,2);

		#-----（htmlのタグを直接書けないようにする（一応）「<」を「」 に変換する）
		$value =~ s/<//g;
		$value =~ s/>//g;

		#-----（改行コードの変換（一応"））
		$value =~ s/\r\n/\n/g;
		$value =~ s/\r/\n/g;
		$value =~ s/\n//g;
		
		#-----（「"」を、「""」に変換する）

		$value =~ s/"/""/g;

		#-----（削除するアカウント）
		if($key eq 'DELACCOUNT'){
			 push(@delaccount,$value);
		}
		#-----（一時停止するアカウント）
		if($key eq 'STPACCOUNT'){
			 push(@stpaccount,$value);
		}
		#-----（利用再開するアカウント）
		if($key eq 'STRACCOUNT'){
			 push(@straccount,$value);
		}

		#-----（keyを添字としたハッシュ変数に格納している）
		$qs{$key} = $value;
	}
}


#----------（会員登録処理 アカウントIDとメールアドレスとパスワードを登録）
sub memb_regist{

	#-----（別のページからこのＣＧＩへの投稿を排除する処理）
	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($qs{'ACCOUNT'} eq ''){
		&error("会員登録エラー","アカウントを入力してください。");	
	}

	if(length($qs{'ACCOUNT'}) > 16 || length($qs{'ACCOUNT'})< 1){
		&error("会員登録エラー","アカウントは半角英数字1〜16文字までです。");	
	}

	if($qs{'ACCOUNT'} =~ /[^\w]/){
		&error("会員登録エラー","アカウントは半角英数字で入力してください。");	
	}

	#-----（Eメールをチェックする）
	if(!($qs{'EMAIL'} =~ /([\w\-\+]+)\@([\w\-\+]+)\.([\w\-\+\.]+)/)){
		&error("会員登録エラー","正しいE-Mailを入力してください。");
	}

	#-----（パスワード抽出処理）
	srand;
	open(PASSFILE,"<$pass_file") || &error('ファイルオープンエラー','単語ファイルが開きません。');
	rand($.) < 1 and $pass_line = $_ while <PASSFILE>;
	close(PASSFILE);
	chop($pass_line) if $pass_line =~ /\n/;
	
	#-----（パスワード暗号化処理）
	($sec) = localtime(time);
	$salt = substr("0".$sec,-2,2);
	if($crypt_flg == 1){
		$pwd = crypt($pass_line, $salt);
	}elsif($crypt_flg == 2){	#---（MD5の場合）
		$pwd = crypt($pass_line, "\$1\$$salt");
	}else{
		$pwd = $pass_line;
	}


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

	#-----（会員人数が制限に達した場合の処理）
	$lines = @lines;
	if ($sum_memb < $lines + 1) { 
		shift(@lines); 	#-----（lines配列の要素から古い要素を取り出す）
	}

	#-----（同じアカウントで登録されている会員がいないかチェックする）
	foreach $line (@lines) {
		my $temp = $line;
		@values = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);
		if ($values[0] eq $qs{'ACCOUNT'}) {
			&error('会員登録エラー','このアカウントはすでに使用されています。別のアカウントを入力してください。');
			last;
		}
		if ($values[1] eq $qs{'EMAIL'}) {
			&error('会員登録エラー','このE-mailはすでに使用されています。別のE-mailを入力してください。');
			last;
		}
	}

	#-----（会員リストファイルに登録）
	&lock("memb");

	#-----（@linesに新しい会員を追加登録する）
	push(@lines,"\"$qs{'ACCOUNT'}\",\"$qs{'EMAIL'}\",\"$pwd\",\"0\",\"$timestring\",\"$host\",\"$ENV{'HTTP_USER_AGENT'}\",\n");
	open(DB,">$memb_file") || &error('ファイルオープンエラー','会員リストファイルが開きません。');
	print DB @lines;	#-----（ファイルに書き出し）
	close(DB);

	&unlock("memb");

	#-----（メールを送信する）
	&sendmail_to($qs{'ACCOUNT'},$message,$subject);
}

#----------（パスワード変更処理）
sub memb_update{
	my $flg = 0;

	#-----（アカウントをチェックする）
	if($qs{'ACCOUNT'} eq ''){
		&error("会員更新エラー","アカウントを入力してください。");	
	}

	#-----（Eメールをチェックする）
	if(!($qs{'EMAIL'} =~ /([\w\-\+]+)\@([\w\-\+]+)\.([\w\-\+\.]+)/)){
		&error("会員更新エラー","正しいE-Mailを入力してください。");
	}

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

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

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

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

	#-----（会員リストファイルをオープン）
	&lock("memb");

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

	#-----（同じアカウントで同じE-mailの会員データをチェックする）
	foreach $line(@lines) {
		my $temp = $line;
		@values = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);
		if ($values[0] eq $qs{'ACCOUNT'} && $values[1] eq $qs{'EMAIL'}) {
			if($values[3] eq "1"){ &error('会員更新エラー','この会員は現在、利用停止中です。'); }
			$flg = 1;
			$now_pass = $values[2];
			
			($sec) = localtime(time);
			$salt = substr("0".$sec,-2,2);

			if($crypt_flg == 1){
				if(crypt($qs{'PASSWORD'},substr($now_pass,0,2)) eq $now_pass){
					#-----（パスワード暗号化処理）
					$pwd = crypt($qs{'NEW_PASSWORD'}, $salt);
				
				}else{
					&error('パスワード入力エラー','パスワードが一致しません。');
				}

			}elsif($crypt_flg == 2){
				if(crypt($qs{'PASSWORD'},substr($now_pass,0,5)) eq $now_pass){
					#-----（パスワード暗号化処理）

					$pwd = crypt($qs{'NEW_PASSWORD'}, "\$1\$$salt");
				}else{
					&error('パスワード入力エラー','パスワードが一致しません。');
				}
			}else{
				if($qs{'PASSWORD'} eq $now_pass){
					$pwd = $qs{'NEW_PASSWORD'};
				}else{
					&error('パスワード入力エラー','パスワードが一致しません。');
				}
			}
			$line = "\"$values[0]\",\"$values[1]\",\"$pwd\",\"0\",\"$timestring\",\"$host\",\"$ENV{'HTTP_USER_AGENT'}\",\n";
			last;
		}
	}
	if($flg == 0){
		&error('アカウント入力エラー','アカウント、E-mailの一致する会員が見つかりません。');
	}

	#-----（パスワード変更した後のデータを登録する）
	open(DB,">$memb_file") || &error('ファイルオープンエラー','データ保存用ファイルが開きません。');
	print DB @lines;	#-----（ファイルに書き出し）
	close(DB);

	&unlock("memb");
}


#----------（パスワード再発行処理）
sub memb_reissue{
	my $flg = 0;

	#-----（Eメールをチェックする）
	if(!($qs{'EMAIL'} =~ /([\w\-\+]+)\@([\w\-\+]+)\.([\w\-\+\.]+)/)){
		&error("会員更新エラー","正しいE-Mailを入力してください。");
	}

	#-----（会員リストファイルをオープン）
	&lock("memb");

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

	#-----（同じE-mailの会員データをチェックする）
	foreach $line(@lines) {
		my $temp = $line;
		@values = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);
		if ($values[1] eq $qs{'EMAIL'}) {
			if($values[3] eq "1"){&error('パスワード再発行エラー','この会員は現在、利用停止中です。');}
			$flg = 1;

			#-----（パスワード抽出処理）
			srand;
			open(PASSFILE,"<$pass_file") || &error('ファイルオープンエラー','単語ファイルが開きません。');
			rand($.) < 1 and $pass_line = $_ while <PASSFILE>;
			close(PASSFILE);
			chop($pass_line) if $pass_line =~ /\n/;

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

			if($crypt_flg == 1){
				#-----（パスワード暗号化処理）
				$pwd = crypt($pass_line, $salt);
			}elsif($crypt_flg == 2){	#---（MD5）
				$pwd = crypt($pass_line, "\$1\$$salt");
			}else{
				$pwd = $pass_line;
			}
			$line = "\"$values[0]\",\"$values[1]\",\"$pwd\",\"0\",\"$timestring\",\"$host\",\"$ENV{'HTTP_USER_AGENT'}\",\n";

			last;
		}
	}

	if($flg == 0){
		&error('E-mail入力エラー','E-mailが一致しません。');
	}

	#-----（パスワード変更した後のデータを登録する）
	open(DB,">$memb_file") || &error('ファイルオープンエラー','データ保存用ファイルが開きません。');
	print DB @lines;	#-----（ファイルに書き出し）
	close(DB);

	&unlock("memb");

	#-----（メールを送信する）
	&sendmail_to($values[0],$message2,$subject2);
}


#----------（会員登録画面 アカウントIDとメールアドレスを入力）
sub memb_form{

	print "Content-type: text/html\n\n";
	open(FORM,"<$temp_fold/memb_form.html");
	while(<FORM>){
		if($_ !~ /<---/){ print $_; next; }
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/;
		$_ =~ s/<---COPYRIGHT--->/$copyright/;
		print "$_";
	}
	close(FORM);
	exit;
}

#---------（パスワードを変更する画面：アカウント、E-mail、パスワード、新しいパスワードを入力）
sub memb_upd_form{

	print "Content-type: text/html\n\n";
	
	open(FORM,"<$temp_fold/memb_upd_form.html");
	while(<FORM>){
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/;
		$_ =~ s/<---COPYRIGHT--->/$copyright/;
		print "$_";
	}
	close(FORM);

	exit;
}

#---------（パスワードを再発行する画面：E-mailを入力する）
sub memb_reisu_form{

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

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

	exit;
}

#----------（管理モードへ移るためのフォーム）
sub admin_form{

	print "Content-type: text/html\n\n";
	
	open(LOGIN,"<$temp_fold/admin_login.html");
	while(<LOGIN>){
		if($_ !~ /<---/){ print $_; next; }
		$_ =~ s/<---BBS_TITLE--->/$bbs_title/;
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/;
		$_ =~ s/<---COPYRIGHT--->/$copyright/;
		print "$_";
	}
	close(LOGIN);
}
#----------（会員のリスト）
sub memb_list{
	my $count = 0;
	my $bgcolor ;
	my $listhtml = "";

	if($qs{'PASSWORD'}){ 
		&admin_setcookie; 
		if(!&admin_certain($qs{'PASSWORD'})){
			&error("認証エラー1","パスワードが一致しません。");
		}
	}else{

		&getcookie;
		if(!&admin_certain($COOKIE{'adminpass'})){
			&error("認証エラー2","パスワードが一致しません。");
		}
	}

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

	$lines = @lines;	#----（配列の要素数）

	if($lines){
		$listhtml = "<p align=\"center\">現在$lines件の登録があります。<br>
会員を操作することができます。<br>
□にチェックを入れて、画面下の「実行」ボタンを押してください。 </p>";
	}else{
		$listhtml = "<p align=\"center\">現在、会員登録がありません。<br></p>";
	}

	@lines = reverse(@lines);
	if($qs{'LINENUM'} eq ''){ $line_start = 0; }else{ $line_start = $qs{'LINENUM'}; }
	
	$line_end = $line_start + $max_memb -1;
	if($line_end >= $lines-1){$line_end = $lines - 1;}

	$listhtml.= "<table border=\"1\" width=\"80%\" align=\"center\" cellspacing=\"1\">\n";
	$listhtml.= "	<tr bgcolor=\"gray\"><td colspan=\"2\"><font color=\"white\">削除／一時停止／再開</font></td><td nowrap><font color=\"white\">アカウント</td><td><font color=\"white\">E-mail</font></td><td><font color=\"white\">登録日時</font></td><td><font color=\"white\">ホスト名<br>ユーザエージェント</font></td></tr>\n";
	$listhtml.= "<form action=\"membregist.cgi\" method=\"post\">\n";
	$listhtml.= "<input type=\"hidden\" name=\"ACTION\" value=\"remove\">\n";

	#-----（会員データの一覧表）
	foreach $line($line_start..$line_end) {
		++$count;
		$bgcolor = int($count % 2) ? "white" : "#eeeeee";
		my $temp = $lines[$line];
		($account,$email,$password,$ok_flg,$time,$host,$useragent) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);
		
		$listhtml.= "<tr bgcolor=\"$bgcolor\">";
		$listhtml.= "	<td valign=\"top\" rowspan=\"2\" nowrap>";
		$listhtml.= " <input type=\"checkbox\" value=\"$account\" name=\"DELACCOUNT\"><font size=\"-1\">削除</font></td>\n";
		if($ok_flg == 0){
			$listhtml.= "	<td valign=\"top\" rowspan=\"2\" nowrap>";
			$listhtml.= "	<input type=\"checkbox\" value=\"$account\" name=\"STPACCOUNT\"><font size=\"-1\">停止</font></td>\n";
		}else{
			$listhtml.= "	<td valign=\"top\" rowspan=\"2\" nowrap>";
			$listhtml.= "	<input type=\"checkbox\" value=\"$account\" name=\"STRACCOUNT\"><font size=\"-1\">再開</font><br>";
			$listhtml.= "<font color=\"red\" size=\"-1\">[利用停止中]</font></td>\n";
		}
		$listhtml.= "	<td valign=\"top\" rowspan=\"2\">$account</td>\n";
		$listhtml.= "	<td valign=\"top\" rowspan=\"2\"><a href=\"mailto:$email\">$email</a></td>\n";
		$listhtml.= "	<td valign=\"top\" rowspan=\"2\">$time</td>\n";
		$listhtml.= "	<td valign=\"top\">$host</td>\n";
		$listhtml.= "</tr>";
		$listhtml.= "<tr bgcolor=\"$bgcolor\">";
		$listhtml.= "	<td valign=\"top\">$useragent</td>\n";
		$listhtml.= "</tr>";
	}
	$listhtml.= "</table>\n";
	$listhtml.= "<table border=\"0\" width=\"650\" align=\"center\" cellspacing=\"1\">\n";
	$listhtml.= "<tr><td>\n";
	
	$listhtml.= "	<input type=\"submit\" value=\"実行\" class=\"btn\">\n";
	$listhtml.= "</td></tr>\n";
	$listhtml.= "</form>\n";
	$listhtml.= "</table>\n";

	$line_next = $line_end + 1;
	$i = $line_start + 1; $j = $line_end + 1;
	
	if($lines-1 >= 0){
		$listhtml.= "<table border=\"0\" width=\"650\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\"><tr><td>";
		$listhtml.= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr>";
		if($line_end ne $lines-1){
			$listhtml.= "<form method=POST action=\"membregist.cgi\">\n";
			$listhtml.= "<td>";
			$listhtml.= "	<input type=hidden name=\"LINENUM\" value=\"$line_next\">\n";
			$listhtml.= "	<input type=hidden name=\"ACTION\" value=\"list\">\n";
			$listhtml.= "	<input type=submit value=\"次のページへ\" class=\"btn\">";
			$listhtml.= "</td>";
			$listhtml.= "</form>\n";
		}
		if($line_start >= $max_memb){
			$line_forward = $line_start - $max_memb;    #-----（$max件前に戻る）
			$listhtml.= "<form method=POST action=\"membregist.cgi\"><td>\n";
			$listhtml.= "	<input type=hidden name=\"LINENUM\" value=\"$line_forward\">\n";
			$listhtml.= "	<input type=hidden name=\"ACTION\" value=\"list\">\n";
			$listhtml.= "	<input type=submit value=\"前のページへ\" class=\"btn\">";
			$listhtml.= "</td>\n";
			$listhtml.= "</form>\n";
		}
		$listhtml.= "</td></tr></table>";
		$listhtml.= "</tr></table>";
	}



	print "Content-type: text/html\n\n";
	open(TEMP,"<$temp_fold/memblist.html");
	while(<TEMP>){
		if($_ !~ /<---/){ print $_; next; }

		$_ =~ s/<---BBS_TITLE--->/$bbs_title/g;
		$_ =~ s/<---BBS_SCRIPT--->/$bbs_script/;
		$_ =~ s/<---MEMB_SCRIPT--->/$memb_script/g;
		$_ =~ s/<---LIST--->/$listhtml/;
		$_ =~ s/<---COPYRIGHT--->/$copyright/;
		print "$_";
	}
	close(TEMP);

	exit;
}
#----------（会員削除処理）
sub memb_remove{
	my $flg = 0;
	my @lines;
	my @NEW;
	
	&getcookie;
	if(!&admin_certain($COOKIE{'adminpass'})){
		&error("認証エラー","パスワードが一致しません。");
	}

	&lock("memb");

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

	foreach $line(@lines){
		$temp = $line;
		($account,$email,$password,$ok_flg,$time,$host,$useragent) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);

		#-----（引数のアカウントと一致するか）
		foreach $delacnt(@delaccount){
			if($account eq $delacnt){ $flg = 1;}
		}

		#-----（アカウントが合わないときに$lineをNEWに出力）
		if($flg == 0){
			push(@NEW,$line);
		}
		$flg = 0;
	}

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

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

	&unlock("memb");
}

#----------（会員停止処理）
sub memb_stop{
	my @lines;
	my @NEW;

	&getcookie;
	if(!&admin_certain($COOKIE{'adminpass'})){
		&error("認証エラー","パスワードが一致しません。");
	}

	&lock("memb");

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

	foreach $line(@lines){
		$temp = $line;
		($account,$email,$password,$ok_flg,$time,$host,$useragent) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);

		#-----（引数のアカウントと一致するか）
		foreach $stpacnt(@stpaccount){
			if($account eq $stpacnt){
				$line = "\"$account\",\"$email\",\"$password\",\"1\",\"$time\",\"$host\",\"$useragent\",\n"
			}
		}

		#-----（$lineをNEWに出力）
		push(@NEW,$line);
	}

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

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

	&unlock("memb");

}

#----------（会員再開処理）
sub memb_start{
	my @lines;
	my @NEW;
	
	&getcookie;
	if(!&admin_certain($COOKIE{'adminpass'})){
		&error("認証エラー","パスワードが一致しません。");
	}

	&lock("memb");

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

	foreach $line(@lines){
		$temp = $line;
		($account,$email,$password,$ok_flg,$time,$host,$useragent) = map{scalar(/^"(.*)"$/,$_ = $1,s/""/"/g,$_)} ($temp =~ /("(?:[^"]|"")*"),/g);

		#-----（引数のアカウントと一致するか）
		foreach $stracnt(@straccount){
			if($account eq $stracnt){
				$line = "\"$account\",\"$email\",\"$password\",\"0\",\"$time\",\"$host\",\"$useragent\",\n"
			}
		}

		#-----（$lineをNEWに出力）
		push(@NEW,$line);
	}

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

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

	&unlock("memb");

}
#----------（登録者にメールを送る）
sub sendmail_to{
	my $account = shift @_;
	my $message= shift @_;
	my $subject = shift @_;

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

	open(OUT,"| $sendmail $qs{'EMAIL'}")||&error('システム異常です','何らかの原因で処理できません。');
	print OUT "X-Mailer: MembersBBS\n";
	print OUT "From: $admin_mail\n";
	print OUT "To: $qs{'EMAIL'}\n";
	if ($cc_flg == 1) { print OUT "CC: $admin_mail\n"; }
	print OUT "Reply-To: $admin_mail\n";

	&jcode::convert(\$subject,"jis");
	print OUT "Subject:$subject\n";
	print OUT "Content-Transfer-Encoding: 7bit\n";
	print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n";

	&jcode::convert(\$message,"jis");
	print OUT $message;

	print OUT "\n\n";
	
	print OUT &jcode'jis("  アカウント：")."$account\n";
	print OUT &jcode'jis("  パスワード：")."$pass_line\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);

	if ($cc_flg == 1) { &sendmail_cc($account,$message,$subject); }	#--------（管理者にも送信する）

}

#----------（管理者にもメールを送る）

sub sendmail_cc{
	my $account = shift @_;
	my $message= shift @_;
	my $subject = shift @_;

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

	print OUT "X-Mailer: MembersBBS\n";
	print OUT "From: $admin_mail\n";
	print OUT "To: $qs{'EMAIL'}\n";
	if ($cc_flg == 1) { print OUT "CC: $admin_mail\n"; }
	print OUT "Reply-To: $admin_mail\n";

	&jcode::convert(\$subject,"jis");
	print OUT "Subject:$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("このメールは、掲示板へ会員登録があったことを管理者に伝えるために送信しています。");
	print OUT "\n\n";
	&jcode::convert(\$message,"jis");
	print OUT $message;

	print OUT "\n\n";
	
	print OUT &jcode'jis("  アカウント：")."$account\n";
	print OUT &jcode'jis("  パスワード：")."$pass_line\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);
}


