#!/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/ )製スクリプトより移植
#
#---------------------- 初期設定ここから ----------------------#
# マスターパスワードの設定(これだけは必ず設定して下さい)
# 半角数字で4文字まで
$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 = '
';
# タイトルバーに入るタイトル(内、タグ使用不可)
$title_name = "フラミンゴ会投稿のページ";
# 記事を投稿した時にその記事部分を自動表示する頭出し機構(JavaScript使用)
$head_search = 1; # 頭出し OFF = 0 ON = 1
# 記事表示部分の横幅を画面(フレーム)の全幅に対する割合で記述(%表示)
$log_wid = 80; # (このままなら全体の80%幅になる)
# 記事タイトルの背景色
$title_back = "#000000";
# 記事タイトルの文字色
$title_color = "#ffff00";
# 記事タイトル部の日付の色
$date_color = "#ffffff";
# 入力形式(不都合がある場合はGETに変えてみる)
$method = "POST";
# 1ページに表示する記事数
$max_line = 20;
# 記事の最大記録数(あまり多くしないこと)
$max_log = 100;
# 背景色と文字色が同一色での投稿
# 許可しない = 0; 許可する = 1;
$col_mode = 0;
# 投稿時のタグの使用
# 許可しない = 0; 許可する = 1;
$tag_mode = 0;
# 記事投稿時の背景色及び文字色設定
# '色1','色2','色3'という形式で好きなだけ設定して下さい。
@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 = "
";
# 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 = "";
$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/"/"/g;
$value =~ s///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') { ®ist; }
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 = "\n";
$opt2 = "\n";
$opt2 = $opt2 . "
\n";
print "Content-type: text/html\n\n";
print "\n";
print "$title_name";
print "$style\n\n";
if($head_search && $FORM{'action'} eq 'regist') { print ""; }
else { print ""; }
print "\n$title_logo\n";
print "$msg\n";
print "
\n\n";
print "\n
\n\n";
print "\n";
print "\n";
# ↑この1行削除禁止
print "\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("暗証番号を半角数字4桁で入力して下さい"); }
$FORM{'name'} =~ s/\://g; $FORM{'name'} =~ s/\=//g; $FORM{'name'} =~ s/</g; $FORM{'name'} =~ s/>/>/g;
$FORM{'title'} =~ s/\://g; $FORM{'title'} =~ s/\=//g; $FORM{'title'} =~ s/</g; $FORM{'title'} =~ s/>/</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/
/g; $FORM{'coment'} =~ s/\n/
/g;
if($lock_mode) { &lock1; }
open(READ,"$tmp$file") || &error("[ $file ]が開けませんでした。");
@lines = ;
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 = ;
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 "\n\n";
print "$title_name\n";
print "\n$body\n\n";
print "エラー
$_[0]
\n";
print "\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("渋滞中!書込に失敗した可能性があります");
}