#!/usr/local/bin/perl

;#  ↑このパスはプロバイダによって違うので調べて設定する
;#    (これはこのスクリプトの最初の１行になければならず、それより上に空行があってもいけません。)
;#    (この設定が必要ないサーバもあります。一般的な場合を想定して解説を入れています。)
;#    (他に、プロバイダからアナウンスされている情報を十分理解しておいてください。)
;#
;# 簡易ＢＢＳ version 9.07（フリーソフト）
;#
;# Script written by Kazu.Y
;# Created on: 02/05/96
;# I can be reached at: rescue@ask.ne.jp
;# Scripts Found at: http://www.rescue.ne.jp/

# [History]
# v8.90 11/AUG/98 v8.8にロック機能を付加
# v9.00 12/AUG/98 タグ処理を制限してセキュリティアップ
# v9.01 24/AUG/98 未入力処理(クッキー消去)時にリストされな不具合を修正
# v9.02 03/SEP/98 改行の扱いを３種類に変更
# v9.03 18/SEP/98 Ｅメール自動リンクの廃止
# v9.04 19/OCT/98 タブコードの取り扱い修正
# v9.05 26/OCT/98 記録データ制限の解除処理
# v9.06 22/NOV/98 エラー処理を改善
# v9.07 20/JUL/98 クッキーの２０００年対応

###########################################################################################
#
# ■重要！ v9シリーズはそれ以前のヴァージョンとデータの互換性がありません。
#
# 基本構成
#
#   /public_html/（ホームページディレクトリ）
#        |
#        |-- /cgi-bin/（任意のディレクトリ）
#                |
#                |-- jcode.pl (644)
#                |-- minibbs.cgi (755)
#                |
#                |-- /data/ (777)
#                       |
#                       |-- data.cgi (666)
#
#                   ・data.cgi は中身が空っぽのファイルをパソコン上で作成して転送する
#                   ・( )内はパーミッッション値
#
###########################################################################################

#----------------#
#    初期設定    #
#----------------#

#--- 必ずあなたの環境に合わせて書き替える項目 --------------------------------------------#

#◆掲示板の名前
#　''内に記述しますが、'を入れたい場合は '' を "" に替えてください.
#　ただしその場合、文字によって化けが生じることがあります.
#　詳しくは当サイトのＦＡＱを参照してください.
$title = '<FONT COLOR="#F7D21E"><H2>Jazz & LatinJazz Live Spot SOMEDAY in Tokyo</H2>
<H1>Add to Here Your Home page<BR>（みんなのホームページ宣伝コーナー<I>！</I>。）</H1></FONT>
<FONT SIZE=3> Please add your Homepage Address for your Propaganda !<BR>
    みなさん、ここにあなたのホームページのアドレスを書き込み宣伝してください！。<BR>
※正しいメールアドレスが記載されてないものは、全て削除します。</FONT><BR><BR>';

#◆このスクリプトをＵＲＬで設定
$reload = 'http://someday.net/Guestbook6/minibbs.cgi';

#◆画面の「終了」リンク先をＵＲＬで設定
$modoru = 'http://www.someday.net/';


#--- 必要に応じて設定する項目 ------------------------------------------------------------#

#◆画面の色や背景の設定 (HTML書式)
$body = '<body bgcolor="#74A0AC">';

#◆タイトル背景とタイトル文字色の設定
$title_back = 'DB7619';
$title_str = 'AQUA';

#◆投稿毎に管理者へ内容をメールする
#  メール機能は、いち早く不適切な投稿等をチェックすることができるように設計しました.
#  メールしない場合は $mailto $sendmail を設定する必要はありません.
#  投稿者がＥメールを記入している場合は、返信アドレスにそのＥメールが記載されます.
#  メールする:1 しない:0

$s_mail = 1;
$mailto = 'info@someday.net'; # 送信先Ｅメール
$sendmail = '/usr/lib/sendmail'; # 送信スクリプト(sendmail) プロバイダに聞くこと

