#!/usr/local/bin/perl #=============================================== # wwwchat.cgi Version 2.61 # Copyright (C) 1997, 2000 とほほ # http://wakusei.cplaza.ne.jp/twn/wwwchat.htm # フリーソフト・改造/流用/再配布可能・確認メール不要 #=============================================== # # 1997.05.18 First Version # 1997.06.08 Max lines -> Max messages. # 1997.06.08 Add E-Mail Address field. # 1997.06.15 Change E-Mail field to URL field. # 1997.07.06 Remove old lock directory # 1997.11.09 HTMLタグを禁止できるようにした # 1998.04.12 x-sjisを指定しないようにした # 1998.05.24 & や " の文字化けを改善 # 1998.12.20 Ver2.51 SIGPIPE対応 # 1999.01.24 Ver2.52 リンクを_topで開くように修正 # 1999.02.07 Ver2.53 2000年対応(年を4桁で表示) # 1999.05.23 Ver2.54 クライアントがJISを送るときの文字化けに対処 # 1999.06.06 Ver2.55 ロックファイルのパーミッションを755から0755に修正 # 1999.10.03 Ver2.56 誤ってロックファイルを消してしまうことがあるバグを修正 # 2000.03.19 Ver2.60 HTMLタグの使用を禁止 # 2000.03.20 Ver2.61 シンタックスチェックのワーニングを除去 # # # Set timezone # $ENV{'TZ'} = "JST-9"; # # Maximum number of messages # $max_msgs = 100; # # Allow HTML tags # $allow_tags = 0; # # Weekday # @wdays = ( "日", "月", "火", "水", "木", "金", "土" ); # # Japanese KANJI code # if (-f "jcode.pl") { $jflag = 1; $kcode = "sjis"; require "jcode.pl"; } # # 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_tags) { $value =~ s//-->/g; } else { $value =~ s/&/&/g; $value =~ s/"/"/g; $value =~ s//>/g; } if ($jflag) { &jcode'convert(*value, $kcode); } $FORM{$name} = $value; } } # # File lock # foreach $i ( 1, 2, 3, 4, 5, 6 ) { if (mkdir("lock/wwwchat.loc", 0755)) { last; } elsif ($i == 1) { ($mtime) = (stat("lock/wwwchat.loc"))[9]; if ($mtime < time() - 600) { rmdir("lock/wwwchat.loc"); } } elsif ($i < 6) { sleep(2); } else { exit(1); } } # # Remove lockfile when terminated by signal # sub sigexit { rmdir("lock/wwwchat.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, "> wwwchat.tmp"); if ($FORM{'URL'} eq "") { print OUT "__XXX__ $date $FORM{'FROM'}\n"; } elsif ($FORM{'URL'} =~ /^http:/) { print OUT "__XXX__ $date $FORM{'FROM'}\n"; } else { print OUT "__XXX__ $date $FORM{'FROM'}\n"; } print OUT "$FORM{'MESSAGE'}\n"; # print OUT "
\n"; # print OUT "$FORM{'FROM'} $date\n"; # print OUT "
$FORM{'MESSAGE'}\n"; # print OUT "
\n"; # print OUT "
\n"; # # Append messages. # open(IN, "wwwchat.dat"); while () { print OUT; } close(IN); close(OUT); # # Copy .tmp to .dat # open(IN, "wwwchat.tmp"); open(OUT, "> wwwchat.dat"); $msgs = 0; while () { if ($_ =~ /^__XXX__/) { if ($max_msgs != 0) { if ($msgs++ >= $max_msgs) { last; } } } print OUT; } close(IN); close(OUT); } # # Print HTML document # print "Content-type: text/html\n"; print "\n"; print "\n"; print "\n"; print "Chat room\n"; print "\n"; print "\n"; print "\n"; open(IN, "wwwchat.dat"); while () { if ($_ =~ /^__XXX__/) { @x = split(/ /, $_); $y = join(" ", @x[3..$#x]); print "\n"; print "

$y $x[1] $x[2]
\n"; } else { print; } } close(IN); print "

\n"; print "\n"; print "\n"; # # File unlock # rmdir("lock/wwwchat.loc");