#!/usr/bin/perl
require './jcode.pl';
#------------------------------------------
$ver = "Child Tree v8.93";# (ツリー式掲示板)
#------------------------------------------
# Copyright(C) りゅういち
# E-Mail:ryu@cj-c.com
# W W W :http://www.cj-c.com/
#------------------------------------------
#---[設定ファイル]-------------------------
# 同じようにいくつでも増やせます。
# [ ]内の数字を使いCGIにアクセスするとその設定ファイルで動作します。
# $set[12] の設定ファイルを使う場合: http://www.---.com/cgi-bin/cbbs.cgi?no=12
$set[0]="./kanri.cgi";
$set[1]="./ff12shitumon.cgi";
$set[2]="./ff12kouryaku.cgi";
$set[3]="./set3.cgi";
$set[4]="./set4.cgi";
# 禁止文字列 タグ使用の場合は禁止タグも入力OK 同じようにいくつでも指定可能
@NW=('死ね');
# 排除IP/禁止文字列設定ファイル
$IpFile="IpAcDeny.cgi";
$NWFile="WordDeny.cgi";
# ---[設定ここまで]--------------------------------------------------------------------------------------------------
#
# ファイルアップ機能はとほほさんのWWWUPLを参考にしています。
# -> http://tohoho.wakusei.ne.jp/
#
# ---[排除IP/禁止文字列読み込み]-------------------------------------------------------------------------------------
if(-e $NWFile){
open(DE,"$NWFile");
while(){push(@NW,$_);}
close(DE);
}
if(-e $IpFile){
open(DE,"$IpFile");
while(){push(@ips,$_);}
close(DE);
}
if(@ips){
$match=0;
foreach (@ips) {$_=~ s/\n//; if($ENV{'REMOTE_ADDR'}=~ /$_/){$match=1; last;}}
if($match){&er_("あなたには閲覧権限がありません!");}
}
# ---[設定ファイル読み込み]------------------------------------------------------------------------------------------
$res_r=1;
&d_code_;
if($no eq ""){$no=0;}
if($set[$no]){unless(-e $set[$no]){&er_('設定ファイルが無いです!');}else{$SetUpFile="$set[$no]"; require"$SetUpFile";}}
else{&er_('設定ファイルがCGIに設定されてません!');}
$nf="\n";
# ---[フォームスタイルシート設定]------------------------------------------------------------------------------------
$ag=$ENV{'HTTP_USER_AGENT'};
if($fss && $ag =~ /IE|Netscape6/){
$fm=" onmouseover=\"this.style.$on\" onmouseout=\"this.style.$off\"";
$ff=" onFocus=\"this.style.$on\" onBlur=\"this.style.$off\"";
$fsi="$fst";
}
# ---[簡易パスワード制限関連]----------------------------------------------------------------------------------------
if($s_ret){if($FORM{"P"} eq ""){
&get_("P");} $P=$FORM{"P"};
$pf="\n";
$pp="&P=$P";
}else{$pf=""; $pp="";}
if($FORM{'KLOG'}){
$KLOG=$FORM{'KLOG'}; $TrON=0; $TpON=1; $ThON=0; $TOPH=2;
unless($KLOG=~ /^[\d]+/){&er_("そのファイルは閲覧できません!");}
$log="$klog_d\/$KLOG\.txt";
$pp.="&KLOG=$KLOG";
$pf.="\n";
}
if($s_ret && $P eq "" && ($mode eq "alk"||$mode eq "")){&pas_;}
if($s_ret==2 && $P eq "R"){&er_("パスワードが違います!");}
if($s_ret && $P ne "R"){if($P ne "$s_pas"){&er_("パスワードが違います!");}else{&set_("P");}}
# ---[サブルーチンの読み込み/表示確定]-------------------------------------------------------------------------------
if($mode eq "all_v"){&a_;} if($mode eq "ffs"){&freeform_;}
if($mode eq "bma"){&bma_;} if($mode eq "Den"){&Den_;}
if($mode eq "ent"){&ent_;} if($mode eq "man"){&man_;}
if($mode eq "n_w"){&n_w_;} if($mode eq "wri"){&wri_;}
if($mode eq "del"){&del_;} if($mode eq "s_d"){&s_d_;}
if($mode eq "nam"){&hen_;} if($mode eq "h_w"){&h_w_;}
if($mode eq "new"){&new_;} if($mode eq "all"){&all_;}
if($mode eq "al2"){&all2;} if($mode eq "res"){&res_;}
if($mode eq "key"){&key_;} if($mode eq "one"){&one_;}
if($mode eq "ran"){&ran_;} if($mode eq "f_a"){&f_a_;}
if($mode eq "img"){&img_;} if($mode eq "red"){&read;}
if($mode eq "cmin"){&set_("M");} if($mode eq "cookdel"){&cookdel;}
unless(-e $log){if($KLOG eq ""){&l_m($log);}}
unless(-e $c_f){if($cou){&l_m($c_f);}}
unless(-e $RLOG){if($M_Rank){&l_m($RLOG);}}
if($W){$Wf="&W=$W";} if($H){$Hf="&H=$H";}
if($W eq "W"){$Res_T=0;}elsif($W eq "T"){$Res_T=1;}elsif($W eq "R"){$Res_T=2;}
if($mode eq "alk"){&alk_;}
if($H eq "F"){&html2_;}elsif($H eq "T"){&html_;}elsif($H eq "N"){&alk_;}
if($TOPH==1){&html_;}elsif($TOPH==2){&html2_;}else{&alk_;}
exit;
#--------------------------------------------------------------------------------------------------------------------
# [記事デザイン]
# -> 記事を統一デザインで表示(design)
#
sub design {
local($namber,$date,$name,$email,$d_may,$comment,$url,$space,$end,$type,$delkey,$ip,$tim,$ico,
$Ent,$fimg,$mini,$icon,$font,$hr,$txt,$sel,$yobi,$Se,$ResNo,$htype,$hanyo)=@_; @_=();
$HTML="";
if($font eq ""){$font=$text;}
if($hr eq ""){$hr=$ttb;}
if($d_may eq ""){$d_may="NO TITLE";}
if($Icon && $comment=~/
\(携帯\)$/){$icon="$Ico_k";}
if($icon ne ""){
if($IconHei){$WH=" height=$IconHei width=$IconWid";}
$icon="";
}
if($txt){$Txt="$TXT_T:[$txt] ";}else{$Txt="";}
if($sel){$Sel="$SEL_T:[$sel] ";}else{$Sel="";}
if($yobi){$yobi="[ID:$yobi]";}
if($end){$end="$end_ok";}
if($email && $Se < 2){$email="$AMark";}else{$email="";}
if($url){
if($URLIM){
if($UI_Wi){$UIWH=" width=\"$UI_Wi\" height=\"$UI_He\"";}
$i_or_t="";
}else{$i_or_t="http://$url";}
$url="$i_or_t";
}
if($comment=~ /<\/pre>$/){$comment=~ s/
/\n/g;}
if($Txt || $Sel ||($Txt && $Sel)){
if($TS_Pr==0){$d_may="$Txt$Sel/"."$d_may";}
elsif($TS_Pr==1){$comment="$Txt
$Sel
"."$comment";}
elsif($TS_Pr==2){$comment.="
$Txt
$Sel";}
}
if($FORM{"pass"} && $FORM{"pass"} eq $pass){$Ent=1; $url="";}
if($mas_c==2 && $Ent==0){$comment="コメント表\示:未許可";}
$comment="$comment"; &auto_($comment);
if($o_mail){$Smsg="[メール受信/";if($Se==2 || $Se==1){$Smsg.="ON]\n";}else{$Smsg.="OFF]\n";}}
if($ico && $i_mode){$Pr=""; &size(); $Pr="$Pr |
\n"; $SIZE+=$Size;}else{$Pr="";}
$agsg=""; $UeSt=""; $Pre="";
if($ResNo==0){$ResNo="親";}
if($htype eq "T"){
$ResNo="$ResNo階層"; $Border=1; $Twidth=90;
if($Res_i){$IN="記事引用";}
}elsif($htype eq "T2"){
$ResNo="$ResNo階層"; $Border=1; $Twidth=90;
$IN="返信";
if($Res_i){$IN.="/引用返信\n";}
$VNo=$namber; $OTL="";
if($type > 0){$UeSt.="$b_ "; $OTL=" 親 $type /";}else{$UeSt.="親記事 / ";}
if($n_){$UeSt.="$n_ \n";}else{$UeSt.="返信無し\n";}
$OTL.=" □ Tree\n";
$IN="[$OTL]\n".$IN;
$HTML.="
";
}elsif($htype eq "F"){
$VNo++; $ResNo="inTopicNo.$ResNo"; $Border=0; $Twidth=90;
$IN="引用返信";
if($Res_i){$IN.="/返信";}
if($VNo==1){$sg=$VNo+1; $agsg="\ \;\ \;▼■";}
elsif($VNo >= $topic){$ag=$VNo-1; $agsg="▲ ■";}
else{$ag=$VNo-1; $sg=$VNo+1; $agsg="▲▼■";}
}elsif($htype eq "N"){
$ResNo=""; $Border=1; $Twidth=90;
if($TOPH==0){$MD="mode=res&namber="; if($type){$MD.="$type";}else{$MD.="$namber";}}
elsif($TOPH==1){$MD="mode=one&namber=$namber&type=$type&space=$space";}
elsif($TOPH==2){$MD="mode=al2&namber="; if($type){$MD.="$type";}else{$MD.="$namber";} $MD.="&space=$space";}
$IN="返信";
if($Res_i){$IN.="/引用返信\n";}
$HTML.="
";
}elsif($htype eq "P"){
$ResNo=""; $Border=1; $Twidth=90;
if($hanyo eq "randam"){$icon="アイコン
ランダム";}
$Smsg.="";}
if($tag){$tagmsg="可能\です。";}else{$tagmsg="できません。";}
if($FORM{"PV"} eq ""){print"
_FORM_
}
}
#--------------------------------------------------------------------------------------------------------------------
# [ツリー記事表示]
# -> ツリーの記事を表示する(one_)
#
sub one_ {
@TREE=();
open(LOG,"$log") || &er_("Can't open $log");
while ($Line = ) {
($nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim) = split(/<>/,$Line);
if(($type==0 && ($nam eq $namber || $ty eq $namber))||($type && ($nam eq $type || $ty eq $type))){
if($ty){
if($Keisen){
$SPS=$sp/15; $Lg=0; $Tg=0; $S="";
if($SP){
if($SP > $SPS){if($L[$SPS]){$Tg=1; $L[$SP]="";}else{$Lg=1; $L[$SP]="";}}
elsif($SP==$SPS && $L[$SPS]){$Tg=1;}elsif($SP < $SPS){$Lg=1;}
}else{$Lg=1;}
if($SPS > 1){foreach(2..$SPS){$_--; if($L[$_]){$S.="$K_I";}else{$S.="$K_SP";}}}
$SP=$sp/15;
if($SP==1){@L=(); $L[$SP]=1;}else{$L[$SP]=1;}
if($Lg){$Line="$S$K_L<>$Line";}
elsif($Tg){$Line="$S$K_T<>$Line";}
}else{$Line="<>$Line";}
if($date){unshift(@TREE,$Line);}
}else{unshift(@TREE,"<>$Line"); $SP=0; @L=(); if($tim=~/[\d]+/){last;}}
}
}
close(LOG);
$rs=0; $i=0; $ON=0; $Tree=""; $SP=0; $F=0;
foreach $lines (@TREE) {
($Sen,$nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim,$Se)=split(/<>/,$lines);
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
if($namber eq "$nam" && $namber ne $ty) {
if($d_may eq ""){$d_may="NO TITLE";}
&hed_("One Message View / $d_may","1");
$com="■No$namberに返信($nameさんの記事)
$comment";
$com=~ s/
/\r> /g; $com=~ s/> > />>/g;
if($sp==0){$re=1;}elsif($sp>0){$re=$sp/15+1;}
if($d_may=~ /^Re\[/){
$resuji=index("$d_may" , "\:");
$d_may=~ s/\:\ //;
$d_may=substr($d_may,$resuji);
}
$ti="Re[$re]: $d_may";
if($i==0){$i=1;}
print"";
$ResNo=$sp/15;
&design($nam,$date,$name,$email,$d_may,$comment,$url,$sp,$end,$ty,$del,$Ip,$tim,$ico,
$Ent,$fimg,$ICON,$ICO,$font,$hr,$txt,$sel,$yobi,$Se,$ResNo,"T");
print"$HTML\n";
print"
\n";
print"前の記事(元になった記事) | \n";
print"次の記事(この記事の返信) |
\n";
}
if($end){$end="$end_ok"; $En=1;}
if($d_may eq ""){$d_may="No Title";}
$date=substr($date,2,19);
if(($time_k-$tim)>$new_t*3600){$news="$hed_i";}else{$news="$new_i";}
if($txt){$Txt="$TXT_T:[$txt] ";}else{$Txt="";}
if($sel){$Sel="$SEL_T:[$sel] ";}else{$Sel="";}
if($Txt || $Sel ||($Txt && $Sel)){if($TS_Pr==0){$d_may="$Txt$Sel/"."$d_may";}}
if(@ico3 && $Icon && ($ICON ne "" || $comment=~/
\(携帯\)$/)){
if($I_Hei_m){$WHm=" width=$I_Wid_m height=$I_Hei_m";}
if($ICON ne ""){if($ICON=~ /m/){$ICON=~ s/m//; $mICO=$mas_m[$ICON];}else{$mICO=$ico3[$ICON];}}
elsif($Icon && $comment=~/
\(携帯\)$/){$mICO="$Ico_km";}
$news.="";
}
if($yobi){$yobi="[ID:$yobi] ";}
if(length($d_may)>$t_max){$d_may=substr($d_may,0,($t_max-2)); $d_may="$d_may..";}
if($email && $Se < 2){$name="$name $AMark";}
if($ico && $i_mode){$Pr=""; &size(1); $Pr=" "."$Pr"; $SIZE+=$Size;}else{$Pr="";}
$psp=$space+15;$nsp=$space-15;
if(($namber eq "$ty" || $type eq "$nam" || $type eq "$ty") && $ON==0){
if($rs && $sp <= $space && $type){$ON=1;}
if($sp eq $nsp && $nam < $namber && $i != 1){
$b_="←$d_may\n/$name $yobi$Pr";
}elsif($type == 0){$b_="親記事";}
if($sp eq $psp && $nam > $namber && $i == 1){
$n_.="→$d_may\n/$name $yobi$Pr
";
$N_NUM=$nam;
}
if($i==1){$rs=1;}
}
$im=""; $im2=""; $im3="";
if($sp > $SP && $F){$N_NUM=$nam;}
if($sp eq $SP && $F){$F=0;}
if($N_NUM eq $nam && $F==0){$F=1; $SP=$sp;}
if($nam eq $namber){$im=""; $im2=""; $im3=" ←Now";}
if($Keisen){$Tree.="$Sen";}
else{
$Tree.="";
$spz=$sp/15*$zure;
$Tree.="." x $spz;
$Tree.="";
}
$Tree.="$im$news $d_may\n";
$Tree.="/ $name ($date) $yobi#$nam$im2 $end$Pr$im3\n";
}
print" |
$b_ | \n";
if($n_){print"$n_\n";}else{print"返信無し \n";}
print" |
上記関連ツリー | $Tree\n";
$total=@TREE-1;
if($type>0){$a_="$type";}elsif($type==0){$a_="$namber";}
if($TpON){$TpLink=" / 上記ツリーをトピック表\示\n";}
print" $all_i 上記ツリーを一括表\示$TpLink\n";
print" |
上記の記事へ返信 |
---|
\n";
if($r_max && $total >= $r_max){
print"レス数の限度を超えたのでレスできません。
(レス数限度:$r_max 現在のレス数:$total)\n";
print" → [ツリーの新規作成]\n";
}else{if($En && $end_e){print"$end_ok / 返信不可
";}else{&forms_("T");}}
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [ツリー表示]
# -> ツリーの一覧を表示する(html_)
#
sub html_ {
@NEW=(); @RES=(); @SEN=(); $SP=0; %RES=(); %R=();
if($FORM{'page'}){$page=$FORM{'page'};}else{$page=0;}
open(LOG,"$log") || &er_("Can't open $log");
while ($Line = ) {
($namber,$date,$name,$email,$d_may,$comment,$url,
$space,$end,$type,$del,$ip,$tim) = split(/<>/,$Line);
if($type){
$RS++;
if($R{$type}){$R{$type}++;}else{$R{$type}=1;}
if(($OyaCount > $page+$a_max || $page > $OyaCount+1) && $Res_T==0 && $tim=~/[\d]+/){next;}
if($date){
if($Keisen){
$SPS=$space/15; $Lg=0; $Tg=0; $S="";
if($SP){
if($SP > $SPS){if($L[$SPS]){$Tg=1; $L[$SP]="";}else{$Lg=1; $L[$SP]="";}}
elsif($SP==$SPS && $L[$SPS]){$Tg=1;}elsif($SP < $SPS){$Lg=1;}
}else{$Lg=1;}
if($SPS > 1){foreach(2..$SPS){$_--; if($L[$_]){$S.="$K_I";}else{$S.="$K_SP";}}}
$SP=$space/15;
if($SP==1){@L=(); $L[$SP]=1;}else{$L[$SP]=1;}
if($Lg){$Line="$S$K_L<>$Line";}
elsif($Tg){$Line="$S$K_T<>$Line";}
}else{$Line="<>$Line";}
$RES{$type}="$Line".$RES{$type};
}
}else{
if($tim eq ""){$tim="$TIM";} $tim=sprintf("%011d",$tim);
if($Res_T==2){$tim=$R{$namber}; $tim=sprintf("%05d",$tim);}
push(@NEW,"$tim<>$Line"); $SP=0; @L=(); $OyaCount=@NEW;
}
$TIM=$tim;
}
close(LOG);
if($Res_T){@NEW=sort(@NEW); @NEW=reverse(@NEW);}
@lines=(); $total=@NEW; $NS=$total+$RS;
$PAGE=$FORM{"page"}/$a_max;
&hed_("All Tree / Page: $PAGE");
$page_=int(($total-1)/$a_max);
$end_data=@NEW-1;
$page_end=$page + ($a_max - 1);
if($page_end >= $end_data){$page_end=$end_data;}
$Pg=$page+1; $Pg2=$page_end+1;
$nl=$page_end + 1;
$bl=$page - $a_max;
if($bl >= 0){$Bl=""; $Ble="";}else{$Bl=""; $Ble="";}
if($page_end ne $end_data){$Nl="";$Nle="";}else{$Nl=""; $Nle="";}
print <<"_HTML_";
$com_top
|
■ $new_t時間以内の記事は $new_i で表\示されます。
■ $all_i をクリックするとそのツリーを一括で表\示します。
|
$Henko
_HTML_
if($i_mode){&minf_("T");}
print"[ 全$totalツリー($Pg-$Pg2 表\示) ] \n";
$Plink="$Bl\<\;\<\;$Ble\n"; $a=0;
for($i=0;$i<=$page_;$i++){
$af=$page/$a_max;
if($i != 0){$Plink.="| ";}
if($i eq $af){$Plink.="$i\n";}else{$Plink.="$i\n";}
$a+=$a_max;
}
$Plink.="$Nl\>\;\>\;$Nle\n";
if($Res_T==1){$OJ1="更新順"; $OJ2="投稿順"; $OJ3="レス数";}
elsif($Res_T==2){$OJ1="更新順"; $OJ2="投稿順"; $OJ3="レス数";}
else{$OJ1="更新順"; $OJ2="投稿順"; $OJ3="レス数";}
print"$Plink
[ $OJ1 / $OJ2 / $OJ3 ] ←ソ\ート方法変更
";
foreach ($page .. $page_end) {
($T,$namber,$date,$name,$email,$d_may,$comment,$url,
$space,$end,$type,$del,$ip,$tim,$Se)=split(/<>/,$NEW[$_]);
if(($time_k - $tim) > $new_t*3600){$news="$hed_i";}else{$news="$new_i";}
if($email && $Se < 2){$name="$name $AMark";}
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
if(@ico3 && $Icon && ($ICON ne "" || $comment=~/
\(携帯\)$/)){
if($I_Hei_m){$WHm=" width=$I_Wid_m height=$I_Hei_m";}
if($ICON ne ""){if($ICON=~ /m/){$ICON=~ s/m//; $mICO=$mas_m[$ICON];}else{$mICO=$ico3[$ICON];}}
elsif($Icon && $comment=~/
\(携帯\)$/){$mICO="$Ico_km";}
$news.="";
}
if($ico && $i_mode){$Pr=""; &size(1); $Pr=" "."$Pr";}else{$Pr="";}
if($d_may eq ""){$d_may="No Title";}
if($yobi){$yobi="[ID:$yobi] ";}
if($txt){$Txt="$TXT_T:[$txt] ";}else{$Txt="";}
if($sel){$Sel="$SEL_T:[$sel] ";}else{$Sel="";}
if($Txt || $Sel ||($Txt && $Sel)){if($TS_Pr==0){$d_may="$Txt$Sel/"."$d_may";}}
if(length($d_may)>$t_max){$d_may=substr($d_may,0,($t_max-2));$d_may="$d_may.."; }
$date=substr($date,2,19);
print <<"_HTML_";
$all_i |
$news $d_may
/ $name ($date) $yobi#$namber$Pr
_HTML_
$res=0;
@RES= split(/\n/,$RES{$namber});
foreach $lines(@RES) {
($Sen,$rnam,$rd,$rname,$rmail,$rdm,$rcom,$rurl,
$rsp,$re,$rtype,$del,$ip,$rtim,$M) = split(/<>/,$lines);
if($re ne ""){$re="$end_ok";}
if($namber eq "$rtype"){
if(($time_k-$rtim)>$new_t*3600){$news="$hed_i";}else{$news="$new_i";}
if($rmail && $M < 2){$rname="$rname $AMark";}
$rd=substr($rd,2,19);
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($rICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
if(@ico3 && $Icon &&($rICON ne "" || $rcom=~/ \(携帯\)$/)){
if($I_Hei_m){$WHm=" width=$I_Wid_m height=$I_Hei_m";}
if($rICON ne ""){if($rICON=~ /m/){$rICON=~ s/m//; $mrICO=$mas_m[$rICON];}else{$mrICO=$ico3[$rICON];}}
elsif($Icon && $rcom=~/ \(携帯\)$/){$mrICO="$Ico_km";}
$news.="";
}
if($ico && $i_mode){$Pr=""; &size(1); $Pr=" "."$Pr";}else{$Pr="";}
if($rdm eq ""){$rdm="No Title"; }
if($yobi){$yobi="[ID:$yobi] ";}
if($txt){$Txt="$TXT_T:[$txt] ";}else{$Txt="";}
if($sel){$Sel="$SEL_T:[$sel] ";}else{$Sel="";}
if($Txt || $Sel ||($Txt && $Sel)){if($TS_Pr==0){$rdm="$Txt$Sel/"."$rdm";}}
if(length($rdm)>$t_max){$rdm=substr($rdm,0,($t_max-2)); $rdm="$rdm..";}
print " |
| \n";
if($Keisen){print"$Sen";}
else{
print "";
$rspz=$rsp/15*$zure;
print "." x $rspz;
print "";
}
print"$news $rdm\n";
print"/ $rname ($rd) $yobi#$rnam $re$Pr\n";
$res++;
if($R{$namber}==$res){last;}
}
}
print " |
";
}
print"
\n";
&allfooter("ツリー$a_max");
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [ツリー一括表示]
# -> ツリーの関連記事を表示する(all_)
#
sub all_ {
@TREE=();
open(DB,"$log");
while ($Line = ) {
($nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim) = split(/<>/,$Line);
if(($type==0 && ($nam eq $namber || $ty eq $namber))||($type && ($nam eq $type || $ty eq $type))){
if($ty){
if($Keisen){
$SPS=$sp/15; $Lg=0; $Tg=0; $S="";
if($SP){
if($SP > $SPS){if($L[$SPS]){$Tg=1; $L[$SP]="";}else{$Lg=1; $L[$SP]="";}}
elsif($SP==$SPS && $L[$SPS]){$Tg=1;}elsif($SP < $SPS){$Lg=1;}
}else{$Lg=1;}
if($SPS > 1){foreach(2..$SPS){$_--; if($L[$_]){$S.="$K_I";}else{$S.="$K_SP";}}}
$SP=$sp/15;
if($SP==1){@L=(); $L[$SP]=1;}else{$L[$SP]=1;}
if($Lg){$Line="$S$K_L<>$Line";}
elsif($Tg){$Line="$S$K_T<>$Line";}
}else{$Line="<>$Line";}
if($date){unshift(@TREE,$Line);}
}else{unshift(@TREE,"<>$Line"); $SP=0; @L=(); if($tim=~/[\d]+/){last;}}
}
}
close(DB);
&hed_("One Tree All Message");
print<<"_ALLTOP_";
ツリー一括表\示 |
$IcCom
_ALLTOP_
$ALLTREE="";
foreach $line (@TREE) {
($Sen,$nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim,$Se) = split(/<>/,$line);
if($end ne ""){$end="$end_ok";}
if(($ty == 0 && $namber eq "$nam")||($ty != 0 && $namber eq $ty)){
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
$n_="";
$rs=0;$i=0;
foreach $Line (@TREE) {
($S,$n,$d,$na,$e,$dm,$c,$u,$s,$e,$t) = split(/<>/,$Line);
if($nam eq $n){$i=1;}
if(($t==0 && $namber eq "$n")||($t != 0 && $namber eq $t)){
if($rs && $sp eq "$s"){last;}
$psp=$sp+15;$nsp=$sp-15;
if($s eq $nsp && $nam > $n && $i != 1){$b_="▲[ $n ] / ";}
if($s eq $psp && $nam < $n && $i == 1){$n_.="▼[ $n ]\n";}
}
if($i==1){$rs=1;}
}
$ResNo=$sp/15;
&design($nam,$date,$name,$email,$d_may,$comment,$url,$sp,$end,$ty,$del,$Ip,$tim,$ico,
$Ent,$fimg,$ICON,$ICO,$font,$hr,$txt,$sel,$yobi,$Se,$ResNo,"T2");
$ALLTREE.="$HTML";
if($email && $Se < 2){$name="$name $AMark";}
if(($time_k-$tim)>$new_t*3600){$news = "$hed_i";}else{$news="$new_i";}
if($d_may eq ""){$d_may = "No Title";}
$date=substr($date,2,19);
if($Keisen){print"$Sen";}
else{
print "";
$spz=$sp/15*$zure;
print "." x $spz;
print "";
}
if($yobi){$yobi="[ID:$yobi] ";}
if($txt){$Txt="$TXT_T:[$txt] ";}else{$Txt="";}
if($sel){$Sel="$SEL_T:[$sel] ";}else{$Sel="";}
if($Txt || $Sel ||($Txt && $Sel)){if($TS_Pr==0){$d_may="$Txt$Sel/"."$d_may";}}
if(length($d_may)>$t_max){$d_may=substr($d_may,0,($t_max-2));$d_may="$d_may..";}
if(@ico3 && $Icon && ($ICON ne "" || $comment=~/ \(携帯\)$/)){
if($I_Hei_m){$WHm=" width=$I_Wid_m height=$I_Hei_m";}
if($ICON ne ""){if($ICON=~ /m/){$ICON=~ s/m//; $mICO=$mas_m[$ICON];}else{$mICO=$ico3[$ICON];}}
elsif($Icon && $comment=~/ \(携帯\)$/){$mICO="$Ico_km";}
$news.="";
}
if($i_mode && $ico){$Pr=""; &size(1); $Pr=" "."$Pr"; $CookOn="";}else{$Pr="";}
print"$news $d_may\n";
print"/$name ($date) $yobi#$nam $end$Pr |
\n";
}
}
print" |
\n";
print"$ALLTREE
";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [新着記事表示]
# -> 新着記事を表示する(n_w_)
#
sub n_w_ {
@NEW=();
open(DB,"$log");
while () {
($nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim,$Se) = split(/<>/,$_);
if(($time_k - $tim) <= $new_t*3600){push(@NEW,"$tim<>$_<>");}
}
close(DB);
&hed_("New Message");
$total=@NEW;
$page_=int(($#NEW)/$new_s);
if($FORM{'page'} eq ''){$page=0;}else{$page=$FORM{'page'};}
$end_data=@NEW-1;
$page_end=$page + ($new_s - 1);
if($page_end >= $end_data) { $page_end = $end_data; }
$Pg=$page+1; $Pg2=$page_end+1;
$nl = $page_end + 1;
$bl = $page - $new_s;
if($bl >= 0){$Bl=""; $Ble="";}
if($page_end ne $end_data){$Nl=""; $Nle="";}
print <<"_FTOP_";
[ 新着記事全$total件($Pg-$Pg2 を表\示) ]
_FTOP_
$Plink="$Bl\<\;\<\;$Ble\n";$a=0;
for($i=0;$i<=$page_;$i++){
$af=$page/$new_s;
if($i != 0){$Plink.="| ";}
if($i eq $af){$Plink.="$i\n";}else{$Plink.="$i\n";}
$a+=$new_s;
}
$Plink.="$Nl\>\;\>\;$Nle";
if($FORM{"s"} ne ""){$new_su=$FORM{"s"};}
if($new_su){$SL1="新着順"; $SL2="古い順";}
else{$SL1="新着順"; $SL2="古い順";}
print"$Plink
[ $SL1 / $SL2 ] ←ソ\ート方法変更
";
if(@NEW){
@NEW=sort @NEW;
if($new_su){@NEW=reverse(@NEW);}
foreach ($page..$page_end) {
($Tim,$nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim,$Se) = split(/<>/,$NEW[$_]);
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
&design($nam,$date,$name,$email,$d_may,$comment,$url,$sp,$end,$ty,$del,$Ip,$tim,$ico,
$Ent,$fimg,$ICON,$ICO,$font,$hr,$txt,$sel,$yobi,$Se,$ResNo,"N");
print"$HTML\n";
}
print"
\n";
if($Bl){print"$Bl<前の$new_s件$Ble\n";}
if($Nl){if($Bl){print"| ";} print"$Nl次の$new_s件>$Nle\n";}
print"
\n";
}else{print"
新着記事はありません。
\n";}
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [新規投稿]
# -> 新規投稿のフォームを表示する(new_)
#
sub new_ {
if($topok==0 && $FORM{'pass'} ne "$pass"){&er_("パスワードが違います!");}
&hed_("Write New Message","1");
print"";
if($TrON){$T01="ツリー ";} if($TpON){$T02="トピック ";} if($ThON){$T03="スレッド ";}
print"$T01$T02$T03の新規作成 |
---|
\n";
&forms_;
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [ログ書きこみ処理]
# -> ログに記事を書き込む(wri_)
#
sub wri_ {
if($s_ret && $P ne "$s_pas"){&er_("パスワードが違います!");}
if($KLOG){&er_("過去ログには書き込みできません!");}
&check_;
if($FORM{"PV"} && $FLAG==0){
&hed_("Preview","1");
$c_name=$name; $c_email=$email; $ti=$d_may; $c_txt=$txt; $c_sel=$sel;
$c_ico=$CICO; $c_hr=$hr; $c_font=$font; $c_key=$delkey;
$com=$comment; $com=~ s/
/\n/g;
if(($com=~ /^/)&&($com=~ /<\/pre>$/)){$Z=" checked";}else{$T=" checked";}
$c_url=$url;
if($i_mode && ($ResUp || ($ResUp==0 && $sp==0))){$FORM_E=" enctype=\"multipart/form-data\"";}
else{$FORM_E="";}
if($tag){
$comment=~ s/\<\;//g;
$comment=~ s/\"\;/\"/g;
$comment=~ s/<>/\<\;\>\;/g;
}
&design("",$date,$name,$email,$d_may,$comment,$url,$space,$end,$type,$delkey,$ip,$tim,"",
"","","",$ICO,$font,$hr,$txt,$sel,$yobi,$send,"","P",$CICO);
if($AgSg){if($FORM{"AgSg"}){$HTML.="記事ソ\ート:上げる(age)";}else{$HTML.="記事ソ\ート:下げる(sage)";}}
print<<"_PV_";
$HTML
_PV_
&forms_($H);
&foot_;
}
if($FORM{'URL'}){
($KURL,$Ag) = split(/::/,$FORM{'URL'});
$comment.="
(携帯)";
}
if($UID){
if($Ag){$pUID=$Ag;}else{&get_("I");}
if($pUID eq "n"){&er_("ブラウザのcookie機能\がOFFでは投稿不可。対応ブラウザにするか、ONにしてください!");}
}
&set_; &cry_;
if($pUID){&set_("I","$pUID");}
if($tag){
$comment=~ s/\<\;//g;
$comment=~ s/\"\;/\"/g;
$comment=~ s/<>/\<\;\>\;/g;
}
if($locks){&lock_("$lockf");}
if($M_Rank){&rank;}
open(LOG,"$log") || &er_("Can't open $log");
@lines = ;
close(LOG);
$NOWTIME=time; &time_($NOWTIME);
if($bup){&backup_;}
($knum,$kd,$kname,$kem,$ksub,$kcom)=split(/<>/,$lines[0]);
$namber=$knum+1;
if($kd eq "" && $kcom eq ""){shift(@lines);}
if($mas_c){$E=0;}else{$E=1;}
$oya=0; @new=(); $SeMail=""; $WR=0; $R=~ s/:/:/g; $SIZE=0;
$txt=~ s/\:/:/g; $sel=~ s/\:/:/g; $txt=~ s/\|\|/||/g; $sel=~ s/\|\|/||/g;
if($file){$SIZE+=-s "$i_dir/$file";}
if($o_mail){if($send && $FORM{'pub'}==0){$send=2;}elsif($send==0 && $FORM{'pub'}==0){$send=3;}}
$new_="$namber<>$date<>$name<>$email<>$d_may<>$comment<>$url<>$space<>$end<>$type<>$epasswd<>";
$new_.="$Ip:$file:$E:$TL:$ICON\|$ICO\|$font\|$hr\|:$txt\|\|$sel\|\|$pUID\|\|:$R:<>$time_k<>$send<>\n";
if ($res_r==1 && $type != 0) {
@r_date=();
foreach (0 .. $#lines) {
$resres=0;
($nam,$d,$na,$mail,$d_m,$com,$u,$s,$e,$ty,$de,$ip,$tim,$sml) = split(/<>/,$lines[$_]);
$sml=~ s/\n/0/;
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
if($name eq $na && $comment eq $com){&er_("同じ内容は送信不可!","1");}
if($FORM{'N'} eq $nam){ push(@r_data,$new_); $oya=1; $resres=1;}
if($ty == 0 && $nam eq "$type"){
if($i_mode && $ico){$SIZE+=-s "$i_dir/$ico";}
if($sml==2 || $sml==1){if($SeMail !~ /$mail/){if($q_mail){$SeMail.=" $mail";}else{$SeMail.=",$mail";}}}
$new_line="$lines[$_]";
if($he_tp){&cryma_($de); if($ok eq "n"){&er_("トピック制作者しか返信できません!","1");}}
if(($nam eq "$kiji" && $oya==0) && $FORM{'N'} eq ""){push(@r_data,$new_); $oya=1;}
$resres=1;
if($FORM{"AgSg"}==0){push(@new,@r_data); push(@new,$new_line);}
}elsif($ty eq "$type"){
if($i_mode && $ico){$SIZE+=-s "$i_dir/$ico";}
if($sml==2 || $sml==1){if($SeMail !~ /$mail/){if($q_mail){$SeMail.=" $mail";}else{$SeMail.=",$mail";}}}
if(($nam eq "$kiji" && $oya==0)||($ty eq "$kiji" && $oya==0 && $space > 15) && $FORM{'N'} eq ""){
push(@r_data,$new_); $oya=1;
}
push(@r_data,$lines[$_]);
if($he_tp){&cryma_($de); if($ok eq "n"){&er_("トピック制作者しか返信できません!","1");}}
$resres=1;
}
if($resres == 0){push(@new,$lines[$_]);}
}
if($FORM{"AgSg"}){unshift(@new,$new_line); unshift(@new,@r_data);}
}else{
$h=0; $ON=0; @KLOG=();
foreach (0 .. $#lines) {
($nam,$d,$na,$mail,$d_m,$com,$u,$s,$e,$ty,$de,$ip,$tim,$sml)=split(/<>/,$lines[$_]);
($IP,$i,$E)=split(/:/,$ip);
if($name eq $na && $comment eq $com){ &er_("同じ内容は送信不可!","1"); }
$sml =~ s/\n/0/;
if($ty==0){$h++;}
if($FORM{'N'} eq $nam){push(@new,$new_); $oya=1;}
if($nam eq "$kiji" && $FORM{'N'} eq ""){
if($i_mode && $i){$SIZE+=-s "$i_dir/$i";}
if($sml==2 || $sml==1){if($SeMail !~ /$mail/){if($q_mail){$SeMail.=" $mail";}else{$SeMail.=",$mail";}}}
push(@new,$new_);
$oya=1;
}
if($ON){
if($i && -e "$i_dir/$i" && $LogDel){unlink("$i_dir/$i");}
if($klog_s){unshift(@KLOG,$lines[$_]);}else{if($i_mode==0){last;}}
}else{push(@new,$lines[$_]);}
if($h >= $max-1){$ON=1;}
}
}
if($SIZE && $max_or < int($SIZE/1024)){&er_("限度ファイルサイズを超えたので、ファイルアップできません!","1");}
if($type==0 || $oya==0){unshift(@new,$new_);}
elsif($oya){unshift(@new,"$namber<><><><><><><><><>$namber<><><><><>\n");}
open(LOG,">$log") || &er_("Can't write $log","1");
print LOG @new;
close(LOG);
if($i_mode){&get_("M"); &set_("M");}
if($klog_s && @KLOG){&log_;}
if(-e $lockf){rmdir($lockf);}
if($t_mail || $o_mail){&mail_;}
if($KURL){&ktai("書き込み","$KURL");}
if($H eq "F" && $tpend && $type){$FORM{"namber"}=$type; $space=0; &all2;}
}
#--------------------------------------------------------------------------------------------------------------------
# [記事一括削除]
# -> 記事フォーマットをおこなう(s_d_)
#
sub s_d_ {
if($s_ret && $P ne "$s_pas"){&er_("パスワードが違います!");}
if($FORM{'pass'} ne "$pass"){&er_("パスワードが違います!");}
open(DB,">$log");
print DB "";
close(DB);
$msg="フォーマット完了
"; &del_;
}
#--------------------------------------------------------------------------------------------------------------------
# [説明書]
# -> 簡易ヘルプを表示する(man_)
#
sub man_ {
&hed_("Help");
if($TrON){$Tr=" ツリー ";}else{$Tr="";}
if($TpON){$Tp=" トピック ";}else{$Tp="";}
if($ThON){$Th=" スレッド ";}else{$Th="";}
print <<"_HTML_";
$title マニュアル |
□ 基本事項/使用方法
- 電子掲示板(BBS)について
電子掲示板(BBS)とは、インターネット上で不特定多数に公開されている公の発言の場です。
- 無責任な発言や、他人の悪口・個人情報などは、書き込んではいけません。
- そのような記述があった場合、管理者権限により予\告なく削除され、然るべき処置がとられます。
- このBBSの記事表\示形態について
このBBSは$Tr$Tp$Th表\示型のBBSです。
_HTML_
if($Tr){
print"- [ツリー] ...記事を木の枝分かれのように表\示します。話の流れが分かり易いのが特徴です。
\n";
print"閲覧/返信したい記事タイトルをクリックします。$all_i をクリックするとツリーを一括表\示します。 \n";
}
if($Tp){
print" - [トピック] ...記事を話題ごとに表\示します。ひとつの話題の多くの記事をスムーズに読む事ができます。
\n";
print"閲覧/返信したいトピック(話題)タイトルをクリックします。\n";
}
if($Th){
print" - [スレッド] ...最初から記事内容を表\示します。一度に多くの話題に目を通すことができます。
\n";
print"初期表\示で$alk_su件のスレッド(話題)とそれぞれの最新$alk_rm件の返信記事を閲覧できます。";
}
print <<"_HTML_";
- 記事の投稿方法について
- 新しい話題を投稿するには...
上部/下部メニューにある [新規作成] をクリックして、必要な情報を入力してください。
- 既に投稿されている記事に、返信記事を投稿するには...
返信したい記事を表\示し [返信] をクリックして、
必要な情報を入力してください。
- その他のメニューについて
- [新着記事] をクリックすると$new_t時間内に投稿された記事を抽出して閲覧できます。
- [検索] をクリックするとログ内の記事をキーワードをから検索できます。
_HTML_
if($M_Rank){print"
- [発言ランク] をクリックすると名前を元に集計された投稿回数のランキングを表\示します。\n";}
if($i_mode){print"
- [ファイル一覧] をクリックすると投稿記事に添付されたファイルのみを閲覧できます。\n";}
if($klog_s){print"
- [過去ログ] をクリックすると過去の話題を閲覧できます。過去ログの検索は [検索] から行ないます。\n";}
print <<"_HTML_";
- このBBSの機能\について
- 話題を$max件まで保持し、それら話題内の記事には返信ができます。
話題が$max件を超えた場合、更新日時が古い話題から
_HTML_
if($klog_s){print" [過去ログ] へ保存されます。返信はできません。\n";}else{print"削除されます。\n";}
if($r_max){print" また、各話題毎の返信限度数は、$r_max件です。それ以上は返信できません。";}
if($end_f && $end_c==0){print" - 話題が $end_ok になった時、$end_ok BOX をチェックして投稿してください。\n";}
elsif($end_c && $end_f){print"
- 話題が $end_ok になった時、その旨をお知らせ下さい。管理者がチェックします。\n";}
if($UID){
print"
- 投稿者には個別のIDが発行されます(ランダムな半角英数8文字)。他人に成りすますことを防ぎます。
\n";
print"この場合、ブラウザのcookieが ON でなければ投稿できません(ブラウザの初期設定ではONになっています)。\n";
}
if($SPAM){
print" - メールアドレス自動収集ソ\フト対策のため、メールリンクに $SPAM という文字列を付加して表\示しています。
\n";
print"メールを送る際は $SPAM という文字列を削除してください。\n";
}
if($i_mode){
print" - ローカル(自分のPC内)にある$max_fs\KB以内のファイルをアップロードすることができます。
\n";
print"詳しくは投稿の際の説明を参照してください。\n";
}
print <<"_HTML_";
- $new_i\...$new_t時間内に投稿された話題/記事 $up_i_\...$new_t時間内に更新された話題 $hed_i\...左記以外の話題/記事
- cookieに対応しています。このBBSに関するcookieを削除することもできます。
→[cookieの削除]
cookie...ブラウザが入力内容を保存しておく機能\です。別のサイトで利用されることは通常ありません。
- 記事投稿の際 削除キー(任意のパスワード) を入力することによって、自分の投稿記事の編集/削除ができます。
□ 書き込む際の注意
$atcom
|
_HTML_
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [ヘッダ表示]
# -> HTMLヘッダの生成(hed_)
#
sub hed_ {
print"Content-type: text/html; charset=Shift_JIS\n";
if($UID && $_[1]==1){
&get_("I");
if($pUID eq "n"){
$pUID="";
@UID = ('a'..'z','A'..'Z','0'..'9');
srand;
$pUID.="$UID[int(rand(62))]"; $pUID.="$UID[int(rand(62))]";
$pUID.="$UID[int(rand(62))]"; $pUID.="$UID[int(rand(62))]";
$pUID.="$UID[int(rand(62))]"; $pUID.="$UID[int(rand(62))]";
$pUID.="$UID[int(rand(62))]"; $pUID.="$UID[int(rand(62))]";
&set_("I","$pUID");
}
if($pUID eq "n"){$pUID="未発行";}
}
print"\n";
print <<"_HTML_";
$STYLE
$fsi
$title [$_[0]]
_HTML_
print"\n";}elsif($back eq ""){ print ">\n";}
print <<"_HTML_";
_HTML_
if($t_img){print"\n";}
else{print"$title\n";}
$BG=" bgcolor=$t_back";
if($mode eq "man"){$T1="$BG";}elsif($mode eq "n_w"){$T2="$BG";}elsif($mode eq "one"){$T5="$BG";}
elsif($mode eq "new"){$T3="$BG";}elsif($mode eq "alk"){$T4="$BG";}elsif($mode eq "all"){$T5="$BG";}
elsif($mode eq "al2"){$T7="$BG";}elsif($mode eq "ran"){$T6="$BG";}elsif($mode eq "res"){$T4="$BG";}
elsif($mode eq "f_a"){$T8="$BG";}elsif($mode eq "" || $mode eq "wri"){
if($H){if($H eq "T"){$T5="$BG";}elsif($H eq "F"){$T7="$BG";}elsif($H eq "N"){$T4="$BG";}}
else{if($TOPH==1){$T5="$BG";}elsif($TOPH==2){$T7="$BG";}else{$T4="$BG";}}
}
if($klog_s){$klog_link="過去ログ | \n";}
if($M_Rank){$rank_link="発言ランク | \n";}
if($topok){$New_link="新規作成 | \n";}
if($TrON){$TrL="ツリー表\示 | \n";}
if($TpON){$TpL="トピック表\示 | \n";}
if($ThON){$ThL="スレッド表\示 | \n";}
if($i_mode){$FiL="ファイル一覧 | \n";}
$HEDF= <<"_HTML_";
_HTML_
if($KLOG){print"
(現在 過去ログ$KLOG を表\示中)";}
print"$HEDF";
if($cou){&con_;} print"";
}
#--------------------------------------------------------------------------------------------------------------------
# [フッタ表示]
# -> HTMLフッタの生成(foot_)
#
sub foot_ {
print"
$HEDF
- Child Tree -
_HTML_
exit;
}
#--------------------------------------------------------------------------------------------------------------------
# [フォームデコード]
# -> フォーム入力内容を解釈(d_code_)
#
sub d_code_ {
$file="";
if($ENV{'CONTENT_LENGTH'} && $ENV{'CONTENT_TYPE'} =~ /^multipart\/form-data/){
$buf=""; $read_data="";
$remain=$ENV{'CONTENT_LENGTH'};
binmode(STDIN);
while($remain){
$remain-=($read_length=sysread(STDIN, $buf, $remain));
exit if $read_length == 0; # 接続が途中で切れた
$read_data.=$buf;
}
$pos1=0; $pos2=0; $pos3=0; $UP=0;
$delimiter="";
while (1) {
$pos2=index($read_data,"\r\n\r\n",$pos1)+4;
@headers=split("\r\n",substr($read_data,$pos1,$pos2-$pos1));
$filename=""; $name="";
foreach(@headers){
if($delimiter eq ""){$delimiter=$_;}
elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"; filename="([^;]*)"/i){
if($3){
$filename=$3;
if($filename =~ /([^\\\/]+$)/){$filename=$1;}
}
}elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"/i){$name= $2;}
}
$pos3=index($read_data,"\r\n$delimiter",$pos2);
$size=$pos3-$pos2;
if($filename){$UP=1; $file=$filename; $Read=$read_data; $Fsize=$size; $Pos2=$pos2;}
elsif($name){
$FORM{$name}=substr($read_data,$pos2,$size);
$value=$FORM{$name};
&jcode'convert(*value,'sjis');
if(@NW){
foreach(0..$#NW){
$NW[$_]=~ s/\n//;
if(index($value,$NW[$_]) >= 0){
$NW[$_]=~ s/\<\;/g; $NW[$_]=~ s/>/\>\;/g;
&er_("「$NW[$_]」は使用できません!");
}
}
}
$value =~ s/&/&\;/g;
$value =~ s/\<\;/g;
$value =~ s/>/\>\;/g;
$value =~ s/\"/\"\;/g;
$value =~ s/<>/\<\;\>\;/g;
$value =~ s///g;
$FORM{$name}=$value;
}
$pos1=$pos3+length("\r\n$delimiter");
if(substr($read_data, $pos1, 4) eq "--\r\n"){last;}
else{$pos1+=2; if($max_count++ > 30){last;} next;}
}
}else{
if ($ENV{'REQUEST_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;
&jcode'convert(*value,'sjis');
if(@NW && $name ne "del"){
foreach(0..$#NW){
$NW[$_]=~ s/\n//;
if(index($value,$NW[$_]) >= 0){
$NW[$_]=~ s/\<\;/g; $NW[$_]=~ s/>/\>\;/g;
&er_("「$NW[$_]」は使用できません!");
}
}
}
$value =~ s/&/&\;/g;
$value =~ s/\<\;/g;
$value =~ s/>/\>\;/g;
$value =~ s/\"/\"\;/g;
$value =~ s/<>/\<\;\>\;/g;
$value =~ s///g;
$FORM{$name} = $value;
if($name eq 'del'){push(@d_,$value);}
if($name eq 'ENT'){push(@E_,$value);}
if($name eq 'IMD'){push(@I_,$value);}
}
}
$d_may= $FORM{'d_may'};
$name = $FORM{'name'};
$comment=$FORM{'comment'}; $comment=~ s/\r\n|\r|\n/
/g;
$email =$FORM{'email'};
$url = $FORM{'url'}; $url=~ s/^http\:\/\///;
$mode = $FORM{'mode'};
$end = $FORM{'end'};
$space= $FORM{'space'};
$kiji = $FORM{'kiji'};
$namber=$FORM{'namber'};
$type = $FORM{'type'};
$delkey=$FORM{"delkey"};
$mo =$FORM{"mo"};
$send = $FORM{"send"};
$no =$FORM{"no"};
$W =$FORM{"W"};
$H =$FORM{"H"};
$txt =$FORM{"txt"}; $sel=$FORM{"sel"};
$ICON =$FORM{"Icon"}; $hr=$FORM{"hr"}; $font=$FORM{"font"};
&time_;
}
#--------------------------------------------------------------------------------------------------------------------
# [cookie発行]
# -> cookieを発行する(set_)
#
sub set_ {
if($_[0] eq "I"){$kday=1826;}else{$kday=30;}
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + $kday*24*60*60);
$yearg += 1900;
if($secg < 10){$secg ="0$secg"; }
if($ming < 10){$ming ="0$ming"; }
if($hourg < 10){$hourg="0$hourg";}
if($mdayg < 10){$mdayg="0$mdayg";}
$month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong];
$youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg];
$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
if($SEL_C){$Csel=",sel:$sel";}else{$Csel="";}
if($TXT_C){$Ctxt=",txt:$txt";}else{$Ctxt="";}
$cook="name\:$name\,email\:$email\,url\:$url\,delkey\:$delkey\,pub\:$FORM{'pub'}\,ico\:$CICO\,font\:$font\,hr\:$hr$Csel$Ctxt";
if($_[0] eq "P"){print"Set-Cookie: $s_pas=$s_pas; expires=$date_gmt\n";}
elsif($_[0] eq "M"){print"Set-Cookie: Cmin=$FORM{'min'}; expires=$date_gmt\n";}
elsif($_[0] eq "I"){print"Set-Cookie: UID=$_[1]; expires=$date_gmt\n";}
else{print "Set-Cookie: CBBS=$cook; expires=$date_gmt\n";}
}
#--------------------------------------------------------------------------------------------------------------------
# [cookie取得]
# -> cookieを取得する(get_)
#
sub get_ {
$cookies = $ENV{'HTTP_COOKIE'};
@pairs = split(/;/,$cookies);
foreach $pair (@pairs) {
($NAME, $value) = split(/=/, $pair);
$NAME =~ s/ //g;
$DUMMY{$NAME} = $value;
}
if($_[0] eq "P"){if($DUMMY{"$s_pas"}){$FORM{"P"}=$DUMMY{"$s_pas"};}}
elsif($_[0] eq "M"){if($DUMMY{'Cmin'}){$FORM{"min"}=$DUMMY{'Cmin'};}else{$FORM{"min"}=0;}}
elsif($_[0] eq "I"){if($DUMMY{'UID'}){$pUID=$DUMMY{'UID'};}else{$pUID="n";}}
else{
@pairs = split(/,/,$DUMMY{'CBBS'});
foreach $pair (@pairs) {
($name, $value)= split(/:/, $pair);
$COOKIE{$name} = $value;
}
$c_name=$COOKIE{'name'};$c_email=$COOKIE{'email'};
$c_url =$COOKIE{'url'}; $c_key =$COOKIE{'delkey'};
$c_pub =$COOKIE{'pub'}; $c_ico =$COOKIE{'ico'};
$c_font=$COOKIE{'font'};$c_hr =$COOKIE{'hr'};
if($SEL_C){$c_sel=$COOKIE{'sel'};}
if($TXT_C){$c_txt=$COOKIE{'txt'};}
}
}
#--------------------------------------------------------------------------------------------------------------------
# [時間設定]
# -> 時間を設定する(time_)
#
sub time_ {
$ENV{'TZ'} = "JST-9";
if($_[0]){$time_k=$_[0];}else{$time_k=time;}
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($time_k);
$year=$year+1900;
$mon++;
if($mon < 10){$mon ="0$mon"; }
if($mday < 10){$mday="0$mday";}
if($hour < 10){$hour="0$hour";}
if($min < 10){$min ="0$min"; }
if($sec < 10){$sec ="0$sec"; }
$week=('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];
$date="$year\/$mon\/$mday\($week\) $hour\:$min\:$sec";
}
#--------------------------------------------------------------------------------------------------------------------
# [管理用ページ]
# -> 管理モードを表示する(del_)
#
sub del_ {
if($FORM{'pass'} ne "$pass"){ &er_("パスワードが違います!"); }
&hed_("Editor");
@NEW=(); $RES=(); $FSize=0; $RS=0; @lines=(); %R=();
open(DB,"$log");
while ($Line=) {
if($FORM{"mode2"} eq "Backup"){push(@lines,$Line);}
($namber,$date,$name,$email,$d_may,$comment,$url,
$space,$end,$type,$delk,$ip,$tim) = split(/<>/,$Line);
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
if($i_mode && $ico){$FSize+= -s "$i_dir/$ico";}
if($type){
if($Keisen){
$SPS=$space/15; $Lg=0; $Tg=0; $S="";
if($SP){
if($SP > $SPS){if($L[$SPS]){$Tg=1; $L[$SP]="";}else{$Lg=1; $L[$SP]="";}}
elsif($SP==$SPS && $L[$SPS]){$Tg=1;}elsif($SP < $SPS){$Lg=1;}
}else{$Lg=1;}
if($SPS > 1){foreach(2..$SPS){$_--; if($L[$_]){$S.="$K_I";}else{$S.="$K_SP";}}}
$SP=$space/15;
if($SP==1){@L=(); $L[$SP]=1;}else{$L[$SP]=1;}
if($Lg){$Line="$S$K_L<>".$Line;}
elsif($Tg){$Line="$S$K_T<>".$Line;}
}else{$Line="0<>$Line";}
if($date){$R{$type}="$Line".$R{$type}; $RS++;}
}else{push(@NEW,$Line); $SP=0; @L=();}
}
close(DB);
if($FORM{"mode2"} eq "Backup"){&backup_; $msg="バックアップ完了
"; @lines=();}
elsif($FORM{"mode2"} =~/\d/){
open(NO,">$c_f") || &er_("Can't write $c_f","1");
print NO $FORM{"mode2"};
close(NO);
$msg="カウンタ値編集完了
";
}elsif($FORM{"mode2"} eq "LockOff"){
$msg="ロック解除完了
";
if(-e $lockf){rmdir($lockf); $msg.="($lockf解除)";}else{$msg.="($lockf無し)";}
if(-e $cloc){rmdir($cloc); $msg.="($cloc解除)"; }else{$msg.="($cloc無し)";}
}
$total=@NEW; $NS=$RS+$total;
$page_=int(($total-1)/$a_max);
if(-s $log){$l_size=int((-s $log)/1024);}else{$l_size=0;}
if($topok==0){$NewMsg="管理用新規作成\n";}
if($i_mode || $mas_c){
if($FSize){$FSize=int($FSize/1024); $FileSize="
アップファイル合計サイズ:$FSize\KB";}else{$FSize=0;}
$FP ="\n";
}
if($bup){$BUL="/バックアップ";}
print <<"_HTML_";
$msg
_DEL_
if($Bl){print"$Bl<前の$a_max件$Ble\n";}
if($Nl){if($Bl){print"| ";} print"$Nl次の$a_max件>$Nle\n";}
print <<"_HTML_";
$Plink
*JavaScript を ONにしてください*
|
|
|
|
_HTML_
if($bup){
if(-e $bup_f){
$bl=(-M $bup_f); $bh=sprintf("%.1f",24*$bl); $bl=sprintf("%.2f",$bl); $bs=int((-s $bup_f)/1024);
$bc="あり($bs\KB / $bl日(約$bh時間)前)"; $Nb=$bup-$bl; $Nh=sprintf("%.1f",$Nb*24);
}else{$bc="無し";}
print <<"_BUP_";
_BUP_
}
print" |
\n";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [記事編集]
# -> 記事編集のフォームを出力(hen_)
#
sub hen_ {
if($KLOG){&er_("過去ログは編集不可");}
if($mo eq ""){
if($FORM{'del'} eq ""){ &er_("登録No が未入力!"); }
if($delkey eq ""){ &er_("削除キー が未入力!"); }
$kiji=$FORM{'del'};
}elsif($mo==1){if($FORM{'pass'} ne "$pass"){ &er_("パスワードが違います!"); }}
open(DB,"$log");
while ($line=) {
($namber,$d,$name,$email,$d_may,$comment,$url,
$s,$end,$t,$de,$i,$ti,$sml) = split(/<>/,$line);
if($d eq ""){next;}
if($kiji eq "$namber"){
if($mo eq ""){
if($de eq "") { &er_("この記事は削除キーがありません!"); }
&cryma_($de);
if($delkey eq "$pass"){$ok="m";}
if($ok eq "n"){ &er_("パスワードが違います!"); }
$hen_l="$cgi_f?no=$no$pp"; $Lcom="";
}else{$hen_l="$cgi_f?mode=del&pass=$FORM{'pass'}&no=$no$pp"; $Lcom="管理モードに";}
if($s && $end_f && ($end_c==0||$FORM{'pass'} eq $pass) && $t){
if($end){$C=" checked";}
$end_form=<<"_ENDBOX_";
$end_ok BOX
$end_m
_ENDBOX_
}
if($FORM{'pass'} eq ""){$FORM{'pass'}=$delkey;}
&hed_("Message Edit");
$comment =~ s/
/\n/g;
if(($comment =~ /^/)&&($comment =~ /<\/pre>$/)){
$Z=" checked";$comment=~ s///g;$comment=~ s/<\/pre>//g;
}else{$T=" checked";}
if($o_mail){
if($sml==1 || $sml==2){$Y=" selected";}
if($sml < 2){$Pch=" selected";}
$Mbox= <<_MAIL_;
└> 関連するレス記事をメールで受信しますか? /
アドレス |
_MAIL_
}
if($tag){$comment=~ s/\<\;/g; $comment=~ s/>/\>\;/g;}
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$i);
print <<"_HTML_";
$msg
_HTML_
if($i_mode){
if($ico){
&size;
print<<"_DEL_";
・ここからファイル削除できます。
_DEL_
}elsif($s==0 || ($s && $ResUp)){
print<<"_DEL_";
_DEL_
}
}
last;
}
}
close(DB);
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [パスワード暗号化]
# -> パスワードを暗号化する(cry_)
#
sub cry_ {
$time = time;
($p1, $p2) = unpack("C2", $time);
$wk = $time / (60*60*24*7) + $p1 + $p2 - 8;
@saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
$nsalt = $saltset[$wk % 64] . $saltset[$time % 64];
$epasswd = crypt($FORM{'delkey'}, $nsalt);
}
#--------------------------------------------------------------------------------------------------------------------
# [パスワード解読]
# -> パスワードを暗号化しマッチング(cryma_)
#
sub cryma_ {
if($de =~ /^\$1\$/){ $crptkey=3; }else{ $crptkey=0; }
$ok = "n";
if(crypt($FORM{'delkey'}, substr($de,$crptkey,2)) eq $de){$ok = "y";}
}
#--------------------------------------------------------------------------------------------------------------------
# [削除処理]
# -> 記事の削除処理(key_)
#
sub key_ {
if($mo eq ""){
if($FORM{'del'} eq ""){ &er_("登録No が未入力!"); }
if($delkey eq "") { &er_("削除キー が未入力!"); }
}elsif($mo==1){if($FORM{'pass'} ne "$pass"){ &er_("パスワードが違います!"); }}
if($locks){&lock_("$lockf");}
open(DB,"$log") || &er_("Can't open $log");
@CAS=(); $dok=0; $OYA=0; $SP="";
while ($mens=) {
$mens =~ s/\n//g; $Pdel=0;
($nam,$d,$na,$mail,$d_,$com,$url,
$sp,$e,$ty,$de,$ip,$ti) = split(/<>/,$mens);
if($d eq ""){push (@CAS,"$mens\n"); $OYA=1; next;}
foreach $namber (@d_) {
if ($namber eq "$nam") {
if($mo eq ""){
if($de eq "" && $dok==0){&er_("記事に削除キーがありません!","1");}
&cryma_($de);
if($delkey eq "$pass"){$ok="m";}
if($ok eq "n" && $dok==0){&er_("パスワードが違います!","1");}
}
if($SP < $sp || $SP==$sp || $SP eq ""){$Pdel=1;}
$mens=""; $dok=1;
($I,$ico,$E,$fi,$TX,$S,$R)=split(/:/,$ip);
if($ico && -e "$i_dir/$ico"){unlink("$i_dir/$ico");}
}
}
if($kiji ne "" && ($kiji eq "$nam"||$kiji eq "$ty")){$mens = "";}
$n="\n";
if($mens eq "" && $kiji eq "" && $Pdel==0){
if($mo || $ok eq "m"){$Dm="(管理者)";}else{$Dm="(投稿者)";}
$mens = "$nam<>$d<><><>(削除)<>この記事は$Dm削除されました<><>$sp<><>$ty<><><>$ti<><>";
}elsif($mens eq "" && ($kiji ne "" || $Pdel)){
$mens=""; $n="";
if($OYA==0){$mens="$nam<><><><><><><><><>$nam<><><><><>"; $n="\n";}
}
$OYA=1; $SP=$sp;
push (@CAS,"$mens$n");
}
close(DB);
open (DB,">$log");
print DB @CAS;
close(DB);
if(-e $lockf){rmdir($lockf);}
if($FORM{'URL'}){&ktai("削除","$FORM{'URL'}");}
if($mo){$msg="削除完了
"; &del_;}else{$mode="";}
}
#--------------------------------------------------------------------------------------------------------------------
# [編集記事置換]
# -> 編集内容を置き換える(h_w_)
#
sub h_w_ {
if($KLOG){&er_("過去ログは編集不可");}
if($FORM{'pass'} ne "$pass" && $mo){&er_("パスワードが違います!");}
if($E_[0] eq "" && $I_[0] eq ""){
$delkey=$FORM{'pass'}; &check_;
if($tag){
$comment=~ s/\<\;//g;
$comment=~ s/\"\;/\"/g;
$comment=~ s/<>/\<\;\>\;/g;
}
}
if($locks){&lock_("$lockf");}
if($FORM{"pre"}){$comment="$comment
";}
@new=(); $flag=0; $SIZE=0;
open(DB,"$log");
while ($line=) {
$line =~ s/\n//g;
($knam,$k,$kname,$kemail,$kd_may,$kcomment,$kurl,
$ks,$ke,$kty,$kd,$ki,$kt,$sml) = split(/<>/,$line);
if($k eq ""){push (@new,"$line\n"); next;}
if($namber eq "$knam") {
if($mo eq ""){
$de=$kd; $FORM{'delkey'}=$FORM{'pass'};
&cryma_($epasswd);
if($FORM{"pass"} eq $pass){$ok="m";}
if($ok eq "n"){ &er_("パスワードが違います!","1"); }
}
if($EStmp){
&time_("");
$EditCom="$date 編集";
if($mo || $ok eq "m"){$EditCom.="(管理者)";}else{$EditCom.="(投稿者)";}
if($comment !~ /([0-9][0-9]):([0-9][0-9]):([0-9][0-9]) 編集/){$EditCom.="
";}else{$EditCom.="
";}
$comment=$EditCom.$comment;
}
($KI,$Kico,$E,$Kfi,$KTX,$KS,$KR)=split(/:/,$ki);
($Ktxt,$Ksel,$Kyobi)=split(/\|\|/,$KS);
if($o_mail){if($send && $FORM{'pub'}==0){$send=2;}elsif($send==0 && $FORM{'pub'}==0){$send=3;}}
$line="$namber<>$k<>$name<>$email<>$d_may<>$comment<>$url<>$ks<>$end<>$kty<>$kd";
$line.="<>$KI:$Kico:$E:$Kfi:$ICON|$ICO|$font|$hr|:$txt\|\|$sel\|\|$Kyobi\|\|:$KR:<>$kt<>$send<>";
$flag = 1;
}elsif(@E_){
($KI,$Kico,$E,$Kfi,$KTX,$KS,$KR)=split(/:/,$ki);
$EF=0;
foreach $ENT (@E_){if($ENT eq $knam){$EF=1; if($E){$EE=0;}else{$EE=1;} last;}}
if($EF){
if($mo eq ""){
$de=$kd; $FORM{'delkey'}=$FORM{'pass'};
&cryma_($epasswd);
if($ok eq "n"){ &er_("パスワードが違います!","1"); }
}
$line="$knam<>$k<>$kname<>$kemail<>$kd_may<>$kcomment<>$kurl<>$ks<>$ke<>$kty<>$kd<>$KI:$Kico:$EE:$Kfi:$KTX:$KS:$KR:<>$kt<>$sml<>";
$flag=1;
}
}elsif(@I_){
($KI,$Kico,$E,$Kfi,$KTX,$KS,$KR)=split(/:/,$ki);
$EF=0;
foreach $ENT (@I_){if($ENT eq $knam){$EF=1;last;}}
if($EF){
if($mo eq ""){
$de=$kd; $FORM{'delkey'}=$FORM{'pass'};
&cryma_($epasswd);
if($ok eq "n"){ &er_("パスワードが違います!","1"); }
}
if($Kico && -e "$i_dir/$Kico"){unlink("$i_dir/$Kico");}
$Kico=""; $E=0; $Kfi="";
$line="$knam<>$k<>$kname<>$kemail<>$kd_may<>$kcomment<>$kurl<>$ks<>$ke<>$kty<>$kd<>$KI:$Kico:$EE:$Kfi:$KTX:$KS:$KR:<>$kt<>$sml<>";
$flag=1;
}
}elsif($FORM{'UP'}){
$UPt=$FORM{'UPt'}; $UP=$FORM{'UP'};
($KI,$Kico,$E,$Kfi,$KTX,$KS,$KR)=split(/:/,$ki);
if($UPt){if($UPt eq $kty && $Kico){$SIZE+= -s "$i_dir/$Kico";}}
else{if($UP eq $kty && $Kico){$SIZE+= -s "$i_dir/$Kico";}}
if($UP eq $knam){
if($mo eq ""){
$de=$kd; $FORM{'delkey'}=$FORM{'pass'};
&cryma_($epasswd);
if($ok eq "n"){ &er_("パスワードが違います!","1"); }
}
if($mas_c){$E=0;}else{$E=1;}
$SIZE+=-s "$i_dir/$file";
$line="$knam<>$k<>$kname<>$kemail<>$kd_may<>$kcomment<>$kurl<>$ks<>$ke<>$kty<>$kd<>$KI:$file:$E:$TL:$KTX:$KS:$KR:<>$kt<>$sml<>";
$flag=1;
}
}
push(@new,"$line\n");
}
close(DB);
if($SIZE && $max_or < int($SIZE/1024)){&er_("このファイルは総ファイルサイズを超えるためアップできません!","1");}
if($flag==0){&er_("その記事Noは存在しません!","1");}
if($flag==1){
open (DB,">$log");
print DB @new;
close(DB);
}
if(-e $lockf){rmdir($lockf);}
if($FORM{'URL'}){&ktai("編集","$FORM{'URL'}");}
if(@E_ || @I_ || $FORM{'UP'}){
if($mo && (@E_ || @I_)){&ent_;}
else{
if(@I_){$msg="ファイル削除
"; $FORM{"del"}=$I_[0];}
elsif($FORM{'UP'}){$msg="ファイルアップ完了
$Henko"; if($mo){$kiji=$FORM{'UP'};}else{$FORM{"del"}=$FORM{'UP'};}}
$delkey=$FORM{"pass"}; &hen_;
}
}elsif($mo){$msg="編集完了
"; &del_;}
else{$msg="以下のように編集完了
"; $delkey=$FORM{"pass"}; $FORM{"del"}=$namber; &hen_;}
}
#--------------------------------------------------------------------------------------------------------------------
# [排除IP/禁止文字追加]
# -> 排除IP/禁止文字追加システム(Den_)
#
sub Den_ {
if($FORM{'pass'} ne "$pass"){&er_("パスワードが違います!");}
($m,$Log)=split(/:/,$FORM{"m"});
if($m eq "Make"){
open(DB,">$Log") || &er_("Can't make $Log");
print DB "";
close(DB);
chmod(0666,"$Log");
}elsif($m eq "Add"){
$FORM{'u'}=~ s/\<\;//g;
open(OUT,">>$Log");
print OUT "$FORM{'u'}\n";
close(OUT);
$msd="$Logへ登録完了
";
}elsif($m eq "Del"){
open(DB,"$Log");
@deny = ;
close(DB);
@NEW = ();$F=0;
foreach $b (@deny) {
$b =~ s/\n//g;
foreach $u (@d_) {if($u eq "$b"){$F=1; last;}}
if($F){$F=0; next;}
push(@NEW,"$b\n");
}
open (DB,">$Log");
print DB @NEW;
close(DB);
$msd="$Log内削除完了
";
}
&hed_("Deny IP/Word Editor");
print<<"_HTML_";
$msd
■ $Deny[$_] に登録済みの$Dcom[$_]\n";
}else{
print<<"_EDIT_";
■ $Dcom[$_]設定をするファイルの作成
_EDIT_
}
}
print"
\n";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [ロック処理]
# -> ファイルロック処理(lock_)
#
sub lock_ {
$lflag = 0;
foreach(1 .. 5){if(mkdir($_[0], 0755)){$lflag=1; last;}else{sleep(1);}}
if($lflag==0){
if(-e $_[0]){rmdir($_[0]);}
&er_("LOCK is BUSY (ロック中)","1");
}
}
#--------------------------------------------------------------------------------------------------------------------
# [メール通知処理]
# -> 投稿通知メール処理(mail_)
sub mail_ {
$mail_subj = "$title 投稿通知";
if($type != 0 && $type ne ""){$types="($type\RES)";}
if($email eq ""){$email='nomail@xxx.xxx';}
if($url ne "") {$url ="URL : http://$url\n";}
if($d_may eq ""){$d_may="No Title";}
if($sel){$Selm="$SEL_T : $sel\n";}else{$Selm="";}
if($txt){$Txtm="$TXT_T : $txt\n";}else{$Txtm="";}
$Mail_Msg=<<"_MAIL_";
$mail_subj
--Comment------------------------------
Title: $d_may $types
Name : $name ($email)
Time : $date
$url
$comment
$Selm$Txtm
----------------------------------END--
_MAIL_
$Mail_Msg=~ s/
/\n/g;
$Mail_Msg=~ s/\<\;//g;
$Mail_Msg=~ s/\"\;/\"/g;
$Mail_Msg=~ s/\&\;/&/g;
if($t_mail){
if($mymail){if($SeMail !~ /$mailto/){$SeMail="$mailto"."$SeMail";}}
else{if(($email ne $mailto) && ($SeMail !~ /$mailto/)){$SeMail="$mailto"."$SeMail";}}
}
if($SeMail =~ /^\,|^ /){$SeMail=substr($SeMail,1);}
&jcode'convert(*mail_subj,'jis');
&jcode'convert(*Mail_Msg,'jis');
if($SeMail){
if (open(MAIL,"| $s_mail $SeMail")) {
print MAIL "X-Mailer: CBBS MAILER\n";
print MAIL "To: $mailto\n";
print MAIL "From: $email\n";
print MAIL "Subject: $mail_subj\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "\n\n";
print MAIL "$Mail_Msg\n";
close(MAIL);
}
}
}
#--------------------------------------------------------------------------------------------------------------------
# [URLをリンク等]
# -> コメント内、リンク・文字色など処理(auto_)
#
sub auto_ {
if($_[0]=~/<\/pre>/){$_[0]=~ s/(>|\n)((>|>|>)[^\n]*)/$1$2<\/font>/g;}
else{$_[0]=~ s/>((>|>|>)[^<]*)/>$1<\/font>/g;}
$_[0]=~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1$2<\/a>/g;
$_[0]=~ s/([^\w^\.^\~^\-^\/^\?^\&^\+^\=^\:^\%^\;^\#^\,^\|]+)(No|NO|no|No.|NO.|no.|>>|>>|>>)([0-9\,\-]+)/$1$2$3<\/a>/g;
}
#--------------------------------------------------------------------------------------------------------------------
# [カウンタ処理]
# -> カウントアップ処理(con_)
#
sub con_ {
if($mode eq "" || $mode eq "alk"){
if($locks){&lock_("$cloc");}
open(NO,"$c_f") || &er_("Can't open $c_f","1");
$cnt = ;
close(NO);
if($FORM{'mode'} eq "" && $FORM{'page'} eq "" && $ENV{'HTTP_REFERER'} !~ /$cgi_f/) {
$cnt++;
open(NO,">$c_f") || &er_("Can't write $c_f","1");
print NO $cnt;
close(NO);
}
if(-e $cloc){rmdir($cloc);}
while(length($cnt) < $fig){$cnt="0".$cnt;}
@cnts = split(//,$cnt);
if($m_pas){foreach(0..$#cnts){print"";}}
else{print "$cnt";}
print"
\n";
}
}
#--------------------------------------------------------------------------------------------------------------------
# [エラー表示]
# -> エラーの内容を表示する(er_)
#
sub er_ {
if(-e $lockf && $_[1]==1){rmdir($lockf);}
if(-e $cloc && $_[1]==1){rmdir($cloc);}
if(-e "$i_dir/$file"){unlink("$i_dir/$file");}
if($FORM{"URL"}){
($KURL,$Ag) = split(/::/,$FORM{'URL'});
&ktai("ERROR-$_[0]
未","$KURL");
}
if($BG eq ""){&hed_("Error");}
print"
ERROR-$_[0]\n";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [過去ログ]
# -> 過去ログへの書き込み(log_)
#
sub log_ {
open(NO,"$klog_c") || &er_("Can't open $klog_c");
$n = ;
close(NO);
$klog_f = "$klog_d\/$n\.txt";
unless(-e $klog_f){ &l_m($klog_f);}
$klog_size=$klog_l*1024;
if(-s $klog_f > $klog_size) {&log_up;}
open(LOG,">>$klog_f") || &er_("Can't write $klog_f");
print LOG @KLOG;
close(LOG);
}
#--------------------------------------------------------------------------------------------------------------------
# [カウントアップ]
# -> 過去ログ番号のカウントアップ(log_up)
#
sub log_up {
$n++;
open(NUM,">$klog_c") || &er_("Can't write $klog_c");
print NUM "$n";
close(NUM);
$klog_f="$klog_d\/$n\.txt";
&l_m($klog_f);
}
#--------------------------------------------------------------------------------------------------------------------
# [ログ生成]
# -> ログを自動生成します(l_m)
#
sub l_m {
open(DB,">$_[0]") || &er_("Can't make $_[0]");
print DB "";
close(DB);
chmod(0666,"$_[0]");
}
#--------------------------------------------------------------------------------------------------------------------
# [バックアップ処理]
# -> 簡易バックアップ処理(backup_)
#
sub backup_{
unless(-e $bup_f){&l_m($bup_f);}
if(-M "$bup_f" > $bup || $FORM{"mode2"} eq "Backup"){
open(LOG,">$bup_f") || &er_("Can't write $bup_f");
print LOG @lines;
close(LOG);
}
}
#--------------------------------------------------------------------------------------------------------------------
# [修復処理]
# -> バックアップファイルリネーム処理(bma_)
#
sub bma_ {
if($FORM{'pass'} ne "$pass"){&er_("パスワードが違います!");}
if(-e $lockf){rmdir($lockf);}
if(-e $bup_f){rename ($bup_f,$log) || &er_("Rename Error");}
else{&er_("バックアップがないので修復不可能\です!","1");}
$msg="修復完了
"; &del_;
}
#--------------------------------------------------------------------------------------------------------------------
# [スレッド表示]
# -> スレッド形式で記事の一覧を表示する(alk_)
#
sub alk_ {
if($FORM{'page'} eq ''){$page = 0;}else{$page=$FORM{'page'};}
@NEW=(); @RES=(); $List=""; $news=""; $On=1; %N=(); %d=(); %n=(); $RS=0; $K=1;
open(LOG,"$log") || &er_("Can't open $log");
while () {
($namber,$date,$name,$email,$d_may,$comment,$url,
$space,$end,$type,$del,$ip,$tim) = split(/<>/,$_);
if($type){
if($On){if(($time_k-$tim)>$new_t*3600){$n{$type}="$hed_i";}else{$n{$type}="$up_i_"; $On=0;}}
$tim=sprintf("%011d",$tim); if($date){$R{$type}.="$tim<>$_";} $N{$type}++; $RS++;
}else{
if($n{$namber} eq ""){if(($time_k-$tim)>$new_t*3600){$n{$namber}="$hed_i";}else{$n{$namber}="$new_i";}}
if($tim eq ""){$tim="$TIM";} $tim=sprintf("%011d",$tim);
if($Res_T==2){$tim=$N{$namber}; $tim=sprintf("%05d",$tim);}
push(@NEW,"$tim<>$_");
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
if($txt){$Txt="$TXT_T:[$txt] ";}else{$Txt="";}
if($sel){$Sel="$SEL_T:[$sel] ";}else{$Sel="";}
if($d_may eq ""){$d{$namber}="無題";}else{$d{$namber}=$d_may;}
if($Txt || $Sel ||($Txt && $Sel)){if($TS_Pr==0){$d{$namber}="$Txt$Sel/"."$d{$namber}";}}
if($N{$namber} eq ""){$N{$namber}=0;}
if($Top_t && $Res_T==0 && $Rno < $LiMax){
$Rno++; $PAH=$alk_su*$K; if(($PAH) < $Rno){$PAL="&page=$PAH"; $K++;} $L_3=$Rno-1;
if(($page+$alk_su)>=$Rno && ($page)<$Rno){$List.="$n{$namber}$d{$namber}($N{$namber}) |\n";}
else{$List.="$n{$namber}$d{$namber}($N{$namber}) |\n";}
}
$news=""; $On=1;
}
$TIM=$tim;
}
close(LOG);
$PAGE=$page/$alk_su;
&hed_("All Thread / Page: $PAGE");
if($Res_T){
@NEW=sort(@NEW); @NEW=reverse(@NEW);
if($Top_t){
foreach (0..$#NEW){
if($Rno > $LiMax){last;}
($T,$namber,$date,$name,$email,$d_may,$comment,$url,
$space,$end,$type,$del,$ip,$tim) = split(/<>/,$NEW[$_]);
$Rno++; $PAH=$alk_su*$K; if(($PAH) < $Rno){$PAL="&page=$PAH"; $K++;} $L_3=$Rno-1;
if(($page+$alk_su)>=$Rno && ($page)<$Rno){$List.="$n{$namber}$d{$namber}($N{$namber}) |\n";}
else{$List.="$n{$namber}$d{$namber}($N{$namber}) |\n";}
}
}
}
if($Top_t){
$com_top.="■ $new_t時間以内に作成されたスレッドは $new_i で表\示されます。
\n";
$com_top.="■ $new_t時間以内に更新されたスレッドは $up_i_ で表\示されます。
\n";
}
print"$Henko
";
if($i_mode){&minf_("N");}
$total=@NEW; $NS=$RS+$total;
$page_=int(($total-1)/$alk_su);
$end_data=@NEW-1;
$page_end=$page+($alk_su-1);
if($page_end >= $end_data){$page_end = $end_data;}
$Pg=$page+1; $Pg2=$page_end+1;
$nl=$page_end+1;
$bl=$page-$alk_su;
if($bl >= 0){$Bl=""; $Ble="";}
if($page_end ne $end_data){$Nl=""; $Nle="";}
print"[ 全$totalスレッド($Pg-$Pg2 表\示) ] \n";
$Plink="$Bl\<\;\<\;$Ble\n";
$a=0;
for($i=0;$i<=$page_;$i++){
$af=$page/$alk_su;
if($i != 0){$Plink.="| ";}
if($i eq $af){$Plink.="$i\n";}else{$Plink.="$i\n";}
$a+=$alk_su;
}
$Plink.="$Nl\>\;\>\;$Nle";
if($Res_T==1){$OJ1="更新順"; $OJ2="投稿順"; $OJ3="レス数";}
elsif($Res_T==2){$OJ1="更新順"; $OJ2="投稿順"; $OJ3="レス数";}
else{$OJ1="更新順"; $OJ2="投稿順"; $OJ3="レス数";}
print"$Plink
[ $OJ1 / $OJ2 / $OJ3 ]←ソ\ート方法変更
";
if($Top_t){
print"\n";
print"記事リスト ( )内の数字はレス数$List |
\n";
}
$LinkNo="";
foreach ($page .. $page_end) {
($T,$nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim,$Se) = split(/<>/,$NEW[$_]);
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
&design($nam,$date,$name,$email,$d_may,$comment,$url,$sp,$end,$ty,$del,$Ip,$tim,$ico,
$Ent,$fimg,$ICON,$ICO,$font,$hr,$txt,$sel,$yobi,$Se,"","TR");
print"
\n";
if($Top_t){print"■記事リスト";}
if($_ ne $page_end){$L_=$_+1; print" / ▼下のスレッド\n";}
if($_ ne $page){$L_2=$_-1; print" / ▲上のスレッド\n";}
print"$HTML";
@RES=split(/\n/,$R{$nam}); $PNO=0;
@RES=sort(@RES);
if(@RES){
$Rn=$alk_rm; $RC=@RES; $Pg=$RC-$alk_rm+1; if($Pg<=0){$Pg=1;}
print" ▽[全レス$RC件(ResNo.$Pg-$RC 表\示)]\n";
$RC_=int($RC/$ResHy);
$res=0; $Dk=0; $ResNo=$Pg-1; $PgSt=$Pg-1; $PgEd=$RC-1;
foreach ($PgSt..$PgEd) {
($T,$rnam,$rd,$rname,$rmail,$rdm,$rcom,$rurl,
$rsp,$re,$rtype,$del,$rip,$rtim,$Se)=split(/<>/,$RES[$_]);
if($nam eq "$rtype"){
$ResNo++;
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$rip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
$PNO=int($ResNo/$ResHy)*$ResHy;
&design($rnam,$rd,$rname,$rmail,$rdm,$rcom,$rurl,$rsp,$re,$rtype,$del,$Ip,$rtim,$ico,
$Ent,$fimg,$ICON,$ICO,$font,$hr,$txt,$sel,$yobi,$Se,$ResNo,"TR");
print"$HTML";
}
if($ResNo==$N{$nam}){last;}
}
if($RC){
if($Top_t){print" ■記事リスト /\n";}
print"レス記事表\示 →\n";
$a=0;
for($i=0;$i<=$RC_;$i++){
if($i){$St=$i*$ResHy; $En=$St+$ResHy-1; if($RC+1<=$En){$En=$RC;}}
else{$En=$ResHy-1; if($RC<$En){$En=$RC;} $St="親記事";}
print"[$St-$En]\n";
$a+=$ResHy;
}
if($Dk){print" ($Dk件は削除記事)\n";}
}
}
$LinkNo=$nam;
print" |
\n";
}
print"
";
&allfooter("スレッド$alk_su件");
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [スレッドレス表示]
# -> スレッドのレスを表示します(res_)
#
sub res_ {
if($space eq ""){$space=0;}
$SP=$space+15;
@TOP=(); $k=0; $Dk=0; $On=0; $En=0; $O2=0; $TitleHed="";
open(DB,"$log");
while () {
($nam,$da,$na,$mail,$d_may,$co,$ur,
$sp,$end,$ty,$de,$ip,$time)=split(/<>/,$_);
if(($ty==0 && $FORM{"namber"} eq "$nam")||($ty != 0 && $FORM{"namber"} eq $ty)){
if($space < $sp && $On==0 && $O2==0){$N_NUM=$nam; $On=1;}
if($space eq $sp && $O2==0 && $mo ne $nam){$On=0; $N_NUM="";}
if($time){
$time=sprintf("%011d",$time);
push(@TOP,"$time<>$_"); if($end){$En=1;}
}else{$Dk++;}
$namb=$nam; $k++; $TitleHed=$d_may;
if($mo){if($mo eq $nam){$On=1; $O2=1; &comin_;}}else{if($k==1){$On=1; $O2=1; &comin_;}}
}else{if($k && $time=~/[\d]+/){last;}}
}
close(DB);
@TOP=sort(@TOP);
$total=@TOP-1;
if($FORM{'page'} eq ''){$page=0;}else{$page=$FORM{'page'};}
$PAGE=$page/$ResHy;
&hed_("One Thread Res View / $TitleHed / Page: $PAGE","1");
$page_=int($total/$ResHy);
$end_data=@TOP-1;
$page_end=$page+($ResHy-1);
if($page_end >= $end_data){$page_end=$end_data;}
if($page){$Pg="$page"; $Pg2="$page_end";}else{$Pg="親記事"; $Pg2="$page_end";}
$nl=$page_end+1;
$bl=$page-$ResHy;
if($bl >= 0){$Bl=""; $Ble="";}
if($page_end ne $end_data){$Nl=""; $Nle="";}
print"[ スレッド内全$totalレス($Pg-$Pg2 表\示) ] \n";
$Plink="$Bl\<\;\<\;$Ble\n";
$a=0;
for($i=0;$i<=$page_;$i++){
$af=$page/$ResHy;
if($i != 0){$Plink.="| ";}
if($i eq $af){$Plink.="$i\n";}else{$Plink.="$i\n";}
$a+=$ResHy;
}
$Plink.="$Nl>>$Nle\n";
print"$Plink
";
if($Dk){print"( $Dk件の削除記事を非表\示 )
";}
print"
\n";
$i=0; $ToNo=$page; $SIZE=0;
foreach ($page .. $page_end) {
($T,$nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim,$Se) = split(/<>/,$TOP[$_]);
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
&design($nam,$date,$name,$email,$d_may,$comment,$url,$sp,$end,$ty,$del,$Ip,$tim,$ico,
$Ent,$fimg,$ICON,$ICO,$font,$hr,$txt,$sel,$yobi,$Se,$ToNo,"TRES");
print "$HTML";
$ToNo++;
}
if($TrON){$TrLink="$all_i このスレッドをツリーで一括表\示";}
print"
\n";
if($bl >= 0){print"$Bl<前のレス$ResHy件$Ble\n";}
if($page_end ne $end_data){if($Bl){print"| ";} print"$Nl次のレス$ResHy件>$Nle\n";}
if($mo eq ""){$com="";}
print<<"_F_";
スレッド内ページ移動 / $Plink
_F_
if($r_max && $total > $r_max){
print"レス数の限度を超えたのでレスできません。
(レス数限度:$r_max 現在のレス数:$total)\n";
print" → [スレッドの新規作成]";
}
else{if($En && $end_e){print"$end_ok / 返信不可
";}else{&forms_("N");}}
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [ランキング]
# -> 発言ランキングをカウントする(rank)
sub rank {
$flag=0; @N=(); $T=time; $Wri=0;
open(IN,"$RLOG") || &er_("$RLOG","1");
while ($R=) {
($Na,$Co,$Em,$Time)=split(/<>/,$R);
if($Na eq "$name"){$flag=1; $Co++; $R="$Na<>$Co<><>$T<>\n"; $RCo=$Co;}
if(($T-$Time) > $RDEL*86400){$R=""; $Wri=1;}
push(@N,$R);
}
close(IN);
if ($flag || $Wri) {
open(OUT,">$RLOG") || &er_("Can't open $RLOG","1");
print OUT @N;
close(OUT);
}
if ($flag==0) {
open(OUT,">>$RLOG") || &er_("Can't write $RLOG","1");
print OUT "$name<>1<><>$T<>\n";
close(OUT);
$RCo=1;
}
if(@RLv){
foreach(0..$#RLv){
$SPL=$RSPL*($_+1);
if($_!=$#RLv){if($RCo < $SPL){$R="$RLv[$_]($RCo回)"; last;}}
else{$R="$RLv[$_]($RCo回)"; last;}
}
}else{$R="$RCo回";}
}
#--------------------------------------------------------------------------------------------------------------------
# [ランク表示]
# -> 発言ランキングを表示します(ran_)
#
sub ran_ {
@R=(); $Mas="";
open(R,"$RLOG") || &er_("Can't open $RLOG");
while () {
($Na,$Co,$Em,$Ti)=split(/<>/,$_);
if(@d_){
if($FORM{'pass'} ne $pass){&er_("パスワードが違います!");}
foreach $D (@d_){if($D eq $Na){$_=""; last;}}
if($_ eq ""){next;}else{push(@R,"$_");}
}
$N=0;
if(@NoRank){foreach(0..$#NoRank){if($Na eq "$NoRank[$_]"){$N=1; last;}}}
if($N){$Mas.="$Na ->\; $Co回
\n"; next;}
&time_($Ti);
$total+= $Co;
$Co{$Na} = $Co;
$Date{$Na}=$date;
}
close(R);
if(@R){
open(OUT,">$RLOG") || &er_("Can't write $RLOG");
print OUT @R;
close(OUT);
}
&hed_("Rank");
print <<"_T_";
・集計発言数:$total回
・最終発言日から$RDEL日経過すると自動的に削除されます。
\n";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [画像幅取得]
# -> ファイルが画像の場合、ファイルを読み込んで幅を取得します。それ以外のアイコン表示もおこないます(size)
# -> とほほのラウンジを参考にさせていただきました => http://tohoho.wakusei.ne.jp/
#
sub size {
if($Ent==0 && $fimg){$fimg=$no_ent; $A=0;}
if($_[0]){$FORM{"min"}=2;}else{if($CookOn eq ""){&get_("M"); $CookOn=1;}}
$A=0; $I=0;
if($fimg eq "img" && $FORM{'min'}==0){
$Cg=1; $Wn=$W2; $Hn=$H2; $IW=0; $IH=0;
if($ico=~/.gif$/i){ #GIF
open(GIF,"$i_dir/$ico");
binmode(GIF);
seek(GIF,6,0);
read(GIF,$size,4);
close(GIF);
($IW,$IH)=unpack("vv",$size);
}elsif($ico=~/.png$/i){ #PNG
open(PNG,"$i_dir/$ico");
binmode(PNG);
seek(PNG,16,0);
read(PNG,$Pw,4);
read(PNG,$Ph,4);
close(PNG);
$PW=unpack("H*",$Pw);$IW=hex($PW);
$PH=unpack("H*",$Ph);$IH=hex($PH);
}elsif($ico=~/.jpg$|.jpeg$/i){ #JPEG
open(JPG,"$i_dir/$ico");
binmode(JPG);
read(JPG,$Top,2);
while (JPG) {
read(JPG,$Top,4);
($mark,$Cell,$Lar)=unpack("aan",$Top);
if($mark ne "\xFF"){$IW=0; $IH=0; last;}
elsif((ord($Cell) >= 0xC0) && (ord($Cell) <= 0xC3)){
read(JPG,$Top,5); ($IH, $IW)=unpack("xn2",$Top); last;
}else{read(JPG,$Top,($Lar-2));}
}
close(JPG);
}elsif($ico=~/.bmp$/i){ #BMP
open(BMP,"$i_dir/$ico");
binmode(BMP);
seek(BMP,18,0);
read(BMP,$size,8);
close(BMP);
($IW,$IH)=unpack("V2",$size);
}
if($IW && $IH){
if($IW > $Wn){$IK=$Wn*$IH;$kH=int($IK/$IW);$kW=$Wn;$Cg=0;}
if($Cg && $IH > $Hn){$IK=$Hn*$IW;$kW=int($IK/$IH);$kH=$Hn;$Cg=0;}
elsif($Cg==0 && $kH > $Hn){$IK=$Hn*$kW;$kW=int($IK/$kH);$kH=$Hn;}
$Pr.="$IW×$IH";
if($Cg){$kW=$IW;$kH=$IH;}
else{$Pr.=" =\>\; $kW×$kH";}
$Pr.="
\n";
}else{$kW=$W2;$kH=$H2;}
}
if($FORM{'min'}==1){$HW="";}elsif($FORM{'min'}==2){$I=1;}else{$HW=" width=$kW height=$kH";}
if(-s "$i_dir/$ico"){$Size= -s "$i_dir/$ico";}else{$Size=0;}
$KB=int($Size/1024); if($KB==0){$KB=1;}
if($Size){
if($Size && $_[0] && $fimg ne $no_ent){$Alt=" alt=\"$ico/$KB\KB\"";}else{$Alt="";}
if($fimg eq $no_ent){$A=0;}
elsif($fimg eq "img"){
if($I){$Pr.=""; $A=1;}
else{$Pr.=""; $A=1;}
}else{$Pr.="";$A=1;}
if($img_h eq "" && $fimg ne img){$Pr.="";}
elsif($img_h ne "" && $fimg ne img){$Pr.="";}
$AEND="";
if($_[0] eq ""){
if($A){$AEND="$ico/";}
$Pr="$Pr"."
$AEND$KB\KB\n";
}else{if($A){$AEND="";} $Pr.="$AEND\n";}
}
}
#--------------------------------------------------------------------------------------------------------------------
# [許可システム]
# -> アップファイル/記事の表示許可を与えます(ent_)
#
sub ent_ {
if($FORM{'pass'} ne "$pass"){&er_("パスワードが違います!");}
&hed_("Permit");
print <<"_ENT_";
\n";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [表示形式]
# -> アップファイル表示形式の変更など(minf_)
#
sub minf_ {
if($FORM{"min"} eq ""){&get_("M");}
if($FORM{"min"}==1){$S="";$S2=" selected";$S3="";}
elsif($FORM{"min"}==2){$S="";$S2="";$S3=" selected";}
else{$S2="";$S=" selected";$S3="";}
print"
_KEY_
}
#--------------------------------------------------------------------------------------------------------------------
# [アップファイル一覧]
# -> アップされたファイルを一覧で表示します(f_a_)
#
sub f_a_ {
&hed_("All Up File");
print <<"_ENT_";
_ENT_
@ICO=();
open(LOG,"$log") || &er_("Can't open $log");
while () {
($namber,$date,$name,$email,$d_may,$comment,$url,
$space,$end,$type,$del,$ip,$tim) = split(/<>/,$_);
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
if($ico){push(@ICO,"$_");}
}
close(LOG);
@NEW=(); $FS=0; $KL="";
$page_=int($#ICO/$Ico_kp);
if($page_){
$KL.="
ページ移動 / ";
if($FORM{'page'}){$page=$FORM{'page'};}else{$page=0;}
$page_end=$page+($Ico_kp-1);
if($page_end > $#ICO){$page_end=$#ICO;}
for($i=0;$i<=$page_;$i++){
$af=$page/$Ico_kp;
if($i != 0){$KL.="| ";}
if($i eq $af){$KL.="$i\n";}else{$KL.="$i\n";}
$a+=$Ico_kp;
}
$KL.="
";
}else{$page=0; $page_end=$#ICO;}
$i=0; print"$KL";
foreach ($page..$page_end) {
($nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim,$Se)=split(/<>/,$ICO[$_]);
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
if($i==0){print"\n";}
$TB=1;
if($i_mode && $ico){$Pr=""; &size;}else{$Pr="";}
if($Size==0){next;}
$FS=$FS+$Size;
if($TOPH==0){$MD="mode=res&namber="; if($ty){$MD.="$ty";}else{$MD.="$nam";}}
elsif($TOPH==1){$MD="mode=one&namber=$nam&type=$ty&space=$sp";}
elsif($TOPH==2){$MD="mode=al2&namber="; if($ty){$MD.="$ty";}else{$MD.="$nam";}}
print"
\n";
print"[返信ページ]
|
\n";
$i++;
if($i==30){print"
"; $i=0; $TB=0;}
}
if($TB){print"";}
$FS=int($FS/1024);
print "
合計ファイルサイズ/$FS\KB$KL\n";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [全表示]
# -> 設定されている掲示板を一覧表示します(a_)
#
sub a_ {
print "Content-type: text/html\n\n";
print <<"_HTML_";
$STYLE
$fsi
全BBS最新更新記事 [All BBS New Subject]
_HTML_
print"\n";} elsif ($back eq "") { print ">\n";}
print<<"_HTML_";
- Child Tree に設定されているBBSの最終更新記事を表\示します。
- BBSタイトルをクリックするとその掲示板へ、親記事タイトルをクリックするとその記事群へ飛びます。
BBSタイトル |
最新更新された親記事タイトル | 記事数 | 更新者 | 更新時間 |
_HTML_
foreach (0..$#set){
if($set[$_]){
unless(-e $set[$_]){next;}
else{
require "$set[$_]"; $no=$_;
@RES=(); $N=0;
open(LOG,"$log") || &er_("Can't open $log");
while () {
($namber,$date,$name,$email,$d_may,$comment,$url,
$space,$end,$type,$del,$ip,$tim) = split(/<>/,$_);
if($tim eq ""){next;}
if($type){$ti=sprintf("%011d",$tim); if($date){unshift(@RES,"$ti<>$name<>$tim<>");} $N++;}
else{$ti=sprintf("%011d",$tim); if($date){unshift(@RES,"$ti<>$name<>$tim<>");} $N++; last;}
}
close(LOG);
@lines=(); @RES=sort(@RES); @RES=reverse(@RES);
if(@RES){
($Ti,$Name,$Tim)=split(/<>/,$RES[0]);
if($TOPH==0){$MD="mode=res&namber=$namber&page=0";}
elsif($TOPH==1){$MD="mode=all&namber=$namber&type=0&space=0";}
elsif($TOPH==2){$MD="mode=al2&namber=$namber";}
&time_($Tim);
}else{$namber="#"; $d_may="記事がありません!"; $date="/"; $MD=""; $Name="/";}
}
print<<"_TOP_";
$title |
[$namber]
$d_may |
$N | $Name | $date |
_TOP_
}
}
print"
---|
";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [アイコン画像表示]
# -> アイコン画像のサンプルを表示します(img_)
#
sub img_ {
&hed_("All Icon");
print"\n";
print"
|X| ウィンドウを閉じる
\n";
$I=0;
$page_=int($#ico1/$Ico_kp);
if($page_){
print"ページ移動 / ";
if($FORM{'page'}){$page=$FORM{'page'};}else{$page=0;}
$page_end=$page+($Ico_kp-1);
if($page_end > $#ico1){$page_end=$#ico1;}
for($i=0;$i<=$page_;$i++){
$af=$page/$Ico_kp;
if($i != 0){print"| ";}
if($i eq $af){print"$i\n";}else{print"$i\n";}
$a+=$Ico_kp;
}
}else{$page=0; $page_end=$#ico1;}
print"\n";
foreach ($page..$page_end){
if($I==0){print"";}
$I++;
if($ico1[$_] eq "randam"){print"ランダム アイコン | "}
elsif($ico1[$_] eq "master"){
print"";
foreach $MAS (@mas_i){print"";}
print" 管理者用 | \n";
}elsif($ico1[$_] eq ""){print"なし | \n";}
else{print" $ico2[$_] | \n";}
if($I >= $Ico_h){print"
"; $I=0;}
}
if($I){print"";}
print"
";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [指定記事の表示]
# -> No指定された記事などをひとつ表示(read)
#
sub read {
if($namber=~/,/){@N=split(/\,/,$namber);}
elsif($namber=~/-/){
($St,$En)=split(/-/,$namber);
if($St<$En){if($En-$St > 50){$St=$En-49; $MSG="幅が大きすぎたため $St-$En に変更";} $Low=$St; $High=$En;}
if($St>$En){if($St-$En > 50){$En=$St+49; $MSG="幅が大きすぎたため $St-$En に変更";} $Low=$En; $High=$St;}
if($St eq ""){$Low=$En-10; $High=$En; $MSG="幅が未指定のため $St-$En に指定";}
if($En eq ""){$Low=$St; $High=$St+10; $MSG="幅が未指定のため $St-$En に指定";}
foreach($Low..$High){unshift(@N,$_);}
}
else{@N=$namber;}
$N=@N;
if($N > 50){splice(@N,50); $N=@N; $MSG="No指定が多いため $N 以降は非表\示";}
&hed_("No$namber の記事表\示");
print"
$MSG";
$FLAG=0; @HTML=();
open(LOG,"$log") || &er_("Can't open $log");
while ($lines=) {
($nam,$date,$name,$email,$d_may,$comment,$url,
$sp,$end,$ty,$del,$ip,$tim,$Se)=split(/<>/,$lines);
$i=0; $HTML="";
foreach $namber (@N){
if($namber eq "$nam" && $namber ne $ty){
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
($ICON,$ICO,$font,$hr)=split(/\|/,$TXT);
($txt,$sel,$yobi)=split(/\|\|/,$SEL);
&design($nam,$date,$name,$email,$d_may,$comment,$url,$sp,$end,$ty,$del,$Ip,$tim,$ico,
$Ent,$fimg,$ICON,$ICO,$font,$hr,$txt,$sel,$yobi,$Se,"","N");
$tim=sprintf("%011d",$tim);
push(@HTML,"$tim<>$HTML<>");
$FLAG++; last;
}
$i++;
}
if($HTML){splice(@N,$i,1);}
if(@N){next;}else{last;}
}
close(LOG);
@HTML=sort(@HTML);
foreach (0..$#HTML){($time,$HTML)=split(/<>/,$HTML[$_]); print"$HTML\n";}
print"
\n";
if(@N){
@N=reverse(@N);
print"
";
foreach $N (@N){
print"- No$N の記事は現在のログ内にありません!";
if($klog_s){print"→全過去ログから No$N の記事を探す";}
}
print"
";
}
print"
\n";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [フリーフォーム修復]
# -> 以前の文字コード上の不具合修正とログコンバート(freeform_)
#
sub freeform_{
if($FORM{'pass'} ne "$pass"){&er_("パスワードが違います!");}
if($locks){&lock_("$lockf");}
@NEW=(); $T=time; $DmyNo=0;
open(DB,"$log");
while ($lines=) {
($namber,$date,$name,$email,$d_may,$comment,$url,
$space,$end,$type,$del,$ip,$tim,$S) = split(/<>/,$lines);
if($date eq ""){push(@NEW,$lines); next;}else{$lines=~ s/\n//g;}
if($mo==1){
($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip);
if($SEL !~/\|\|\|\|/){
($txt,$sel,$yobi)=split(/\|/,$SEL);
$new_="$namber<>$date<>$name<>$email<>$d_may<>$comment<>$url<>$space<>$end<>$type<>$del<>";
$new_.="$Ip:$ico:$Ent:$fimg:$TXT:$txt\|\|$sel\|\|$yobi\|\|:$R:<>$tim<>$S<>\n";
}else{push(@NEW,$lines); next;}
}elsif($mo eq "I-BOARD"){
if($space =~/[A-Za-z\#]+/){
($font,$hr)=split(/\;/,$space);
if($ip=~ /:/){($ip,$ID,$Sex,$Old,$Rank,$T)=split(/:/,$ip);}
if($type){$sp=15;}else{$sp=0;}
if($DmyNo <= $namber){$DmyNo=$namber;}
$new_="$namber<>$date<>$name<>$email<>$d_may<>$comment<>$url<>$sp<><>$type<>$del<>";
$new_.="$ip\::1::\|$end\|$font\|$hr\|:$Old\|\|$Sex\|\|$ID\|\|:$Rank:<>$T<>$tim<>\n"; $T--;
}else{&er_("すでに ChildTree 用になっています!","1");}
}elsif($mo eq "UPP-BOARD"){
if($space =~/[A-Za-z\#]+/){
($font,$hr)=split(/\;/,$space);
if($type){$sp=15;}else{$sp=0;}
if($DmyNo <= $namber){$DmyNo=$namber;}
if($end){foreach(0..$#exn){if($end=~ /$exn[$_]$/ || $end=~ /\U$exn[$_]\E$/){$TL=$exi[$_]; last;}}}
$new_="$namber<>$date<>$name<>$email<>$d_may<>$comment<>$url<>$sp<><>$type<>$del<>";
$new_.="$ip:$end:$tim:$TL:\|\|$font\|$hr\|:\|\|\|\|\|\|::<>$T<>$tim<>\n"; $T--;
}else{&er_("すでに ChildTree 用になっています!","1");}
}
push(@NEW,$new_);
}
close(DB);
if($DmyNo){unshift(@NEW,"$DmyNo<><><><><><><><><>$DmyNo<><><><><>\n");}
open (DB,">$log");
print DB @NEW;
close(DB);
if(-e $lockf){rmdir($lockf);}
$msg="修復完了
"; &del_;
}
#--------------------------------------------------------------------------------------------------------------------
# [内容チェック]
# -> フォーム内容をチェック(check_)
#
sub check_ {
if($Proxy){
while(($envkey,$envvalue) = each(%ENV)){
if($envkey =~ /proxy|squid/i || $envvalue =~ /proxy|squid/i){&er_("ProxyServer経由では書き込みできません!");}
}
}
if($i_mode && $UP){
$FLAG=0;
foreach (0..$#exn){if($file=~ /$exn[$_]$/i){$FLAG=1; $TAIL=$exn[$_]; $TL=$exi[$_]; last;}}
if($FLAG==0){&er_("アップできないファイル形式です!");}
if(-e "$i_dir/$file"){
$TIME=time; $file="$TIME$TAIL";
$Henko="同名ファイルがあったため、$fileに変更しました
";
}elsif($file=~/[^\w\-\.]/){
$TIME=time; $file="$TIME$TAIL";
$Henko="ファイル名が不適切だったため、$fileに変更しました
";
}
$MaxSize=$max_fs*1024;
if($Fsize > $MaxSize){&er_("ファイルサイズが大きすぎます!");}
if(open(OUT, "> $i_dir/$file")) {
binmode(OUT);
print OUT substr($Read, $Pos2, $Fsize);
close(OUT);
}
chmod(0666,"$i_dir/$file");
}
if($FORM{'UP'} eq ""){
if($name eq ""){&er_("名前が未記入!");}
if($comment eq ""){&er_("コメントが未入力!");}
if($email && $email !~ /(.*)\@(.*)\.(.*)/){&er_("E-メールの入力内容が不正です!");}
if(length($delkey) > 8 && $mode ne "h_w"){&er_("削除キー は8文字以内!");}
if($NMAX && $NMAX < length($name)){&er_("名前は半角$NMAX字以内!");}
if($TMAX && $TMAX < length($d_may)){&er_("タイトルは半角$TMAX字以内!");}
if($CMAX && $CMAX < length($comment)){&er_("コメントは半角$CMAX字以内!");}
if($TXT_H && $TXT_F && $txt eq "" && ($TXT_R==0 || $TXT_R && $type==0)){&er_("$TXT_Tが未入力!");}
if($he_tp && $delkey eq "" && $FORM{'pass'} eq ""){ &er_("トピック追加には削除キーが必須です!"); }
if($FORM{"pre"}){$comment="$comment
";}
if($FORM{"dmay"}){$d_may=$FORM{"dmay"};}
if($d_may eq ""){$d_may="NO TITLE";}
$Ip = $ENV{'REMOTE_ADDR'};
if($ICON ne ""){
$ICO=$ico1[$ICON];
if($ICO eq "randam"){
srand;
$randam=$#ico1;
$ICON =int(rand($randam));
$ICO = $ico1[$ICON];
if($ICO eq "" || $ICO eq "randam" || $ICO eq "master"){
foreach(0..$#ico1){
if($ico1[$_] ne "ramdam" && $ico1[$_] ne "master"){$ICO=$ico1[$_]; $ICON=$_;}
}
}
$CICO="randam";
}elsif($ICO eq "master"){
$ICO_F=0;
if($mode eq "h_w"){$delkey=$FORM{'pass'};}
foreach (0..$#mas_p){if($mas_p[$_] eq $delkey){$ICO=$mas_i[$_]; $ICO_F=1; $ICON="m$_"; last;}}
if($ICO_F==0){&er_("管理者用アイコンは使用できません!");} $CICO="master";
}else{$CICO=$ICO;}
}
}
}
#--------------------------------------------------------------------------------------------------------------------
# [一覧表示のフッタ]
# -> 一覧表示時のフッタ(allfooter)
#
sub allfooter {
print"";
if($Bl){print"$Bl<前の$_[0]$Ble\n";}
if($Nl){if($Bl){print"| ";} print"$Nl次の$_[0]>$Nle\n";}
print <<"_HTML_";
_HTML_
}
#--------------------------------------------------------------------------------------------------------------------
# [cookie削除]
# -> cookieを削除(有効期限を過去に)します(cookdel)
#
sub cookdel{
if($mo eq "ID"){
# print"Set-Cookie: UID=; expires=Sunday, 1-Jun-2001 00:00:00 GMT\n"; $msg="ID削除完了
";
}
elsif($mo eq "ALL"){
print"Set-Cookie: $s_pas=; expires=Sunday, 1-Jun-2001 00:00:00 GMT\n";
print"Set-Cookie: Cmin=; expires=Sunday, 1-Jun-2001 00:00:00 GMT\n";
# print"Set-Cookie: UID=; expires=Sunday, 1-Jun-2001 00:00:00 GMT\n";
print"Set-Cookie: CBBS=; expires=Sunday, 1-Jun-2001 00:00:00 GMT\n";
$msg="cookie削除完了
";
}
&hed_("cookie Delete");
print<<"_HTML_";
$msg
_HTML_
#if($UID){print"IDのcookieのみ削除 /\n";}
print"この掲示板全般のcookie削除
";
print"*) 削除が終了したらウィンドウを閉じてください。";
&foot_;
}
#--------------------------------------------------------------------------------------------------------------------
# [携帯端末向け出力]
# -> 携帯オプションからの作業命令終了の表示(ktai)
#
sub ktai {
$_[1] =~ tr/+/ /;
$_[1] =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$html ="$_[0]完了";
$html.="$_[0]完了
[戻]";
$len = length($html);
print "Content-type: text/html\n";
print "Content-length: $len\n";
print "\n";
print "$html";
exit;
}