#◆画面内に記述する文字列等 (HTML書式)
#　''内に記述しますが、'を入れたい場合は '' を "" に替えてください.
#　ただしその場合、文字によって化けが生じることがあります.
#　詳しくは当サイトのＦＡＱを参照してください.
#　必要ない場合は '' 内に何も書きません.

#◇タイトルの下位置に表示する文字列
$msg_top1 = '<FONT COLOR="00ffff">[<A HREF="../index.html"><FONT COLOR="00ffff">Head</FONT></A>]</FONT> <FONT COLOR="00ffff">[<A HREF="../mise/sch.html"><FONT COLOR="00ffff">Live Schedule</FONT></A>]</FONT> <FONT COLOR="00ffff">[<A HREF="../mise/event.html"><FONT COLOR="00ffff">Event</FONT></A>]</FONT> <FONT COLOR="00ffff">[<A HREF="../mise/pickup.html"><FONT COLOR="00ffff">Pick Up Live</FONT></A>]</FONT></FONT>';
$msg_top2 = ' <FONT COLOR="00ffff">[<A HREF="../mise/party.html"><FONT COLOR="00ffff">貸し切り</FONT></A>]</FONT> <FONT COLOR="00ffff">[<A HREF="../mise/map.html"><FONT COLOR="00ffff">Map</FONT></A>] </FONT></FONT>';
$msg_top3 = '<FONT COLOR="00ffff">[<A HREF="../mise/mous-room.html"><FONT COLOR="00ffff">ROOM of MOU</FONT></A>]</FONT></FONT> <I>from 2002,21 April</I></FONT><img src="http://someday.net/mc/m_count.cgi?6minibbs"><HR>';

#◇投稿フォームの下位置に表示する文字列
$msg_mid1 = ' You  need Password for delete.<br>
 　投稿時には、この記事を削除する時に利用する削除キーを設定してください。<BR>';
$msg_mid2 = ' We keep your Password.<BR>
 　一度設定して投稿すれば一定期間同じ削除キーが保存されます。<br>';
$msg_mid3 = ' When rewrite . a number of [resubmit] next [submit].<BR>
 　入力欄に記憶された内容を消去するには、[書き直し]→[書き込む]を順番に押します。
';

#◇最下部に表示する文字列
$msg_btm1 = ' If you want delete your comments . Please check [delete] and additional your Password.<br>
 　削除は、[削除]欄をチェックして、投稿時に設定した削除キーをすぐ上の欄に入力してボタンを押します。<BR>';
$msg_btm2 = ' If you foregot your Password . You can not delete !.<br>
 　削除キーが合致しない記事は削除されません。<BR>';
$msg_btm3 = ' SOMEDAY can delete all .<BR>
 　削除キー欄にマスターキー(管理者のみ)を入力すると任意の記事の削除が可能です。
';

#◆$reloadで設定した設置ＵＲＬ以外のフォームからの投稿を禁止する処置 する:1 しない:0
#　悪戯の防止用ですが、利用サーバやブラウザによっては正規投稿もできなくなる場合もあります.
$ref_axs = 1;

#◆１記事の最大記録サイズ(bytes) 0で無制限
$max_size = 0;

#◆１画面に表示する記事件数
$def = 10;

#◆書き込み件数の最大登録数の設定です。この件数を超えると、古いものから削除されていきます.
#　ページ処理機能が付きましたので、この件数を大きくしても一度に表示される記事数は限定されます.
#　記録されたファイルの巨大化を防止する為に、ある程度の件数で自動削除されるようにします.
#　サーバ負荷を考慮して、あまり大きくしないことが重要です.
$max = '100';

#◆日本語コード変換ライブラリ
#　minibbs.cgiと同じ場所に設置する場合はこのままでよい.
require './jcode.pl';

#◆内容が書き込まれる記録ファイルの名前（パスの設定ではない！）
$file = 'data.cgi';

#◆データディレクトリのパスの設定（処理の都合上 / で閉じない）
$tmp_dir = './data';

#◆海外サーバ等で時差が生じる場合は修正します
#　海外時間に＋９時間する場合　= localtime(time + 9*60*60);
#　海外時間に−９時間する場合　= localtime(time - 9*60*60);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + 14*60*60);

