#!/usr/local/bin/perl require 'jcode.pl'; ## remake.cgi ver 2.06 (2001/08/22)(16.zip) # 使い方 # remake.cgi?bbs=bbs 全復帰 # remake.cgi?bbs=bbs&key=0 復帰なし(index.html再作成) # remake.cgi?bbs=bbs&key=key keyのスレッドを復帰 #================================================== # システム関連(タイムゾーン・シグナル) #================================================== #タイムゾーンをセットする { $ENV{'TZ'} = "JST-9"; } #シグナル対処関数 sub SigExit { exit(0); } #対応シグナル { $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "SigExit"; } #================================================== # 初期情報の取得(POST) #================================================== { use vars qw(%FORM); my ($buffer, @pairs, $pair, $name, $value); if($ENV{'REQUEST_METHOD'} eq 'GET'){$buffer = $ENV{'QUERY_STRING'};} if($ENV{'REQUEST_METHOD'} eq 'POST'){read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});} @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2',$1)/eg; $value =~ s//>/g; $value =~ s/\r\n|\r|\n/
/g; $value =~ s/
/
/g; $FORM{$name} = $value; } } #================================================== # エラーレスポンス(BBS情報) #================================================== #BBS名がない場合ばいばい #BBS名に不正な文字があった場合もばいばい { unless($FORM{'bbs'}){ DispError("ERROR!","BBS名がありません!"); } # if($FORM{'bbs'} =~ /(\.|\/)/){ # DispError("ERROR!","BBS名が不正です!"); # } } #================================================== # システム関連(ファイル・ディレクトリパス) #================================================== #各種PATH生成 { use vars qw($WWWPATH); use vars qw($PATH); use vars qw($DATPATH); use vars qw($TEMPPATH); use vars qw($IMODEPATH); $PATH = "../" . $FORM{'bbs'} . "/"; $DATPATH = $PATH . "dat/"; $TEMPPATH = $PATH . "html/"; $IMODEPATH = $PATH . "i/"; use vars qw($NOWTIME); $NOWTIME = time; } #================================================== # 初期情報の取得(設定ファイル) #================================================== { use vars qw(@SETTING); # 設定ファイルを読む my ($m_pass,$m_key,$m_value); $m_pass = $PATH . "SETTING.TXT"; if(-e $m_pass){ open(FILE,$m_pass); foreach (){ chop; ($m_key,$m_value) = split /=/; $SETTING{$m_key} = $m_value; } close(FILE); }else{ # 設定ファイルがない(ERROR) DispError("ERROR!","ERROR:ユーザー設定が消失しています!"); } #欠落情報の補完 unless($SETTING{"BBS_THREAD_NUMBER"}){$SETTING{"BBS_THREAD_NUMBER"} = 20;} unless($SETTING{"BBS_CONTENTS_NUMBER"}){$SETTING{"BBS_CONTENTS_NUMBER"} = 10;} unless($SETTING{"BBS_LINE_NUMBER"}){$SETTING{"BBS_LINE_NUMBER"} = 30;} unless($SETTING{"BBS_MAX_MENU_THREAD"}){$SETTING{"BBS_MAX_MENU_THREAD"}=100;} unless($SETTING{"BBS_BG_COLOR"}){$SETTING{"BBS_BG_COLOR"}="#FFFFFF";} unless($SETTING{"BBS_MENU_COLOR"}){$SETTING{"BBS_MENU_COLOR"}="#CCFFCC";} unless($SETTING{"BBS_MAKETHREAD_COLOR"}){$SETTING{"BBS_MAKETHREAD_COLOR"}="#CCFFCC";} unless($SETTING{"BBS_THREAD_COLOR"}){$SETTING{"BBS_THREAD_COLOR"}="#EFEFEF";} unless($SETTING{"BBS_SUBJECT_COLOR"}){$SETTING{"BBS_SUBJECT_COLOR"}="#FF0000";} unless($SETTING{"BBS_TEXT_COLOR"}){$SETTING{"BBS_TEXT_COLOR"}="#000000";} unless($SETTING{"BBS_NAME_COLOR"}){$SETTING{"BBS_NAME_COLOR"}="#008800";} unless($SETTING{"BBS_LINK_COLOR"}){$SETTING{"BBS_LINK_COLOR"}="#0000FF";} unless($SETTING{"BBS_ALINK_COLOR"}){$SETTING{"BBS_ALINK_COLOR"}="#FF0000";} unless($SETTING{"BBS_VLINK_COLOR"}){$SETTING{"BBS_VLINK_COLOR"}="#660099";} unless($SETTING{"BBS_TITLE_COLOR"}){$SETTING{"BBS_TITLE_COLOR"}="#000000";} unless($SETTING{"BBS_SUBJECT_COUNT"}){$SETTING{"BBS_SUBJECT_COUNT"}="64";} unless($SETTING{"BBS_NAME_COUNT"}){$SETTING{"BBS_NAME_COUNT"}="64";} unless($SETTING{"BBS_MAIL_COUNT"}){$SETTING{"BBS_MAIL_COUNT"}="64";} unless($SETTING{"BBS_MESSAGE_COUNT"}){$SETTING{"BBS_MESSAGE_COUNT"}="4096";} } #================================================== # ファイル操作(サブジェクトファイル読み込み) #================================================== #サブジェクトファイルを読み込む { my $subject = $PATH . "subject.txt"; use vars qw(@PAGEFILE); use vars qw(%SUBJECT); use vars qw($FILENUM); #サブジェクトファイルを読み込む open(SUBR,"<$subject"); #SUBJECTを開く my @SUBJECTLIST = ; #内容を全て読み込む close(SUBR); #閉じる #サブジェクト内容をハッシュに格納 foreach(@SUBJECTLIST){ chomp($_);#改行を取る my ($file, $value) = split(/<>/,$_); unless($file){next;} my $filename = $DATPATH . $file; if(-e $filename){ #datが存在する場合のみ最後に追加 push(@PAGEFILE,$file); $SUBJECT{$file} = $value; } } ### 逝っちゃったログも拾う if($FORM{'key'} eq ''){ opendir(DIR, $PATH."dat/"); @filelist = readdir(DIR); closedir(DIR); foreach(@filelist){ if($_ eq "." || $_ eq ".."){next} if (-e $PATH."dat/$_" && $PAGEFILE{$_} eq "" && $SUBJECT{$_} eq ""){ unshift(@PAGEFILE,$_); open(IN,$PATH."dat/$_"); @in=; close(IN); $subject=(split /<>/,$in[0])[4]; chomp($subject);$num=@in; $SUBJECT{$_} = "$subject ($num)"; } } } #サブジェクト数を取得 $FILENUM=@PAGEFILE; #パーミッション調整 chmod(0666,$subject); if ($FORM{'key'} eq "") { foreach (@PAGEFILE) { open(DAT,"$DATPATH$_"); my @temp=; close(DAT); my $num=@temp; my ($name,$mail,$date,$message,$subject) = split(/<>/,$temp[0]); chomp($subject);#改行を取る $SUBJECT{$_} = "$subject ($num)"; } }elsif ($FORM{'key'} ne 0 && -e "$DATPATH$FORM{'key'}.dat") { open(DAT,"$DATPATH$FORM{'key'}.dat"); my @temp=; close(DAT); my $num=@temp; my ($name,$mail,$date,$message,$subject) = split(/<>/,$temp[0]); chomp($subject);#改行を取る my $fl=0; foreach(@PAGEFILE){ if($_ eq "$FORM{'key'}.dat"){ $fl=1;last; } } if($fl eq 0){ unshift(@PAGEFILE,"$FORM{'key'}.dat");$FILENUM++; } $SUBJECT{"$FORM{'key'}.dat"} = "$subject ($num)"; } my ($subtt,$subtm,$datfile,$valued,$subval,$subnum); undef $subtm; undef $subtt; $subject = $PATH . "subject.txt"; #サブジェクトテキストを開く open(SUBW,">$subject"); eval{flock(SUBW,2);}; #一括書き込み my @temp; undef @temp; foreach(@PAGEFILE){ $temp[@temp]=$_; print SUBW "$_\<>$SUBJECT{$_}\n"; } @PAGEFILE=@temp; eval{flock(SUBW,8);}; close(SUBW); # i-mode用テキストを開く { unless(-e $IMODEPATH){ mkdir($IMODEPATH,0777); } my $imodeindex = $IMODEPATH . "index.html"; open(SUBW,">$imodeindex"); eval{flock(SUBW,2);}; # 一括書き込み print SUBW "\n"; print SUBW "\n"; print SUBW "$SETTING{'BBS_TITLE'}\n"; print SUBW "\n"; print SUBW "おんぷちゃんねる i-mode トップ
"; print SUBW "$SETTING{'BBS_TITLE'}
"; my ($count,$key,$end,$subtitle); if($FILENUM<30){$end=$FILENUM;}else{$end=30;} for($count=1;$count<=$end;$count++){ @PAGEFILE[$count-1]=~ /(\d*)\.dat/; $key = $1; $subtitle = $SUBJECT{@PAGEFILE[$count-1]}; &jcode::z2h_sjis(\$subtitle); print SUBW "$count: $subtitle
"; } $count=@PAGEFILE; if ($count > 30){ print SUBW "
\n"; } print SUBW "
\n"; print SUBW < タイトル:
名前:
mail:
コメント


