#!/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"; 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 . "\n"; $opt2 = $opt2 . "\n"; } $opt1 = $opt1 . "
\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"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; # print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
タイトル
お名前
Eメール クッキー有効
コメント
URL
文字色$opt1
背景色$opt2
暗証番号半角数字4桁(削除時に使用)\n"; print " 

\[更新\]\[戻る\]\[終了\]
\n

\n"; print "\n
\n
\n"; print "
\n"; print "\n"; print "\n"; print "\n"; print "\n"; if (!open(DB,"$tmp$file")) { &error("[ $file ]が開けませんでした。"); } @lines = ; 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/"/"/g; if($mail) { $mail = ""; } else { $mail = ""; } if($url) { $url = ""; } else { $url = ""; } if($host) { $host = "\[$host\]" } print "\n"; print "\n"; } print "\n"; print "\n"; print "\n
暗証番号\n"; print "
\[$no\] $title
$date
\n"; print "$name\n$host\n"; print " $mail 削除\n"; print "
$coment\n"; print "

\n"; print "最大記録数:$max_log 件 \n"; $p_top = $top + 1; if ($#lines >= 0) { if ($end ne $#lines) { print "現在 NO\.$p_top 〜 NO\.$no までを表\示 \n \n"; } else { print "現在 NO\.$p_top 〜 最後までを表\示 \n"; } } print "\[更新\]\[戻る\]\[終了\]\n"; print "
\n"; print "
--- flamingo_bbs ---
\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{'title'} =~ s/\://g; $FORM{'title'} =~ s/\=//g; $FORM{'title'} =~ 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/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("渋滞中!書込に失敗した可能性があります"); }