#◆クッキーの消化設定
#　最終書き込みから   30日後 30*24*60*60
#　　　　　　　　　　　1日後 24*60*60
#　　　　　　　　　 10時間後 10*60*60
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60);

#◆入力形式の設定　標準入力:1(post) その他:0(get)
#　投稿ボタンを押して Method not implemented.. 等というエラーが出る場合は get で試すこと
#　getの場合は文字制限がありますので長い文章等は途中で切れる可能性があります.
#　さらに、getの場合は不要な悪戯を受けてしまう環境になりますので、注意してください.
#　POST:1 GET:0
$method = 1;

###########################################################################################
#
# ・記録ファイルには処理の都合上特殊コードが記録されますので、直接編集はできません。
# ・スクリプトの中身を書き替える場合は、perlやCGIやHTMLなどのそれなりの知識が必要です。
#
###########################################################################################

@wday_array = ('日','月','火','水','木','金','土');
$date_now = sprintf("%01d月%01d日(%s)%02d時%02d分",$mon +1,$mday,$wday_array[$wday],$hour,$min);
$date_num = sprintf("%02d%02d%02d%02d%02d",$mon +1,$mday,$hour,$min,$sec); # <-変更禁止

&lock0;

if ($method eq '1' && $ENV{'QUERY_STRING'} ne '') { &error('エラー','不正利用の可能性があります.'); }

if ($method eq '1') { $method = 'post'; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }
else { $method = 'get'; $buffer = $ENV{'QUERY_STRING'}; }

@pairs = split(/&/,$buffer);
@pairs = (grep(/^action=/,@pairs),grep(!/^action=/,@pairs));
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');

	$value =~ s/\&/&amp;/g;
	$value =~ s/\"/&quot;/g;
	$value =~ s/</&lt;/g;
	$value =~ s/>/&gt;/g;

	if ($s_mail && $name eq 'value') {

		$mail_value = $value;
		if ($mail_value =~ /\r\n/) { $mail_value =~ s/\r\n/\n/g; }
		if ($mail_value =~ /\r/) { $mail_value =~ s/\r/\n/g; }
	}

	if ($FORM{'action'} eq 'regist') {

		if ($value =~ /\r\n/) { $value =~ s/\r\n/\r/g; }
		if ($value =~ /\n/) { $value =~ s/\n/\r/g; }
	}

	if ($name eq 'name' || $name eq 'email') { $value =~ s/\;//g; $value =~ s/\://g; $value =~ s/\,//g; }

	if ($name eq 'target') { push(@RM,$value); }
	else { $FORM{$name} = $value; }
}

if ($FORM{'action'} eq 'password') { &encode; }

$cookies = $ENV{'HTTP_COOKIE'};

@pairs = split(/;/,$cookies);
foreach $pair (@pairs) {

	($name, $value) = split(/=/, $pair);
	$name =~ s/ //g;
	$DUMMY{$name} = $value;
}

@pairs = split(/,/,$DUMMY{$reload});
foreach $pair (@pairs) {

	($name, $value) = split(/:/, $pair);
	$COOKIE{$name} = $value;
}

if ($FORM{'admin'} eq 'change') { &password; exit; }
if ($FORM{'action'} eq 'remove') { &remove; }
elsif ($FORM{'action'} eq 'regist') { &regist; }

if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$file が設定された場所にありません."); }
@lines = <DB>;
close(DB);

if (-z "$tmp_dir\/$file") { $first = 1; &password; exit; }
elsif (@lines[0] =~ /MiniBBSv8/) { &error('データエラー',"$file のデータ形式は簡易ＢＢＳv8シリーズのものと思われますので使えません."); }
elsif (!(@lines[0] =~ /MiniBBSv9/)) { &error('データエラー',"$file のデータはこの簡易ＢＢＳでは使えない構造である可能性があります."); }

&html;
exit;

