#!/usr/local/bin/perl # # YUTAKA BOARD Version0.1 Copyright(C) BY YUTAKA # # 設定 $ID = 'YUTAKA_BBS'; # 掲示板の識別子 $TITLE = 'ゆたかの掲示板'; # 掲示板のタイトル $HOMEPAGE = 'http://www.infonia.ne.jp/~aaaa/yutaka.html'; # 自分のホームページ $EMAIL = 'aaaa@infonia.ne.jp'; # 自分のメールアドレス $MAXMSG = 50; # 最大登録件数 $MAXCNT = 9999; # この値を超えたらカウンタリセット $DATA_FILE = 'board_yutaka.dat'; # データファイル $CNT_FILE = 'board_yutaka.cnt'; # カウントファイル $LOCK_FILE = 'board_yutaka.lck'; # ロックファイル $COLOR = 'TEXT="#FFFFFF" BGCOLOR="#000000" LINK="#00FFFF" VLINK="#00FF00" ALINK="#FF00FF"'; $CHGCOLOR = 0; # 1にすると有効、色を更新毎に変更 %CHGCOLOR = ( '1','TEXT="#000000" BGCOLOR="#C0C0C0" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"', '2','TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#FF0000" VLINK="#800080" ALINK="#0000FF"', '3','TEXT="#000000" BGCOLOR="#FFFFC0" LINK="#0000FF" VLINK="#800080" ALINK="#FF00FF"', '4','TEXT="#400040" BGCOLOR="#FFFF80" LINK="#0000FF" VLINK="#008000" ALINK="#FF0080"', '5','TEXT="#000000" BGCOLOR="#FFF0F0" LINK="#FF0000" VLINK="#800080" ALINK="#0000FF"', '6','TEXT="#000000" BGCOLOR="#C0C0FF" LINK="#0000FF" VLINK="#800080" ALINK="#FF0080"', '7','TEXT="#000000" BGCOLOR="#8080C0" LINK="#FFFFFF" VLINK="#800080" ALINK="#FFFF00"', '8','TEXT="#000080" BGCOLOR="#FFC040" LINK="#0000FF" VLINK="#008000" ALINK="#00FFFF"', '9','TEXT="#FFFFFF" BGCOLOR="#000000" LINK="#FFFF00" VLINK="#C0C0C0" ALINK="#C0FFC0"', '10','TEXT="#FFFFFF" BGCOLOR="#004000" LINK="#FFFF00" VLINK="#80FF80" ALINK="#00FF40"', '11','TEXT="#FFFFFF" BGCOLOR="#000080" LINK="#FFFF00" VLINK="#8080FF" ALINK="#FF00FF"', '0','TEXT="#FFFFFF" BGCOLOR="#800080" LINK="#00FFFF" VLINK="#80FFFF" ALINK="#00FF00"' ); #$BACK = '/~aaaa/cgi-bin/back21.gif'; # 背景画像、無ければ'' $BACK = ''; $CHGBACK = 0; # 1にすると有効、背景画像を更新毎に変更 %CHGBACK = ( '1','/~aaaa/cgi-bin/back21.gif', '2','/~aaaa/cgi-bin/back22.gif', '3','/~aaaa/cgi-bin/back23.gif', '4','/~aaaa/cgi-bin/back24.gif', '5','/~aaaa/cgi-bin/back25.gif', '6','/~aaaa/cgi-bin/back26.gif', '0','/~aaaa/cgi-bin/back27.gif' ); #$MUSIC = '/~aaaa/cgi-bin/bgm1.mid'; # 背景音楽、無ければ'' $MUSIC = ''; $CHGMUSIC = 0; # 1にすると有効、背景音楽を更新毎に変更 %CHGMUSIC = ( '1','/~aaaa/cgi-bin/bgm1.mid', '2','/~aaaa/cgi-bin/103a.mid', '3','/~aaaa/cgi-bin/106a.mid', '4','/~aaaa/cgi-bin/111a.mid', '5','/~aaaa/cgi-bin/112a.mid', '6','/~aaaa/cgi-bin/april.mid', '7','/~aaaa/cgi-bin/hituji.mid', '8','/~aaaa/cgi-bin/kirakira.mid', '9','/~aaaa/cgi-bin/lago2.mid', '10','/~aaaa/cgi-bin/longago.mid', '11','/~aaaa/cgi-bin/mado.mid', '12','/~aaaa/cgi-bin/momi.mid', '13','/~aaaa/cgi-bin/musicbox01.mid', '14','/~aaaa/cgi-bin/musicbox02.mid', '15','/~aaaa/cgi-bin/musicbox03.mid', '16','/~aaaa/cgi-bin/musicbox07.mid', '17','/~aaaa/cgi-bin/musicbox08.mid', '18','/~aaaa/cgi-bin/musicbox10.mid', '19','/~aaaa/cgi-bin/olga.mid', '0','/~aaaa/cgi-bin/wish-a.mid' ); # # 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'}; if ($cmd eq 'unlock') { &UNLOCK; } elsif($method eq 'POST') { &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('名前を記入してください。'); } $email = $form{'email'}; if($email eq '') { &PRINT_SYS('メールアドレスを記入してください。'); } else { $ed_uname = ''.$uname.''; } $homepage = $form{'homepage'}; if( $homepage ne 'http://' && $homepage ne '') { $ed_homepage = '['.$homepage.']'; } else { $ed_homepage = ''; } $responce = $form{'responce'}; if( $responce ne '' ) { $ed_responce = '[コメント番号'.$responce.']'; } $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; # カウンタインクリメント if(-f $CNT_FILE) { open(CNT, "$CNT_FILE"); $cnt = ; close(CNT); if(++$cnt > $MAXCNT) { $cnt=1; } } else { $cnt=1; } open(CNT, "> $CNT_FILE"); printf(CNT "%d", $cnt); close(CNT); # データファイル書き込み ($sec,$min,$hour,$day,$mon,$year) = localtime(time); $mon++; @newboard = ( '
[No:'.$cnt.']['.$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-BBS Version0.1 BY YUTAKA
'."\n"; print '
'."\n"; # print ''."\n"; print ''."\n"; exit; } sub PRINT_BBS { &BBS_CNTROL; 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"; if($homepage eq '') { $homepage ='http://'; } print 'ホームページ

'."\n"; print 'レスするメッセージの番号

'."\n"; print '本文
'."\n"; print '
'."\n"; print ''."\n"; print '
'."\n"; print '
'."\n"; print '
'."\n"; print @board; # 著作権表示の修正禁止 print '
'."\n"; print 'YUTAKA-BBS Version0.1 BY YUTAKA
'."\n"; print '
'."\n"; # print ''."\n"; print ''."\n"; } # 表示制御 sub BBS_CNTROL { $cnt = @board[0]; $cnt =~ s/^.*A NAME = "//; $cnt =~ s/">\[No:.*$//; if($CHGCOLOR == 1) { $COLOR = $CHGCOLOR{($cnt % keys(%CHGCOLOR))}; } if($CHGBACK == 1) { $BACK = $CHGBACK{($cnt % keys(%CHGBACK))}; } if($CHGMUSIC == 1) { $MUSIC = $CHGMUSIC{($cnt % keys(%CHGMUSIC))}; } } # ファイル排他制御 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__