#!/usr/local/bin/perl ### 簡易掲示板 v1.00 #BASE-CGI : http://www.interq.or.jp/earth/tumuji/ 超簡易掲示板 v0.99 #BASE-Aut : dominia #Customize : Pastel Carrot - Lime Utano #=============管理人の情報ここから=============# $admin_url = ""; #管理人のHPトップアドレス $admin_name = ""; #管理人の名前 $admin_mail = ''; #管理人のメールアドレス #=============管理人の情報ここまで=============# #===========通常変更可能区域ここから===========# $F_TITLE = "簡易掲示板"; #タイトルの名前 $I_TITLE = ""; #画像の名前と場所 $TITLECOLOR = "#000000"; #タイトルの色 $TITLESIZE = "+3"; #タイトルの大きさ $cook_name = "name"; #クッキーの名前 $cook_save = 30; #クッキー保存期間(日) $max_word = 1200; #一回の書き込みにおける最大コメント文字数(半角) $MAX = "50"; #保存できる最大数 $max = "10"; #1ページに表示できる数 $count = "./count.txt"; #count.txtの名前 及び場所 $cgifile = "./bbs.cgi"; #CGIファイルの名前 及び場所 $logfile = "./logfile.txt"; #ログファイルの名前 及び場所 require "./jcode.pl"; #jcode.plの場所(名前変更不可) require "./filelock.pl"; #filelock.plの場所(名前変更不可) ## BODY-TAG 関連 $BGCOLOR = "#eeeeff"; #BGCOLORメソッド $LINK = "red"; #LINKメソッド $VLINK = "orange"; #VLINKメソッド $TEXT = "black"; #BODYメソッド ## 投稿フォーム部分 $FORM_BG = "#eeffee"; #BGCOLORメソッド #===========通常変更可能区域ここまで===========# ######################################### # # データの取りこみ # ######################################### $expire = gmtime(time+60*60*24*$cook_save); if($ENV{'CONTENT_LENGTH'} || $ENV{'QUERY_STRING'}){ read STDIN,$QUERY,$ENV{'CONTENT_LENGTH'} if($ENV{'CONTENT_LENGTH'}); $QUERY = $ENV{'QUERY_STRING'} if($ENV{'QUERY_STRING'}); @QUERY = split /&/,$QUERY; foreach(@QUERY){ ($key,$val) = split /=/; $key =~ tr /+/ /; $val =~ tr /+/ /; $key =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("c",hex($1))/ge; $val =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("c",hex($1))/ge; $val =~ s//>/g; $val =~ s/\"/"/g; $val =~ s/\n/
/g; &jcode::convert(*key, 'sjis'); &jcode::convert(*val, 'sjis'); $form{$key} = $val; } if($form{name}){ &error("本文が空白です") if($form{'body'} eq ""); &error("本文が長すぎます。$max_word文字以内に収めてください") if($form{'body'} > "$max_word"); $form{title} = "無題" if($form{title} eq ""); &error("メールアドレスの書式が間違っています") if($form{'mail'} && ($form{'mail'} !~ /.+\@.+\..+/)); &error("メールアドレスの文字制限を越えています。") if(length($form{'mail'}) > 100); $form{url} =~ s/http\:\/\///; &error("URLの文字数制限を越えてます。") if (length($form{url}) > 150); &dubble; #二重投稿の禁止 &loaddata; #データの取得 &counter; #カウンターの取得 &ipdata; #IPの取得 &gettime; #時間の取得 &savedata; #データの保存 if($form{cookie}){&set_cookie;} } } ######################################### # # HTMLフォーム部分 # ######################################### &get_cookie; #クッキーの取得 if($I_TITLE){ $M_TITLE = ""; } else { $M_TITLE = "$F_TITLE"; } &html_header($F_TITLE); print <<"HTML";
$M_TITLE

投稿者
メール
タイトル
内容
URL
クッキーを保存する
HTML print "
書いた通りに記入されるので、適当に改行を入れてください。\n"; print "タグは一切使えません。
\n"; print "最大で$MAX件保存できます。\n"; print "それを越えた場合、古い方から消えていきます。

\n"; ######################################### # # ログ表示部分 # ######################################### $first = 0; $first = $form{'start'} if($form{'start'}); $end = $first + ($max - 1); &loaddata; for($i = $first;$i <= $end;$i++){ last if $i >= @data; $DATA = $data[$i]; ($COUNT,$name,$mail,$title,$body,$url,$TIME) = split /\t/,$DATA; print ""; } else { print "投稿者:$name  投稿日:$TIME"; } print "\n"; print "\n"; print "" if($url); print "
[$COUNT] $title\n"; if($mail){ print "投稿者:$name  投稿日:$TIME

$body
http://$url

"; if((@data > $i) && (@data > $max)){ $first = $end + 1; print "次の$max件 "; } } print "掲示板のトップへ" if($first > $max); &html_footer(); ######################################### # # サブルーチン部分 # ######################################### sub set_cookie{ #クッキーの発行 $cook="name\:$form{name}\,mail\:$form{mail}\,url\:$form{url}"; print "Set-Cookie: $cook_name=$cook; expires=$expire\n"; if($form{name}){$COOKIE{name} = $form{name};} if($form{mail}){$COOKIE{mail} = $form{mail};} if($form{url}){$COOKIE{url} = $form{url};} } sub get_cookie{ #クッキーの取得 @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pairs (@pairs){ ($name,$val) = split(/=/,$pairs); $name =~ s/ //g; $DUMMY{$name} = $val; } @pairs = split(/,/,$DUMMY{$cook_name}); foreach $pairs (@pairs){ ($name,$val) = split(/:/,$pairs); &jcode::convert(*name, 'sjis'); $COOKIE{$name} = $val; } } sub ipdata{ #各IPデータの取得 $ip_a = $ENV{'REMOTE_ADDR'}; $ip_h = $ENV{'REMOTE_HOST'}; } sub gettime{ #時間の取得 @date = localtime; $date[4] += 1; $date[5] += 1900; @youbi = ("月","火","水","木","金","土","日"); $time = "$date[5]年$date[4]月$date[3]日$youbi[$date]曜日$date[2]時$date[1]分$date[0]秒"; } sub loaddata{ #データの読み取り &filelock::lock(); open OUT,"$logfile" || &error('ログファイルが開けません'); @data = ; close OUT; &filelock::unlock(); } sub savedata{ #データの保存 unshift (@data,"$counter\t$form{name}\t$form{mail}\t$form{title}\t$form{body}\t$form{url}\t$time\t$ip_a\t$ip_h\n"); &filelock::lock(); open IN,">$logfile" || &error('ログファイルに書き込めません'); print IN @data; close IN; &filelock::unlock(); if(@data > $MAX){pop @data;} } sub counter{ #カウンタの取得 &filelock::lock(); open COUNT,"<$count"; $counter = ; close COUNT; ++$counter; open COUNT,">$count"; print COUNT $counter; close COUNT; &filelock::unlock(); } sub dubble{ #二重投稿の禁止 &filelock::lock(); open OUT,"$logfile" or die &error('ログファイルが開けません'); @d_data = ; ($d_count,$d_name,$d_mail,$d_title,$d_body,$d_url) = split(/\t/,$d_data[0]); close OUT; &filelock::unlock(); if(($d_name eq $form{name}) && ($d_mail eq $form{mail}) && ($d_title eq $form{title}) && ($d_body eq $form{body}) && ($d_url eq $form{url})){&error("二重投稿です。");} } sub error{ #その他エラー表示 &html_header("Error"); print "$_[0]"; exit; } ## Print header of HTML : HTMLヘッダーの表示 sub html_header { print "Content-type: text/html \n\n"; print "\n"; print "$_[0]\n"; print ''."\n"; print ''."\n"; print ''."\n"; print "\n"; print "\n"; } ## Print footer of HTML : HTMLフッターの表示 sub html_footer { print "ホームページへ
"; print "
管理人:$admin_name
"; print '
'; print "Scripted by Lime Utano
\n"; print "(c)Pastel Carrot "; print "1999-
All rights Reserved.
\n"; print "BASE-CGI : 超簡易掲示板 v0.99
\n"; print 'BASE-Script : ゼノいんぽっしぶる
'; print "\n"; } __END__