#!/flamingo/cgi-bin/perl

# ↑各プロバイダで指定しているパスを記述
#
# Colorful_BBS v.1.0（フリーソフト）
# 
# Last Modified:2000/04/26
# Copyright (C) 2000 suepon , All rights reserved.
# http://CGIScriptMarket.com/
#
# special thanks !!　rescue様
# ファイルロックシステムの一部を
# Web裏技( http://www.rescue.ne.jp/ )製スクリプトより移植
#
#----------------------　初期設定ここから　----------------------#

# マスターパスワードの設定（これだけは必ず設定して下さい）
# 半角数字で４文字まで
$master = "1939";

# [終了]を押したときに戻るページ（http://からのフルパスでも良い）
$home = "http://www.kayazono.com/flamingo/flamingo_hyosi.htm";

# ログファイルの名前
$file = "log.dat";

# ログファイルを設置するディレクトリ
$tmp = "flamingo/cgi-bin/data/";

# ファイルロック（書込が頻繁にあり、同時投稿などの可能性がある場合は 1 にする）
$lock_mode = 0;	# ファイルロックOFF = 0  ファイルロックON = 1

# このページのタイトル（ページ最上部に表示、タグ使用可）
$title_logo = '<table border=5 bgcolor=#336648><tr><td><font size=4 color=#ffffff><b>フラミンゴ会投稿のページ</b></font></td></tr></table>';

# タイトルバーに入るタイトル（<title></title>内、タグ使用不可）
$title_name = "フラミンゴ会投稿のページ"; 


# 記事を投稿した時にその記事部分を自動表示する頭出し機構（JavaScript使用）
$head_search = 1; # 頭出し OFF = 0  ON = 1

# 記事表示部分の横幅を画面（フレーム）の全幅に対する割合で記述（％表示）
$log_wid = 80;	# （このままなら全体の８０％幅になる）

# 記事タイトルの背景色
$title_back = "#000000";

# 記事タイトルの文字色
$title_color = "#ffff00";

# 記事タイトル部の日付の色
$date_color = "#ffffff";

# 入力形式（不都合がある場合はGETに変えてみる）
$method = "POST";

# １ページに表示する記事数
$max_line = 20;

# 記事の最大記録数（あまり多くしないこと）
$max_log = 100;

# 背景色と文字色が同一色での投稿
# 許可しない = 0; 許可する = 1;
$col_mode = 0;

# 投稿時のタグの使用
# 許可しない = 0; 許可する = 1;
$tag_mode = 0;

# 記事投稿時の背景色及び文字色設定
# '色１','色２','色３'という形式で好きなだけ設定して下さい。
@COLORS = ('#000000','#ffffff','#ffff00','#ff0000','#008040','#0000ff','#ff00ff','#00ff00','#ff1493','#ff8040','#000080','#00ffff','#7fffd4','#8b0000','#9cff63');

# ページの基本色設定（上の配列の左から何番目の色かを 0 から数えて指定）
# 基本背景色
$base_bcol = 14; # このままだと#9cff63
# 基本文字色
$base_font = 0; # このままだと#000000

