#!/usr/local/bin/perl #| WeB BaNaNa Version 2.14 #| This script is free. #| #| Author Shigeto Nakazawa.(1996/11/27) #| HomePageUrl http://www7.big.or.jp/~jawa/ # -------------------------------------------------------------------- # オプションの設定を変更することができます。 # 変更する場合は、readme.htm をご覧になってから行ってください。 # 設定変更には充分注意してください。 $master = "sibaban"; # 管理用のパスワードです。 $max = '150'; # 登録・表示最大数(あまりに多いと危険) $date_color = "#FF0000"; # 日付の色 $banana_color = "#0000CC"; # バナナ(連想単語)の色(^-^;; $ip_check = 0; # IPアドレスの表示 (0:表示しない 1:表示する) $rh_check = 0; # リモートホストの表示 (0:表示しない 1:表示する) # ファイル関連の設定 $jcode = './jcode.pl'; # jcode.pl のある場所 $logfile = './banana.log'; # 記録用ファイル $lock1 = './banana1.lock'; # 鍵ファイル(1) $lock2 = './banana2.lock'; # 鍵ファイル(2) $lock_flag = 1; # 鍵ファイルの 1:使用 0:不使用 # HTML関連の設定 $html_header=<<"_EOF_"; # 共通ヘッダー部分 WeB BaNaNa _EOF_ # ↑ _EOF_ は必須です。 $html_top=<<"_EOF_"; # デフォルト画面の上の部分

WeB BaNaNa


さぁ! 下の言葉から想像する言葉を書くのだ!
_EOF_ # ↑ _EOF_ は必須です。 $html_buttom=<<"_EOF_"; # デフォルト画面の下の部分
・ タグを使用したり、全角50字を超えると登録されません。

[管理用]


_EOF_ # ↑ _EOF_ は必須です。 $html_thanks=<<"_EOF_"; # サンクス画面のタイトル部分

WeB BaNaNa

せんきゅぅ!
これが今までの経緯だ! 見終わったら、ここをクリックすることで前のページに戻れるぞ。君の言葉から何が連想されていくのか、たまに見に来ると楽しいにちがいない!

_EOF_ # ↑ _EOF_ は必須です。 # オプションの設定はここまでです。 # 以下は CGI のプログラムです。 # 書き換えは個人の責任で行って下さい。 # -------------------------------------------------------------------- &check_code; &read_form; if($FORM{'download'} eq 'on') { @logs = &read_file($logfile); print "Content-type: text/download\n\n"; print $html_header; &banana_html; exit; } print "Content-type: text/html\n\n"; print $html_header; if($FORM{'edit'} eq 'on') { &check_password; @logs = &read_file($logfile); &edit_log; &editor_html; exit; } @logs = &read_file($logfile); if (!$logs[0]) { $logs[0] = "0<>xx/xx<>バナナ<><>\n"; } if($FORM{'no'} eq '') { &default_html; exit; } $no = $FORM{'no'}; $banana = $FORM{'banana'}; &check_form; $no = ++$no % 9999; &get_date; unshift(@new,"$no<>$date<>$banana<>$ENV{'REMOTE_HOST'}<>$ENV{'REMOTE_ADDR'}\n"); foreach $line (@logs) { push(@new,$line); if (++$i == $max) { last; } } @logs = @new; &banana_html; &write_file($logfile,@new); exit; sub default_html { ($no,$date,$banana) = split(/<>/,$logs[0]); $banana = &code_unchg($banana); print $html_top; print<<"_EOF_";

$buffer

$bananaといったら!


