#!/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"
";} print <<"_FORM_";
    • 入力内容にタグは利用$tagmsg
    $atcom
    $nf$pf$Hi$TPH $Mbox $FI _FORM_ if(@fonts){ print ""; } if(@hr){ print""; } if($Icon){ print"\n"; } if(($SEL_F && $SEL_R==0) || ($SEL_F && $SEL_R && $sp==0)){ print"\n"; } if(($TXT_F && $TXT_R==0) || ($TXT_F && $TXT_R && $sp==0)){ print"\n"; } if($space ne "" && $end_f==1){ if($end_c){$end_form="";} else{$end_form="";} } if($AgSg && $sp > 0){ $AgSgIn ="記事ソ\ート/\n"; }else{$AgSgIn="\n";} if($_[0]){print"";} print<<"_FORM_"; $end_form
    Name/ $uidv
    E-Mail/
    Title/
    URL/
    Comment/ 通常モード->  図表\モード-> (適当に改行して下さい$CML)
    文字色/\n"; foreach (0 .. $#fonts) { if($c_font eq ""){$c_font="$fonts[0]";} print"\n";} else{print"$fonts[$_]\">\n";} } print"
    枠線色/\n"; foreach (0 .. $#hr) { if($c_hr eq ""){$c_hr="$hr[0]";} print "\n";} else{print"$hr[$_]\">\n";} } print"
    Icon/ (画像を選択/"; print"サンプル一覧)
    $SEL_T/
    $TXT_T/\n"; print"
    $end_ok になったらその旨も書いてください。
    $end_ok BOX/$end_m
    削除キー/ (半角8文字以内$KEY)
    $AgSgIn  プレビュー/ 

