#!/usr/local/bin/perl

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

# [History]
# v8.90 11/AUG/98 v8.8にロック機能を付加
# v8.91 26/AUG/98 未入力処理(クッキー消去)時にリストされな不具合を修正
# v8.92 06/JAN/99 文字列チェックの修正
# v8.93 20/JUL/99 クッキーの２０００年対応

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

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

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

#◆掲示板の名前
#　''内に記述しますが、'を入れたい場合は '' を "" に替えてください.
#　ただしその場合、文字によって化けが生じることがあります.
#　詳しくは当サイトのＦＡＱを参照してください.
$title = '<table border="0">
	<tr><td bgcolor="#444444">
	<font size="7" color="#dddddd">
みんなの伝言板
	</font></td></tr></table>
	<font size="4">
	
	</font>
	<BR>
	<font size="3">
	
	</font>';

#◆このスクリプトをＵＲＬで設定
$reload = 'http://www.izu.co.jp/~saigo/cgi-bin/minibbs.cgi';

#◆画面の「終了」リンク先をＵＲＬで設定
$modoru = 'http://www.izu.co.jp/~saigo/index.html';


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

#◆画面の色や背景の設定 (HTML書式)
$body = '<body bgcolor="#006622" text="#ffffff" LINK="fbfb00" ALINK="ff0055" VLINK="000000">';

#◆タイトル背景の設定
$title_back = '#555555';

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

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

#◆タグを使えるようにするかどうかの設定
#  <a href="リンク"></a>についてはＵＲＬフォームが用意してあるので、いたずらやタグの
#  閉じ忘れ等による混乱を避けるためにできるだけ使えないようにしておくことをお勧めします.
#  使える:1 使えない:0
$tag = 1;

#◆タグを使えるようにした場合に拒否する危険にもなるタグの指定 (書式はperl文法書を参照)
#　$tag = 0;にした場合はこのままでよい.
@kyohi = (

	'<table(.|\n)*>',
	'<meta(.|\n)*>',
	'<pre(.|\n)*>',
	'<form(.|\n)*>',
	'<embed(.|\n)*>',
	'<script(.|\n)*>',
	'<frame(.|\n)*>',
	'<a(.|\n)*on(.*)=(.|\n)*>',
	'<img(.|\n)*on(.*)=(.|\n)*>',
	'',
	'',
	'',

'');

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

#◇タイトルの下位置に表示する文字列
$msg_top1 = '<hr size=5><p>始めて来た方は、できるだけ<a href="../cgi-rec/minibbs.cgi">「紳士＆淑女録」</a>で自己紹介を書いてください｡<br>';
$msg_top2 = 'そうする事で、ほかの人が｢今度来たのはどんな人だ？｣<br>';
$msg_top3 = 'って言うのが分かっていいかなと思うのでお願いします。<br>';

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

#◇最下部に表示する文字列
$msg_btm1 = '■削除は、[削除]欄をチェックして、投稿時に設定した削除キーをすぐ上の欄に入力してボタンを押します.<br>';
$msg_btm2 = '■削除キーが合致しない記事は削除されません.<br>';
$msg_btm3 = '■削除キー欄にマスターキー(管理者のみ)を入力すると任意の記事の削除が可能です.';

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

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

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

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

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

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

#◆クッキーの消化設定
#　最終書き込みから   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;

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

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

