#!/usr/bin/perl # Copyright (c) CGIROOM. http://cgiroom.nu #======================================================================# # [Ver 3.15.2 ] ツリー掲示板 # # このプログラムによって起きた事にCGIROOMは責任を負いません。 # 利用契約に同意できない方のご利用は、遠慮下さい。 #======================================================================# # 設定 #◇ ログの最高保存件数 $max = 150; #◇ 1ページ表示ツリー件数 $pmax = 15; #◇ 最新記事表示件数 $newlogmax = 20; #◇ タイトル $title="OB・OG掲示板"; #◇ バック先URL $url="../"; #◇ パスワード $pass="adpass1114"; #======================================================================# # ファイル設定(変更したい人のみ) #◇ jcode.plまでのパス $jcode = './jcode.pl'; #◇ データファイル名 $LOG = "treebbs.dat"; #◇ 過去ログ保存用ファイル(オプション) $BACK="treebbs.bak"; #◇ ロックファイル名 $lock = "lock.txt"; #======================================================================# # 詳細設定 (変更しなくてもCGIは動きます) #◇ 返信フォームに引用文字をあらかじめ表示するなら0を1に $FORM{'hens'}= 0 ; #◇ フォームからURLを消す場合は 0 に $urls = 1 ; #◇ 発言者が発言を削除できないようにするなら 0 に $user = 1 ; #◇ 発言にレスがついてしまったら発言者削除をできないようにするなら 0 に $res_del = 1 ; #◇ 削除した記事(とその記事へのレスすべて)を非表示にするな 1 しないなら 0 $del_next = 1 ; #◇ IPを表示するなら 1 しないなら 0 (REMOTE_HOST > REMOTE_ADDR) $ip_print = 1 ; #◇ 検索該当タイトルの表示件数 $s_p = 50 ; #◇ New!マーク 最近の発言につけるマーク $newf ='New!'; #◇ New!マーク表示時間 $new = 48 ; #◇ lastマーク スレッドの中で一番最後に発言された物につけるマーク $last = '←Last'; #◇ 引用文の色 $m_color="#800000"; #◇ コメントの色(#) $c_color="#BBBBBB"; #◇ BODY $body=''; #◇ 書きこみフォームのバックカラー $bg='#E0E0E0'; #◇ 発言時注意事項 $msg = <<'MSG'; ◇名前と題名は必ず入力してください。
◇PASSWORDを入力すると、後で自分の発言を削除することができます。
MSG #======================================================================# #◇ 1つのツリーに発言できる最大件数 $tree_max = 50 ; #◇ 1つのツリーに発言できる最大階層 # 横にレスが付きすぎると見にくくなるため # 発言できる階層を決めておく $kai_max = 15 ; #◇ 一覧表示する時に長いタイトルは一定の長さにカット # レスが多くなると長いタイトルのせいで横スクロールがでるので # それを極力防ぎます。(35 がおすすめ) $size_cut = 50; #======================================================================# # HTML ヘッダー sub head{ print"Content-type: text/html\n\n"; print< $title $body

$title

雑談から現役生へのメッセージまで
ご自由にお使いください。

新規発言一覧最新記事検索HOME

HTML } #======================================================================# # [メール転送設定] # これはオプションのオプションですので、普通に掲示板が利用されたい方は # 設定の必要はありません。 $send = "" ; $admin= '' ; $cmd = "" ; $subject= ""; #設定ここまで #======================================================================# if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $QUERY, $ENV{'CONTENT_LENGTH'}); }else{ $QUERY = $ENV{'QUERY_STRING'}; } @QUERY = split(/&/,$QUERY); foreach (@QUERY){ ($n, $v) = split(/=/); $v =~ tr/+/ /; $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $v =~ s/&/&/g; $v =~ s/"/"/g; $v =~ s//>/g; $v =~ s/\r\n/
/g; $v =~ s/\r/
/g; $v =~ s/\n/
/g; $v =~ s/\t/    /g; $FORM{$n} = $v; } if($FORM{'kako'}){ $kako = "kako=1&"; $kako_h=""; $LOG = $BACK; } $html = "href=\"treebbs.cgi?kako=1&lists=1\">過去一覧 | 1; $links="treebbs.cgi?${kako}log="; $ENV{'TZ'}="JST-9"; $blockquote ="
"; $var=""; $treealllist=0; #======================================================================# if($FORM{'log'}){ $w = $FORM{'log'}; &err('予期せぬリクエストです') if $w =~ /\D/; open(LOG)||&err('ファイルをオープンできません'); $dummy = unless $kako; while(){ if(/^$w\t/o){ @data_log = split(/\t/); undef $data_log[8] unless $urls == 1; last; } } unless(@data_log){ $mataha = "または、過去ログに移動されたかもしれません" if $html && $FORM{'kako'} eq ""; &err('既に削除されてしまったようです。' . $mataha); } &head; $mail="" if $data_log[5]; $cmsg = $data_log[7]; $ip_print = $ip_print ? "
\n発言元: $data_log[12]" : ""; &link(*cmsg); print< No.$data_log[0]  $data_log[3] 発言者: $mail$data_log[4]