_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_";
$new_t時間以内に投稿された新着記事

    [ 新着記事全$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"
      ( ページ移動 / $Plink )

\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_";

HELP $New_link新着記事 $TrL$ThL$TpL$rank_link$FiL $klog_link
HOME 検索

_HTML_ if($KLOG){print"
(現在 過去ログ$KLOG を表\示中)";} print"$HEDF"; if($cou){&con_;} print"
"; } #-------------------------------------------------------------------------------------------------------------------- # [フッタ表示] # -> HTMLフッタの生成(foot_) # sub foot_ { print"
$nf$pf\n"; if($i_mode || $mas_c){print"Mode/ \n";} else{print"\n";} print <<"_HTML_"; Pass/

$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; &er_("「$NW[$_]」は使用できません!"); } } } $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; &er_("「$NW[$_]」は使用できません!"); } } } $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"; $FP.="[画像/記事表\示許可]
    $nf$pf\n"; $FP.="
    \n"; } if($bup){$BUL="/バックアップ";} print <<"_HTML_";
    管理モードヘルプ
    管理モード
    現在のログのサイズ:$l_size\KB 記事数:$NS(親/$total レス/$RS)$FileSize
    • 記事を編集したい場合、その記事のタイトルをクリック。
    • 削除したい記事にチェックを入れ「削除」ボタンを押して下さい。
    • 記事Noの横のIPアドレスをクリックすると排除IPモードへ情報を送ります。
    • ツリー削除をするとツリーが跡形も無く消えます。
    • 記事削除は、その記事に対するレスがない場合は完全削除になります。
      その記事に対するレスがある場合は完全に削除されず削除記事になります。
    • 削除記事は「記事完全削除」をチェックすると完全に消せます。
    • ロック解除/ログ初期化/フリーフォーム修復/ログコンバート$BUL $NewMsg
    $nf$pf [排除IP/禁止文字追加]
    $FP _HTML_ if($cou){ open(NO,"$c_f") || &er_("Can't open $c_f"); $cnt = ; close(NO); print <<"_BUP_";
    $nf$pf [カウンタ値編集]
    カウント数/
    _BUP_ } print <<"_HTML_";
    $msg
    $nf$pf
      _HTML_ if($FORM{'page'} eq ''){$page=0;}else{$page=$FORM{'page'};} $end_data=@NEW - 1; $page_end=$page + ($a_max - 1); if($page_end >= $end_data){$page_end=$end_data;} $nl=$page_end + 1; $bl=$page - $a_max; if($bl >= 0){$Bl=""; $Ble="";} if($page_end ne $end_data){$Nl=""; $Nle="";} $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"; print"$Plink
    \n"; foreach ($page .. $page_end) { ($namber,$date,$name,$email,$d_may,$comment,$url, $space,$end,$type,$delkey,$Ip) = split(/<>/,$NEW[$_]); ($ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$Ip); ($txt,$sel,$yobi)=split(/\|\|/,$SEL); if($ico){$ico=" [File:$ico]";} if($email ne ""){$name = "$name";} if($d_may eq ""){$d_may= "No Title";} if($yobi){$yobi=" [ID:$yobi]";} 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_";
      ツリー削除
      $d_may / $name ($date)$yobi #$namber [$ip]$ico
      _HTML_ @RES=split(/\n/,$R{$namber}); foreach $lines(@RES) { ($Sen,$rnam,$rd,$rname,$rmail,$rdm,$rcom,$rurl, $rsp,$re,$rtype,$rde,$rIp,$tim,$Se) = split(/<>/,$lines); ($rip,$ico,$Ent,$fimg,$TXT,$rSEL,$R)=split(/:/,$rIp); ($txt,$sel,$ryobi)=split(/\|\|/,$rSEL); if ($namber eq "$rtype"){ if($rmail){$rname="$rname";} if($rd_may eq ""){$rd_may="No Title";} if(length($rdm)>$t_max){$rdm=substr($rdm,0,($t_max-2));$rdm="$rdm..";} $rd=substr($rd,2,19); if($re){$re="$end_ok";} if($ico){$ico=" [File:$ico]";} if($ryobi){$ryobi=" [ID:$ryobi]";} if($Keisen){print"$Sen";} else{ print ""; $rspz=$rsp/15*$zure; print "." x $rspz; print ""; } print <<"_HTML_"; $rdm / $rname ($rd)$ryobi #$rnam [$rip]$ico $re
      _HTML_ } } print"

    "; } print <<"_DEL_";
    記事完全削除
    _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(-e $lockf){print"
      • メインログ($lockf):ロック中\n";} if(-e $cloc){print"
      • カウンタログ($cloc):ロック中\n";} print<<"_HTML_";
    • ロック中のログがあっても、ユーザが操作中の場合があります。しばらく様子を見て実行してください。
    [ログフォーマット(初期化)]

    • ファイルアップ機能\がONの場合、表\示許可モードでファイルをすべて削除し行なってください!
    [フリーフォーム修復]

    • 文字コード上の不具合修正します。文字化けが起きた場合は編集で修正してください。
    • 念のためバックアップを取っておくことをお勧めします(v7.0未満からフリーフォームを使用\している場合)
    [ログコンバート]
      /
    • I-BOARDシリーズ もしくは UPP-BOARD のログを ChildTree 用にコンバートします。
    • コンバートすると元に戻すのは大変なので注意! ボタンを間違えないで!
    • 記事はすべて新着記事扱いとなります。
    • コンバート対象ログ:[$log]
    _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_";
    $nf$pf [バックアップ]
      /
    • [Backup]ボタンをクリックすると現在のログをバックアップします。
    • バックアップ機\能\を使用している人のみ修復可能\です。
    • バックアップ$bc
    • 次のバックアップは $Nb日(約$Nh時間)後
    _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;}
    		($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$i);
    		print <<"_HTML_";
    
    記事No[$namber] の編集
    $msg
      $nf$pf □ $Lcom戻る

      $Mbox _HTML_ ($ICON,$ICO,$font,$hr)=split(/\|/,$TXT); ($txt,$sel,$yobi)=split(/\|\|/,$SEL); if($font){ print ""; } if($hr){ print""; } if($ICON ne ""){ if($CICO){$ICO=$CICO;} print"\n"; } if($sel){ print"\n"; } if($txt){ print""; } print<<"_HTML_";
      Name/
      E-Mail/
      Title/
      URL/
      Comment▽ 通常モード/ 図表\モード/ (適当に改行を入れて下さい)
      文字色/\n"; foreach (0 .. $#fonts) { if($font eq ""){$font="$fonts[0]";} print"\n";} else{print"$fonts[$_]\">\n";} } print"
      枠線色/\n"; foreach (0 .. $#hr) { if($hr eq ""){$cr="$hr[0]";} print "\n";} else{print"$hr[$_]\">\n";} } print"
      Icon/ (画像を選択/"; print"サンプル一覧)
      $SEL_T/
      $TXT_T/\n"; print"\n"; print"

      $end_form

    _HTML_ if($i_mode){ if($ico){ &size; print<<"_DEL_";
    ・ここからファイル削除できます。

    $Pr
    $nf$pf

    _DEL_ }elsif($s==0 || ($s && $ResUp)){ print<<"_DEL_";
      ・ここからファイルアップできます。
      $nf$pf File /  
        アップ可能\拡張子=> _DEL_ foreach (0..$#exn) { if($exi[$I] eq "img"){$EX="$exn[$_]";}else{$EX="$exn[$_]";} print"/$EX"; $I++; } print<<"_DEL_";
        1) 太字の拡張子は画像として認識されます。
        2) 画像は初期状態で縮小サイズ$H2×$W2ピクセル以下で表\示されます。
        3) 同名ファイルがある、またはファイル名が不適切な場合、
          ファイル名が自動変更されます。
        4) アップ可能\ファイルサイズは1回$max_fs\KB(1KB=1024Bytes)までです。

    _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_";
    排除IP/禁止文字列設定モード
    $msd
    • 指定した物が含まれているとそれぞれ排除されます。
    • [排除IP?] IPアドレスは4桁で構\成されており、通常4桁目がアクセス毎に変わります。よって、3桁目までを指定します。
      例) 127.0.0.1 を排除したい場合は 127.0.0. と指定する。192.168.0.1 → 192.168.0. (*)自分のIPは絶対に設定しない!
    • [禁止文字列?] 使用されたくない文字列を指定します。大文字小文字は区別されます。
      例) 宣伝記事→URLを指定。タグ→開始タグの一部 <img <font 等。 _HTML_ @Deny=("$IpFile","$NWFile"); @Dcom=("排除IP","禁止文字列"); foreach(0..1){ if($mo){if($_==0){$mo=~ s/(\d+\.\d+\.\d+\.)(\d+)/$1/;}else{$mo="";}} if(-e "$Deny[$_]"){ open(DB,"$Deny[$_]") || &er_("Can't open $Deny[$_]"); @deny = ; close(DB); print<<"_EDIT_";
      ■ $Dcom[$_]の追加
        $nf$pf $Dcom[$_] / (例/cj-c.com)
      ■ $Deny[$_] に登録済みの$Dcom[$_]
        $nf$pf _EDIT_ foreach(0..$#deny){ $deny[$_]=~ s/\n//g; $deny[$_]=~ s//\>\;/g; print"- $deny[$_]
        \n"; } print"
      \n"; }else{ print<<"_EDIT_";

      ■ $Dcom[$_]設定をするファイルの作成
      • $Dcom[$_]を設定するファイル($Deny[$_])がないのでオンラインで設定する場合、このファイルを作成する必要があります。
      • このCGIのあるディレクトリに作成します(このディレクトリのパーミッションが777or755 である必要があります)。
      • ここでうまく作成できない場合は同名ファイルをFTPから作成してください(パーミッション:666)
        $nf$pf
      _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"
    \n"; print"$com_top
    $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"
      $TrLink

    \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日経過すると自動的に削除されます。
    $nf$pf
    _T_ $J=0; $rank1=0; $rank2=1; $count_tmp=0; $K=0; foreach (sort { ($Co{$b} <=> $Co{$a}) || ($a cmp $b)} keys(%Co)) { ($Co{$_} == $count_tmp) || ($rank1 = $rank2); $P{$_}=($Co{$_} / $total) * 100; $P{$_}=sprintf("%2.1f",$P{$_}); if($rank1 > 10 && $J==0){ $J=1; print"\n"; print""; } if($J && $rank1 > $RBEST){last;} if($rank1==1){$G=$P{$_};$G{$_}=50;}else{$G{$_}=int(($P{$_}*50)/$G);} print"\n"; $count_tmp=$Co{$_}; $rank2++; } if($Mas){print"\n";} print"
    BEST 10
    順位名前発言回数最終発言日グラフ*

    11位〜$RBEST位
    順位名前発言回数最終発言日グラフ*
    $rank1$_"; if(@RLv){ $i=0; foreach $RLv (@RLv){ $SPL=$RSPL*($i+1); if($i!=$#RLv){if($Co{$_} < $SPL){print" -($RLv[$i])"; last;}} else{print" -($RLv[$i])"; last;} $i++; } } print"$Co{$_}$Date{$_}"; if($RGimg){$G{$_}=$G{$_}*3; print"";} else{print "l" x $G{$_};} print" $P{$_}\%

    ちなみに… $Mas

    *マーク削除/Pass \n"; print"
    \n"; if(@RLv){ print"\n"; foreach(0..$#RLv){ $SPL=$RSPL*$_; if($_!=$#RLv){$SPL2="〜".($RSPL*($_+1)-1)."回";}else{$SPL2="回以上";} print"\n"; } print"
    レベル発言回数
    $RLv[$_]$SPL$SPL2
    \n"; } print"
    \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_";
    ファイル/記事表\示許可

      • 掲示板に戻る / 通常管理モード
      • 許可する/未許可にするファイルをチェックし、ボタンを押して下さい。
      • ファイル削除をチェックしてボタンを押すとファイルのみを削除できます。
      • 記事のみの表\示許可は一度許可済みにすると、未許可に戻せません!
      • $nf$pf
    $nf$pf _ENT_ $i=0; $k=0; open(LOG,"$log") || &er_("Can't open $log"); while ($line=) { ($nam,$date,$name,$email,$d_may,$comment,$url, $sp,$end,$ty,$del,$ip,$tim,$Se)=split(/<>/,$line); if($date eq ""){next;} ($Ip,$ico,$Ent,$fimg,$TXT,$SEL,$R)=split(/:/,$ip); if($ico || ($Ent==0 && $mas_c==2)){ if($i==0){ print""; print"\n"; } $check=""; if($Ent){$eok="○"; if($FORM{"check"}==2){$check=" checked";}} else{$eok="×"; if($FORM{"check"}==1){$check=" checked";}} if($ty){$Re="($tyレス)";}else{$Re="";} if($email){$name="$name";} if($url){$url="/HP";} if(-s "$i_dir/$ico"){$Size = -s "$i_dir/$ico";}else{$Size = 0;} $comment =~ s/
    / /g; $TB=1; if($tag){ $comment =~ s//>/g; } if(length($comment) > 100){ $comment=substr($comment,0,98); $comment=$comment . '..'; $comment.="全文"; } if($k){$BG=" bgcolor=\"$k_back\""; $k=0;}else{$BG=""; $k=1;} print <<"_ENT_"; _ENT_ $i++; if($i==30){print"
    許可チェック投稿者情報コメントファイル情報ファイル削除
    -$eok #$nam $Re
    ├$name [$Ip]
    ($date$url)
    $comment $ico
    ($Size\Bytes)
    "; $i=0; $TB=0;} }else{next;} } close(LOG); if($TB){print"";} print "
    \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"
      $nf$pf"; if($mas_c){print"・表\示許可が出るまでファイルはで表\示されます。
      \n";} if($_[0]){print"";} print <<"_KEY_"; ・記事中の画像表\示形式
    _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"; $i++; if($i==30){print"

    $Pr

    \n"; 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_";
    全BBS最終更新記事

    • Child Tree に設定されている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_"; _TOP_ } } print"
    BBSタイトル 最新更新された親記事タイトル記事数更新者更新時間
    $title [$namber] $d_may $N$Name$date
    "; &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"\n"; }elsif($ico1[$_] eq ""){print"\n";} else{print"\n";} if($I >= $Ico_h){print""; $I=0;} } if($I){print"";} print"
    ランダム
    アイコン
    "; foreach $MAS (@mas_i){print"";} print"
    管理者用
    なし
    $ico2[$_]
    "; &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"
    No$namber の記事

    $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"
    "; } 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_";
        ( ページ移動 / $Plink )

    $nf$pf
      [検索フォーム]
        現在ログ内全記事数/$NS (親/$total レス/$RS) から検索  キーワード/

    $nf$pf
      [削除/編集フォーム]
        記事No(半角数字)/ 削除キー/

    _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; }