#!/usr/local/bin/perl #=========================================================== # wwwboard: Version 2.61 # Copyright (C) 1997, 2000 とほほ # http://wakusei.cplaza.ne.jp/twn/wwwboard.htm # フリーソフト・再配布/改造/流用可能・確認メール不要 #=========================================================== # # 1997.03.23 初版 # 1997.03.?? 改行を改行として扱うように修正 # 1997.04.10 時間帯が狂ってしまうことがある問題に対処 # 1997.04.20 長いタグを書くと強制的に改行が挿入されてしまう問題に対処 # 1997.05.11 初期値を300行に減らした # 1997.05.11 「再描画」を「再表示」に # 1997.05.11 「戻る」ボタンをつけた # 1997.05.18 「伝言板」に改名 # 1997.06.08 メールアドレスを入力できるようにした # 1997.06.15 URLを入力できるようにした # 1997.06.15 曜日を表示するようにした # 1997.06.15 漢字コードの文字化けに対処した。(jcode採用) # 1997.07.06 10分以上古いロックファイルは削除するようにした # 1997.08.24 NN2.0で文字化けするバグを修正 # 1997.10.19 自己診断機能を強化 # 1997.11.09 HTMLタグを許さない指定を可能にした # 1998.04.12 x-sjisを指定しないようにした # 1998.05.24 リロードしても二重書き込みしないようにした # 1998.05.24 アンパ(&)とクォート(")も文字化けしないようにした # 1998.05.25 二重書き込み禁止がNetscapeサーバーで動かなかったので一時見送り # 1998.08.02 の書き忘れを修正 # 1998.11.08 SIGPIPE対処とエラー時のメッセージ追加 # 1999.02.07 Ver2.52 2000年対応 # 1999.05.23 Ver2.53 クライアントがJISを送信するときの文字化けに対処 # 1999.06.06 Ver2.54 ロックファイルのパーミッションを755から0755に修正 # 1999.10.03 Ver2.55 誤ってロックファイルを消してしまうことがあるバグを修正 # 2000.03.19 Ver2.60 HTMLタグの使用を禁止 # 2000.03.20 Ver2.61 シンタックスチェック # # # Maximum number of messages # $max_msgs = 100; # # Return URL # $return_url = ""; # # Allow HTML tags # $allow_html = 0; # # Set timezone # $ENV{'TZ'} = "JST-9"; # # Constant variables # @wdays = ( "日", "月", "火", "水", "木", "金", "土", "日" ); # # Test mode # if ($ARGV[0] eq "test") { print "Content-type: text/html\n"; print "\n"; print "\n"; print "\n"; print "wwwboard test\n"; print "\n"; print "\n"; print "CGIスクリプトは正常に動作しています。\n"; if (! -d "lock") { print "
NG. lockディレクトリが存在しません。\n"; } elsif (! -w "lock") { print "
NG. lockディレクトリに書き込みができません。\n"; } elsif (-d "lock/wwwboard.loc") { print "
NG. lock/wwwboard.loc が残っています。\n"; } if (! -f "wwwboard.dat") { print "
NG. wwwboard.dat が存在しません。\n"; } elsif (! -w "wwwboard.dat") { print "
NG. wwwboard.dat に書き込みできません。\n"; } if (! -f "wwwboard.tmp") { print "
NG. wwwboard.tmp が存在しません。\n"; } elsif (! -w "wwwboard.tmp") { print "
NG. wwwboard.tmp に書き込みできません。\n"; } print "\n"; print "\n"; exit(0); } # # Japanese KANJI code # if (-f "jcode.pl") { $jflag = 1; require "jcode.pl"; $code = ord(substr("漢", 0, 1)); if ($code == 0xb4) { $ccode = "euc"; } elsif ($code == 0x1b) { $ccode = "jis"; } else { $ccode = "sjis"; } } # # Read variables # if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); @a = split(/&/, $query_string); foreach $x (@a) { ($name, $value) = split(/=/, $x); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; if ($jflag) { &jcode'convert(*value, "euc"); } if ($allow_html) { $value =~ s//-->/g; } else { $value =~ s/&/&/g; $value =~ s/"/"/g; $value =~ s//>/g; } if ($jflag) { &jcode'convert(*value, $ccode); } $FORM{$name} = $value; } } # # File lock # foreach $i ( 1, 2, 3, 4, 5, 6 ) { if (mkdir("lock/wwwboard.loc", 0755)) { last; } elsif ($i == 1) { ($mtime) = (stat("lock/wwwboard.loc"))[9]; if ($mtime < time() - 600) { rmdir("lock/wwwboard.loc"); } } elsif ($i < 6) { sleep(2); } else { print "Content-type: text/html\n"; print "\n"; print "\n"; print "\n"; print "掲示板\n"; print "\n"; print "\n"; print "

掲示板

\n"; print "
\n"; print "只今、掲示板が混雑しております。しばらくお待ちの上、"; print "再度アクセスお願いします。\n"; print "
\n"; print "\n"; print "\n"; exit(1); } } # # Remove lockfile when terminated by signal # sub sigexit { rmdir("lock/wwwboard.loc"); exit(0); } $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit"; # # Write to date file # if ($FORM{'MESSAGE'} ne "") { # # Get date and time # ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time); $date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d", $year + 1900, $mon + 1, $mday, $wdays[$wday], $hour, $min, $sec); # # Write current message. # $FORM{'MESSAGE'} =~ s/\r*$//g; $FORM{'MESSAGE'} =~ s/\r/
/g; open(OUT, "> wwwboard.tmp"); print OUT "
\n"; if ($FORM{'URL'} eq "") { print OUT "$FORM{'FROM'} $date\n"; } elsif ($FORM{'URL'} =~ /^http:/) { print OUT "$FORM{'FROM'} $date\n"; } else { print OUT "$FORM{'FROM'} $date\n"; } print OUT "
$FORM{'MESSAGE'}\n"; print OUT "
\n"; print OUT "
\n"; # # Append messages. # open(IN, "wwwboard.dat"); while () { print OUT; } close(IN); close(OUT); # # Copy .tmp to .dat # open(IN, "wwwboard.tmp"); open(OUT, "> wwwboard.dat"); $msgs = 0; while () { if ($_ =~ /^
/) { if ($max_msgs != 0) { if ($msgs++ >= $max_msgs) { last; } } } print OUT; } close(IN); close(OUT); } #if ($ARGV[0] eq "reload") { # rmdir("lock/wwwboard.loc"); # print "Location: $ENV{'SCRIPT_NAME'}\n"; # print "\n"; # exit(0); #} # # Print HTML document # print "Content-type: text/html\n"; print "\n"; print "\n"; print "\n"; print "掲示板\n"; print "\n"; print "\n"; print "

掲示板

\n"; if ($return_url ne "") { print "[戻る]\n"; } print "
\n"; #print "
\n"; print "\n"; print "\n"; print ""; print ""; print "\n"; print "\n"; print ""; print ""; print ""; print "\n"; print ""; print "\n"; print "\n"; print "\n"; print "
お名前:
URL:
URLにはメールアドレスか、http:で始まるホームページアドレスを入れてください。省略可。
"; print "
\n"; print "

\n"; print "

\n"; print "
\n"; open(IN, "wwwboard.dat"); while () { print; } close(IN); print "\n"; print "\n"; # # File unlock # rmdir("lock/wwwboard.loc");