sub html {

	#--- 入力フォーム画面 --------------------------------#

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

	print "<html><head><title>$title</title></head>\n";
	print "$body\n";
	print "<h1>$title</h1>\n";

	print "$msg_top1\n";
	print "$msg_top2\n";
	print "$msg_top3<p>\n";

	print "<form method=$method action=\"$reload\">\n";
	print "<input type=hidden name=\"action\" value=\"regist\">\n";

	print "･ 投稿者 [your name] <input type=text name=\"name\" size=40 value=\"$COOKIE{'name'}\" maxlength=40><br>\n";
	print "･ メール [your E-Mail] <input type=text name=\"email\" size=40 value=\"$COOKIE{'email'}\"><br>\n";
	print "･ 題名＆あなたの住所、国 [title &your address & country]<BR>　<input type=text name=\"subject\" size=80 maxlength=80><br>\n";
	print "･ 内　容 [comments] <font size=-1> ";
	print "<input type=radio name=\"how\" value=\"2\" checked>改行有効 (bigin a new line) ";
	print "<input type=radio name=\"how\" value=\"0\">改行無効 (no new line) ";
	print "<input type=radio name=\"how\" value=\"1\">図/表\モード</font><br>\n";
	print "　　<textarea name=\"value\" rows=5 cols=120 wrap=off></textarea><br>\n";

	print "　　　 <input type=submit value=\" 書き込む [submit] \"><input type=reset value=\"書き直し [resubmit]\">  <BR>";

	print "削除キー [key for delete] <input type=password name=\"pwd\" size=10 value=\"$COOKIE{'pwd'}\"> <font size=-1>your password(記事削除時に使用)</font></form><p>";

	print "$msg_mid1\n";
	print "$msg_mid2\n";
	print "$msg_mid3<p>\n";

	print "<table border=1 cellpadding=2 cellspacing=2><tr>\n";
	print "<th><font size=+1><a href=\"$reload\">更新[renewal]</a></font></th>\n";
	print "<th><font size=+1><a href=\"$modoru\" target=\"_top\">終了 [back to Head]</a></font></th>\n";
	print "</tr></table><p>\n\n";

	#--- 記録記事の出力 ----------------------------------#

	@lines = reverse(@lines);

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

	$page_end = $page + $def - 1;
	if ($page_end > $#lines) { $page_end = $#lines; }

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

	foreach ($page .. $page_end) {

		if ($lines[$_] =~ /^\"(\d+)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\",\"(.*)\"/) {

			$number = $1;
			$pwd = $2;
			$name = $3;
			$email = $4;
			$host = $5;
			$date = $6;
			$subject = $7;
			$link = $9;
			$how = $10;

			$value = $8;
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
			if ($link == 1) { $value =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig; }
			$value =~ s/&quot;/\"/g;
			$value =~ s/&amp;/\&/g;

			print "<hr size=5><p>\n";
			print "<table width=100% border=0><tr><td bgcolor=$title_back><font size=+2 color=$title_str><b>$subject</b></font></td></tr></table>\n";

			print "<i><b>投稿日 [date]</b> $date ";
			if ($email) { print "<b>投稿者 [your name]</b> <a href=\"mailto:$email\">$name</a> [$host]  "; } else { print "投稿者 [your name] $name [$host]  "; }

			print "<input type=checkbox name=\"target\" value=\"$number\">削除 [delete]<p></i>\n";

			print "<blockquote><font size=+1>\n";

			if ($how == 1) { print "<pre>$value</pre><p>\n"; }
			elsif ($how == 2) { $value =~ s/\r/<br>\r/g; print "$value<p>\n"; }
			else { print "$value<p>\n"; }

			print "</font></blockquote>\n";
		}
	}

	#--- 改ページ処理 ------------------------------------#

	$page_next = $page_end + 1;
	$i = $page + 1; $j = $page_end + 1;

	print "<hr><p><table border=1 cellpadding=2 cellspacing=2><tr>\n";

	print "<td>削除キー [key for delete] <input type=password name=\"pwd\" size=10 value=\"$COOKIE{'pwd'}\"> ";
	print "<BR><input type=submit value=\"削除 [delete]\"></td></form>\n";

	if ($#lines >= 0) {

		if ($page_end ne $#lines) {

			print "<td>新着順 [in order of<BR> Registration] $i \- $j</td>\n";
			print "<form method=$method action=\"$reload\">\n";
			print "<input type=hidden name=\"page\" value=\"$page_next\">\n";
			print "<td><input type=submit value=\"次のページ [Next Page]\"></td></form>\n";
		}
		else { print "<td>新着順 [in order of<BR> Registration] $i \-&gt; 最後</td>\n"; }
	}

	print "<td>最大記録<BR>件数 $max</td>\n";

	print "<th><font size=+1><a href=\"$reload\">更新<BR>（renewal）</a></font></th>\n";
	print "<th><font size=+1><a href=\"$modoru\" target=\"_top\">終了<BR> [back to Head]</a></font></th>\n";
	print "</tr></table><p>\n\n";

	print "$msg_btm1\n";
	print "$msg_btm2\n";
	print "$msg_btm3<p>\n";

	print "<table border=1 cellpadding=2 cellspacing=2><tr>\n";
	print "<form method=$method action=\"$reload\">\n";
	print "<input type=hidden name=\"admin\" value=\"change\">";
	print "<td><input type=submit value=\"マスターキー変更 [chenge password]\"></td></form>\n";
	print "</tr></table><p>\n\n";

	# このスクリプトの著作権表示（かならず表示してください）
	print "<h5 align=right><a href=\"http://www.rescue.ne.jp/\" target=\"_top\">MiniBBS</a><BR>◎本掲示板はレスキューさんのBBSを使用させていただき、<BR>これを改造させて頂きました。どうも有難うございました。</h5>\n";


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

sub regist {

	if ($ref_axs) {

		$ref = $ENV{'HTTP_REFERER'};
		$ref_url = $reload; $ref_url =~ s/\~/.*/g;
		if (!($ref =~ /$ref_url/i)) { &error('利用不可',"「$reload」以外からの投稿は受け付けられません.<BR>ERROR !. YOU NEED Real your name & your E-Mail address & your Password"); }
	}

	if ($FORM{'name'} eq '') { &error('入力ミス','投稿者を記入してください.<BR>You need real your name for write !.'); }
	$FORM{'name'} =~ s/</&lt;/g; $FORM{'name'} =~ s/>/&gt;/g;

	if ($FORM{'email'} ne '' && !($FORM{'email'} =~ /(.*)\@(.*)\.(.*)/)) { &error('入力ミス','メールアドレスの形式が間違っています.<BR>ERROR !. your E-Mail address.'); }
	$FORM{'email'} =~ s/</&lt;/g; $FORM{'email'} =~ s/>/&gt;/g;

	if ($FORM{'pwd'} eq '' || length($FORM{'pwd'}) < 6) { &error('入力ミス','削除キー欄に6文字以上の半角文字でパスワードを指定してください.<br>これは記事を削除する時に利用するものです.<BR>You need Password for delete.<BR>Please add Password more than 6 words.'); }

	if ($FORM{'subject'} eq '' && $FORM{'value'} eq '') {

		$COOKIE{'name'} = '';
		$COOKIE{'email'} = '';
		$COOKIE{'pwd'} = '';
		&cookie; 
		print "Set-Cookie: $reload=\n";

		if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$file が設定された場所にありません.<BR>ERROR !."); }
		@lines = <DB>;
		close(DB);

		&html;
		exit;
	}

	if ($FORM{'subject'} eq '') { &error('入力ミス','題名を記入してください.<BR>ERROR !. Please write Title'); }
	$FORM{'subject'} =~ s/</&lt;/g; $FORM{'subject'} =~ s/>/&gt;/g;

	if ($FORM{'value'} eq '') { &error('入力ミス','内容を記入してください.<BR>ERROR !. Please write Comments .'); }
	if ($max_size) {

		$value_size = length($FORM{'value'});
		if ($value_size > $max_size) { &error('入力ミス',"最大記録サイズ$max_sizeを超えています. 現在$value_sizeサイズです.<BR>ERROR !. too much your comments !."); }
	}

	&cookie;
	$cook="name\:$FORM{'name'}\,email\:$FORM{'email'}\,pwd\:$FORM{'pwd'}";
	print "Set-Cookie: $reload=$cook; expires=$date_gmt\n";

	#-- リムネット専用ホスト取得ルーチンの入れ替え位置 : ここから --#

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

	#-- リムネット専用ホスト取得ルーチンの入れ替え位置 : ここまで --#

	&lock1;

	if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$file が見つかりません. 設定を確認してください."); }
	@lines = <DB>; $password = shift(@lines);
	close(DB);

	&encode2($FORM{'pwd'});

	if ($max <= $#lines + 1) { shift(@lines); }
	push(@lines,"\"$date_num\"\,\"$pwd\"\,\"$FORM{'name'}\"\,\"$FORM{'email'}\"\,\"$host\"\,\"$date_now\"\,\"$FORM{'subject'}\"\,\"$FORM{'value'}\"\,\"$FORM{'link'}\"\,\"$FORM{'how'}\"\n");

	if (!open(DB,"> $tmp_dir\/$tmp_file")) { &error('設定ミス','テンポラリーファイルが作成できません.<BR>ERROR !.'); }
	print DB $password;
	print DB @lines;
	close(DB);

	&lock2;

	$COOKIE{'name'} = $FORM{'name'};
	$COOKIE{'email'} = $FORM{'email'};
	$COOKIE{'pwd'} = $FORM{'pwd'};

	if ($s_mail) { &e_mail; }
}

sub cookie {

	$y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday";
	$m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec";
	@youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6);
	@monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11);
	$date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg);
}

