#! /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 "\n";
}
else {
print "$title\n";
}
print "
\n";
if ( $readme ne "" ) {
print "\n";
}
print "
\n";
#------------------------------------------
# 書き込みフォーム
#------------------------------------------
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 "
\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/>/>/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;
}