#!/usr/local/bin/perl #───── minibbs Ver.1.8 ───── # 個人で使用する場合の改造は構いませんが、再配布する場合は連絡をして下さい。 # 著作権は絶対に削除変更しないで下さい。再配布でも同様です。 # バグ等、何かありましたら、サイト内にあるサポート掲示板からお知らせ下さい。 # lockフォルダはお手数ですが、各自で作成して一緒にアップして下さい。 # 設置に関してはHPで説明していますので、そちらを参照して下さい。 # 管理用パスで全ての記事を削除出来ます。 #───── パーミッション ───── # 必ずプロバイダーの指示に従って下さい。 # 特に指定がなければ下の通りにして下さい。 # minibbs.cgi [755] # minibbs2.cgi [666] # jcode.pl [644] # img [777]←画像用フォルダ。各自でご用意下さい # lock [777]←排他制御用フォルダ。mkdir関数使用時のみ必要です # ───── 初期設定 ───── # CGIファイル $cgifile = './minibbs.cgi'; # 記録ファイル $logfile = './minibbs2.cgi'; # タイトル $title = 'minibbs'; # タイトルの文字の大きさ(単位なし) $size = "5"; # タイトルの文字色 $color = "#696969"; # 戻る方法を選択して下さい。 # 「画面を閉じる(別窓で表示)」を選択する場合=2、「戻る」を選択する場合=1、 # 「表示しない(フローティングフレーム使用)」を選択する場合=0 $back = '2'; # 「戻る」を選択して場合は、戻り先のURLを指定して下さい。 # $home='/index'; # 最大記事保存数 $max = '100'; # 最大記事表示数 $pagemax = '5'; # bodyタグ $body = ''; # 文字色の設定(幾つでも増やせます) @c_list = ('#696969','#0000ff','#008000','#800000','#800080','#ff0000','#FF9900'); # アイコン @p_list = ('1.gif','2.gif'); # アイコンの名称(上記と同じ順番で記述して下さい) @p_list2 = ('アイコン1','アイコン2'); # アイコン表示のためのURL(絶対パスで最後の/は必ずつけて下さい) $imgurl = 'http://garden.s60.xrea.com/support/img/'; # コメント入力欄を複数行にする=1、しない=0 $com = '0'; # 管理用パス(必ず設定して下さい) $adpass = '0123'; # 排他制御(ファイルロック)の設定 # flock関数を使う=2、mkdir関数を使う=1、使わない場合=0 # flock関数でエラーが発生した場合は、mkdir関数を御使用下さい。 # 「混雑しています」が度々表示される場合は外して下さい # mkdir関数を使う場合は必ずlockフォルダを一緒にアップして下さい $filelock = '2'; # ファイルロックの名称(mkdir関数を使う場合に必要。変更の必要なし) $lockdir = './lock/minibbs.lock'; # アクセスを制限したいIP、またはホストを記述して下さい # IPの場合、"123.456.78.90"を"123.456.78.*"と変えて記述します # ホストの場合、"popxx.garden.ne.jp"を"*.gardenxx.ne.jp"と変えて記述します # 例→@stop = ("123.456.78.*","*.gardenxx.ne.jp"); @stop = (""); # スパム対策等で外部からのアクセスを拒否したい場合設定して下さい # 例→'$stop2 = 'http://garden.s60.xrea.com/(自分のサイトのURLを設定する)'; $stop2 = ''; # 書込みを拒否したい語句を記述して下さい(幾つでも増やせます) # 例→@ngword = ('死ね','殺す'); @ngword = (''); # 入力データのサイズを設定出来ます(必要な方のみ) # 全角は2バイトになりますので「500文字」の場合は「1000」と設定します # 例→ $datasize = '1000'; $datasize = ''; # スタイルシート(判る方は自由に変更して下さい) $style = ''; require './jcode.pl'; # ───── 初期設定ここまで! ───── $hos = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($stop2 ne "" ) { $referer = $ENV{'HTTP_REFERER'}; if ($referer !~ /$stop2/) { &error("アクセスが制限されています");} } if ($gethostbyaddr) { if ($hos eq "" || $hos eq "$addr") { $hos = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } } if ($hos eq "") { $hos = $addr; } foreach $ipline (@stop) { if ($ipline eq "") { next;} s/\*/\.\*/g; if ($hos =~ /$ipline/i) { &error("アクセスが制限されています");} if ($addr =~ /$ipline/i) { &error("アクセスが制限されています");} } &get_time; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } @buf = split(/&/, $buf); foreach (@buf) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*val, "sjis"); $val =~ s//>/g; $val =~ s/"/"/g; $val =~ s/,/,/g; $in{$key} = $val; } $fotter = '

