#!/usr/local/bin/perl

#===========================================================
# wwwboard: Version 2.61
# Copyright (C) 1997, 2000 とほほ
# http://wakusei.cplaza.ne.jp/twn/wwwboard.htm
# フリーソフト・再配布/改造/流用可能・確認メール不要
#===========================================================

#
# 1997.03.23 初版
# 1997.03.?? 改行を改行として扱うように修正
# 1997.04.10 時間帯が狂ってしまうことがある問題に対処
# 1997.04.20 長いタグを書くと強制的に改行が挿入されてしまう問題に対処
# 1997.05.11 初期値を300行に減らした
# 1997.05.11 「再描画」を「再表示」に
# 1997.05.11 「戻る」ボタンをつけた
# 1997.05.18 「伝言板」に改名
# 1997.06.08 メールアドレスを入力できるようにした
# 1997.06.15 ＵＲＬを入力できるようにした
# 1997.06.15 曜日を表示するようにした
# 1997.06.15 漢字コードの文字化けに対処した。(jcode採用)
# 1997.07.06 10分以上古いロックファイルは削除するようにした
# 1997.08.24 NN2.0で文字化けするバグを修正
# 1997.10.19 自己診断機能を強化
# 1997.11.09 HTMLタグを許さない指定を可能にした
# 1998.04.12 x-sjisを指定しないようにした
# 1998.05.24 リロードしても二重書き込みしないようにした
# 1998.05.24 アンパ(&)とクォート(")も文字化けしないようにした
# 1998.05.25 二重書き込み禁止がNetscapeサーバーで動かなかったので一時見送り
# 1998.08.02 </BODY></HTML>の書き忘れを修正
# 1998.11.08 SIGPIPE対処とエラー時のメッセージ追加
# 1999.02.07 Ver2.52 2000年対応
# 1999.05.23 Ver2.53 クライアントがJISを送信するときの文字化けに対処
# 1999.06.06 Ver2.54 ロックファイルのパーミッションを755から0755に修正
# 1999.10.03 Ver2.55 誤ってロックファイルを消してしまうことがあるバグを修正
# 2000.03.19 Ver2.60 HTMLタグの使用を禁止
# 2000.03.20 Ver2.61 シンタックスチェック
#

#
# Maximum number of messages
#
$max_msgs = 0;

#
# Return URL
#
$return_url = "../index.html";

#
# Return ADDRESS
#
$return_address = "../board.html";

#
# Allow HTML tags
#
$allow_html = 0;

#
# Set timezone
#
$ENV{'TZ'} = "JST-9";

#
# Constant variables
#
@wdays = ( "日", "月", "火", "水", "木", "金", "土", "日" );

#
# Test mode
#
if ($ARGV[0] eq "test") {
	print "Content-type: text/html\n";
	print "\n";
	print "<HTML>\n";
	print "<HEAD>\n";
	print "<TITLE>wwwboard test</TITLE>\n";
	print "</HEAD>\n";
	print "<BODY TEXT=black BGCOLOR=white>\n";
	print "CGIスクリプトは正常に動作しています。\n";
	if (! -d "lock") {
		print "<BR>NG. lockディレクトリが存在しません。\n";
	} elsif (! -w "lock") {
		print "<BR>NG. lockディレクトリに書き込みができません。\n";
	} elsif (-d "lock/wwwboard.loc") {
		print "<BR>NG. lock/wwwboard.loc が残っています。\n";
	}
	if (! -f "wwwboard.dat") {
		print "<BR>NG. wwwboard.dat が存在しません。\n";
	} elsif (! -w "wwwboard.dat") {
		print "<BR>NG. wwwboard.dat に書き込みできません。\n";
	}
	if (! -f "wwwboard.tmp") {
		print "<BR>NG. wwwboard.tmp が存在しません。\n";
	} elsif (! -w "wwwboard.tmp") {
		print "<BR>NG. wwwboard.tmp に書き込みできません。\n";
	}
	print "</BODY>\n";
	print "</HTML>\n";
	exit(0);
}

#
# Japanese KANJI code
#
if (-f "jcode.pl") {
	$jflag = 1;
	require "jcode.pl";
	$code = ord(substr("漢", 0, 1));
	if ($code == 0xb4) {
		$ccode = "euc";
	} elsif ($code == 0x1b) {
		$ccode = "jis";
	} else {
		$ccode = "sjis";
	}
}

#
# Read variables
#
if ($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
	@a = split(/&/, $query_string);
	foreach $x (@a) {
		($name, $value) = split(/=/, $x);
		$value =~ tr/+/ /;
		$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
		if ($jflag) {
			&jcode'convert(*value, "euc");
		}
		if ($allow_html) {
			$value =~ s/<!--/&lt;!--/g;
			$value =~ s/-->/--&gt;/g;
		} else {
			$value =~ s/&/&amp;/g;
			$value =~ s/"/&quot;/g;
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
		}
		if ($jflag) {
			&jcode'convert(*value, $ccode);
		}
		$FORM{$name} = $value;
	}
}

