#! /usr/local/bin/perl # #========================================================================================== # # 多機能(?)掲示板システム 『Suzuki's Simple Board』ver 1.27 # # 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'; # 掲示板スクリプト名(ファイル名のみ、拡張子なし) $version = '1.27'; # 本スクリプトのバージョン #--------------------------------------------------------------------- # ボード定義情報:デフォルト値 # ・定義ファイルを使用する場合は、そちらが優先されます。 # ・定義ファイルに無い項目がある場合、ここで定義する値が使用されます。 # ・定義ファイルを使用する場合は、この項目は削除してもかまいません。 #--------------------------------------------------------------------- $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のサイズ #---------------------------------------------------------- # ボード情報定義ファイル名 # 例) $cfg_name = "ssboard.cfg"; #---------------------------------------------------------- # $cfg_name = ""; #---------------------------------------------------------- # ログファイル名についてはセキュリティ上、変更しておいた方 # がよいと思います。 #---------------------------------------------------------- # $log_name = "ssboard.log"; #---------------------------------------------------------- # デフォルトセキュリティレベルの設定 # セキュリティレベルの設定がされていない場合のデフォルト # 0:制限なし # 1:JPドメインのみ許可 # 2:プロキシの禁止 # 3:JPおよびプロキシ #---------------------------------------------------------- # $security = '0'; #---------------------------------------------------------- # 許可したいプロキシ(と誤判定されるドメイン)を設定する #---------------------------------------------------------- @proxylist = ( "aikis.or.jp", "cypress.ne.jp" ); #---------------------------------------------------------- # 利用制限するドメインリストのファイル名 # 省略すると、ドメイン制限は行われません # $domain_file = "domain.lst"; #---------------------------------------------------------- $domain_file = ""; #---------------------------------------------------------- # クッキー処理のためのクッキー名 # 変更しない場合、複数のボードで同じクッキーが利用されるこ # とになり、支障をきたすこともあります #---------------------------------------------------------- # $cookie_name = "ssb001"; #---------------------------------------------------------- # 管理用パスワード # 当然のことですが、できるだけ類推できにくいものを設定して # ください。できれば8文字より長いものにしましょう #---------------------------------------------------------- # $user_pass = "1234"; #---------------------------------------------------------- # ファイル入出力時にファイルロックを行う設定。これにより、 # 同時アクセス時の問題が多少マシになる(?) # サーバーが flock()関数を使える設定の場合のみ利用できます # 0:ファイルロックを行わない # 1:flock()でファイルロックを行う #---------------------------------------------------------- # $lockmode = 0; #---------------------------------------------------------- # 掲示板メンテナンス中の時に指定するフラグ。 # メンテナンス中は読み込み・書き込みの制限ができます。 # 0:通常の運用 1:書き込みを禁止 2:表示も禁止 #---------------------------------------------------------- # $maintenance = 0; #---------------------------------------------------------- # CERN系のサーバーなどで、ファイル関係でエラーが出る場合、 # 以下に設置するディレクトリのサーバー内でのフルパスを指定 # してみると、正常に動作することがあるかもしれません ^^;; # # 最後は / で終わること。 # 例:$path = '/home/user/foo/public_html/cgi-bin/bbs/'; #---------------------------------------------------------- # $path = ''; #---------------------------------------------------------- # 外部からの(イタズラ)書き込みを禁止する場合、以下に、ス # クリプトのURLを記入する。(サーバーやブラウザによっては # うまく働かないこともあります) # 例:$script_url = 'http://www.foo.com/~foo/ssboard.cgi'; #---------------------------------------------------------- # $script_url = ''; #---------------------------------------------------------- # 書き込みの後のリロードに失敗する場合(File Not Foundので # る場合)、CGIスクリプトを設置するディレクトリ名をURLで指 # 定すると成功する場合があるそうです。 # ※この機能については未確認です # ※biglobeでは成功するそうです # ※v1.27より記述方法を変更しています # ※最後は / で終わること。 # 例:$rerload_url = 'http://www.aikis.or.jp/~s-suzuki/multibbs/'; #---------------------------------------------------------- $reload_url = ''; #---------------------------------------------------------- # 日本語コード変換ライブラリの指定 #---------------------------------------------------------- # require "$path"."jcode.pl"; #========================================================================================= # これより、処理の開始 #========================================================================================= $| = 1; # ファイルバッファリングをしない &form; # フォーム入力された値の分解 &init; # 各種データ変数の初期化 &read_domainlist; # 制限するドメインリストの読み込み &read_cfg; # ボード定義情報の読み込み #---------------------------------------------------------- # 動作モードの判定(管理者・ユーザーの各モード) #---------------------------------------------------------- if( $FORM{'mode'} eq 'admin' ) { if ( $FORM{'editpwd'} ne $user_pass ) { &error("パスワードが違います。"); } else { $mode = 'admin'; } } #---------------------------------------------------------- # スクリプトの動作を決定($FORM{'task'}で判定) #---------------------------------------------------------- if ( $FORM{'task'} eq 'removelist' ) { # 削除データのリスト表示 &removelist; } elsif ( $FORM{'task'} eq 'remove' ) { # データの削除ルーチンへ &remove_data; } elsif ( $FORM{'task'} eq 'editlist' ) { # 編集データのリスト表示 &editlist; } elsif ( $FORM{'task'} eq 'edit') { # 編集モード &edit_data; } elsif ( $FORM{'task'} eq 'regist') { # データの書き込み(通常・コメント) ®ist; } elsif ($FORM{'task'} eq 'regist2') { # 編集モードのデータ書き込み ®ist2; } elsif ($FORM{'task'} eq 'makelog') { # 過去ログ作成CGIの呼び出し if( $FORM{'pwd'} ne $user_pass ) { &error("パスワードが違います。"); } else { if( -e "makelog.cgi" ) { print "Location:$reload_url"."makelog.cgi?\n\n"; } else { &error("過去ログ作成スクリプト(makelog.cgi)が見つかりません。"); } } } elsif ($FORM{'task'} eq 'cust') { # カスタマイズCGIの呼び出し if( $FORM{'pwd'} ne $user_pass ) { &error("パスワードが違います。"); } else { if( -e "cust.cgi" ) { print "Location:$reload_url"."cust.cgi?\n\n"; } else { &error("カスタマイズスクリプト(cust.cgi)が見つかりません。"); } } } elsif ($FORM{'task'} eq 'domain') { # ドメイン管理CGIの呼び出し if( $FORM{'pwd'} ne $user_pass ) { &error("パスワードが違います。"); } else { 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"; } &html; exit; } #========================================================================================= # 処理はここまで(以下は、各サブルーチン) #========================================================================================= #---------------------------------------------------------------------- # 通常の画面表示ルーチン #---------------------------------------------------------------------- sub html { #------------------------------------------------------- # クッキーの取得(独自方式) #------------------------------------------------------- $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 "
ただ今、掲示板のメンテナンス中です。しばらくお待ち下さい。\n"; print "\n\n"; exit; } #---------------------------------------------------------- # 記事一覧処理 # 配列<@lines>から1件ずつデータを取り出して処理する #---------------------------------------------------------- $nextline = 1; foreach $line (@line_data) { ($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 "
$value"; for (;;) { #--------------------------------------- # 次行がコメントかどうか #--------------------------------------- if ( substr($line_data[$nextline], 0, 1) ne "@" ) { last; } ($count,$date,$editpwd,$name,$email,$url,$value,$subject,$rhost) = split(/\,/,$line_data[$nextline]); #--------------------------------------- # nullコード(\0)を半角カンマに変換 #--------------------------------------- $name =~ s/\0/\,/g; $value =~ s/\0/\,/g; $subject =~ s/\0/\,/g; $email =~ s/\0/\,/g; $url =~ s/\0/\,/g; print "\n\n"; $nextline++; } #---------------------------------------------------------------------- if ( $CFG_DATA{'page'} ne "0" ) { print "
$subject"; print " 名前:$name"; if ($email ne "") { print " Mail"; } if ($url ne "") { print " Home"; } print " ($date)$value"; $nextline++; } print"
$CFG_DATA{'readme2'}\n"; } if ($maintenance == 1 ) { print "
ただ今、掲示板のメンテナンス中につき書き込みができません。しばらくお待ち下さい。\n"; print "