Blue+Cross

'; if ($in{'mode'} eq "regist") { ®ist;} elsif ($in{'mode'} eq "delete") { &delete;} elsif ($in{'mode'} eq "top") { print "Location: $cgifile" . '?' . "\n\n";} if ($filelock == 1){ &lock;} &input; if ($filelock == 1){ &unlock;} print <<"EOM"; Content-type: text/html $title $style $body EOM if ($back == 2) { print "[閉じる]\n"; } elsif ($back ==1) { print "[戻る]\n"; } ($titles2,$name2,$colors2,$pass2) = &get_cookie; print "

\n"; print "$title\n"; print "

\n"; print "
\n"; print " \n"; print "\n"; print "\n"; if ($com == 1) { print "\n"; print "\n"; print "
\n"; print "お名前:\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "コメント:\n"; print "\n"; print "\n"; } else { print "
\n"; print "コメント:\n"; print "\n"; print "\n"; } print "
\n"; print "文字色:\n"; if ( $colors2 eq "") { $colors2 = $c_list[0];} foreach $c_line (@c_list) { if ( $colors2 eq $c_line) { print "\n"; print "\n"; } else { print "\n"; } } print "
\n"; print "パスワード(英数8文字以内):\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print "
\n"; print "

\n"; if ($in{'start'} eq '') { $in{'start'} = 0; } $end = $in{'start'} + $pagemax; $pre = $in{'start'} - $pagemax; if ($end > @data) { $end = @data; } for ($i = $in{'start'}; $i < $end; $i++) { my($no,$titles,$name,$colors,$comment,$date,$host,$pass) = split(/<>/,$data[$i]); $comment = &autolink($comment); print " $name [NO.$no:$date]\n"; print "
$comment
\n"; print "
\n"; } print "
\n"; if (($in{'start'} != 0) || ($end < @data)) { print "\n"; } if ($in{'start'} != 0) { print "\n"; } if ($end < @data) { print "\n"; } if (($in{'start'} != 0) || ($end < @data)) { print "
\n"; print "\n"; print "
\n"; print "\n"; print "
\n"; } print "
\n"; print "

\n"; print "\n"; print "NO: \n"; print "パスワード: \n"; print "

\n"; print"
\n"; print "$fotter\n"; exit; sub regist { if ($in{'name'} eq "") { &error("名前が入力されていません"); } if ($in{'comment'} eq "") { &error("コメントが記入されていません"); } if ($datasize != "") { if (length($in{'name'}) >= $datasize ) { &error('規定されている容量を超過しています'); } if (length($in{'comment'}) >= $datasize ) { &error('規定されている容量を超過しています'); } } foreach $word (@ngword) { if ($word eq "") { next;} if ($in{'name'} =~ m/$word/) { &error('書き込みが禁止されている語句が含まれています'); } if ($in{'comment'} =~ m/$word/) { &error('書き込みが禁止されている語句が含まれています'); } } $stop3 = ($in{'comment'} =~ s/http/http/ig); if ($stop3 >= 3) { &error("URLの多数書き込みは禁止です"); } $in{'comment'} =~ s/\r\n/
/g; $in{'comment'} =~ s/\r/
/g; $in{'comment'} =~ s/\n/
/g; &get_time; &set_cookie; if ($filelock == 1){ &lock;} &input; for ($i = 0; $i < @data; $i++) { my($no,$titles,$name,$colors,$comment,$date,$host,$pass) = split(/<>/,$data[0]); if (($in{'name'} eq $name) && ($in{'comment'} eq $comment)) { &error("二重投稿です"); } } my $cnt = 0; my $titles = (); foreach $p_list(@p_list) { if ($cnt == $in{'titles'}) { $titles = $p_list;} $cnt ++; } while ($max <= @data) { pop(@data); } $host = $hos; $no = $data[0] + 1; unshift(@data,"$no<>$titles<>$in{'name'}<>$in{'colors'}<>$in{'comment'}<>$date<>$host<>$in{'pass'}<>\n"); &output; if ($filelock == 1){ &unlock;} print "Location: $cgifile" . '?' . "\n\n"; } sub input { if ($filelock ==2 ) { open(IN,"$logfile") || &error ('ファイルオープンエラー'); eval{ flock(IN, 1);}; if ($@) { &error('flock関数は使用出来ません。mkdir関数に設定して下さい');} @data = ; close(IN); } else { open(IN,"$logfile") || &error ('ファイルオープンエラー'); @data = ; close(IN); } } sub output { if ($filelock ==2 ) { open(OUT, "+< $logfile"); flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print OUT @data; close(OUT); } else { open(OUT,">$logfile") || &error ('ファイルオープンエラー'); print OUT @data; close(OUT); } } sub autolink { local($_) = $_[0]; $_ =~ s/([^=^\"]|^)((http|https):[!#-9A-~]+)/$1$2<\/a>/g; $_; } sub get_time { $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); my(@week) = ('sun','mon','tue','wed','thu','fri','sat'); $wday = $week[$wday]; $date = sprintf("%04d/%02d/%02d (%s) %02d:%02d", $year+1900,$mon+1,$mday, $wday,$hour,$min); } sub set_cookie { my($gmt, $cook, @t, @m, @w); @t = gmtime(time + 60*24*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); $cook = "$in{'titles'}<>$in{'name'}<>$in{'colors'}<>$in{'pass'}"; $cook =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "Set-Cookie: BBS2=$cook; expires=$gmt\n"; } sub get_cookie { my $cookie = $ENV{'HTTP_COOKIE'}; foreach (split(/;/, $cookie)) { my($key, $val) = split(/=/); $key =~ s/\s//g; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $cookie{$key} = $val; } my @cookie = (); @cookie = split(/<>/, $cookie{'BBS2'}); return (@cookie); } sub lock { if (-e $lockdir ) { $checktime = (stat($lockdir))[9]; if (($date - $checktime ) > 120) { rmdir($lockdir); } } $retry = 5; while (!mkdir($lockdir, 0755)) { if (--$retry <= 0) { &error("混雑しています。時間をあけてアクセスして下さい"); } sleep(1); } } sub unlock { rmdir($lockdir); } sub delete { $flag = 0; if ($in{'pass'} eq $adpass ) { $flag =1;} if (($in{'no'} eq "") || ($in{'pass'} eq "")) { &error("正しく記入されていません");} if ($filelock == 1){ &lock;} &input; for ($i = 0; $i < @data; $i++) { my($no,$titles,$name,$colors,$comment,$date,$host,$pass) = split(/<>/,$data[$i]); if ($no eq $in{'no'}) { if ($flag == 1) { splice(@data,$i,1); &output; } else { if ($pass eq '') { &error("パスワードが設定されていません"); } if ($pass ne $in{'pass'}) { &error("パスワードが違います"); } if ($in{'pass'} eq $pass) { splice(@data,$i,1); &output; } } last; } } if ($filelock == 1) { &unlock;} print <<"EOM"; Content-type: text/html 削除処理完了 $style $body

記事は削除されました


トップに戻る
$fotter EOM exit; } sub error { print <<"EOM"; Content-type: text/html エラーが発生しました $style $body

以下のエラーが発生しました


$_[0]

戻る

$fotter EOM exit; } # copyright (c) 2004 Blue+Cross (sakuya) # http://garden.s60.xrea.com/