#!/usr/bin/perl # # #初期設定項目 # #文字コードライブラリー require './jcode.pl'; #最大ログ保存数 $data_max = 50; #このスクリプトの場所 $this = "./onebbs4.cgi"; #ログファイルの場所 $logfile = "./b2.dat"; #1ページのコメント表示数 $comsize = 10; #メイン処理 &decode; if ($mode eq 'regist'){ ®ist; } elsif ($mode eq 'delete'){ &delete } &html; #html表示 sub html{ #ログファイル読み込み open(IN,"$logfile"); @log = ; close(IN); print <<"HTML"; Content-type: text/html 一言メッセージ

一言メッセージを書いてください。


入力 =>
パスワード

HTML #コメント部分の表示 $start = $page +1; $end = $page + $comsize; $i= 0; foreach $in (@log){ $i++; if ($i < $start){ next;} elsif ($i > $end ){ next;} $in =~ s/\n//; ($num,$comment,$password,$jptime) = split(/\t/,$in); print "$num> $comment
";} &next; print <<"END"; $next $back $rest $total



パスワード
削除番号
END exit; } #デコード処理 sub decode{ $method = $ENV{ 'REQUEST_METHOD' }; if( $method eq 'GET' ) { $input = $ENV{ 'QUERY_STRING' }; } else {read( STDIN,$input,$ENV{ 'CONTENT_LENGTH' } );} @in = split(/&/,$input); foreach (@in) { ($list, $value) = split(/=/); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value, 'sjis'); $form{$list} = $value; } $mode = $form{'mode'}; $comment = &tag($form{'comment'}); $no = $form{'no'}; $page = $form{'page'}; $password = $form{'password'}; } #ログファイルに書き込み sub regist{ if ($comment eq '' || $password eq ''){ &error('エラー','コメントとパスワードを記入してください。')} #現在時間所得 &time; open(IN,"$logfile"); @log = ; close(IN); $top = $log[0]; ($top_no,$top_comment,$top_password,$top_jptime)= split(/\t/,$top); if ($top_comment eq $comment ){ &error('エラー','二重投稿禁止')} $no = $log[0] + 1 ; #パスワード暗号化 $salt = pack( "CC",int( rand(26) + 65 ),int(rand(26) + 97 )); $password = crypt( $password,$salt); $newdata = "$no\t$comment\t$password\t$jptime\n"; open(OUT,">$logfile"); unshift (@log,"$newdata"); #ログ保存数を設定($# は変数のインデックスの最大値を求める記述) if ($#log > ($data_max -1)){ $#log = $data_max -1;} print OUT @log; close(OUT); } #ログファイルから削除 sub delete{ if ($no eq '' || $password eq ''){ &error('エラー','削除番号とパスワードを記入してください。')} open(IN,"$logfile"); $pass_match = 0; foreach () { ($log_no,$comment,$log_password,$jptime) = split(/\t/); if ($log_password eq crypt("$form{'password'}",$log_password)){ $pass_match = 1;} #削除ナンバー以外は保存 if (!($no == $log_no)){ push(@log,$_); } } if ($pass_match == 0){ &error('エラー','パスワードが違ってます。')} close(IN); open(OUT,">$logfile"); print OUT @log; close(OUT); } #nextページ処理サブルーチン sub next { $next_page = $page + $comsize; $back_page = $page - $comsize; $page_total = int( ($#log ) / $comsize )+1; $page_rest = ($page / $comsize)+1; $page_all = ($#log +1) - ($page + $comsize); if ($page_all > O){ $total = "あと$page_all件の書き込みがあります。\n";} if ($back_page >= 0){ $next = "前のページ\n"; } if ($next_page < $i){ $back = "次のページ\n"; } $rest = "$page_rest/$page_total\n"; } #タグの禁止と改行の変更サブルーチン sub tag { $_[0] =~ s/&/&/g; $_[0] =~ s/"/"/g; $_[0] =~ s//>/g; $_[0] =~ s/\r\n/
/g; $_[0] =~ s/\r/
/g; $_[0] =~ s/\n/
/g; return $_[0]; } #時間所得 sub time { ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime(time); $nitiji = sprintf("%04d年%02d月%02d日",$year +1900,$mon +1,$day); $jikan = sprintf( "%02d時%02d分",$hour,$min); $jptime = $nitiji.$jikan ; } #エラーメッセージ表示 sub error { print "Content-type: text/html\n\n"; print <<"HTML"; $_[0]
$_[1] HTML exit; } __END__