#! /usr/local/bin/perl
#
#==========================================================================================
#
# 多機能(?)掲示板システム 『SSBoard』 : 過去ログ表示スクリプト
#
# Copyright Shinobu Suzuki 1998. All rights reserved.
#-----------------------------------------------------------------------------------------
# HomePage : http://www.aikis.or.jp/~s-suzuki/cgilabo/
# E-mail : s-suzuki@aikis.or.jp
#==========================================================================================
#
# makelog.cgiで作成された過去ログを表示するスクリプト
#
# ・過去ログデータはSSBoardの設置ディレクトリ下の oldlog ディレクトリに格納される
# ・過去ログファイルは、ベース名に000〜999までの連番が付加されている
# ・過去ログファイルの拡張子は .bkl となる
# ・画面の配色等は、ボード定義ファイルがあれば、その値を優先する
# ・CGIの呼び出しは以下のように行う
# viewlog.cgi?bordname=ボード名
#
#-----------------------------------------------------------------------------------------
# 初期設定
#-----------------------------------------------------------------------------------------
$version = '1.3'; # 本スクリプトのバージョン
$base_name = 'ssboard'; # 過去ログファイルのベース名
$indexname = '掲示板に戻る'; # viewlog.cgiからの戻り先
$index = './ssboard.cgi'; # viewlog.cgiからの戻り先(URL)
#----------------------------------------------------------
# ボード情報定義ファイル名
# 例) $cfg_name = "ssboard.cfg";
#----------------------------------------------------------
$cfg_name = "";
#---------------------------------------------------------------------
# ボード定義情報:デフォルト値
# ・定義ファイルを使用する場合は、そちらが優先されます。
# ・定義ファイルににない項目は、ここでは設定する値が使用されます。
# ・定義ファイルを使用する場合は、この項目は削除してもかまいませんが
# 削除しない方がなにかと安全です。
#--- こ こ か ら -----------------------------------------------------
$max = '50'; # 最大ログ数(0で無制限に保存)
$page = '20'; # 1ページあたりのメッセージ数(0でページ処理をしない)
$user_name = ''; # ボードの主催者名
$user_email = ''; # 主催者のE-mailアドレス
$title = "SSBoard v$version"; # 掲示板のタイトル
$title_image = ''; # タイトル画像(URL:省略可)
$bg_col = '#f0f0f0'; # 背景色
$bg_image = ''; # 背景画像(URL:省略可)
$title_col = '#000090'; # タイトルの色
$text_col = '#000000'; # テキストの色
$link_col = '#0000ff'; # リンクの色
$alink_col = '#ff0000'; # リンク中の色
$vlink_col = '#900090'; # 既リンクの色
$subject_col = '#ff0000'; # 題名の色
$name_col = '#009000'; # 投稿者名の色
$linkname1 = ''; # 外部リンク その1
$link1 = ''; # 外部リンク その1(URL)
$linkname2 = ''; # 外部リンク その2
$link2 = ''; # 外部リンク その2(URL)
$linkname3 = ''; # 外部リンク その3
$link3 = ''; # 外部リンク その3(URL)
$readme = ''; # 掲示板の説明文
$readme2 = ''; # 書き込み画面の説明文
#--- こ こ ま で -----------------------------------------------------
#----------------------------------------------------------
# ファイル入出力時にファイルロックを行う設定。これにより、
# 同時アクセス時の問題が多少マシになる(?)
# サーバーが flock()関数を使える設定の場合のみ利用できる。
# 0:ファイルロックを行わない
# 1:flock()でファイルロックを行う
#----------------------------------------------------------
$lockmode = 0;
#----------------------------------------------------------
# CERN HTTPDなどのサーバーの場合で、ファイル関係のエラーが
# 出る場合、設置するディレクトリのフルパスを指定してみて下
# さい。なお、最後は / で終わること。
# $path = "/home/users/s-suzuki/public_html/bbs/";
#----------------------------------------------------------
$path = '';
#----------------------------------------------------------
# 日本語コード変換ライブラリの指定
#----------------------------------------------------------
require "$path"."jcode.pl";
#=========================================================================================
# これより、処理の開始
#=========================================================================================
&form; # フォーム入力された値の分解
&read_cfg; # ボード定義ファイルの読み込み
#----------------------------------------------------------
# スクリプトの動作を決定($FORM{'task'}で判定)
#----------------------------------------------------------
#
if ( $FORM{'task'} eq 'view' ) { # 過去ログ表示ルーチンへ
&view_log;
}
else { # 通常の画面表示
&html;
}
#----------------------------------------------------------------------
# 通常の画面表示ルーチン
#----------------------------------------------------------------------
#
sub html {
if ( $path ne "" ) {
opendir(DIR,"$path/oldlog/");
}
else {
opendir(DIR,"./oldlog/");
}
@readlist = grep(/$base_name[0-9]{3}.bkl/, readdir(DIR));
closedir(DIR);
print "Content-type: text/html\n\n";
print "\n
\n$CFG_DATA{'title'}:過去ログ一覧\n\n";
print "\n\n";
print "$CFG_DATA{'title'}:過去ログの一覧
\n";
print "
\n\n";
print "\n";
print "
\n";
foreach $file (@readlist) {
if( open( DB, "$path"."oldlog/"."$file" )) {
$logtitle = ;
close(DB);
$j = $i+1;
print " \n";
print " $j. | \n";
print "  ";
print "$logtitle  | \n";
print "
\n";
$i++;
}
}
if ( $i eq 0 ) {
print "現在、過去ログはありません。 |
\n";
print "
\n";
}
else {
print "\n";
}
print "
\n
\n";
print "[$indexname]";
exit;
}
#----------------------------------------------------------------------
# 過去ログの表示
#----------------------------------------------------------------------
#
sub view_log {
#--------------------------------------------------
# 過去ログファイル名のセット
#--------------------------------------------------
if ($path eq "" ) {
$log_file = "./oldlog/"."$FORM{'file'}";
}
else {
$log_file = "$path"."oldlog/$FORM{'file'}";
}
#--------------------------------------------------
if (!open(DB,"$log_file")) {
&error("ファイルの入出力にエラーが発生しました(E001)。");
}
if( $lockmode == 1 ) {
eval { flock( DB, 2 );};
if ( $@ ne "" ) {
&error("flock()がサポートされていません。");
}
@lines = ;
flock( DB, 8 ); # ロック解除
}
else {
@lines = ;
}
close(DB);
$logtitle = $lines[0];
shift @lines;
#--------------------------------------------------
# HTML(画面)の出力
#--------------------------------------------------
print "Content-type: text/html\n\n";
print "\n\n$CFG_DATA{'title'}:過去ログ\n\n";
print "\n\n";
print "$CFG_DATA{'title'}:$logtitle\n";
print "
";
#----------------------------------------------------------
# 記事一覧処理
# 配列<@lines>から1件ずつデータを取り出して処理する
#----------------------------------------------------------
#
$nextline = 1;
foreach $line (@lines) {
($count,$date,$editpwd,$name,$email,$url,$value,$subject,$rhost) = split(/\,/,$line);
if ( substr($line, 0, 1) eq "@" ) {
next;
}
#---------------------------------------
# nullコード(\0)を半角カンマに変換
#---------------------------------------
$name =~ s/\0/\,/g;
$value =~ s/\0/\,/g;
$subject =~ s/\0/\,/g;
$email =~ s/\0/\,/g;
$url =~ s/\0/\,/g;
print "
$count $subject";
print " 名前:$name";
if ($email ne "") {
print " Mail";
}
if ($url ne "") {
print " Home";
}
print " ($date)$value";
for (;;) {
#---------------------------------------
# 次行がコメントかどうか
#---------------------------------------
if ( substr($lines[$nextline], 0, 1) ne "@" ) {
last;
}
($count,$date,$editpwd,$name,$email,$url,$value,$subject,$rhost) = split(/\,/,$lines[$nextline]);
#---------------------------------------
# nullコード(\0)を半角カンマに変換
#---------------------------------------
$name =~ s/\0/\,/g;
$value =~ s/\0/\,/g;
$subject =~ s/\0/\,/g;
$email =~ s/\0/\,/g;
$url =~ s/\0/\,/g;
print "
$subject";
print " 名前:$name";
if ($email ne "") {
print " Mail";
}
if ($url ne "") {
print " Home";
}
print " ($date)$value
";
$nextline++;
}
print"
\n\n";
$nextline++;
}
print "
\n";
print "\n";
print "\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;
#--------------------------------------------------
# 記録するデータの半角カナを全角カナに変換する
# これを利用するには、jcode.plのv2.0以降を使うこと
#--------------------------------------------------
&jcode'h2z_sjis(*value);
#--------------------------------------------------
# 記録するデータはsjisに統一する
#--------------------------------------------------
&jcode'convert(*value,'sjis');
$FORM{$name} = $value;
}
}
#-----------------------------------------------------------------
# ボード定義ファイルの読み込み
#-----------------------------------------------------------------
#
sub read_cfg {
$CFG_DATA{'max'} = $max;
$CFG_DATA{'page'} = $page;
$CFG_DATA{'user_name'} = $user_name;
$CFG_DATA{'user_email'} = $user_email;
$CFG_DATA{'security'} = $security;
$CFG_DATA{'title'} = $title;
$CFG_DATA{'title_image'} = $title_image;
$CFG_DATA{'bg_col'} = $bg_col;
$CFG_DATA{'bg_image'} = $bg_image;
$CFG_DATA{'title_col'} = $title_col;
$CFG_DATA{'text_col'} = $text_col;
$CFG_DATA{'link_col'} = $link_col;
$CFG_DATA{'alink_col'} = $alink_col;
$CFG_DATA{'vlink_col'} = $vlink_col;
$CFG_DATA{'subject_col'} = $subject_col;
$CFG_DATA{'name_col'} = $name_col;
$CFG_DATA{'linkname1'} = $linkname1;
$CFG_DATA{'link1'} = $link1;
$CFG_DATA{'linkname2'} = $linkname2;
$CFG_DATA{'link2'} = $link2;
$CFG_DATA{'linkname3'} = $linkname3;
$CFG_DATA{'link3'} = $link3;
$CFG_DATA{'readme'} = $readme;
$CFG_DATA{'readme2'} = $readme2;
$CFG_DATA{'max_size'} = $max_size;
$CFG_DATA{'max_subject'} = $max_subject;
$CFG_DATA{'max_name'} = $max_name;
$CFG_DATA{'max_email'} = $max_email;
$CFG_DATA{'max_url'} = $max_url;
#---------------------------------------
# 定義ファイルからの読み込み
#---------------------------------------
$cfg_file = "$path"."$base_name".".cfg";
if ( open(DB,"$cfg_file")) {
if( $lockmode == 1 ) {
eval { flock( DB, 2 );}; # ファイルをロック
if ( $@ ne "" ) {
&error("flock()がサポートされていません。");
}
@lines = ;
flock( DB, 8 ); # ロック解除
}
else {
@lines = ;
}
close(DB);
}
foreach $line (@lines) {
($name,$value) = split(/\,/,$line);
$CFG_DATA{$name} = $value;
}
}
#-----------------------------------------------------------------
# エラーメッセージの出力
#-----------------------------------------------------------------
#
sub error {
$error_msg = $_[0];
print "Content-type: text/html\n\n";
print "エラー発生:過去ログの表\示\n";
print '' . "\n";
print 'おしらせ
' . "\n";
print "$error_msg\n";
print '' . "\n";
exit;
}