_EOF_ print $html_buttom; print<<"_EOF_";
WeB BaNaNa v2.14 [Shigeto Nakazawa]
_EOF_ } sub check_form { ($ck_no) = (split(/<>/,$logs[0]))[0]; if ($ck_no != $no) { &error("残念、タイムオーバーだ。今、誰かが連想してしまったぞ。一度戻って,再読み込みを行うのだ。"); } if (!$banana) { &error("何も書かれていないか、タグが使われているぞ。タグはだめなのだ。"); } if (length($banana) > 100) { &error("言葉が長すぎるぞ。文字数が全角50字を超えるとダメなのだ。"); } $banana = &code_chg($banana); foreach $line (@logs) { ($ck_no,$date,$ck_banana) = split(/<>/,$line); if (($banana =~ /$ck_banana/i) || ($ck_banana =~ /$banana/i)) { &error("前に君と同じような発想をした人がいるぞ! オリジナルで勝負だ!"); } } } sub get_date{ $ENV{'TZ'} = 'JST-9'; ($sec,$min,$hour,$mday,$mon) = localtime(time); $mon++; if ($mday < 10) { $mday = "0$mday"; } if ($mon < 10) { $mon = "0$mon"; } $date = "$mon/$mday"; } sub banana_html{ print $html_thanks; print "\n\n\n\n\n"; foreach $line (@logs) { ($no,$date1,$banana1,$rhost1,$ipad1) = split(/<>/,$line); $banana1 = &code_unchg($banana1); if ($banana2) { print "$date2 : "; print "$banana1といったら$banana2"; if ($rh_check || $ip_check) { print "   ["; if ($rh_check) { $rhost2 = $rhost2 eq $ipad2?gethostbyaddr(pack('C4',split(/\./,$ipad2)),2)||'':$rhost2; print $rhost2; } print " "; if ($ip_check) { print $ipad2; } print "]"; } print "
\n"; } $banana2 = $banana1; $date2 = $date1; $rhost2 = $rhost1; $ipad2 = $ipad1; } print "\n\n\n\n\n"; print ""; } sub check_password { if ($FORM{'pass'} eq $master) { return 1; } print<<"_EOF_";
管理用パスワードを入力してください。

(管理用のエディタを使用するためには、管理用パスワードが必要です。)


_EOF_ exit; } sub edit_log { ($no) = split(/<>/,$lines[0]); $no = ++$no % 9999; foreach $line (@logs) { local($no,$date,$banana,$rhost,$ipad) = split(/<>/,$line); if ($FORM{$no} eq 'on') { if ($FORM{'banana'}) { $FORM{'banana'} = &code_chg($FORM{'banana'}); $line = "$no<>$date<>$FORM{'banana'}<>$rhost<>$ipad"; push (@new,$line); } } else { push (@new,$line); } } @logs = &write_file($logfile,@new); } sub editor_html { print<<"_EOF_";
[エディタをやめる]

WeB BaNaNa Editor

★使い方★

編集する時
1.編集する項目をチェックします。(複数でも可能\)
2.編集内容を書きます(このとき、何も書かなかった場合、削除されます)
3.[編集開始]で書き換えられます。

HTML化する時
1.HTML化ボタンを押します
2.ダウンロードを開始します。
3.ダウンロードしたファイルの名前を banana.htm 等に書き換えます。



_EOF_ foreach $line (@logs) { ($no,$date,$banana) = split(/<>/,$line); $banana = &code_unchg($banana); print "\n"; print "$date : "; print "$banana
\n"; } exit; } # -*-*-*- 禁止文字コードの変換処理 -*-*-*- sub code_chg { local($text) = $_[0]; $text =~ s/\(/(/g; $text =~ s/\)/)/g; $text =~ s/\*/*/g; $text =~ s/\+/+/g; $text =~ s/\././g; $text =~ s/\?/?/g; $text =~ s/\[/[/g; $text =~ s/\\/\/g; $text =~ s/\]/]/g; $text =~ s/\{/{/g; $text =~ s/\|/|/g; $text =~ s/\}/}/g; return $text; } sub code_unchg { local($text) = $_[0]; $text =~ s/(/\(/g; $text =~ s/)/\)/g; $text =~ s/*/\*/g; $text =~ s/+/\+/g; $text =~ s/./\./g; $text =~ s/?/\?/g; $text =~ s/[/\[/g; $text =~ s/\/\\/g; $text =~ s/]/\]/g; $text =~ s/{/\{/g; $text =~ s/|/\|/g; $text =~ s/}/\}/g; return $text; } # -*-*-*- 記録ファイルの処理 -*-*-*- sub read_file { local($logfile) = $_[0]; &lock_file($lock1);&lock_file($lock2); if ($lock_error) { &error("ロックファイルを検出しました。時間をおいてご利用下さい。"); } if (!open(IN,$logfile)) { &unlock_file; &error("記録ファイルの読み込み不可です。"); } local(@files) = ; close(IN); &unlock_file($lock2);&unlock_file($lock1); return @files; } sub write_file { local($logfile,@logs) = @_; &lock_file($lock1);&lock_file($lock2); if ($lock_error) { &error("ロックファイルを検出しました。時間をおいてご利用下さい。"); } if (!open(OUT,">$logfile")) { &unlock_file; &error("記録ファイルの書き込み不可です。"); } print OUT @logs; close(OUT); &unlock_file($lock2);&unlock_file($lock1); return @logs; } # -*-*-*- ロック機構 -*-*-*- sub lock_file { local($lockfile) = $_[0]; if (!$lock_flag) { return 1; } local($retry) = 5; while (-f $lockfile) { if ($retry-- <= 0) { local($mtime) = (stat($lockfile))[9]; if ($mtime < time()-60*15) { &unlock_file($lockfile); } $lock_error = 1; return 1; } sleep 1; } open (LOCK,">$lockfile"); close(LOCK); return 1; } sub unlock_file { local($lockfile) = $_[0]; unlink($lockfile); } # -*-*-*- フォームからデータ取得 -*-*-*- sub read_form { local($pair,$buffer); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } local(@pairs) = split(/&/,$buffer); foreach $pair (@pairs) { local($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $FORM{$name} = &change_code($value); } } # -*-*-*- 文字コード関連 -*-*-*- sub check_code { if (!(-r $jcode)) { &error(1,"jcode.pl がみつかりません。"); } require $jcode; local($text) = ord(substr("中澤重人=じゃわ(^-^;;",0,1)); if ($text == 0xc3) { $mojicode = "euc"; $charset_code = "x-euc-jp"; } elsif ($text == 0x92) { $mojicode = "sjis";$charset_code = "x-sjis"; } else { &error(1,"サポートしてない文字コードです"); } } sub change_code { local($text)=$_[0]; &jcode'convert(*text,$mojicode); if ($mojicode eq 'sjis') { &jcode'h2z_sjis(*text); } if ($mojicode eq 'euc') { &jcode'h2z_euc(*text); } $text =~ s/<(.|\n)*//g; return $text; } # -*-*-*- エラー処理 -*-*-*- sub error { print <<"_EOF_";

坂Oさんに突っ込まれました!

$_[0] _EOF_ exit; }