sub error {

	print "Content-type: text/html\n\n";
        print "<html><head><title>$title</title></head>\n";
        print "$body\n";
        print "<h1>$_[0]</h1>\n";
	print "<h3>$_[1]</h3>\n";
	print "ブラウザの[戻る]ボタンを押して前の画面に移動してください.（back）<p>\n";
        print "</body></html>\n";
        exit;
}

sub remove {

	&lock1;

	if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$file が見つかりません. 設定を確認してください.<BR>ERROR !."); }
	@lines = <DB>;
	close(DB);

	$password = shift(@lines);
	chop($password);
	($header,$password1) = split(/:/,$password);
	if ($password1 =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; }

	$target = join('|',@RM);
	if (crypt($FORM{'pwd'}, substr($password1,$salt,2)) eq $password1) { $admin = 1; }

	foreach $line (@lines) {

		if ($line =~ /^\"(\d+)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\"\,\"(.*)\",\"(.*)\"/) {

			$number = $1;
			$pwd = $2;

			if ($number =~ /$target/) {

				if (!$admin && crypt($FORM{'pwd'}, substr($pwd,$salt,2)) ne $pwd) { push(@NEW,$line);}
			}
			else { push(@NEW,$line); }
		}
	}

	if (!open(DB,"> $tmp_dir\/$tmp_file")) { &error('設定ミス','テンポラリーファイルが作成できません.<BR>ERROR !.'); }
	print DB "$password\n";
	print DB @NEW;
	close(DB);

	&lock2;

	@lines = @NEW;
}

