#!/usr/bin/perl ############ # 基本設定 # ############ #require 'jcode.pl'; #$ccode = "euc"; $boardurl = "http://あなたのウェブサイト/bbs.html"; #$basedir = "/掲示板のあるディレクトリ/"; $pswd = "password"; #$addrss = 'あなたの@メール.アドレス'; $smpath = "/usr/sbin/sendmail"; $wait = 0; $max = 512; $dname = "ゲスト"; $dttle = "こんにちは"; $arch = "A-"; $daug = "D-"; $admin = "admin"; $init = "init"; $dlck = 10; $erro0 = "いくつかのエラーが重なっています。"; $erro1 = "データファイルまたは臨時ファイルの取り扱いに失敗しました。"; $erro2 = "現在ほかの方が記帳中です。"; $erro3 = "いつまでもこの状態が続く場合は管理人に連絡して下さい。"; $erro4 = "ロックが解除できませんが、それ以外は問題ないようです。"; $erro5 = "ディレクトリの取り扱いに失敗しました。"; $erro6 = "データがカラです。何も送信されていません。"; $erro7 = "パスワードが違います。"; $erro8 = "ファイルかディレクトリに異常があります。"; $erro9 = "以下のファイルが削除できませんでした:"; $erro10 = "以下の掲示板関係ファイルがすでに存在します。"; $erro11 = "連番での削除の最終No.が違うようです。"; $erro12 = "連番での削除の開始No.が違うようです。"; $erro13 = "連番でのアーカイブ化の開始No.が違うようです。"; $erro14 = "連番でのアーカイブ化の開始No.が違うようです。"; ### 固定変数 ### $tmp = "tmp.dat"; $lock = "lock.dat"; $unlock = "unlock.dat"; if ($ENV{'SERVER_NAME'}) { $bbs_cgi = "http://".$ENV{'SERVER_NAME'}.$ENV{'SCRIPT_NAME'}; } else { $bbs_cgi = $ENV{'SCRIPT_NAME'}; } ($bfile = $boardurl) =~ s/.*\///; ### 掲示板型紙 ### $head = <<"BOARD_HEAD"; DoubleMessageBoard

DoubleMessageBoard

日本語版

お名前:
メール:

件 名:

コメント(HTMLタグは使えません):

BOARD_HEAD ######## # 主文 # ######## if ($basedir) {chdir $basedir or &error1("LINE-83",$erro5,$erro3,$!);} if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, my($input), $ENV{'CONTENT_LENGTH'}); my(@pair) = split(/&/, $input); foreach (@pair) { my($name, $value) = split(/=/); $value =~ tr/+/ /; ### データ整形 ### $value =~ s/%0D%0A/
/g; $value =~ s/%0A/
/g; $value =~ s/%0D/
/g; $value =~ s/%09/     /g; $value =~ s/%3C/</g; $value =~ s/%3E/>/g; $value =~ s/%(..)/pack("c", hex($1))/ge; if ($ccode) {jcode'convert($value,$ccode);} $data{$name} = $value; } if ($data{'comments'} ne "") { &addmsg; } elsif ($data{'pswd'}) { if ($data{'pswd'} eq $pswd) {&ediout;} else {&error1("LINE-105",$erro7,$!);} } else { &error1("LINE-107",$erro6,$!); } } elsif ($ENV{'QUERY_STRING'} =~ m/^$admin=?(.*)/) { if ($1 ne $init) {&ediin;} else {&init;} } print "Location: $boardurl\n\n"; exit; ############## # 投稿受付け # ############## sub addmsg { if ($dlck) {&randu;} else {&uflck;} $posted = localtime(time); if ($data{'name'} eq "") {$data{'name'} = $dname;} if ($data{'email'}) {$data{'name'} = "$data{'name'}";} if ($data{'title'} eq "") {$data{'title'} = $dttle;} $data{'comments'} =~ s/((s?https?|ftp):\/\/[\-_\w!\#\$\%\&'\(\)\=\~\@;:,\.\/\+\*\?]+[\-_\w\$\&\=\~\@\/\+])/$1<\/a>/gi; $size = length $data{'comments'}; if ($max < $size) {&dent;} ### 新記事 ### $msg = <<"NEW_DATA";
$data{'name'} ($posted)

$data{'title'}