EOF print SUBW "
\n"; eval{flock(SUBW,8);}; close(SUBW); # パーミッション調整 chmod(0666,$imodeindex); } # 過去ログメニューをかーくー { my $sub = $PATH . "subback.html"; open(HED,">$sub"); eval{flock(HED,2);}; print HED< EOF my $dat; for(my $count=1;$count<=$FILENUM;$count++){ $PAGEFILE[$count-1]=~/(\d+)\.dat/; $dat=$1; print HED "$count: $SUBJECT{$PAGEFILE[$count-1]} \n"; } print HED "
倉庫はこちら"; print HED ""; eval{flock(HED,8);}; close(HED); } } #================================================== # ファイル操作(HTML作成用作業ファイル更新) #================================================== #HTML用DATを作成 { if ($FORM{'key'} eq ""){ foreach(@PAGEFILE){ my $dat; $dat = $_; $dat =~ s/([^\.]*)\.dat/$1/; MakeWorkFile($dat); } }elsif ($FORM{'key'} ne 0) { MakeWorkFile($FORM{'key'}); } #パーミッション調整 chmod(0777,$TEMPPATH); } #================================================== # 本HTML吐き処理 #================================================== { use vars qw($INDEXFILE); $INDEXFILE = $PATH . "index.html"; open(HTM,">$INDEXFILE"); eval{flock(HTM,2);}; print HTM < $SETTING{'BBS_TITLE'} EOF if($SETTING{'BBS_TITLE_PICTURE'}){ print HTM "
"; if($SETTING{'BBS_TITLE_LINK'}){ print HTM ""; } print HTM ""; if($SETTING{'BBS_TITLE_LINK'}){ print HTM ""; } print HTM "
"; }else{ print HTM "
"; if($SETTING{'BBS_TITLE_LINK'}){ print HTM ""; } # print HTM "

