#!/usr/local/bin/perl # # nph-minichat.txt は nph-minichat.cgi に名前変更してください。 ;# 簡易チャット2(NPH仕様) version 6.0n ;# ;# This is Freesoft. ;# Copyright(c)2000 by rescue.ne.jp # [基本構成] ( )内はパーミッション値 # # /public_html/(ホームページディレクトリ) # | # +-- /cgi-local/(任意のディレクトリ) # | # |-- jcode.pl (644) # |-- nph-minichat.cgi (755) # |-- minichat.dat (666) # [履歴] # # v1.0 26/FEB/96 初版 # v4.0 09/JUN/98 # ----------------ここを境にデータ互換はありません----- # v5.0 30/NOV/98 JavaScript組み込み、データ構造の変更 # v5.1 01/DEC/98 JavaScriptエラー修正 # v5.2 16/JAN/99 JavaScriptの採用の有無設定可能に # ----------------ここを境にデータ互換はありません----- # v6.0n 16/MAR/00 NPH仕様化 #----------------# # 初期設定 # #----------------# #◆名称 $title = '簡易チャット2'; #◆設定 $body = ''; #◆チャット表示行 $max = 30; #◆画面に挿入するリンクURL $modoru = 'http://ホームページなどのURL'; #◆画面に挿入するリンクの名称 $modoru_name = '戻る'; #◆minichat.datのパス設定 $chat_file = './minichat.dat'; #◆日本語コード変換ライブラリ require './jcode.pl'; #◆ホスト名をソースに表示 (1:する 0:しない) $view_host = 1; #---------------------------------------------------------------------------- #--時間処理 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $date_now = sprintf("%d:%02d",$hour,$min); #ホスト取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq '') { $host = $addr; } if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } #--フォーム入力と解析 (項1=値1&項2=値2&項3=値3&…) read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); $buffer .= $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s//>/g; $value =~ s/\t//g; $in{$name} = $value; } #--ログ取得 if (!open(DB,$chat_file)) { &error('システムエラー','チャットファイルが開けません.'); } @lines = ; close(DB); ($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$lines[0],5); if ($in{'action'} eq "") { $time = time; &list(1); exit; } # 強制リロード #--クッキー取得と解析 (クッキー名=項1:値1,項2:値2,項3:値3,…) $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($key,$val) = split(/=/,$pair,2); $key =~ s/ //g; if ($key eq "minichat") { $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; @pairs2 = split(/\,/,$val); foreach $pair (@pairs2) { ($key,$val) = split(/:/,$pair,2); $COOKIE{$key} = $val; } } } if ($in{'uname'} eq "" && $COOKIE{'uname'} eq "" && -s $chat_file == 0) { print "HTTP/1.0 204 OK\r\n"; exit; } if ($in{'uname'} eq "" && $COOKIE{'uname'} eq "") { $in{'Value'} = ""; } if ($COOKIE{'uname'} eq "" && $in{'Value'} eq "") { if ($TIME eq "" || $COOKIE{'reload'} eq $TIME) { print "HTTP/1.0 204 OK\r\n"; exit; } # 更新なし→ドキュメントを送信しない else { $time = $TIME; &list(4); exit; } # 更新検知リロード } if ($COOKIE{'reload'} eq "" || $COOKIE{'uname'} eq "") { # 参加 if ($TIME eq "") { $TIME = time; } if ($in{'Value'} ne "") { $COOKIE{'uname'} = $in{'uname'}; ®ist; $time = time; } else { $time = $TIME; } &list(2); exit; } if ($in{'Value'} ne "" && $COOKIE{'uname'} ne "") { $time = time; ®ist; &list(3); exit; } if ($TIME eq "" || $COOKIE{'reload'} eq $TIME) { print "HTTP/1.0 204 OK\r\n"; exit; } # 更新なし→ドキュメントを送信しない else { $time = $TIME; &list(4); exit; } # 更新検知リロード sub list { if ($in{'uname'} ne "") { $COOKIE{'uname'} = $in{'uname'}; } $cookie = "reload:$time,uname:$COOKIE{'uname'}"; $cookie =~ s/([^0-9A-Za-z_])/"%" . unpack("H2",$1)/ge; # URLエンコード $cookie =~ tr/ /+/; print "HTTP/1.0 200 OK\r\n"; if ($buffer ne "") { print "Set-Cookie: minichat=$cookie\r\n"; } else { print "Set-Cookie: minichat=reload:$time\r\n"; undef %COOKIE; } if ($COOKIE{'uname'} eq "") { $body =~ s/ $title $body

$title

EOF if ($in{'action'} eq "" || $COOKIE{'uname'} eq "") { print "名前 > "; } else { print "$COOKIE{'uname'} > "; } print " "; print "
\n"; foreach $line (@lines) { $line =~ s/\n//g; ($TIME,$DATE,$UNAME,$VALUE,$HOST) = split(/\t/,$line,5); if ($view_host) { $host = " "; } else { $host = ""; } #--URL自動リンク $VALUE =~ s/"/"/g; $VALUE =~ s/>/>/g; $VALUE =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1\:$2<\/a>/ig; #--Eメール自動リンク $VALUE =~ s/\b([-\w.]+@[-\w.]+\.[-\w.]+)\b/$1<\/a>/g; print "
\n"; print "$UNAME > $VALUE ($DATE)$host\n"; } print "
\n"; print "[
$modoru_name] [リセット]

\n"; #--このスクリプトの著作権表示(かならず表示してください) print "

<MiniCHAT-2>

\n"; print "\n"; exit; } sub regist { if ($max <= $#lines +1) { pop(@lines); } unshift(@lines,"$time\t$date_now\t$COOKIE{'uname'}\t$in{'Value'}\t$host\n"); if (!open(DB,"> $chat_file")) { &error('エラー','チャットファイルへ記録できません.'); } print DB @lines; close(DB); } sub error { local (@msg) = @_; local ($i); print "HTTP/1.0 200 OK\r\n"; print "Content-type: text/html\r\n\r\n"; print <<"EOF"; $title $body

$_[0]

EOF print "\n"; print <<"EOF";

[戻る]

EOF exit; }