sub password {

	if (-z "$tmp_dir\/$file") { $first = 1; }

	print "Content-type: text/html\n\n";
	print "<html><head><title>$title</title></head>\n";
	print "$body\n";
	print "<h1>マスターキーの設定/変更<BR>get pass word/chenge password</h1>\n";

	if ($first && $message eq '') { print "記事を削除するための管理パスワードを登録します。<BR>Registration of yor password)<p>\n"; }
	else { print "$message<p>\n"; }

	print "<form method=$method action=\"$reload\">\n";
	print "<input type=hidden name=\"action\" value=\"password\">\n";
	if (!$first) { print "旧パスワード（old password） <input type=password name=\"password_old\" size=10><br>\n"; }
	print "新パスワード [new password] <input type=password name=\"pwd\" size=10><br>\n";
	print "新パスワード [new password] <input type=password name=\"pwd2\" size=10>（確認のためもう一度）again<p>\n";
	print "<input type=submit value=\"     登録 [enter] \"></form><p>\n";
	print "</body></html>\n";
}

sub encode {

	&lock1;

	if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$file が見つかりません. 設定を確認してください.<BR>ERROR !."); }
	@lines = <DB>;
	close(DB);

	$password = shift(@lines);
	chop($password);
	($header,$password1) = split(/:/,$password);
	if ($password1 =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; }

	if ($header eq 'MiniBBSv9') { if (crypt($FORM{'password_old'}, substr($password1,$salt,2)) ne $password1) { $message = '旧パスワード（old password）が認証されませんでした.'; &password; exit; }}
	if ($FORM{'pwd'} =~ /\W/ || $FORM{'pwd'} eq '') { $message = '新パスワード（new password）に英数字以外の文字が含まれているか空欄です.'; &password; exit; }
	if ($FORM{'pwd'} ne $FORM{'pwd2'}) { $message = '確認のために入力された新パスワード（new password）が一致しません.'; &password; exit; }
	if (length($FORM{'pwd'}) < 6) { $message = '6文字以上の半角文字でパスワードを指定してください.<BR>Please add Password more than 6 word.'; &password; exit; }

	&encode2($FORM{'pwd'});

	if (!open(DB,"> $tmp_dir\/$tmp_file")) { &error('設定ミス','テンポラリーファイルが作成できません.<BR>ERROR !.'); }
	print DB "MiniBBSv9\:$pwd\n";
	print DB @lines;
	close(DB);

	&lock2;

	&html; exit;
}

