#! /usr/local/bin/perl # ↑この上のPerlのパスを書き換えるのはお約束ですね #========================================================================================== # # マルチボード掲示板システム 『MultiBBS』ver 1.3 : 過去ログ作成スクリプト # # Copyright Shinobu Suzuki 1998. All rights reserved. #----------------------------------------------------------------------------------------- # HomePage : http://www.aikis.or.jp/~s-suzuki/cgilabo/ # E-mail : s-suzuki@aikis.or.jp # Version : 1.32 # Update : 1999/02/27 #----------------------------------------------------------------------------------------- # ■MultiBBSシステムの各ボードログから、指定したログデータを過去ログとして抽出します。 # ■過去ログデータはMultiBBSの設置ディレクトリ下の oldlog ディレクトリに格納されます # ■oldlog ディレクトリのパーミッションは 777(707) にしてください # ■過去ログファイルは、ボード名に000〜999までの連番が付加されます # ■過去ログファイルの拡張子は .bkl となります # ■過去ログファイルの表示は viewlog.cgi で行います # **** # ■このスクリプトは config.cgi を参照しています #========================================================================================== # 初期設定 #----------------------------------------------------------------------------------------- # CERN HTTPDなどのサーバーの場合で、ファイル関係のエラーが # 出る場合、設置するディレクトリのフルパスを指定してみて下 # さい。なお、最後は / で終わること。 # 例) $path = "/home/users/s-suzuki/public_html/bbs/"; #---------------------------------------------------------- $path = ""; #---------------------------------------------------------- # 共通設定ファイルの指定 #---------------------------------------------------------- require "$path"."config.cgi"; #---------------------------------------------------------- # 日本語コード変換ライブラリの指定 #---------------------------------------------------------- require "$path"."jcode.pl"; #---------------------------------------------------------- # このスクリプトでのみ必要な設定 #---------------------------------------------------------- $indexname = '戻る'; # makelog.cgiからの戻り先 $index = './'; # makelog.cgiからの戻り先(URL) $usermode = 0; # 利用できるユーザー # 0:システム管理者のみ # 1:ボード開設者も利用可能 #---------------------------------------------------------- # 外部からの(イタズラ)書き込みを禁止する場合、以下に、ス # クリプトのURLを記入する。(サーバーやブラウザによっては # うまくいかないこともあります) # 例:$script_url = 'http://www.aikis.or.jp/~s-suzuki/multibbs/makelog.cgi'; #---------------------------------------------------------- $script_url = ''; #---------------------------------------------------------- # ログ作成の後、File Not Found などがでる場合、CGIスクリプ # トを設置するディレクトリ名をURLで指定すると成功する場合 # があるそうです。 # ※この機能については未確認です # ※biglobeでは成功するそうです # ※最後は / で終わること。 # 例:$rerload_url = 'http://www.aikis.or.jp/~s-suzuki/multibbs/'; #---------------------------------------------------------- $reload_url = ''; #===================================================================== # これより、処理の開始 #===================================================================== &form; # フォーム入力された値の分解 &read_master_key; # 管理用マスターキー読み込み &init; # 各種データ変数の初期化 #---------------------------------------------------------- # スクリプトの動作を決定($FORM{'task'}で判定) #---------------------------------------------------------- if ( $FORM{'task'} eq 'make_log' ) { # データの削除ルーチンへ &read_cfg; # ボード定義ファイルの読み込み &make_log; } elsif ( $FORM{'task'} eq 'move' ) { # データの削除ルーチンへ &read_cfg; # ボード定義ファイルの読み込み &move_log; } else { # 通常の画面表示 &main; } #===================================================================== # 処理はここまで(以下は、サブルーチン) #===================================================================== #---------------------------------------------------------------------- # 通常の画面表示ルーチン #---------------------------------------------------------------------- sub main { if ( $path ne "" ) { opendir(DIR,"$path"."log/"); } else { opendir(DIR,"./log/"); } @readlist = grep(/cfg/, readdir(DIR)); closedir(DIR); print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "過去ログの作成:ボードの選択\n"; print "\n\n"; print "\n\n"; print "過去ログの作成:ボードの選択
\n"; print "
\n\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; foreach $bord (@readlist) { if ( $path ne "" ) { $tempname = "$path"."log/$bord"; } else { $tempname = "./log/$bord"; } if( open( DB, $tempname )) { @lines = ; close(DB); foreach $line (@lines) { ($name,$value) = split(/\,/,$line); if( $name eq 'title' ) { $bordtitle = $value; $bordtitle =~ s/<(.*?)>//ig; last; } } ($fname,$ext) = split(/\./,$bord); print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; $i++; } } if ( $i eq 0 ) { print "\n"; print "
 \n"; print " ボード名タイトル
 [$fname]  $bordtitle 
ボードは開設されていません。
\n"; } else { print "\n"; print "
管理用マスターキー、あるいは主催者パスワード
\n"; } print "
\n
\n"; print "[$indexname]\n"; #------------------------- # スクリプトの著作権表示 #------------------------- print "
\n
"; print "MultiBBS v$version
\n"; exit; } #---------------------------------------------------------------------- # 整理するログの選択リスト #---------------------------------------------------------------------- sub make_log { #-------------------------------------------------- # パスワードのチェック #-------------------------------------------------- $passcheck = "NG"; if ( $FORM{'passwd'} eq "" ) { &error("パスワードが入力されていません(E001)。"); } else { $temp = crypt( $FORM{'passwd'}, substr($master_pass,0,2) ); $temp2 = crypt( $FORM{'passwd'}, substr($CFG_DATA{'user_pass'},0,2) ); if( $usermode == 1 ) { if ( $temp2 eq $CFG_DATA{'user_pass'} ) { $passcheck = "OK"; } } if ( $temp eq $master_pass ) { $passcheck = "OK"; } } if( $passcheck ne "OK" ) { &error("パスワードが違います。"); } #-------------------------------------------------- if (!open(DB,"$log_file")) { &error("ファイルの入出力にエラーが発生しました(E001)。"); } eval { flock( DB, 2 );}; @lines = ; eval { flock( DB, 8 );}; # ロック解除 close(DB); #-------------------------------------------------- # HTML(画面)の出力 #-------------------------------------------------- print "Content-type: text/html\n\n"; print "\n\n過去ログの作成\n\n"; print "\n\n"; print "過去ログの作成:$bordname\n"; print "\n"; if( $FORM{'bordname'} ne "" ) { print "\n"; } print "\n"; print "\n"; print "過去ログのタイトル \n

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; foreach $line (@lines) { ($count,$date,$editpwd,$name,$email,$url,$value,$subject,$rhost) = split(/\,/,$line); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "" } print "
 \n"; print "No.日付投稿者タイトル
$count $date  $name  $subject 
\n"; print "
\n"; print "\n"; print "

\n"; print "\n"; exit; } #----------------------------------------------------------------- # リストアップされたメッセージのデータ削除 #----------------------------------------------------------------- sub move_log { #-------------------------------------------------- # パスワードのチェック #-------------------------------------------------- $passcheck = "NG"; if ( $FORM{'passwd'} eq "" ) { &error("パスワードが入力されていません(E002)。"); } else { $temp = crypt( $FORM{'passwd'}, substr($master_pass,0,2) ); $temp2 = crypt( $FORM{'passwd'}, substr($CFG_DATA{'user_pass'},0,2) ); if( $usermode == 1 ) { if ( $temp2 eq $CFG_DATA{'user_pass'} ) { $passcheck = "OK"; } } if ( $temp eq $master_pass ) { $passcheck = "OK"; } } if( $passcheck ne "OK" ) { &error("パスワードが違います(E002)。"); } #------------------------------------- if( $FORM{'logtitle'} eq "" ) { &error("過去ログのタイトルが入力されていません(E001)。"); } #-------------------------------------------------- # 外部フォームからの書き込みの禁止チェック #-------------------------------------------------- if ($script_url ne "") { $ref = $ENV{'HTTP_REFERER'}; $ref_url = $script_url; $ref_url =~ s/\~/.*/g; if (!($ref =~ /$ref_url/i)) { &error("「$script_url」以外からの投稿は受け付けられません(E001)。"); } } #------------------------------------- # 過去ログファイル名の作成 #------------------------------------- if ( $path ne "" ) { $temp = "$path"."oldlog/"; } else { $temp = "./oldlog/"; } for( $i=0; $i<1000; $i++ ) { $new_log = sprintf "%s%s%03d.bkl", $temp, $FORM{'bordname'}, $i; if ( -e $new_log ) { if ($i == 999) { &error("これ以上の過去ログを作成できません。"); } next; } else { last; } } #------------------------------------- # 通常ログの読み込み #------------------------------------- if (!open(IN,"$log_file")) { &error("ファイルの入出力にエラーが発生しました(E006)。"); } eval { flock( IN, 2 );}; # ファイルをロック @lines = ; eval { flock( IN, 8 );}; # ロック解除 close(IN); #------------------------------------- # ログの分別 #------------------------------------- push (@old, "$FORM{'logtitle'}\n"); # 1行目にタイトルを格納 foreach $line (@lines) { ($count,$date,$editpwd,$name,$email,$url,$value,$subject,$rhost) = split(/\,/,$line); $del = 0; foreach $target (@RM) { if ($target eq $count) { $del = 1; } } if ($del == 0) { push(@new,$line); } else { push(@old,$line); } } #------------------------------------- # 通常ログの出力 #------------------------------------- if (!open(DB,">$log_file")) { &error("ファイルの入出力にエラーが発生しました(E007)。"); } eval { flock( DB, 2 );}; # ファイルをロック print DB @new; eval { flock( DB, 8 );}; # ロック解除 close(DB); #------------------------------------- # 過去ログの出力 #------------------------------------- if (!open(DB,">$new_log")) { &error("ファイルの入出力にエラーが発生しました(E007)。"); } eval { flock( DB, 2 );}; # ファイルをロック print DB @old; eval { flock( DB, 8 );}; # ロック解除 close(DB); #------------------------------------------------------------ # 記録処理後、再読み込みする #------------------------------------------------------------ print "Location:$reload_url"."makelog.cgi?\n\n"; } #----------------------------------------------------------------- # フォーム投稿されたデータを解析し、配列にリストする #----------------------------------------------------------------- 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; #-------------------------------------------------- # 処理の都合上、改行コード等を文字列から排除する # 改行コードを
に変換する(97.01.29) #-------------------------------------------------- $value =~ s/\r\n/
/g; $value =~ s/\n/
/g; $value =~ s/\,//g; #-------------------------------------------------- # 書き込まれたくないタグが含まれる内容を消去する #-------------------------------------------------- if ( $mode ne "admin" ) { $value =~ s/; eval { flock( DB, 8 );}; # ロック解除 close(DB); foreach $line (@lines) { ($name,$value) = split(/\,/,$line); $CFG_DATA{$name} = $value; } if ( $CFG_DATA{'max'} > $log_max ) { $CFG_DATA{'max'} = $log_max; } if ( $CFG_DATA{'page'} eq "" ) { $CFG_DATA{'page'} = 0; } else { if( $CFG_DATA{'page'} > $page_max ) { $CFG_DATA{'page'} = $page_max; } } } #----------------------------------------------------------------- # 管理用マスターキーの読み込み #----------------------------------------------------------------- sub read_master_key { if ( open( DB, "$path$passwd_file" )) { eval { flock( DB, 2 );}; # ファイルをロック $master_pass = ; eval { flock( DB, 8 );}; # ロック解除 close(DB); if ( $master_pass eq "" ) { print "Location:$reload_url"."admin.cgi\n\n"; } chop($master_pass) if $master_pass =~ /\n$/; } else { print "Location:$reload_url"."admin.cgi\n\n"; } } #--------------------------------------------------------------------- # 各種データ変数の初期化 #--------------------------------------------------------------------- sub init { if( $FORM{'bordname'} ne "" ) { $bordname = "$FORM{'bordname'}"; if ( $path ne "" ) { $log_file = "$path"."log/$bordname".".log"; # ログファイル名 } else { $log_file = "./log/$bordname".".log"; # ログファイル名 } } }