発言日: $data_log[9] $data_log[6]$ip_print $blockquote $cmsg
$data_log[8]
HTML print "
▼関連発言";

$i=0;
seek(LOG,0,0);
while(){
	if(/^(\d+)\t(\d+)\t$data_log[2]\t/o){
		$F{$data_log[2]}=$1 unless $F{$data_log[2]};
		$list{$1}=$_;
		push(@{$restree{$2}},$1);
		last if $1 == $data_log[2];
	}
}
close(LOG);$alllist=1;
&treelist(0,"","",$size_cut);
if($data_log[3]=~ s/Re\[(\d+)\]:/"Re\[" . ($1 + 1) . "\]:"/e){
}elsif($data_log[3]=~ s/^Re:/Re\[2\]:/){
}else{$data_log[3]="Re:$data_log[3]"}
($cna,$maile,$curl,$pwd)=split(/\t/,&get_cookie);
$PW ="PASSWORD" if $user;

if($FORM{'hens'} == 1 && $FORM{'nhens'} eq ""){
	$data_log[7]=~ s/
/\r> /g; $hen="> $data_log[7]"; } $formurls=< URL 省略可 URL print"
"; if( !$kako && &x(\@log,$data_log[1]) >= $kai_max){ print "
これ以上深く発言することはできませんので
この発言への返信はできません\n"; }elsif( !$kako && $#log + 2 > $tree_max){ print < ツリー全体が $tree_max 件に達しましたので、このツリーにはもう発言できません HTML }elsif(!$kako && !($#log + 2 > $tree_max)){ print "
"; &new_form("返信","[引用]",$data_log[2],$data_log[0],$cna,$data_log[3],$maile,$hen); } &get_cookie; print<

Pass 保存

HTML &last; exit; #======================================================================# }elsif($FORM{'all'} && $FORM{'all'} !~ /\D/){ &head; $all=$FORM{'all'}; $FORM{'s'}=~ s/\D//g; print"$blockquote
スレッド";
open(LOG)||&err('ファイルをオープンできません');
$news =  - $new unless $kako;
while(){
	if(/^(\d+)\t(\d+)\t$all\t/o){
		$F{$all}=$1 unless $F{$all};
		$list{$1}=$_;
		push(@{$restree{$2}},$1);
		push(@{$arestree{$2}},$1);
		last if $1 == $all;
	}
}
close(LOG);
$links='#';
@data=split(/\t/,$list{$FORM{'s'}});
$target=$data[1];
@{$arestree{$target}}=($data[0]);
print "