# ハイパーテキストのスタイル設定
$style = "
<STYLE TYPE=\"text/css\">
<!--
A                { text-decoration: none; }
A:link           { text-decoration: none; color:#0000ff; }
A:visited        { text-decoration: none; color:#0000ff; }
A:hover          { text-decoration: underline; color:0000ff; }
-->
</STYLE>
";

# jcode.pl の場所
require 'flamingo/cgi-bin/jcode.pl';

# アイコン用画像
$mail_img1 = "mail_off.gif";		# E-mailの登録が無い場合
$mail_img2 = "mail.gif";		# E-mailの登録がある場合
$mail_size = "width=10 height=10";	# ↑の画像のサイズ


#------------------　初期設定ここまで　------------------#

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

@youbi = ('日','月','火','水','木','金','土');
$month = ($mon + 1);
if ($year < 2000) { $year+=1900; }
if ($month < 10) { $month = "0$month"; }
if ($mday < 10)  { $mday  = "0$mday";  }
if ($sec < 10)  { $sec =  "0$sec";  }
if ($min < 10)  { $min =  "0$min";  }
if ($hour < 10) { $hour = "0$hour"; }

$date_now = "$year年$month月$mday日($youbi[$wday])$hour時$min分$sec秒";
$num = "$year$month$mday$hour$min$sec";
$body = "<body bgcolor=$COLORS[$base_bcol] text=$COLORS[$base_font]>";
$cookie_name = "flamingo_BBS";
$agent = $ENV{'HTTP_USER_AGENT'};
$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; }

if ($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
else {
	$buffer = $ENV{'QUERY_STRING'};
}

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

        ($par, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ s/\n//g;
        $value =~ s/\,//g;
        $value =~ s/"/&quot/g;
        $value =~ s/<!--#(.|\n)*-->//g;
        &jcode'convert(*value,'sjis');

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

$cookies = $ENV{'HTTP_COOKIE'};
@pairs = split(/;/,$cookies);
foreach $pair (@pairs) {
	($par, $value) = split(/=/, $pair);
	$par =~ s/ //g;
	$DUMMY{$par} = $value;
	}
@pairs = split(/,/,$DUMMY{'flamingo_BBS'});
foreach $pair (@pairs) {
	($par, $value) = split(/:/, $pair);
	$COOK{$par} = $value;
	}

if ($FORM{'action'} eq 'remove') { &delete; }
elsif ($FORM{'action'} eq 'regist') { &regist; }
else { &main; }

sub main {

	if ($agent =~ /MSIE/i) { $name_size = 30; $url_size = 70; $cr = 8; $cc = 60; }
	else { $name_size = 20; $url_size = 50; $cr = 6; $cc = 50; }

	$opt1 = "<table border=1 cellspacing=0 cellpadding=0><tr>\n";
	$opt2 = "<table border=1 cellspacing=0 cellpadding=0><tr>\n";

	foreach (0..$#COLORS) {
		if( $_ eq $base_bcol ) { $b_check = " checked"; } else { $b_check = ""; }
		if( $_ eq $base_font ) { $f_check = " checked"; } else { $f_check = ""; }
		$opt1 = $opt1 . "<td bgcolor=$COLORS[$_]><input type=radio name=f_col value=\"$COLORS[$_]\"$f_check></td>\n";
		$opt2 = $opt2 . "<td bgcolor=$COLORS[$_]><input type=radio name=bg_col value=\"$COLORS[$_]\"$b_check></td>\n";
	}

	$opt1 = $opt1 . "</tr></table>\n";
	$opt2 = $opt2 . "</tr></table>\n";

        print "Content-type: text/html\n\n";
        print "<html><head>\n";
	print "<title>$title_name</title>";
        print "$style\n</head>\n";

	if($head_search && $FORM{'action'} eq 'regist') { print "<body bgcolor=$COLORS[$base_bcol] text=$COLORS[$base_font] onLoad=\"document.location='\#$FORM{'label'}'\">"; }
	else { print "<body bgcolor=$COLORS[$base_bcol] text=$COLORS[$base_font]>"; }

        print "<center>\n$title_logo<p>\n";
	print "$msg\n";
	print "<table cellspacing=0 cellpadding=0 border=0><form method=$method action=\"flamingo_bbs.cgi\">\n";
	print "<input type=hidden name=action value=regist>\n";
	print "<input type=hidden name=label value=\"log_top\">\n";
	print "<tr><td>タイトル</td><td><input type=text name=title size=$name_size></td></tr>\n";
	print "<tr><td>お名前</td><td><input type=text name=name size=$name_size value=$COOK{'name'}></td></tr>\n";
	print "<tr><td>Eメール</td><td><input type=text name=mail size=$name_size value=$COOK{'mail'}> <input type=checkbox name=cookie_mode value=1 checked><font size=2>クッキー有効</font></td></tr>\n";
	print "<tr><td>コメント</td><td><textarea name=coment rows=$cr cols=$cc wrap=off></textarea></td></tr>\n";
	# print "<tr><td>URL</td><td><input type=text name=url size=$url_size value=\"http://\"></td></tr>\n";
	print "<tr><td>文字色</td><td>$opt1</td></tr>\n";
	print "<tr><td>背景色</td><td>$opt2</td></tr>\n";
	print "<tr><td>暗証番号</td><td><input type=password name=pass size=5 value=$COOK{'pass'}><font size=2>半角数字４桁（削除時に使用）</font>\n";
	print "<input type=submit value=\"  書き込む  \">　<input type=reset value=\"リセット\"></td></form></tr>\n";
	print "<tr><td colspan=2 align=center><hr>\[<a href=\"./flamingo_bbs.cgi\">更新</a>\]\[<a href=\"javascript:history.go(-1)\">戻る</a>\]\[<a href=\"$home\">終了</a>\]</td></tr>\n";
	print "</table>\n</center>\n";
        print "</center>\n<hr>\n<center>\n";
	print "<form method=$method action=\"flamingo_bbs.cgi\">\n";
	print "<input type=hidden name=\"action\" value=\"remove\">\n";
	print "<a name=\"log_top\"></a>\n";
	print "<table border=1 cellpadding=1 cellspacing=1 width=$log_wid%>\n";
	print "<tr><td bgcolor=#dcdcdc align=right><font size=2>暗証番号</font><input type=password name=pass size=5 value=$COOK{'pass'}>\n";
	print "<input type=submit value=\"記事削除\"></td></tr>\n";

	if (!open(DB,"$tmp$file")) { &error("[ $file ]が開けませんでした。"); }
	@lines = <DB>;
	close(DB);

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

	$end = $top + $max_line - 1;
	if ($end > $#lines) { $end = $#lines; }

	foreach ($top .. $end) {

		$no = $_ + 1;

		$lines[$_] =~ s/\n//g;
                ($number,$date,$title,$name,$mail,$coment,$url,$bg_col,$f_col,$pass,$host) = split(/\,/,$lines[$_]);

                $coment =~ s/&quot/"/g;

		if($mail) { $mail = "<a href=\"mailto:$mail\"><img src=\"$mail_img2\" border=0 $home_size></a>"; }
		else { $mail = "<img src=\"$mail_img1\" $mail_size>"; }

		if($url) { $url = "<a href=\"$url\" target=\"_blank\"><img src=\"$home_img2\" border=0 $home_size></a>"; }
		else { $url = "<img src=\"$home_img1\" $home_size>"; }

		if($host) { $host = "\[$host\]" }

                print "<tr bgcolor=$title_back><td><font color=$title_color>\[$no\] <b>$title</b></font><div align=right><font color=$date_color size=2>$date</font></div></td></tr>\n";

                print "<tr bgcolor=$bg_col><td>\n";

                print "<font size=2 color=$f_col><b>$name</b>\n$host\n";

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

		print "<blockquote>$coment\n";

                print "</blockquote></font><p></td></tr>\n";

        }

	print "</form>\n";
	print "<form method=$method action=\"flamingo_bbs.cgi\">\n";
	print "<input type=hidden name=\"top\" value=\"$no\">\n<tr bgcolor=#dcdcdc><td align=center>\n";
	print "<font size=2>最大記録数：$max_log 件　\n";

	$p_top = $top + 1;
        if ($#lines >= 0) {
                if ($end ne $#lines) {
			print "現在 NO\.$p_top 〜 NO\.$no までを表\示 </font>\n<input type=submit value=\"次のページへ\"> \n";
		} else {
			print "現在 NO\.$p_top 〜 最後までを表\示</font> \n";
		}
	}

	print "\[<a href=\"./flamingo_bbs.cgi\">更新</a>\]\[<a href=\"javascript:history.go(-1)\">戻る</a>\]\[<a href=\"$home\">終了</a>\]\n";
	print "</td></tr></table></form>\n";
	print "<div align=center><font size=2><a href=\"http://CGIScriptMarket.com/\" target=\"_blank\">--- flamingo_bbs ---</a></font></div>\n";
#	↑この１行削除禁止
	print "</center></body></html>\n";
	exit;
}

sub regist {

	if ($FORM{'title'} eq '' || $FORM{'name'} eq '' || $FORM{'coment'} eq '' || $FORM{'pass'} eq '') { &error("記入漏れがあります"); }
	if ($tag_mode eq 0 && index($FORM{'coment'},"<") > -1) { &error("タグの使用は禁止されています"); }
	if ($col_mode eq 0 && $FORM{'bg_col'} eq $FORM{'f_col'}) { &error("背景色と文字色が同じです"); }

	$ch = 0;
	for ($i=0;$i<=9;$i++) {
		for($ii=0;$ii<=3;$ii++) {
			if( substr($FORM{'pass'},$ii,1) eq $i ) { $ch++; }
		}
	}

	$pass = $FORM{'pass'};

	if(length($FORM{'pass'}) ne 4 || $ch ne 4) { &error("暗証番号を半角数字４桁で入力して下さい"); }

	$FORM{'name'} =~ s/\://g; $FORM{'name'} =~ s/\=//g; $FORM{'name'} =~ s/</&lt;/g; $FORM{'name'} =~ s/>/&gt;/g;
	$FORM{'title'} =~ s/\://g; $FORM{'title'} =~ s/\=//g; $FORM{'title'} =~ s/</&lt;/g; $FORM{'title'} =~ s/>/&lt;/g;
	$FORM{'mail'} =~ s/\://g; $FORM{'mail'} =~ s/\=//g; $FORM{'mail'} =~ s/<//g; $FORM{'mail'} =~ s/>//g;
	# if($FORM{'url'} eq "http://") { $FORM{'url'} = ""; }
        # $FORM{'url'} =~ s/<//g; $FORM{'url'} =~ s/>//g; $FORM{'url'} =~ s/http\:\/\/http\:\/\//http\:\/\//g;
        $FORM{'coment'} =~ s/\t//g; $FORM{'coment'} =~ s/\r/<br>/g; $FORM{'coment'} =~ s/\n/<br>/g;

	if($lock_mode) { &lock1; }

	open(READ,"$tmp$file") || &error("[ $file ]が開けませんでした。");
	@lines = <READ>;
	close(READ);

	$i = 0;
	foreach $line (@lines) {

		$i++;
		if ($i == $max_log) { last; }
		push(@new,$line);
	}

        $value = "$num\,$date_now\,$FORM{'title'}\,$FORM{'name'}\,$FORM{'mail'}\,$FORM{'coment'}\,$FORM{'url'}\,$FORM{'bg_col'}\,$FORM{'f_col'}\,$pass\,$host\n";
        unshift(@new,$value);

	if($lock_mode) { $lock = "$$\.lock"; }
	else { $lock = $file; }

	open(WRITE,"> $tmp$lock") || &error("[ $file ]が開けませんでした。");
	print WRITE @new;
	close(WRITE);

	if($lock_mode) { &lock2; }

	if ($FORM{'cookie_mode'} eq 1) {
		($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = localtime(time + 30*24*60*60);
		$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);
		$COOK{'name'} = $FORM{'name'};
		$COOK{'mail'} = $FORM{'mail'};
		$COOK{'pass'} = $FORM{'pass'};
	} else {
		$date_gmt = "Sun, 01-Jan-1995 01:00:00 GMT";
		$COOK{'name'} = "";
		$COOK{'mail'} = "";
		$COOK{'pass'} = "";
	}

	$cook="name\:$FORM{'name'}\,mail\:$FORM{'mail'}\,pass\:$FORM{'pass'}";
	print "Set-Cookie: $cookie_name=$cook; expires=$date_gmt\n";

        &main;
}

sub delete {

	if($lock_mode) { &lock1; }

	open(READ,"$tmp$file") || &error("[ $file ]が開けませんでした。");
	@lines = <READ>;
	close(READ);

	foreach $line (@lines) {

		($number,$date,$title,$name,$mail,$coment,$url,$bg_col,$f_col,$pass,$host) = split(/\,/,$line);

		if ( $FORM{'pass'} eq $master ) { $pass = $master; }

		$del = 0;
		foreach $target (@RM) {

		if ($target eq $number && $pass eq $FORM{'pass'}) { $del = 1; }

		}

		if ($del == 0) { push(@new,$line); }
	}

	if($lock_mode) { $lock = "$$\.lock"; }
	else { $lock = $file; }

	open(WRITE,"> $tmp$lock") || &error("[ $file ]が開けませんでした。");
	print WRITE @new;
	close(WRITE);

	if($lock_mode) { &lock2; }

	&main;
}

sub error {

	print "Content-type: text/html\n\n";
	print "<html>\n<head>\n";
	print "<title>$title_name</title>\n";
	print "</head>\n$body\n<center>\n";
	print "<h1>エラー</h1><br><h2>$_[0]</h2>\n";
        print "</center></body></html>\n";
        exit;

}
sub lock1 {

	local($list,@lists);
	local($retry) = 3;

	$list = `ls $tmp$ls` || &error("渋滞中！ファイルをロックできません");
	@lists = grep(/\.lock/,split(/\s+/,$list));

	while (@lists) {

		if (--$retry <= 0) {

			foreach (@lists) { unlink "$tmp$_" || &error("渋滞中！ファイルをロックできません"); }
			&error("渋滞中！ファイルをロックできません");
		}

		sleep(1);

		$list = `ls $tmp$ls` || &error("渋滞中！ファイルをロックできません");
		@lists = grep(/\.lock/,split(/\s+/,$list));
	}
}

sub lock2 {

	local($list,@lists);

	$list = `ls $tmp$ls` || &error("渋滞中！書込に失敗した可能性があります");
	@lists = grep(!/$lock/,grep(/\.lock/,split(/\s+/,$list)));

	if (@lists) {

		if (-e "$tmp$lock") { unlink("$tmp$lock"); }
		&error("渋滞中！書込に失敗した可能性があります");
	}

	rename("$tmp$lock","$tmp$file") || &error("渋滞中！書込に失敗した可能性があります");

}