#
# File lock
#
foreach $i ( 1, 2, 3, 4, 5, 6 ) {
	if (mkdir("lock/wwwboard.loc", 0755)) {
		last;
	} elsif ($i == 1) {
		($mtime) = (stat("lock/wwwboard.loc"))[9];
		if ($mtime < time() - 600) {
			rmdir("lock/wwwboard.loc");
		}
	} elsif ($i < 6) {
		sleep(2);
	} else {
		print "Content-type: text/html\n";
		print "\n";
		print "<HTML>\n";
		print "<HEAD>\n";
		print "<TITLE>掲示板</TITLE>\n";
		print "</HEAD>\n";
		print "<BODY>\n";
		print "<H1>掲示板</H1>\n";
		print "<HR>\n";
		print "只今、掲示板が混雑しております。しばらくお待ちの上、";
		print "再度アクセスお願いします。\n";
		print "<HR>\n";
		print "</BODY>\n";
		print "</HTML>\n";
		exit(1);
	}
}

#
# Remove lockfile when terminated by signal
#
sub sigexit { rmdir("lock/wwwboard.loc"); exit(0); }
$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit";

#
# Write to date file
#
if ($FORM{'MESSAGE'} ne "") {

	#
	# Get date and time
	#
	($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
	$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d",
		$year + 1900, $mon + 1, $mday, $wdays[$wday],
		$hour, $min, $sec);

	#
	# Write current message.
	#
	$FORM{'MESSAGE'} =~ s/\r*$//g;
	$FORM{'MESSAGE'} =~ s/\r/<BR>/g;
	open(OUT, "> wwwboard.tmp");
	print OUT "<TABLE><TR><TD>\n";
	if ($FORM{'URL'} eq "") {
	    print OUT "<FONT COLOR=\"#FF0000\">$FORM{'FROM'}</FONT> $date\n";
	} elsif ($FORM{'URL'} =~ /^http:/) {
	    print OUT "<A HREF=\"$FORM{'URL'}\">$FORM{'FROM'}</A> $date\n";
	} else {
	    print OUT "<A HREF=\"mailto:$FORM{'URL'}\">$FORM{'FROM'}</A> $date\n";
	}
	print OUT "<BR>$FORM{'MESSAGE'}\n";
	print OUT "</TD></TR></TABLE>\n";
	print OUT "<HR>\n";

	#
	# Append messages.
	#
	open(IN, "wwwboard.dat");
	while (<IN>) {
		print OUT;
	}
	close(IN);
	close(OUT);

	#
	# Copy .tmp to .dat
	#
	open(IN, "wwwboard.tmp");
	open(OUT, "> wwwboard.dat");
	$msgs = 0;
	while (<IN>) {
		if ($_ =~ /^<TABLE><TR><TD>/) {
			if ($max_msgs != 0) {
				if ($msgs++ >= $max_msgs) {
					last;
				}
			}
		}
		print OUT;
	}
	close(IN);
	close(OUT);
}

#if ($ARGV[0] eq "reload") {
#	rmdir("lock/wwwboard.loc");
#	print "Location: $ENV{'SCRIPT_NAME'}\n";
#	print "\n";
#	exit(0);
#}

#
# Print HTML document
#
print "Content-type: text/html\n";
print "\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>ゲストブック</TITLE>\n";
print "</HEAD>\n";
print "<BODY TEXT=black BGCOLOR=white>\n";
print "<H2>ゲストブック</H2>\n";
if ($return_url ne "") {
	print "<A HREF=\"$return_url\">[インデックスに戻る]</A>\n";
}
if ($return_address ne "") {
	print "<A HREF=\"$return_address\">[戻る]</A>\n";
}
print "<HR>\n";
print "ゲストブックです。気軽に書き込んで下さい。タグは使えません。<BR>\n";
print "<HR>\n";
#print "<FORM METHOD=POST ACTION=\"wwwboard.cgi?reload\">\n";
print "<FORM METHOD=POST ACTION=\"wwwboard.cgi\">\n";
print "<TABLE BORDER=1>\n";
print "<TR>";
print "<TD>お名前：</TD>";
print "<TD><INPUT TYPE=text NAME=FROM SIZE=54 VALUE=\"$FORM{'FROM'}\"></TD>\n";
print "</TR>\n";
print "<TR>";
print "<TD>ＵＲＬ：</TD>";
print "<TD><INPUT TYPE=text NAME=URL SIZE=54 VALUE=\"$FORM{'URL'}\"></TD>";
print "</TR>\n";
print "<TR>";
print "<TD COLSPAN=2><SMALL>URLにはメールアドレスか、http:で始まるホームページアドレスを入れてください。省略可。</SMALL></TD>\n";
print "</TR>\n";
print "<TR><TD COLSPAN=2>";
print "<TEXTAREA ROWS=3 COLS=60 NAME=MESSAGE></TEXTAREA></TD></TR>\n";
print "</TABLE>\n";
print "<P><INPUT TYPE=submit VALUE=\"送信 / 再読み込み\">\n";
print "</FORM>\n";
print "<HR>\n";
open(IN, "wwwboard.dat");
while (<IN>) {
	print;
}
close(IN);
print "</BODY>\n";
print "</HTML>\n";

#
# File unlock
#
rmdir("lock/wwwboard.loc");