$SETTING{'BBS_TITLE'}

"; if($SETTING{'BBS_TITLE_LINK'}){ print HTM "
"; } print HTM "
"; } print HTM "\n"; print HTM<
\n"; print HTM " \n"; if ($SETTING{'BBS_PASSWORD_CHECK'} ne "checked"){ print HTM<
$SETTING{'BBS_TITLE'}
EOF if ($SETTING{'BBS_PROXY_CHECK'} eq "checked") { print HTM " ■PROXY規制中■
\n"; } print HTM "
"; &HTM("../right.txt",1); print HTM<
EOF &HTM($PATH."head.txt",1); print HTM<この板の1スレッドの制限は最大$SETTING{'BBS_MAX_RES_COUNT'}レス、または最大$SETTING{'BBS_MAX_RES_SIZE'}KBになっています。
EOF print HTM "
タイトル:  
名前: E-mail(省略可)
内容:
EOF }else{ print HTM< EOF } &HTM("../bottom.txt",1); print HTM "\n\n"; my $lp=int($FILENUM / $SETTING{'BBS_THREAD_NUMBER'}); if($FILENUM != $lp * $SETTING{'BBS_THREAD_NUMBER'}){ $lp++; } if($lp>1){ print HTM "最後のページ"; } my $nextpage; if($FILENUM>$SETTING{'BBS_THREAD_NUMBER'}){ $nextpage=1; print HTM " 次のページ"; } print HTM " スレッド一覧"; print HTM " i-mode"; print HTM " FAQ"; print HTM " リロード\n"; print HTM ""; print HTM "
GlobalNoteScript"; print HTM "
"; print HTM "\n"; print HTM ""; &HTM("../bbstable.txt",1); print HTM <
EOF ### スレッド一覧を吐き出す #スレッド吐き出し用にファイル数を調整 if($FILENUM > $SETTING{'BBS_MAX_MENU_THREAD'}){ $FILENUM=$SETTING{'BBS_MAX_MENU_THREAD'}; } my ($dat, $key, $count); for($count=1;$count<=$FILENUM;$count++){ $dat=$key=$PAGEFILE[$count-1]; $key=~s/([^\.]*)\.dat/$1/; unless($1){next;} if($SETTING{'BBS_THREAD_NUMBER'} >= $count){ print HTM "$count: $SUBJECT{$dat} \n"; }else{ print HTM "$count: $SUBJECT{$dat} \n"; } } print HTM "\n"; print HTM "