└◇$data[0]:
$data[3] [$data[4]] $data[6]"; &treelist($FORM{'s'}||0," ","",5000); print"
\n\n"; &alllists($target); &last; exit; #======================================================================# }elsif($FORM{'ha'} && $FORM{'kako'} eq ""){ &err('不正エラー') if $FORM{'re'} eq "" || $FORM{'s'} =~ /\D/ || $FORM{'re'} =~ /\D/; &err('http://から記入してください') if $FORM{'url'} && $FORM{'url'} !~ /^http:\/\//; &err('パスワードは半角英数字のみでご記入願います') if $FORM{'pw'} =~ /\W/; &ha("記入不足です") if $FORM{'dai'} eq "" || $FORM{'name'} eq "" || $FORM{'t'} eq ""; &ha("只今混雑しているので30秒ほどお待ちになってください。","1") if &lock == 0; require $jcode; $host = $ENV{'REMOTE_HOST'} ? $ENV{'REMOTE_HOST'} : $ENV{'REMOTE_ADDR'}; open(LOG)||&err('ファイルをオープンできません'); @open=; close(LOG); $sss=$open[0]; $sss++; $FORM{'s'}=$sss unless $FORM{'s'}; ($sec,$min,$hour,$day,$mon,$year)=localtime(time); $year += 1900;$mon++; $mon ="0$mon" if $mon < 10; $day ="0$day" if $day < 10; $hour="0$hour" if $hour < 10; $min ="0$min" if $min < 10; $tim = time; $value = "$sss\t$FORM{'re'}\t$FORM{'s'}\t$FORM{'dai'}\t$FORM{'name'}\t$FORM{'email'}\t" . "$mon/$day $hour:$min\t$FORM{'t'}\t$FORM{'url'}\t$year\t$tim\t" . &password($FORM{'pw'}) . "\t$host\t\t\n"; &jcode'convert(*value,'sjis'); @data=split(/\t/,$value); if(grep(/\t\Q$FORM{'dai'}\E\t\Q$FORM{'name'}\E\t.*?\t\Q$FORM{'t'}\E\t/o,@open)){ &err('2重投稿防止機能が作動しました'); } unless((split(/\t/,$open[1]))[10]){ $new[0] = $sss; foreach $next ( @open ){ if($next =~ /^\d+\t\d+\t(\d+)\t/o){ push(@new,$next); undef $next; $target = $1; foreach $dummy (@open){ if( $dummy =~ /^\d+\t(\d+)\t$target\t/ ){ push(@new,$dummy); undef $dummy; last if $1 == 0; } } } } *open = *new; } if($data[1] != 0){ foreach $dummy (@open){ if( $dummy =~ /^\d+\t\d+\t$FORM{'s'}\t/o ){ push(@tree,$dummy); undef $dummy; $max++; } } &err('返信先の記事がありませんので、発言できませんでした') unless @tree; &err('階層が深くなりすぎているので、返信できません') if &x(\@tree,$FORM{'re'}) > $kai_max } &err('ツリーが長くなりすぎたのでこのツリーにはもう発言できません') if $#tree + 2 > $tree_max; splice(@open,0,1,"$sss\n",$value,@tree); while( $max < $#open ){ $back = pop(@open); if($BACK && $back =~ /^(\d+)\t0\t/o){ $target = $1; foreach $dummy (@open){ if( $dummy =~ /^\d+\t\d+\t$target\t/ ){ push(@backup,$dummy); undef $dummy; } } push(@backup,$back); } } if(@backup && -e $BACK){ open(OUT,">>" . $BACK) || &err('過去ログ用ファイルを開けません'); print OUT @backup; close OUT; } open(A,">".$LOG)||&err('ログファイルをオープンできません'); print A @open; close(A); $locks=0; open(LOCK,">" . $lock)&&close(LOCK); undef $send if $cmd eq "ONE" && $FORM{'re'} ne "0"; if($send && ($cmd eq "ONE" || $cmd eq "ALL")){ &err('管理人メールアドレスがこの掲示板で使用できないタイプのものでした') unless $admin =~ /.+\@.+\..+/; $body1 = "==========<< MAIL >>==========\n\n"; $body1 .= "投稿番号:$sss\n"; $body1 .= "日 付 :$mon/$day $hour:$min\n"; $body1 .= "投稿者 :$FORM{'name'}\n"; $body1 .= "題 名 :$FORM{'dai'}\n"; $body1 .= "メール :$FORM{'mail'}\n" if $FORM{'mail'}; $body1 .= "URL :$FORM{'url'}\n" if $FORM{'url'}; $body1 .= "投稿内容:\n $FORM{'t'}\n"; $body1 =~ s/>/>/g; $body1 =~ s/<//\n /g; &jcode'convert(*body1,'jis'); ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,) = localtime(time); $year += 1900; if($day < 10) {$day = "0".$day; } if($hour < 10) {$hour= "0".$hour;} if($min < 10) {$min = "0".$min; } if($sec < 10) {$sec = "0".$sec; } $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; $getu = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$mon]; $date = "$youbi, $day $getu $year $hour:$min:$sec +0900"; $body2 ="==============================\n"; $body2.="REMOTE_ADDR [$ENV{'REMOTE_ADDR'}]\n"; $body2.="REMOTE_HOST [$ENV{'REMOTE_HOST'}]\n"; $body2.="HTTP_USER_AGENT [$ENV{'HTTP_USER_AGENT'}]\n"; $body2.="HTTP_REFERER [$ENV{'HTTP_REFERER'}]\n"; $body2.="==============================\n"; $body2.="TREEBBS http://cgiroom.nu\n"; &jcode'convert(*body2,'jis'); $head ="From: $admin\n"; $head.="Subject: [$subject: $sss] \n"; $head.="Date: $date\n"; $head.="To: $admin\n"; $head.="Content-type: text/plain\n"; $head.="Mime-Version: 1.0\n"; $head.="\n\n"; open(MAILER,"| $send -t") || &err('投稿は完了しましたがメールを送信できませんでした。'); print MAILER $head; print MAILER $body1; print MAILER $body2; print MAILER "\n.\n"; close(MAILER); } if($FORM{'cookie'}){ print "Set-Cookie: CGIROOMTREE=", url_encode("$FORM{'name'}\t$FORM{'email'}\t$FORM{'url'}\t$FORM{'pw'}\t") , "; expires=Fri, 31-Dec-2010 00:00:00 GMT\n"; } }elsif($FORM{'new'}){ &ha(''); #======================================================================# }elsif($FORM{'last'} && $FORM{'kako'} eq ""){ &head; print"
$blockquote";
open(LOG)||&err('ファイルをオープンできません');
$tmp =  unless $kako;
$i="00";
while(){
	last if $i++ >= 20;
	@data=split(/\t/);
	print"";
	print"$data[0]:$data[3] [$data[4]] $data[6]
"; } print"
"; &last; exit; #======================================================================# }elsif($FORM{'seek'}){ $FORM{'s'} =~ s/\D//g; $FORM{'s'} = 1 if $FORM{'s'} eq ""; &head; print"$blockquote"; @saikin=("