#! /usr/local/bin/perl # #========================================================================================== # # 単機能掲示板システム 『TinyBoard』ver 0.91 # # Copyright Shinobu Suzuki 1998. All rights reserved. #----------------------------------------------------------------------------------------- # HomePage : http://www.aikis.or.jp/~s-suzuki/cgilabo/ # E-mail : s-suzuki@aikis.or.jp #========================================================================================== # # 初期設定 # #------------------------------------------------------------------------------------------ $script = 'tinyboard'; # 掲示板スクリプト名(ファイル名のみ、拡張子なし) $version = '0.91'; # 本スクリプトのバージョン #------------------------------------------------------------------------------------------ # ボード定義情報 #------------------------------------------------------------------------------------------ $max = '30'; # 最大ログ数(0で無制限に保存) $user_name = 's-suzuki'; # ボードの主催者名 $user_email = 's-suzuki@aikis.or.jp'; # 主催者のE-mailアドレス $title = "TinyBoard v$version"; # 掲示板のタイトル $title_image = ''; # タイトル画像(URL:省略可) $bg_col = '#f0f0ff'; # 背景色 $bg_image = ''; # 背景画像(URL:省略可) $title_col = '#000090'; # タイトルの色 $text_col = '#000000'; # テキストの色 $link_col = '#0000ff'; # リンクの色 $alink_col = '#ff0000'; # リンク中の色 $vlink_col = '#0000aa'; # 既リンクの色 $subject_col = '#ff0000'; # 題名の色 $name_col = '#009000'; # 投稿者名の色 $linkname = '戻る'; # 外部リンク $link = '../'; # 外部リンクのURL $log_name = "tinyboard.log"; # ログファイル名 $max_value = 1000; # 内容のサイズ $max_name = 100; # 名前のサイズ $max_email = 100; # メールのサイズ $max_subject = 100; # 題名のサイズ #---------------------------------------------------------- # 掲示板の説明文 #---------------------------------------------------------- $readme = 'ここに、能書きなどを書いておきましょう
タグも利用できます。'; #---------------------------------------------------------- # CERN系のサーバーなどで、ファイル関係でエラーが出る場合、 # 以下に設置するディレクトリのサーバー内でのフルパスを指定 # してみると、正常に動作することがあるかもしれません ^^;; # # 最後は / で終わること。 # 例:$path = '/home/user/foo/public_html/cgi-bin/bbs/'; #---------------------------------------------------------- $path = ''; #---------------------------------------------------------- # 日本語コード変換ライブラリの指定 #---------------------------------------------------------- require "$path"."jcode.pl"; &form; # フォーム入力された値の分解 &init; # 各種データ変数の初期化 #---------------------------------------------------------- # スクリプトの動作を決定($FORM{'task'}で判定) #---------------------------------------------------------- if ( $FORM{'task'} eq 'regist') { # データ書き込み ®ist; } else { # 通常の画面表示 &html; } exit; #---------------------------------------------------------------------- # 通常の画面表示ルーチン #---------------------------------------------------------------------- sub html { #------------------------------------------ # ログファイルを配列<@lines>に格納 #------------------------------------------ &read_log; #------------------------------------------ # HTML(画面)の出力 #------------------------------------------ print "Content-type: text/html\n\n"; print "\n\n$title\n\n\n"; print "\n\n"; if ( $link ne "" ) { print "$linkname\n"; } print "
"; if( $title_image ne "" ) { print "\"$title\"\n"; } else { print "$title\n"; } print "

\n"; if ( $readme ne "" ) { print "
$readme
\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 " \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 " \n"; print " \n"; print "
 ・タグは使用できません。
"; print "・半角カナは使用できません。
名前
mail省略可
題名
内容
  "; print "
\n"; print "\n"; print "
全$max件
\n"; #------------------------------------------ # 記事一覧処理 # データ配列(@lines)より1行ずつ取り出す #------------------------------------------ foreach $line (@lines) { #------------------------------------------ # 半角カンマを区切りに、各要素を分解する #------------------------------------------ ($date,$name,$email,$value,$subject) = split(/\,/,$line); #------------------------------------------ # nullコード(\0)を半角カンマに変換 #------------------------------------------ $name =~ s/\0/\,/g; $value =~ s/\0/\,/g; $subject =~ s/\0/\,/g; #------------------------------------------ # メッセージの表示 #------------------------------------------ print "
$subject"; print " 名前:"; print "" if ($email ne ""); print "$name"; print "" if ($email ne ""); print " ($date)