###########################################################################################
#
# ・記録ファイルには処理の都合上特殊コードが記録されますので、直接編集はできません。
# ・スクリプトの中身を書き替える場合は、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;
	$value =~ s/<!--(.|\n)*-->//g;

	&jcode'convert(*value,'sjis');

	if ($value =~ /(.*)\"\,\"(.*)/) { &error('記入ミス','記録できない文字の並び「","」があります.'); }

	if ($tag) {

		foreach (@kyohi) {
	
			if (/^$/) { next; }
			if ($value =~ /$_/i) { &error('記入ミス','記録できないタグ記述があります.'); }
		}
	}

	else { $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 ($FORM{'how'} eq '1') { $value =~ s/\r/<br>\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 のデータ形式はこの簡易ＢＢＳでは使えません."); }

&html;
exit;

sub html {

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

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

	print "<html><head><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 "書く人 <input type=text name=\"name\" size=20 value=\"$COOKIE{'name'}\" maxlength=19><br>\n";
	print "お便り <input type=text name=\"email\" size=40 value=\"$COOKIE{'email'}\"><br>\n";
	print "タイトル <input type=text name=\"subject\" size=70 maxlength=69><br>\n";
	print "本  文 <font size=-1><input type=radio name=\"how\" value=\"1\" checked>自動スペース＆自動改行 ";
	print "<input type=radio name=\"how\" value=\"2\">入力した通りに表\示</font><br>\n";
	print "　　　 <textarea name=\"value\" rows=5 cols=70 wrap=off></textarea><br>\n";
	print "リンク <input type=text name=\"url\" size=70 value=\"http://\"><p>\n";
	print "　　　 <input type=submit value=\"     書き込む     \"><input type=reset value=\"書き直し\">  ";
	print "削除キー <input type=password name=\"pwd\" size=10 value=\"$COOKIE{'pwd'}\"> <font size=-1>(記事削除時に使用)</font></form><p>";

	print "$msg_mid1\n";
	print "$msg_mid2\n";
	print "$msg_mid3<p>\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;
			$value = $8;
			$url = $9;
			$how = $10;

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

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

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

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

			if ($how == 1) { print "$value<p>\n"; }
			else { print "<pre>$value</pre><p>\n"; }

			if ($url) { print "<a href=\"$url\" target=\"_top\">$url</a><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>削除キー <input type=password name=\"pwd\" size=10 value=\"$COOKIE{'pwd'}\"> ";
	print "<input type=submit value=\"削除\"></td></form>\n";

	if ($#lines >= 0) {

		if ($page_end ne $#lines) {

			print "<td>新着順 $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=\"次のページ\"></td></form>\n";
		}
		else { print "<td>新着順 $i \-&gt; 最後</td>\n"; }
	}

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

	print "<th><font size=+1><a href=\"$reload\">更新</a></font></th>\n";
	print "<th><font size=+1><a href=\"$modoru\" target=\"_top\">入り口へ戻る</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=\"マスターキー変更\"></td></form>\n";
	print "</tr></table><p>\n\n";

	# このスクリプトの著作権表示（かならず表示してください）
	print "<h5 align=right><a href=\"http://www.rescue.ne.jp/\" target=\"_top\">MiniBBS</a></h5>\n";
	print "なおこの伝言板はSaigoによって一部改変されております。\nご注意下さい。\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」以外からの投稿は受け付けられません."); }
	}

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

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

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

	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 が設定された場所にありません."); }
		@lines = <DB>;
		close(DB);

		&html;
		exit;
	}

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

	if ($FORM{'value'} eq '') { &error('入力ミス','内容を記入してください.'); }
	if ($max_size) {

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

	if ($FORM{'url'} ne '' && !($FORM{'url'} =~ m#(.*)tp(.*)://#)) { &error('入力ミス','ＵＲＬを正しく記入してください.'); }
	if ($FORM{'url'} =~ m#^(.*)tp(.*)://$#) { $FORM{'url'} = ''; }

	&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{'url'}\"\,\"$FORM{'how'}\"\n");

	if (!open(DB,"> $tmp_dir\/$tmp_file")) { &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 "ブラウザの[戻る]ボタンを押して前の画面に移動してください.<p>\n";
        print "</body></html>\n";
        exit;
}

sub remove {

	&lock1;

	if (!open(DB,"$tmp_dir\/$file")) { &error('設定ミス',"$file が見つかりません. 設定を確認してください."); }
	@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('設定ミス','テンポラリーファイルが作成できません.'); }
	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>マスターキーの設定/変更</h1>\n";

	if ($first && $message eq '') { print "記事を削除するための管理パスワードを登録します。<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 "旧パスワード <input type=password name=\"password_old\" size=10><br>\n"; }
	print "新パスワード <input type=password name=\"pwd\" size=10><br>\n";
	print "新パスワード <input type=password name=\"pwd2\" size=10>（確認のためもう一度）<p>\n";
	print "<input type=submit value=\"     登録     \"></form><p>\n";
	print "</body></html>\n";
}

sub encode {

	&lock1;

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

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

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

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

	if (!open(DB,"> $tmp_dir\/$tmp_file")) { &error('設定ミス','テンポラリーファイルが作成できません.'); }
	print DB "MiniBBSv8\:$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('エラー','暗号処理コマンドが使えませんので設置できません.'); }
}

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] 新着情報";
	&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("投稿者: $FORM{'name'}"); print OUT "$msg\n";
	&jis("Ｅメール: $FORM{'email'}"); print OUT "$msg\n";
	&jis("題名: $FORM{'subject'}"); print OUT "$msg\n";
	&jis("\n$mail_value"); print OUT "$msg\n\n";
	&jis("ＵＲＬ記入欄: $FORM{'url'}"); print OUT "$msg\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\/*\.tmp";
}

sub lock1 {

	$list = `ls $ls`;
	@lists = split(/\s+/,$list);

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

		if (--$retry <= 0) {

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

sub lock2 {

	$list = `ls $ls`;
	@lists = split(/\s+/,$list);
	@lists = grep(!/$tmp_file/,@lists);
	if (@lists) { unlink("$tmp_dir\/$tmp_file"); &error("Busy(2)",'書き込みに失敗しました.<br>再度実行してください.'); }

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