\n"; my $headad = "../headad.txt"; if(-e $headad){ my @headad; open(IN, "$headad"); @headad = ; close(IN); if (@headad){ print HTM "
\n"; foreach(@headad){print HTM;} print HTM "

\n"; } } &HTM("../headad2.txt",1); ### スレッドを吐き出す #スレッド吐き出し用にファイル数を調整 if($FILENUM > $SETTING{'BBS_THREAD_NUMBER'}){ $FILENUM=$SETTING{'BBS_THREAD_NUMBER'}; } my ($front, $next, $ancnum, $dap, $first, $line); for(my $contnum = 0;$contnum < $FILENUM;$contnum++){ $front=$contnum; $next=$contnum+2; if($front==0){$front=$FILENUM;} if($next>$FILENUM){$next=1;} $ancnum=$contnum+1; $dap = $PAGEFILE[$contnum]; $dap =~ s/([^\.]*)\.dat/$1/; if (!-e "$TEMPPATH$dap.html") { MakeWorkFile($dap); } print HTM "\n"; open(IN, "$TEMPPATH$dap.html"); $first=; $first =~ s/\$ANCOR/$ancnum/g; $first =~ s/\$FRONT/$front/g; $first =~ s/\$NEXT/$next/g; print HTM $first; print HTM while ; close(IN); print HTM < レスを全部読む 最新レス50 レス1-100 掲示板のトップへ リロード
EOF } if ($nextpage){ print HTM< 次のページ EOF } print HTM "
"; print HTM "