$data{'comments'} NEW_DATA $msg =~ tr/\n/ /s; print TEMPF "\n\t".$msg."\n"; while () {print TEMPF;} close(TEMPF); close(DATAF); unless (-z $tmp) { rename ($tmp, $bfile) or &error2("LINE-147",$erro1,$erro3,$!); } else { &error2("LINE-149",$erro1,$erro3,$!); } &unlck; ### メール送信 ### if ($addrss) { $mailn = <<"MAIL_NOTICE"; To: $addrss Subject: 掲示板に新しく投稿がありました $data{'title'} MAIL_NOTICE if ($ccode) {jcode'convert($mailn,"jis");} open (MAIL, "|$smpath -t -oi"); print MAIL $mailn; close MAIL; } &thnk; } ############ # 娘板作成 # ############ sub dent { my($file) = $daug.$item.".html"; open (NDF, ">$file") or &error2("LINE-177",$erro1,$erro3,$!); print NDF <<"HTML_DAUG"; DaughterBoard $data{'title'}

$data{'comments'} HTML_DAUG close NDF; $data{'comments'} = substr($data{'comments'}, 0, $max); $data{'comments'} =~ s/]*)>?([^>]*)$//g; $data{'comments'} =~ s/<([^>]*)$//g; $cutoff = ($size - (length $data{'comments'})); ### 娘板へのリンク ### $data{'comments'} .= "

$cutoff more byte(s), click here!"; } ################ # ありがとう文 # ################ sub thnk { if (defined $wait) {print "REFRESH: $wait;URL=$boardurl\n"} print <<"THANK_YOU"; Content-type: text/html ありがとうございました。

御利用者さまへ

CGIはあなた様から命じられた作業を無事終了しました。再び掲示板へ御案内いたします。
m(. .)m

THANK_YOU exit; } ################## # データ編集入力 # ################## sub ediin { open(DATAF, "<$bfile") or &error1("LINE-237",$erro8,$!); print <<"HTML_HEAD"; Content-type: text/html ウェブマスター専用ページ

ようこそ。これは管理作業用ページです

ウェブマスター以外の入室はお断りします

くれぐれもハッキングとかしないでね m(..)m
HTML_HEAD ### 編集ページ本文 ### while () { if (/^\t(.*)/) { print <<"HTML_BODY";

$2

記事No.$1
この記事を削除する HTML_BODY } } print <<"HTML_FOOT";



No.からNo.までの記事を削除する

No.からNo.までの記事を古文書として別途保管する

合い言葉:


何もせず掲示板に戻る

処理の優先順位:CGIはそれぞれの記事について、まずこの記事を削除するがチェックされているか、次ぎに連番での削除範囲に指定されているか、最後に古文書へ入れる範囲に含まれているかの順で判断して処理し、どれにも含まれない記事は掲示板に残されます。 HTML_FOOT close(DATAF); exit; } ################## # データ編集出力 # ################## sub ediout { if ($data{'STDE'} or $data{'ENDE'}) { if ($data{'STDE'} =~ m/^([^0-9]*)([0-9]+)([^0-9]*)$/) { $data{'STDE'} = $2; } else { &error1($erro12,$!); } if ($data{'ENDE'} =~ m/^([^0-9]*)([0-9]+)([^0-9]*)$/) { $data{'ENDE'} = $2; } else { &error1($erro11,$!); } if ($data{'STDE'} <= $data{'ENDE'}) { $stde = $data{'STDE'}; $ende = $data{'ENDE'}; } else { $stde = $data{'ENDE'}; $ende = $data{'STDE'}; } } if ($data{'STAR'} or $data{'ENAR'}) { if ($data{'STAR'} =~ m/^([^0-9]*)([0-9]+)([^0-9]*)$/) { $data{'STAR'} = $2; } else { &error1($erro14,$!); } if ($data{'ENAR'} =~ m/^([^0-9]*)([0-9]+)([^0-9]*)$/) { $data{'ENAR'} = $2; } else { &error1($erro13,$!); } if ($data{'STAR'} <= $data{'ENAR'}) { $star = $data{'STAR'}; $enar = $data{'ENAR'}; } else { $star = $data{'ENAR'}; $enar = $data{'STAR'}; } if ($dlck) { &randu; open (LKF, "+<$lock") or &error2("LINE-332",$erro1,$erro3,$!); } else {&uflck;} print TEMPF "\n"; $afno = ; $arch .= $afno.".html"; open (ARCH, ">$arch") or &error2("LINE-337",$erro8,$!); ### アーカイブ ### print ARCH <<"ARCH_HEAD"; アーカイブ

