#!/usr/local/bin/perl # ############################################################## # 簡易掲示板プログラム T-Note (c)Takahiro Nishida 97/7/22 # # (質問等は下記ページの専用掲示板で受け付けています) # # http://www2s.biglobe.ne.jp/~tnishida/ # ############################################################## # ###(変数設定部)詳細は上記ページをご覧下さい。###################### $ext="cgi"; $basedir="."; $method="post"; $code="sjis"; $password="khide"; $email="trec\@mx1.tiki.ne.jp"; $sdef="20"; $show_host = "1"; ###(以下は表示のカスタマイズ)### $bgcolor="#E0FFFF"; $fontcolor="#708090"; $namecolor="#080808"; $linkcolor="#6a5acd"; $nocolor="#f4a460"; ###(変数設定部)ここまで######################################### require 'jcode.pl'; $lockfile="$basedir/lockdir/tn.lock"; $verno="2.20"; &main; sub main{ &lock_check; &show_header; &check_input; &file_lock; &get_datafile; &del_data; &add_newdata; &update_datafile; &show_html; &unlock; } sub lock_check{ if((-M "$lockfile")>0.0004){ &unlock; } return; } sub show_header{ print "Content-type: text/html\n\n"; return; } sub check_input{ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($vn, $value) = split(/=/, $pair); $FORM{$vn} = &decode($value); } if($FORM{'book'}){ $book = $FORM{'book'}; } if($FORM{'who'}) { $who = $FORM{'who'}; } if($FORM{'mail'}){ $mail = $FORM{'mail'}; } if($FORM{'url'}) { $url = $FORM{'url'}; } if($FORM{'com'}) { $com = $FORM{'com'}; } if($FORM{'from'}){ $from = $FORM{'from'}; } if($FORM{'to'}) { $to = $FORM{'to'}; } if($FORM{'rm'}) { $rm = $FORM{'rm'}; } if($FORM{'pwd'}) { $pwd = $FORM{'pwd'}; } if($book !~ /^\w+$/){ &error("",3); } if($mail && $mail !~ /(.+)\@(.+)\.(.+)/){ &error("",4); } if($url && $url !~ /^http:\/\//){ &error("",5); } $remote_host = $ENV{'REMOTE_HOST'}; # 更新があったかどうかのフラグ $newflag = 0; } sub get_datafile{ open(FILE,"$basedir/$book.txt") || die &error("$book\.txt",1); @datas=; close(FILE); } sub update_datafile{ unless($newflag){ return; } open(FILE,">$basedir/$book.txt") || die &error("$book\.txt",1); print FILE @datas; close(FILE); } sub del_data{ unless($rm && $pwd eq $password){ return; } $newflag = 1; if($rm > 0 && $rm <= @datas-3){ $datas[$rm+2]="\n"; } return; } sub add_newdata{ unless($who && $com){ return; } $newflag = 1; @ts=localtime(time); $ts[4]++; $date_now = sprintf("%02d/%02d/%02d %02d:%02d", $ts[5], $ts[4], $ts[3], $ts[2], $ts[1]); push(@datas, "$date_now\t$who\t$mail\t$url\t$com\t$remote_host\n"); return; } sub show_html{ ($tbuf, $tcom, $topurl) = splice(@datas, 0, 3); ($title, $titlebar) = split("\t", $tbuf); if(!$titlebar){ $titlebar = "NoteBook($book)"; } $i = @datas; if(!$from){ $from = $i - $sdef; if($from<1){ $from=1; } } if(!$to){ $to=$i; } if($i&&(($from<1)||($to>$i)||($to<$from))){ &error("",6); } #--------------------------------- print <<"EOF"; $titlebar [戻る]

$title

$tcom

★注:名前と内容は必須です。HTMLタグは使えません。


名前:

メールアドレス:

URL:

内容:

入力を終えたら右のボタンを押してください。


全発言数:$i件 [全発言] [最新$sdef発言]

範囲選択:No.から No.まで


EOF #--------------------------------- $from--; $to--; for($p = $to; $p >= $from; $p--){ $no = $p + 1; @sps = split("\t",$datas[$p]); # 削除されていた場合 if(!$sps[1]){ print "No.$no (削除済)
"; next; } # 発言番号、日時 print "No.$no ($sps[0])
"; # 名前 print "name:$sps[1]
"; # ホスト名 if($show_host){ print "host:$sps[5]
\n"; } # メールアドレス print "email:"; if($sps[2]){ print "$sps[2]"; } print"
\n"; # URL print "URL:"; if($sps[3]){ print "$sps[3]"; } print "

\n"; # 内容 print "$sps[4]


\n"; $no--; } #----------------------------- print <<"EOF";
発言削除:No.  管理パスワード:

EOF #----------------------------- ©right; print "
"; } sub copyright{ # print "
Powered By T-Note Ver.$verno
\n"; return; } sub decode{ ($org) = @_; $org =~ tr/+/ /; $org =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $org =~ s/\t//g; $org =~ s//>/g; $org =~ s/\cM//g; $org =~ s/\n{2,}/

/g; $org =~ s/\n/
/g; &jcode'convert(*org,$code); return $org; } sub file_lock{ $try=0; while(!(symlink("$$",$lockfile))){ if(++$try>3){ &error("",0); } sleep(1); } } ############################################## # symlink が使えないサーバー用のファイルロック ############################################## #sub file_lock{ # $try=0; # while(-f $lockfile){ # if(++$try>3){ # &error("",0); # } # sleep(1); # } # open(FILE,">$lockfile") || die &error($lockfile,2); # close(FILE); #} ############################################## sub unlock{ return unlink($lockfile); } sub error{ ($file, $id) = @_; $msg[0] = 'ロック中です'; $msg[1] = 'が開けません'; $msg[2] = 'に書き込めません'; $msg[3] = 'bookが指定されていないか不正です'; $msg[4] = 'メールアドレスが不正です'; $msg[5] = 'URLが不正です'; $msg[6] = '発言番号の指定が不正です'; @fmid = (0,1,1,0,0,0,0); $fmsg[0] = "Backを押して戻ってください"; $fmsg[1] = "管理者$emailに連絡してください"; $fid = $fmid[$id]; print "T-Note Error!!\n"; print "\n"; print "

!! ERROR !!

\n"; print "

$file $msg[$id]

\n"; print "

$fmsg[$fid]

\n"; ©right; print ""; &unlock; exit; }