#! /usr/local/bin/perl # #========================================================================================== # # 多機能(?)掲示板システム 『Suzuki's Sigle Board』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 #========================================================================================== # # 初期設定 # #--------------------------------------------------------------------- $script = 'ssboard.cgi'; # 掲示板スクリプト名 $version = '1.3'; # 本スクリプトのバージョン #--------------------------------------------------------------------- # 管理用パスワード # 当然ですが、できるだけ類推できにくいものを設定してください。できれ # ば8文字より長いものにしましょう #--------------------------------------------------------------------- $user_pass = "1234"; #---------------------------------------------------------- # ログファイル名についてはセキュリティ上、変更しておいた方 # がよいと思います。 #---------------------------------------------------------- $log_file = "ssboard.log"; #---------------------------------------------------------- # ボード情報定義ファイル名 # 例) $cfg_name = "ssboard.cfg"; #---------------------------------------------------------- $cfg_file = ""; #--------------------------------------------------------------------- # ボード定義情報:デフォルト値 # ・定義ファイルを使用する場合は、そちらが優先されます。 # ・定義ファイルに無い項目がある場合、ここで定義する値が使用されます。 # ・定義ファイルを使用する場合は、この項目は削除してもかまいませんが # 削除しない方がなにかと安全です。 #--- こ こ か ら ----------------------------------------------------- $file_size = '20000'; # ログファイルのサイズ制限(0で制限なし) # ※これを設定すると $max に関係なく指定したサイズを # こえた時点でログの保存がうち切られます。 # ※サイズの計算は結構アバウトです (^^;;) $max = '50'; # 最大ログ数(0で無制限に保存) $max_comment = '10'; # コメントの最大数(1〜99) $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 = ''; # 書き込み画面の説明文 $max_size = '1500'; # 最大書き込みサイズ(0で制限なし) $max_subject = '100'; # 題名のサイズ $max_name = '100'; # 投稿者名のサイズ $max_email = '100'; # 投稿者emailのサイズ $max_url = '200'; # 投稿者homeのサイズ $security = '0'; # デフォルトセキュリティレベルの設定 # 0:制限なし # 1:JPドメインのみ許可 # 2:プロキシの禁止 # 3:JPおよびプロキシ $maintenance = '0'; # 掲示板メンテナンス中の制限フラグ # 0:通常の運用 1:書き込みを禁止 2:表示も禁止 #--こ こ ま で ------------------------------------------------------- #---------------------------------------------------------- # 許可したいプロキシ(と誤判定されるドメイン)を設定する #---------------------------------------------------------- @proxylist = ( "aikis.or.jp", "cypress.ne.jp" ); #---------------------------------------------------------- # 利用制限するドメインリストのファイル名 # 省略すると、ドメイン制限は行われません # $domain_file = "domain.lst"; #---------------------------------------------------------- $domain_file = ""; #---------------------------------------------------------- # クッキー処理のためのクッキー名 # 変更しない場合、複数のボードで同じクッキーが利用されるこ # とになり、支障をきたすこともあります #---------------------------------------------------------- $cookie_name = "ssb001"; #---------------------------------------------------------- # ファイル入出力時にファイルロックを行う設定。これにより、 # 同時アクセス時の問題が多少マシになる(?) # サーバーが flock()関数を使える設定の場合のみ利用できます # 0:ファイルロックを行わない # 1:flock()でファイルロックを行う #---------------------------------------------------------- $lockmode = 0; #---------------------------------------------------------- # CERN系のサーバーなどで、ファイル関係でエラーが出る場合、 # 以下に設置するディレクトリのサーバー内でのフルパスを指定 # してみると、正常に動作することがあるかもしれません ^^;; # # 最後は / で終わること。 # 例:$path = '/home/user/s-suzuki/public_html/ssboard/'; #---------------------------------------------------------- $path = ''; #---------------------------------------------------------- # 外部からの(イタズラ)書き込みを禁止する場合、以下に、ス # クリプトのURLを記入する。(サーバーやブラウザによっては # うまく働かないこともあります) # 例:$script_url = 'http://www.aikis.or.jp/~s-suzuki/ssboard/ssboard.cgi'; #---------------------------------------------------------- $script_url = ''; #---------------------------------------------------------- # 書き込みの後のリロードに失敗する場合(File Not Foundので # る場合)、CGIスクリプトを設置するディレクトリ名をURLで指 # 定すると成功する場合があるそうです。 # ※この機能については未確認です # ※biglobeでは成功するそうです # ※v1.27より記述方法を変更しています # ※最後は / で終わること。 # 例:$rerload_url = 'http://www.aikis.or.jp/~s-suzuki/ssboard/'; #---------------------------------------------------------- $reload_url = ''; #---------------------------------------------------------- # 日本語コード変換ライブラリの指定 #---------------------------------------------------------- # require "$path"."jcode.pl"; #========================================================================================= # 設定はここまで # これより、処理の開始 #========================================================================================= $| = 1; # ファイルバッファリングをしない &form; # フォーム入力された値の分解 &init; # 各種データ変数の初期化 &read_domainlist; # 制限するドメインリストの読み込み &read_cfg; # ボード定義情報の読み込み #---------------------------------------------------------- # スクリプトの動作を決定($FORM{'task'}で判定) #---------------------------------------------------------- if ( $FORM{'task'} eq 'regist') { # データの書き込み(通常・コメント) ®ist; } elsif ( $FORM{'task'} eq 'remove' ) { # 削除データのリスト表示 if( -e "remove.cgi" ) { print "Location:$reload_url"."remove.cgi?\n\n"; } else { &error("削除スクリプト(remove.cgi)が見つかりません。"); } } elsif ( $FORM{'task'} eq 'edit' ) { # 編集データのリスト表示 if( -e "edit.cgi" ) { print "Location:$reload_url"."edit.cgi?\n\n"; } else { &error("編集スクリプト(edit.cgi)が見つかりません。"); } } elsif ($FORM{'task'} eq 'makelog') { # 過去ログ作成CGIの呼び出し if( -e "makelog.cgi" ) { print "Location:$reload_url"."makelog.cgi?\n\n"; } else { &error("過去ログ作成スクリプト(makelog.cgi)が見つかりません。"); } } elsif ($FORM{'task'} eq 'cust') { # カスタマイズCGIの呼び出し if( -e "cust.cgi" ) { print "Location:$reload_url"."cust.cgi?\n\n"; } else { &error("カスタマイズスクリプト(cust.cgi)が見つかりません。"); } } elsif ($FORM{'task'} eq 'domain') { # ドメイン管理CGIの呼び出し if( -e "cust.cgi" ) { print "Location:$reload_url"."domain.cgi?\n\n"; } else { &error("ドメイン管理スクリプト(dmain.cgi)が見つかりません。"); } } else { # 通常の画面表示 if( $FORM{'task'} eq "log_all" ) { $CFG_DATA{'page'} = "0"; } &main; exit; } #========================================================================================= # 処理はここまで(以下は、各サブルーチン) #========================================================================================= #---------------------------------------------------------------------- # 通常の画面表示ルーチン #---------------------------------------------------------------------- sub main { #------------------------------------------------------- # クッキーの取得(独自方式) #------------------------------------------------------- $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$cookie_name}); foreach $pair (@pairs) { ($name, $value,$temp) = split(/:/, $pair); if( $name eq "url" ) { if( $value eq "" ) { $COOKIE{$name} = "http:\/\/"; } else { $COOKIE{$name} = "$value\:$temp"; } } else { $COOKIE{$name} = $value; } } if ( $COOKIE{'url'} eq "" ) { $COOKIE{'url'} = "http://"; } #------------------------------------------------------------ # 記録ファイルをオープンして、配列<@lines>に格納 #------------------------------------------------------------ &read_log; #-------------------------------------------------- # ページ処理でスタートするメッセージ番号 #-------------------------------------------------- if ( $CFG_DATA{'page'} ne "0" ) { $start = $FORM{'page'}*$CFG_DATA{'page'}; $end = $FORM{'page'}*$CFG_DATA{'page'}+$CFG_DATA{'page'}; } #-------------------------------------------------- # メッセージ数の取得 #-------------------------------------------------- $data_count = 0; $page_mode = 0; if ( $CFG_DATA{'page'} ne "0" ) { foreach $line (@lines) { if( $data_count < $start ) { # 開始番号までスキップ if ( substr($line, 0, 1) eq "#" ) { $data_count++; } } else { if ( substr($line, 0, 1) eq "@" ) { # コメントは無条件に格納 if( $data_count != $start ) { push( @line_data, $line ); } } elsif ( substr($line, 0, 1) eq "#" ) { # 本文の場合 if( $data_count < $end ) { push( @line_data, $line ); $data_count++; } else { $page_mode = 1; # 続きがあるよ! last; } } } } } else { foreach $line (@lines) { push( @line_data, $line ); } } #-------------------------------------------------- # HTML(画面)の出力 #-------------------------------------------------- print "Content-type: text/html\n\n"; print "\n
\n"; if( $CFG_DATA{'title_image'} ne "" ) { print " | \n"; } else { print "$CFG_DATA{'title'}\n"; } print ""; if( $CFG_DATA{'max'} ne '0' ) { print "全$CFG_DATA{'max'}件"; } else { print " "; } print " | \n"; print "
$CFG_DATA{'readme'}\n"; } print "
$value |
$subject"; print " 名前:$name"; if ($email ne "") { print " Mail"; } if ($url ne "") { print " Home"; } print " ($date) $value |