DoubleMessageBoardアーカイブ

掲示板へ戻る ARCH_HEAD $posi = tell(ARCH); while () { if (/^\t(.*)$/) { &deld; if (($1 >= $star) and ($1 <= $enar)) { print ARCH "\n$2\n"; next; } } elsif (/^\t(.*)$/) { if ($posi < (tell(ARCH))) { print ARCH <<"ARCH_FOOT"; $1

DoubleMessageBoard
is visitware, pay me visit! ARCH_FOOT close(ARCH); seek LKF, 0, 0; print LKF ++$afno; ### アーカイブへリンク ### print TEMPF "\t


もっと古い記事があります。ここをクリックして下さい。\n"; } else { print TEMPF; close ARCH; unlink $arch; } last; } print TEMPF; } if ($dlck) {close(LKF);} } else { if ($dlck) {&randu;} else {&uflck;} print TEMPF "\n"; while () { if (/^\t(.*)/) {&deld;} print TEMPF; if (/^\t(.*)$/) {last;} } } print TEMPF <<"HTML_FOOT";

DoubleMessageBoard
is visitware, pay me visit! HTML_FOOT close(DATAF); close(TEMPF); unless (-z $tmp) { rename ($tmp, $bfile) or &error2("LINE-406",$erro1,$erro3,$!); } else { &error2("LINE-408",$erro1,$erro3,$!); } &unlck; if ($msg) { &error1($erro9,$msg); } else { &thnk; } } ############## # 掲示板作成 # ############## sub init { if (-e $bfile) {&error1("LINE-425",$erro10,$bfile);} if (-e $unlock) {&error1("LINE-426",$erro10,$unlock);} open(DATAF, ">$bfile") or &error1("LINE-427",$erro8,$!); print DATAF $head; print DATAF <<"HTML_MANDE"; \t


DoubleMessageBoard
is visitware, pay me visit! HTML_MANDE close(DATAF); open(LKF, ">$unlock") or &error1("LINE-440",$erro8,$!); print LKF "1"; close(LKF); &thnk; } ############ # エラー文 # ############ sub error1 { print <<"ERROR_M"; Content-type: text/html エラー!

利用者様へ

以下の理由により命令は実行されませんでした。
$_[0]
$_[1]
$_[2]
$_[3] ERROR_M exit; } ################ # エラーその2 # ################ sub error2 { &unlck; &error1; } ######################################## # lock & unlock CGI & write board head # ######################################## sub randu { rename ($unlock, $lock) or &relck; utime time, time, $lock; $SIG{'TERM'} = $SIG{'PIPE'} = $SIG{'HUP'} = "error2"; &wbhd; } sub uflck { open (LKF, "+<$unlock") or &error2("LINE-499",$erro1,$erro3,$!); flock(LKF, 2) or &error1("LINE-500",$erro1,$erro3, $!); &wbhd; } sub wbhd { open (DATAF, "<$bfile") or &error2("LINE-506",$erro1,$erro3,$!); open(TEMPF, ">$tmp") or &error2("LINE-507",$erro1,$erro3,$!); print TEMPF $head; while () {if (/^/) {$item = $1; last;}} } sub unlck { if ($dlck) { rename($lock, $unlock) or &error1("LINE-515",$erro4,$erro3,$!); } else { close(LKF); } } sub relck { unless (-e $lock) { &error1("LINE-524",$erro1,$erro3,$!); } elsif ((-M $lock)*86400 < $dlck) { while (++$i) { sleep 1; if (rename ($unlock, $lock)) {last;} if ($i > 5) {&error1("LINE-529",$erro2,$!);} } } } ######################## # delete daughterboard # ######################## sub deld { if (($data{$1} eq "D") or (($1 >= $stde) and ($1 <= $ende))) { my($file) = $daug.$1.".html"; if (-e $file) {unlink $file or $msg .= "
".$file;} next; } } #-- End of bbs.cgi # # DoubleMessageBoard (JAP), Version 3 # visitware (C) 2000-2003 # B. Uchina, All rights reserved # http://www.visitware.com/sobaya/