$value
\n\n"; } #------------------------------------------ if( $user_name ne "" ) { print "
\n"; print "主催者:"; print "" if( $user_email ne "" ); print "$user_name\n"; print "\n" if( $user_email ne "" ); print "
\n"; } #------------------------------------------ # スクリプトの著作権表示(削除禁止) #------------------------------------------ print "
\n
\n"; print "TinyBoard v$version
\n"; print "\n
\n
\n"; print "\n\n"; } #---------------------------------------------------------------------- # 通常のメッセージ投稿時のデータ書き込み #---------------------------------------------------------------------- sub regist { #------------------------------------------ # 書き込み内容のチェック #------------------------------------------ &error("名前が記入されていません。") if( $FORM{'name'} eq "" ); &error("題名が記入されていません。") if( $FORM{'subject'} eq "" ); &error("内容が記入されていません。") if( $FORM{'value'} eq "" ); #------------------------------------------ # サイズオーバーする部分をカット #------------------------------------------ $FORM{'value'} = substr( $FORM{'value'}, 0, $max_value ); $FORM{'name'} = substr( $FORM{'name'}, 0, $max_name ); $FORM{'email'} = substr( $FORM{'email'}, 0, $max_email ); $FORM{'subject'} = substr( $FORM{'subject'}, 0, $max_subject ); #------------------------------------------ # ログファイルを配列<@lines>に格納 #------------------------------------------ &read_log; #------------------------------------------ # 記録件数処理 #------------------------------------------ $i = 0; foreach $line (@lines) { $i++; if( $i == $max ) { # 最大件数ならループ終了 last; } push( @new,$line ); } $value = "$date_now\,$FORM{'name'}\,$FORM{'email'}\,$FORM{'value'}\,$FORM{'subject'}\,\n"; unshift(@new,$value); # 一番最初に、新しいデータを追加 #------------------------------------------ # データ(@new)をログファイルに書き出す #------------------------------------------ &write_log; #------------------------------------------ # 記録処理後、再読み込みする #------------------------------------------ print "Location:"."$cgi_name?\n\n"; exit; } #----------------------------------------------------------------- # フォーム投稿されたデータを解析し、配列にリストする #----------------------------------------------------------------- sub form { #-------------------------------------------------- # フォームから入力されたデータを$bufferに格納 #-------------------------------------------------- if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } #-------------------------------------------------- # $bufferに格納されたFORM形式のデータを取り出す #-------------------------------------------------- @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #---------------------------------- # タグは禁止 #---------------------------------- $value =~ s//>/g; #---------------------------------- # 改行コードを
に変換する #---------------------------------- $value =~ s/\r\n/
/g; $value =~ s/\n/
/g; #---------------------------------- # 半角カンマをnull(\0)に変換する #---------------------------------- $value =~ s/\,/\0/g; #---------------------------------- # 半角カナを全角カナに変換する #---------------------------------- &jcode'h2z_sjis(*value); #---------------------------------- # データはsjisに統一する #---------------------------------- &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } } #--------------------------------------------------------------------- # 各種データ変数の初期化 #--------------------------------------------------------------------- sub init { $cgi_name = "$script".".cgi"; # CGIファイル名 $log_file = "$path"."$log_name"; # ログファイル名 #---------------------------------------------------------- # 海外サーバ等で時差が生じる場合は修正 # 海外時間に+9時間する場合 = localtime(time + 9*60*60); # 海外時間に−9時間する場合 = localtime(time - 9*60*60); #---------------------------------------------------------- ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); #---------------------------------------------------------- # 時分秒を2桁に統一する処理 #---------------------------------------------------------- if ($sec < 10) { $sec = "0$sec"; } if ($min < 10) { $min = "0$min"; } if ($hour < 10) { $hour = "0$hour"; } #---------------------------------------------------------- # 上記の$monには0から11までの数字が入るので修正処理 #---------------------------------------------------------- $month = ($mon + 1); #---------------------------------------------------------- # 曜日変換処理 # $wdayには0から6までの数字が入り曜日に対応している #---------------------------------------------------------- $y0="日"; $y1="月"; $y2="火"; $y3="水"; $y4="木"; $y5="金"; $y6="土"; $youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6) [$wday]; #---------------------------------------------------------- # 時刻フォーマット #---------------------------------------------------------- $date_now = "$month月$mday日($youbi)$hour時$min分$sec秒"; } #----------------------------------------------------------------- # ログファイルの読み込み(@linesに格納) #----------------------------------------------------------------- sub read_log { if (!open(DB,"$log_file")) { &error("ログファイルが読み出しオープンできません。"); } @lines = ; close(DB); } #----------------------------------------------------------------- # ログファイルの書き出し #----------------------------------------------------------------- sub write_log { if (!open(DB,">$log_file")) { &error("ログファイルが書き出しオープンできません。"); } print DB @new; close(DB); } #----------------------------------------------------------------- # エラーメッセージの出力 #----------------------------------------------------------------- sub error { $error_msg = $_[0]; print "Content-type: text/html\n\n"; print "TinyBoard v$version\n"; print "\n"; print "おしらせ\n

\n"; print "$error_msg\n"; print "\n\n"; exit; }