sub encode2 {

	$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];
	if (!eval '$pwd = crypt($_[0], $nsalt);') { &error('エラー','暗号処理コマンドが使えませんので設置できません.<BR>ERROR !.'); }
}

sub e_mail {

	# 管理者に投稿をメールする

	if (!open(OUT,"| $sendmail -t")) { return; }

	print OUT "To: $mailto\n";
	if ($FORM{'email'} ne '') { print OUT "From: $FORM{'email'}\n"; }
	else { print OUT "From: $mailto\n"; }
	$subject = "[$title] 新着情報 [new one]";
	&jis("Subject: $subject"); print OUT "$msg\n";
	print OUT "Content-Transfer-Encoding: 7bit\n";
	print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n\n";

	&jis("投稿者 [your name]: $FORM{'name'}"); print OUT "$msg\n";
	&jis("Ｅメール [your E-Mail]: $FORM{'email'}"); print OUT "$msg\n";
	&jis("題名 [comments]: $FORM{'subject'}"); print OUT "$msg\n";
	&jis("\n$mail_value"); print OUT "$msg\n\n";

	close(OUT);
}

sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); }

sub lock0 {

	$ps = $$;
	if ($ps eq '') { $ps = $date_num; }
	$tmp_file = "$ps\.tmp";
	$ls = "$tmp_dir\/*.*";
}

sub lock1 {

	$list = `ls $ls`;
	if ($list eq '') { return; }
	@lists = split(/\s+/,$list);
	@lists = grep(/\.tmp/,@lists);

	local($retry) = 3;
	while (@lists) {

		if (--$retry <= 0) {

			foreach (@lists) { if (-e $_) { unlink; }}
			&error("Busy(1)",'ただ今混雑しております.（busy now）<br>再度実行してください.（try again）');
		}
		sleep(1);
		$list = `ls $ls`;
		@lists = split(/\s+/,$list);
		@lists = grep(/\.tmp/,@lists);
	}
}

sub lock2 {

	$list = `ls $ls`;
	@lists = split(/\s+/,$list);
	@lists = grep(/\.tmp/,@lists);
	@lists = grep(!/$tmp_file/,@lists);
	if (@lists) {

		if (-e "$tmp_dir\/$tmp_file") { unlink("$tmp_dir\/$tmp_file"); }
		&error("Busy(2)",'書き込みに失敗しました.（error）<br>再度実行してください.（try again）');
	}

	if (!rename("$tmp_dir\/$tmp_file","$tmp_dir\/$file")) { &error("Busy(3)",'書き込みに失敗しました.（error）<br>再度実行してください.（try again）'); } ;
	chmod 0666,"$tmp_dir\/$file";
}