"; &HTM("../bottom_ad.txt",1); print HTM "\n"; print HTM "
"; eval{flock(HTM,8);}; close(HTM); &location; } sub HTM { my ($file,$h) = @_; if(-e $file){ if($h){select(HTM);} open(IN, "$file"); print while ; close(IN); if($h){select(STDOUT);} } } sub location { $PATH .= "index.html"; if ($SETTING{'BBS_LOCATION_CHECK'} eq 'checked') { print "Location: $PATH\n\n"; } else { print "Content-Type: text/html; charset=shift_jis\n\n"; print < indexファイル作成中 indexファイル作成中 EOF } exit; } #エラー画面(エラー処理) #DispError(TITLE,TOPIC); sub DispError{ my $title=$_[0]; my $topic=$_[1]; print "Content-type: text/html; charset=shift_jis\n\n"; #----------------------------------------------------------------------- print < $title
$topic
EOF #----------------------------------------------------------------------- exit; } #作業用ファイル作成 #MakeWorkFile(KEY-NUMBER); sub MakeWorkFile { my $key = $_[0]; my $workfile = $TEMPPATH . $key . ".html"; my $datafile = $DATPATH . $key . ".dat"; my (@messx,@content,@logdat); my ($mailto,$time,$brmax,$topnum,$firstlog,$lognum,$name,$mail,$subject,$message); if(-e $datafile){ open(RDAT,"<$datafile"); @logdat=; # ログを配列に読み込む close(RDAT); }else{ open(SHTM,">$workfile"); print SHTM "return"; close(SHTM); return; } open(SHTM,">$workfile");# ログテンポラリを開く eval{flock(SHTM,2);}; # ログのカキコ数を取得 $lognum = @logdat; # 1つ目の要素を読み込む $firstlog = $logdat[0]; # 改行カット chomp($firstlog); # 1つ目の要素を加工する ($name,$mail,$time,$message,$subject) = split /<>/,$firstlog; my $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; $message =~ s/($check)(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1$2\:$3<\/a>/igo; # サブジェクトテーブルを吐き出す(ここは必ず1行にまとめること(処理効率)) #----------------------------------------------------------------------- print SHTM <
[\$ANCOR:$lognum]$subject
EOF #----------------------------------------------------------------------- # 1つ目の要素のメールへのリンクを作成 # 末尾にsjisの1バイト目があったら削る my $check1 = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; my $check2 = '[\201-\237\340-\374]'; $mail =~ s/($check1)$check2$/$1/g; $name =~ s/($check1)$check2$/$1/g; if($mail ne ''){ $mailto = "$name"; }else{ $mailto = "$name"; } # 1つ目の要素を吐き出す print SHTM "
1 名前:$mailto 投稿日:$time
$message


\n"; # ログ数から、表示コンテンツをチェック if(@logdat>$SETTING{'BBS_CONTENTS_NUMBER'}){ # ケツの要素を0〜9番までコンテンツに格納 @content[0..$SETTING{'BBS_CONTENTS_NUMBER'}-1] = @logdat[@logdat-$SETTING{'BBS_CONTENTS_NUMBER'}..@logdat-1]; $topnum=@logdat-($SETTING{'BBS_CONTENTS_NUMBER'}-1); if($topnum eq 992){ @content[0..$SETTING{'BBS_CONTENTS_NUMBER'}-1]=@logdat[@logdat-$SETTING{'BBS_CONTENTS_NUMBER'}-1..@logdat-2]; $topnum--; } }else{ # アタマの要素を1〜10番までコンテンツに格納 @content[0..($SETTING{'BBS_CONTENTS_NUMBER'}-1)] = @logdat[1..$SETTING{'BBS_CONTENTS_NUMBER'}]; $topnum=2; } my @messx; foreach(@content){ unless($_){ $topnum++; next; } chop; ($name,$mail,$time,$message,$subject) = split /<>/; my $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; $message =~ s/($check)(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1$2\:$3<\/a>/igo; # 要素のメールへのリンクを作成 # 末尾にsjisの1バイト目があったら削る my $check1 = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; my $check2 = '[\201-\237\340-\374]'; $mail =~ s/($check1)$check2$/$1/g; $name =~ s/($check1)$check2$/$1/g; if($mail ne ''){ $mailto = "$name"; }else{ $mailto = "$name"; } print SHTM "
$topnum 名前:$mailto 投稿日:$time
"; $topnum++; @messx = split /
/,$message;# メッセージを行でカット if(@messx<$SETTING{'BBS_LINE_NUMBER'}){ print SHTM "$message
"; }else{ for(@messx[0..$SETTING{'BBS_LINE_NUMBER'}]){ print SHTM "$_
"; } $topnum--; print SHTM "(省略されました・・全てを読むにはここを押してください)
"; $topnum++; } print SHTM "
\n"; } #----------------------------------------------------------------------- print SHTM <
名前: E-mail(省略可)
EOF #----------------------------------------------------------------------- eval{flock(SHTM,8);}; close(SHTM); # パーミッション調整 chmod(0666,$workfile); }