#!/usr/local/bin/perl # # YUTAKA CHAT Version0.1 Copyright(C) BY YUTAKA # # 設定 $ID = 'YUTAKA_CHAT'; # ちゃっとの識別子 $TITLE = 'ゆたかちゃっと'; # ちゃっとのタイトル $HOMEPAGE = 'http://www.infonia.ne.jp/~aaaa/yutaka.html'; # 自分のホームページ $EMAIL = 'aaaa@infonia.ne.jp'; # 自分のメールアドレス $MAXMSG = 20; # 最大登録件数 $DATA_FILE = 'chat_yutaka.dat'; # データファイル $LOCK_FILE = 'chat_yutaka.lck'; # ロックファイル $COLOR = 'TEXT="#FFFFFF" BGCOLOR="#000000" LINK="#00FFFF" VLINK="#00FF00" ALINK="#FF00FF"'; $UNAMECOLOR = '"#FF00FF"'; # 名前の色 #$BACK = '/~aaaa/cgi-bin/back22.gif'; # 背景画像、無ければ'' $BACK = ''; #$MUSIC = '/~aaaa/cgi-bin/bgm1.mid'; # 背景音楽、無ければ'' $MUSIC = ''; # # main # # コード変換ライブラリ参照 require 'jcode.pl'; # V2.8でテスト実施 # 文字列取得 $method = $ENV{'REQUEST_METHOD'}; if( $method eq 'POST') {read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});} else {$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; $value =~ s//>/g; $value =~ s/"/"/g; $value =~ s/^//g; $value =~ s/\*//g; # $value =~ s/\n//g; &jcode'h2z_sjis(*value); &jcode'convert(*value,'sjis'); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg; &jcode'convert(*name,'sjis'); $form{$name} = $value; } # 処理選択 $cmd = $form{'cmd'}; $puttext = $form{'puttext'}; if ($cmd eq 'unlock') { &UNLOCK; } elsif(($method eq 'POST') && ($puttext ne '')) { &WRITE; } else { &READ;} # サブルーチン sub UNLOCK { $lock = 1; &UNLOCK_FILE; &PRINT_SYS('ファイルのアンロックを実行しました。'); } sub READ { &GET_COOKIE; &READ_FILE; &PRINT_BBS; } sub WRITE { &DATA_CHECK; &READ_FILE; &WRITE_FILE; &SET_COOKIE; &PRINT_BBS; } # second level sub READ_FILE { if(open(BOARD, "$DATA_FILE")) { @board = ; close(BOARD); } } sub DATA_CHECK { $uname = $form{'uname'}; if($uname eq '') { &PRINT_SYS('名前を記入してください。'); } $ed_uname = ''.$uname.''; # $puttext = $form{'puttext'}; # if($puttext eq '') { # &PRINT_SYS('本文を記入してください。'); # } $puttext =~ s/\r\n/
/g; $puttext =~ s/\n/
/g; } sub WRITE_FILE { if(@board > (3 * ($MAXMSG - 1))) { splice(@board, (3 * ($MAXMSG - 1))); } &LOCK_FILE; # データファイル書き込み ($sec,$min,$hour,$day,$mon,$year) = localtime(time); $mon++; @newboard = ( '
['.$ed_uname.'] ['.$year.'年'.$mon.'月'.$day.'日 '.$hour.'時'.$min.'分'.$sec.'秒] '.$ed_responce.' '.$ed_homepage.'
'."\n", '
'.$puttext.'
'."\n", '
'."\n" ); unshift(@board, $newboard[2]); unshift(@board, $newboard[1]); unshift(@board, $newboard[0]); if(open(BOARD, ">$DATA_FILE")) { print (BOARD @board); close (BOARD); } &UNLOCK_FILE; } # 表示編集 sub PRINT_SYS { print 'Content-type: text/html'."\n\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ' '.$TITLE.''."\n"; print ' '."\n"; print ' '."\n"; print ' '."\n"; print ''."\n"; print ''."\n"; print '
'."\n"; print 'HOME MAIL'."\n"; print '
'."\n"; print ''.$TITLE.'
'."\n"; print '
'."\n"; print ''."\n"; print $_[0].'

'."\n"; print 'ブラウザの機能で前に戻ってください。'."\n"; print '
'."\n"; print '
'."\n"; print '
'."\n"; # 著作権表示の修正禁止 print '
'."\n"; print 'YUTAKA-CHAT Version0.1 BY YUTAKA
'."\n"; print '
'."\n"; # print ''."\n"; print ''."\n"; exit; } sub PRINT_BBS { print 'Content-type: text/html'."\n\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ' '.$TITLE.''."\n"; print ' '."\n"; print ' '."\n"; print ' '."\n"; print ''."\n"; if($BACK eq '') { print ''."\n"; } else { print ''."\n"; } if($MUSIC ne '') { print ''; print ''."\n"; print ''; print ''."\n"; } print '
'."\n"; print 'HOME MAIL'."\n"; print '
'."\n"; print ''.$TITLE.'
'."\n"; print $MAXMSG.'件以上は自動的に削除されます。'."\n"; print '
'."\n"; print '
'."\n"; print '
'."\n"; print '名前:
'."\n"; print '本文:
'."\n"; print '
'."\n"; print '
'."\n"; print '
'."\n"; print @board; # 著作権表示の修正禁止 print '
'."\n"; print 'YUTAKA-CHAT Version0.1 BY YUTAKA
'."\n"; print '
'."\n"; # print ''."\n"; print ''."\n"; } # ファイル排他制御 sub LOCK_FILE { $wait_time = 5; while(-f $LOCK_FILE) { if ($wait_time-- <= 0) { &PRINT_SYS('他の人が書き込み中です。しばらくしてから書き込んでください。'); sleep 4; } } open (FHAND,">$LOCK_FILE"); close (FHAND); $lock = 1; } sub UNLOCK_FILE { if ($lock) { unlink($LOCK_FILE); $lock = 0; } } #クッキー関連処理 sub GET_COOKIE{ $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); @dummy = grep(/$ID=$ID/, @pairs); $dummy = $dummy[$#dummy]; @pairs = split(/\t/,$dummy); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $cookie{$name} = $value; } $uname = $cookie{'uname'}; $email = $cookie{'email'}; $homepage = $cookie{'homepage'}; } sub SET_COOKIE { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time+30*24*60*60); $week = ('Mon','Tue','Wed','Thu','Fri','Sat','Sun')[$wday]; $mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon]; if ($sec < 10) { $sec = '0' . $sec; } if ($min < 10) { $min = '0' . $min; } if ($hour < 10) { $hour = '0' . $hour; } $year += 1900; $expires = "$week $mon $mday $hour:$min:$sec $year"; $cookie = $ID.'='.$ID."\t".'uname='.$uname."\t".'email='.$email."\t".'homepage='.$homepage; &jcode'convert(*cookie, 'sjis'); print "Set-Cookie: $cookie; expires=$expires GMT\n"; } __END__