#!/usr/bin/perl require './jcode.pl'; #---------------------------------- $ver="I-BOARD/2001 v2.4"; #(マルチデザインアイコンレス掲示板) #---------------------------------- # Copyright(C) りゅういち # E-Mail:ryu@cj-c.com # W W W :http://www.cj-c.com/ #---------------------------------- #--- 設定ファイル -------------* # 同じようにいくつでも増やせます。 # [ ]内の数字を使いCGIにアクセスするとその設定ファイルで動作します。 # $set[12] の設定ファイルを使う場合: http://www.xxx.com/cgi-bin/ibbs.cgi?no=12 $set[0]="./set.cgi"; $set[1]="./set1.cgi"; $set[2]="./set2.cgi"; $set[3]="./set3.cgi"; $set[4]="./set4.cgi"; # 禁止文字列 タグ使用の場合は禁止タグも入力OK # -> 同じようにいくつでも指定可能 # -> 特に指定しない場合は空行 () にする @NW = ("死ね","本番","○番","本○","基盤","SEX","○EX","S○X","SE○","SEX","○EX","S○X","SE○","セックス","しね","死ね","氏ね","殺す","ころす","市ね","シネ"); # 排除IP/禁止文字列設定ファイル $IpFile="IpAcDeny.cgi"; $NWFile="WordDeny.cgi"; # ---[設定ここまで]-------------------------------------------------------------------------------------------------- # # # ---[排除IP/禁止文字列読み込み]------------------------------------------------------------------------------------- if(-e $NWFile){ open(DE,"$NWFile"); while(){$_=~ s/\n//g; push(@NW,$_);} close(DE); } if(-e $IpFile){ open(DE,"$IpFile"); while(){$_=~ s/\n//g; push(@ips,$_);} close(DE); } $match = 0; if(@ips){ foreach (@ips) {if ($ENV{'REMOTE_ADDR'} =~ /$_/) { $match=1; last; }} if($match){&er_("あなたには閲覧権限がありません!");} } # ---[設定ファイル読み込み]------------------------------------------------------------------------------------------ &d_code_; if($no eq ""){$no=0;} if($set[$no]){unless(-e $set[$no]){&er_('設定ファイルが無いです!');}else{require"$set[$no]";}} else{&er_('設定ファイルがCGIに設定されてません!');} $nf="\n"; $res_r= 1; $a_link=1; # ---[フォームスタイルシート設定]------------------------------------------------------------------------------------ if($fss){ $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'}; $TpON=1; $ThON=0; $TOPH=1; unless($KLOG=~ /^[\d]+/){&er_("そのファイルは閲覧できません!");} $log="$klog_d\/$KLOG\.txt"; $pp.="&KLOG=$KLOG"; $pf.="\n"; } if($s_ret && $P eq "" && $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($NMAX){$NM=" maxlength=$NMAX";} if($CMAX){$CM="/半角$CMAX文字以内";} if($TMAX){$TM=" maxlength=$TMAX";} # ---[サブルーチンの読み込み/表示確定]------------------------------------------------------------------------------- if($mode eq "all"){&all_;} if($mode eq "bma"){&bma_;} if($mode eq "man"){&man_;} if($mode eq "wri"){&wri_;} if($mode eq "w_m"){&w_m_;} 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 "res"){&res_;} if($mode eq "key"){&key_;} if($mode eq "img"){&img_;} if($mode eq "ran"){&ran_;} if($mode eq "ed_"){&edit_del;} if($FORM{"H"} eq ""){if($TOPH){$FORM{"H"}="tp";}else{$FORM{"H"}="th";}} if($FORM{"H"} eq "th"){&html_;}elsif($FORM{"H"} eq "tp"){&html2_;} &html_; #--------------------------------------------------------------------------------------------------------------------- # [パスワード認証] # -> パスワード認証を行ないます(pas_) sub pas_ { &hed_("Pass Input"); print <<_PAS_;
パスワード認証
*書きこむにはパスワードが必要です!
$nf
_PAS_ if($s_ret==1){ print"記事の閲覧はできます(リードオンリー)\n"; print" 記事を閲覧する\n"; } &foot_; } #--------------------------------------------------------------------------------------------------------------------- # [トップページ表示] # -> トップページを表示します(html_) sub html_ { unless(-e $log){&l_m($log);} unless(-e $c_f){if($cou){&l_m($c_f);}} unless(-e $RLOG){if($M_Rank){&l_m($RLOG);}} &get_; if($FORM{'page'} eq ''){$page=0;}else{$page=$FORM{'page'};} $page_end=$page+($a_max-1); $PG=$page/$a_max; if($FORM{"H"} eq "New"){&hed_("New Thread/Topic","new","1");}else{&hed_("Page:$PG","all","1");} print"
"; #print"
$com_top

"; if($P ne "R" && ($page == 0 || $FORM{"M"})){ if($o_mail){ if($c_pub){$Pch=" selected";} $Mbox= <<_MAIL_; └>この記事関連のレスをメールで受信しますか? YES  NO / アドレス _MAIL_ } if($FORM{"M"} && $res_n){ $HID ="\n"; $T_A =""; $T_F="
\n"; $MltiC="▽ 一括入力情報 ▽\n"; $Mlti2="
コメント、タイトルはそれぞれの記事の下のフォームより入力してください。
\n"; }else{ $HID ="\n"; $T_A ="Comment/ (適当に改行を入れて下さい$CM)
\n"; $T_A.=" \n"; $T_F ="Title/\n"; $MltiC=""; $Mlti2=""; } if($UID){$IDv=" [ID:$pUID]";} print <<"_HTML_";
$nf$pf $HID$MltiC $T_F $Mbox $T_A _HTML_ if($#fonts){ print ""; }else{print"\n";} if($#hr){ print""; }else{print"\n";} print""; if((!$FORM{"M"} || ($FORM{"M"} && !$oya_f)) && $mel_f){ print"\n"; } if((!$FORM{"M"} || ($FORM{"M"} && !$oya_f)) && $txt_f){ print"\n"; } if ($i_mode) { print"\n"; }else{print "";} if($FORM{"M"} && $res_n){ print"
Name /$IDv
E-Mail / 削除キー / (半角8文字以内)
文字色/\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_B eq ""){$c_B="$hr[0]";} print "\n";} else{print"$hr[$_]\">\n";} } print"
$sex_t/
$txt_k/"; print"
Icon/(画像を選択/"; print"サンプル一覧)
$Mlti2
\n"; }else{ print"\n"; print"
\n"; } if($FORM{"H"} eq "New"){print"
\n"; &foot_;} } if($res_n && $P ne "R"){ if($FORM{"M"}){ print"["; print"通常モードに戻る]
"; }else{ print"["; print"このページをマルチレスモードにする]
"; } } if($Top_t){ print"
\n"; print"
$listi スレッドリスト ( )内はレス数
\n"; } @NEW=(); %RES=(); %N=(); $Rno=0; $K=1; $i=1; $NS=0; $ListFlag=0; $news=""; open(LOG,"$log") || &er_("Can't open $log"); while ($lines = ){ ($namber,$date,$name,$email,$d_may,$comment,$url,$font,$ico,$type,$delkey,$ip,$sml)=split(/<>/,$lines); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$ip); if($name eq ""){next;} $NS++; $Ti=time; if($type){ if($news eq ""){if(($Ti-$UT) <= $new_t*3600 && $UT){$news="$up_i_";}else{$news="$hed_i";}} if(($page < $i && $page_end >= $i-1) && $KLOG eq ""){$RES{$type}.="$lines";} if($Top_t){$N{$type}++;} }else{ push(@NEW,$lines); $i++; if($Top_t){ if($news eq ""){if(($Ti-$UT) <= $new_t*3600 && $UT){$news="$new_i";}else{$news="$hed_i";}} if($d_may eq ""){$d_may="無題";} if($N{$namber} eq ""){$N{$namber}=0;} $Rno++; $PAH=$a_max*$K; if($PAH <= $Rno){$PAL="page=$PAH&"; $K++;} if($Rno <= $LiMax || $FORM{"ListAll"}){ if($page eq $PAH-$a_max){print"";} else{print"";} print"$news $d_may($N{$namber}) |\n"; }elsif($FORM{"ListAll"} eq ""){$ListFlag=1;} } $news=""; } } close(LOG); if($Top_t){ if($ListFlag){print"";} print"

\n"; } $total=@NEW; $RS=$NS-$total; %N=(); $IL=""; $page_=int(($total-1)/$a_max); $end_data = @NEW - 1; if($page_end >= $end_data){$page_end=$end_data;} $nl=$page_end+1; $bl=$page-$a_max; $plink=""; if($bl >= 0){$plink.="\<\;\<\;\n";}else{$plink="\<\;\<\;\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; } if($page_end ne $end_data){$plink.=">>\n";}else{$plink.="\>\;\>\;\n";} $Pg1=$page+1; $Pg2=$page_end+1; print"[全$totalスレッド($Pg1-$Pg2 表\示)] $plink
"; foreach ($page .. $page_end) { ($namber,$date,$name,$email,$d_may,$comment,$url,$font,$ico,$type,$delkey,$ip,$sml)=split(/<>/,$NEW[$_]); ($font,$b_col)=split(/;/,$font); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$ip); if($b_col eq ""){$b_col="$hr[0]";} if($email ne ""){$email="$emark";} if($d_may eq ""){$d_may="(無題)"; } if($link_i){ if($url){ $url =""; $url.="" } }else{if($url){$url="http://$url"; }} $ICO=""; if($i_mode && $ico){ $ICO.="引用";} if($P eq "R"){print"";}elsif($res_n==2){ if($FORM{"M"} && $res_n){print"";} else{$ResSub="このスレッドに返事を書く";} } $QuoURL="$cgi_f?namber=$namber&mode=res&page=$page&no=$no$pp&IN=$namber#F"; $ResURL="$cgi_f?namber=$namber&mode=res&page=$page&no=$no$pp"; $res=0; (@RES)=split(/\n/,$RES{$namber}); if($KLOG eq ""){@RES=reverse(@RES);} if($#RES-$Res_h >= 0){$ResNo=$#RES-$Res_h+1;}else{$ResNo=0;} $Link=""; if($Res_h <= $#RES){ $a=$Res_t; $a2=1; $ResHy=$#RES/$Res_t; for($i=0;$i<=$ResHy;$i++){ if($#RES < $a){$a=$#RES+1;} $Link.="[$a2-$a]\n"; $a2=$a+1; $a+=$Res_t; } }elsif($#RES < 0){$Link.="-";}else{$a2=$ResNo+1; $a=$#RES+1; $Link.="[$a2-$a]";} &design("OYA",$namber,$date,$name,$email,$d_may,$comment,$url,$ICO,$font,$b_col, $Ip,$ID,$Sex,$Old,$Rank,$t_font,$sml,$k_back,$IL,$ResSub,$Link,$QuoURL,$ResURL); foreach ($ResNo..$#RES) { ($rnam,$rdate,$rname,$rmail,$rd_may,$rcom,$rurl,$rfont,$rico,$rtype,$rdel,$rip,$rsml)=split(/<>/,$RES[$_]); ($rfont,$b_col)=split(/;/,$rfont); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$rip); if($b_col eq ""){$b_col="$hr[0]";} if($rmail ne "") { $rmail="$emark"; } if($rd_may eq ""){ $rd_may="(無題)"; } if($link_i){ if($rurl){ $rurl =""; $rurl.="" } }else{if($rurl){$rurl="http://$rurl";}} $rico=~ s/\n//g; $ICO=""; if ($i_mode && $rico) { if($i_hei eq ""){$ICO.="\n";} elsif($i_hei ne ""){$ICO.="\n";} } if($o_mail){if($rsml){$rsml="[メール受信:ON]";}else{$rsml="[メール受信:OFF]";}} if($Sex){$Sex="[$sex_t:$Sex]";} if($Old){$Old="[$txt_k:$Old]";} if($a_link){&auto_($rcom,$rtype);} if($Inyo){$IL="引用";} $QuoURL="$cgi_f?namber=$rtype&mode=res&page=$page&no=$no$pp&IN=$rnam#F"; &design("RES",$rnam,$rdate,$rname,$rmail,$rd_may,$rcom,$rurl,$ICO,$rfont,$b_col, $Ip,$ID,$Sex,$Old,$Rank,$t_font,$rsml,$k_back,$IL,$ResSub,$Link,$QuoURL,$ResURL,$_+1); } &design("END","","","","","","","","","", "","","","","","","","","","",$ResSub,$Link,"",$ResURL); if($res_n==2 || $P eq "R"){print"
\n";}elsif($res_n==1){if($FORM{"M"}){print"";}else{&fom_($#RES);}} if($FORM{"M"} && $res_n && $P ne "R"){ if($ResMax && $ResNo >= $ResMax){print"

レスが$ResMax件を超過 このスレッドには返信不可

\n";} else{ print"
△ $d_may へのコメント /\n"; print"
\n"; print"

\n"; print"
\n"; } } } if($FORM{"M"} && $res_n){print"";} print "
\n"; if($P eq "R"){ print"
記事投稿・編集・削除などは"; print"認証を行わないとできません!
\n"; }else{ print <<"_HTML_";
$nf$pf
編集/削除フォーム
記事No(半角数字)/
削除キー/
$nf$pf
検索フォーム
現在ログ[記事数/$NS (親/$total レス/$RS)]内を検索
キーワード/
_HTML_ } &foot_; } #-------------------------------------------------------------------------------------------------------------------- # [トピック一覧表示] # -> トピックを一覧表示(html2_) sub html2_ { @NEW=(); @RES=(); %R=(); %RES=(); $RS=0; if($FORM{'page'}){$page=$FORM{'page'};}else{$page=0;} open(LOG,"$log") || &er_("Can't open $log"); while () { ($namber,$date,$name,$email,$d_may,$comment,$url,$font,$ico,$type,$delkey,$ip,$sml)=split(/<>/,$_); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$ip); if($type){ $RS++; if($R{$type}){$R{$type}++;}else{$R{$type}=1;} if($OyaCount > $page+$tpmax || $page > $OyaCount+1){next;} if($date){$RES{$type}.="$_";} }else{push(@NEW,$_); $OyaCount=@NEW;} } close(LOG); $total=@NEW; $NS=$total+$RS; @lines=(); $PAGE=$page/($tpmax*2); &hed_("All Topic / Page: $PAGE","topic"); $Pg=$page+1; $Pg2=$page+$tpmax; if($Pg2 >= $total){$Pg2=$total;} print <<"_HTML_";
$com_top
■ $new_t時間以内に作成されたトピックは $new_i で表\示されます。
■ $new_t時間以内に更新されたトピックは $up_i_ で表\示されます。
■ トピックタイトルをクリックするとそのトピックの内容と返信を表\示します。

_HTML_ $end_data=@NEW-1; $page_end=$page+($tpmax-1); if($page_end >= $end_data){$page_end=$end_data;} $page_=int(($total-1)/($tpmax)); $nl = $page_end + 1; $bl = $page - $tpmax; if($bl >= 0){$Bl=""; $Ble="";}else{$Bl=""; $Ble="";} if($page_end ne $end_data){$Nl=""; $Nle="";}else{$Nl=""; $Nle="";} print"
    [ 全$totalトピック($Pg-$Pg2 表\示) ] \n"; $Plink="$Bl\<\;\<\;$Ble\n"; $a=0; for($i=0;$i<=$page_;$i++){ $af=$page/$tpmax; if($i != 0){$Plink.="| ";} if($i eq $af){$Plink.="$i\n";}else{$Plink.="$i\n";} $a+=$tpmax; } $tim=time; $Plink.="$Nl\>\;\>\;$Nle\n"; print"$Plink
"; print"\n"; if($mel_f){print"";} if($txt_f){print"";} print"\n"; foreach ($page .. $page_end) { ($namber,$date,$name,$email,$d_may,$comment,$url,$font,$ico,$type,$delkey,$ip,$sml)=split(/<>/,$NEW[$_]); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$ip); if((($tim-$UT) <= $new_t*3600) && $UT){$news="$new_i";}else{$news="$hed_i";} if($email){$name="$name $emark";} if($ID){$name="$name
[ID:$ID]";} if($d_may eq ""){$d_may="(無題)";} if(length($d_may)>$t_max){$d_may=substr($d_may,0,($t_max-2)); $d_may="$d_may..";} if(length($date)>11){$date=substr($date,5,16);} $sel="$Sex"; $txt="$Old"; $ksu=1; $BeTime=0; @RES= split(/\n/,$RES{$namber}); if(@RES){ ($rnam,$rd,$rname,$rmail,$rdm,$rcom,$rurl,$rfont,$rico,$rtype,$rdel,$rip,$rsml)=split(/<>/,$RES[0]); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$rip); if($oya_f==0){$sel="$Sex"; $txt="$Old";} if($rmail){$rn="$rname $emark";}else{$rn="$rname";} if($ID){$rn="$rn
[ID:$ID]";} if(length($rd)>11){$rdd=substr($rd,5,16);}else{$rdd=$rd;} if((($tim-$UT) <= $new_t*3600) && $UT){$news="$up_i_";}else{$news="$hed_i";} } if($rdd eq ""){$rdd="$date";} if($rn eq "") {$rn="$name";} $FL="
└#$namber [作成:$date]"; if($Res_t < $R{"$namber"}){ $a=0; $PG_=int(($R{"$namber"}-1)/$Res_t); $RP=""; for($j=0;$j<=$PG_;$j++){ $a2=$j*$Res_t+1; $a=($j+1)*$Res_t; if($a > $R{"$namber"}){$a=$R{"$namber"};} $RP.="$j\n"; } if($FL){$FL.=" [ $RP]";}else{$FL="
 [ $RP]";} } $FL.=""; if($txt_f){if($txt){$Txt="
";}else{$Txt="";}} if($mel_f){if($sel){$Sel="";}else{$Sel="";}} if($R{"$namber"}){$ksu=$R{"$namber"}; if($Res_t > $R{"$namber"}){$A=$R{"$namber"};}else{$A=$Res_t;}}else{$ksu=0;} print"$Sel$Txt"; print"\n"; $rdd=""; $rn=""; $rid=""; } print"
$sex_t$txt_kトピックタイトルレス数トピック作成者最終発言者最終更新
$txt/$sel/
"; print"$news $d_may$FL$ksu$name$rn$rdd


\n"; if($P eq "R"){ print"
記事投稿・編集・削除などは"; print"認証を行わないとできません!\n"; }else{ print <<"_HTML_";
$nf$pf
編集/削除フォーム
記事No(半角数字)/
削除キー/
$nf$pf
検索フォーム
現在ログ[記事数/$NS (親/$total レス/$RS)]内を検索
キーワード/
_HTML_ } &foot_; } #--------------------------------------------------------------------------------------------------------------------- # [別ページレス] # -> 別ページレスを表示します(res_) sub res_ { if($FORM{"page"}){$page=$FORM{"page"};} &get_; @lines=(); $icom=""; open(DB,"$log"); while ($line = ){ ($nam,$date,$name,$email,$d_may,$comment,$url,$font,$ico,$type) = split(/<>/,$line); if($FORM{"IN"} eq "$nam"){ $icom=">\; $comment"; $icom=~ s/
/\n>\; /g; if($tag){$icom=~ s//>/g;} } if($namber eq "$type"){push(@lines,"$line");} if($namber eq "$nam"){$OyaLine=$line; if($KLOG eq ""){last};} } close(DB); if($FORM{"KLOG"} eq ""){@lines=reverse(@lines);} unshift(@lines,"\n"); if($FORM{"RES"}=~/-/){ ($St,$En)=split(/-/,$FORM{"RES"}); $Com="$St-$En のレス記事を表\示"; $Low=$St; $High=$En; if($St<$En){if($En-$St > 50){$St=$En-49; $Com="幅が大きすぎたため $St-$En に変更";} $Low=$St; $High=$En;} if($St>$En){if($St-$En > 50){$En=$St+49; $Com="幅が大きすぎたため $St-$En に変更";} $Low=$En; $High=$St;} if($St eq ""){$Low=$En-10; $High=$En; $Com="幅が未指定のため $St-$En に指定";} if($En eq ""){$Low=$St; $High=$St+10; $Com="幅が未指定のため $St-$En に指定";} } #elsif($FORM{"RES"}==1){$Low=$#lines-$Res_t; $High=$#lines; $Com="レス1-$Res_tまで表\示";} #elsif($FORM{"RES"}==$Res_t){$Res_h=$Res_t; $Com="最新レス$Res_t表\示";} elsif($FORM{"RES"} eq "all"){$Low=1; $High=$#lines; $Com="全レス表\示";} #elsif($FORM{"IN"}){$Low=$#lines-$Res_h; $High=$#lines; $Com="通常/引用表\示";} elsif($FORM{"RES"} =~/[0-9]+/){$Low=$FORM{"RES"}; $High=$FORM{"RES"}; $Com="ResNo$FORM{'RES'}指定表\示";} else{$Low=$#lines-$Res_h+1; $High=$#lines; $Com="最新レス$Res_h件表\示";} if($Low < 1){$Low=1;} if($FORM{"mode2"}){$Com="記事No$namber指定表\示";} $Link="スレッド内ページ移動 /\n"; $NB=""; $a=$Res_t; $a2=1; $ResHy=$#lines/$Res_t; if($Low==1 || $FORM{"RES"} eq ""){$Link.="\<\;\<\;\n";} else{ $A2=$Low-$Res_t; if($A2 <= 0){$A2=1;} $A=$A2+$Res_t-1; if($A > $#lines-1){$A=$#lines;} $Link.="\<\;\<\;\n"; $NB .="<前の$Res_tレス"; } for($i=0;$i<=$ResHy;$i++){ if($#lines-1 < $a){$a=$#lines;} if($Low==$a2 && $High >= $a){$Link.="[$a2-$a]\n";} else{$Link.="[$a2-$a]\n";} $a2=$a+1; $a+=$Res_t; } if($High >= $#lines || $FORM{"RES"} eq ""){$Link.="\>\;\>\;\n";} else{ $A2=$Low+$Res_t; $A=$A2+$Res_t-1; if($A > $#lines-1){$A=$#lines;} $Link.="\>\;\>\;\n"; if($NB){$NB.=" |\n";} $NB .="次の$Res_tレス>\n"; } ($nam,$date,$Name,$email,$d_may,$comment,$url,$font,$ico,$type,$delkey,$ip,$sml) = split(/<>/,$OyaLine); ($font,$b_col)=split(/;/,$font); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$ip); if($d_may eq ""){$d_may="(無題)";} if($url){$url="http://$url";} if($email){$email="$emark";} $ICO=""; if($i_mode && $ico){ $ICO.="引用";} $QuoURL="$cgi_f?namber=$nam&mode=res&page=$page&no=$no&IN=$nam$pp#F"; $ResSub="レスフォームへ移動"; $ResURL="#F"; $ResLink="-"; if($b_col eq ""){$b_col="$hr[0]";} &hed_(" [$namber:$d_may] RES ","","1"); print <<"_HTML_";
<一覧表\示に戻る
記事No.$namber [$d_may] 返信ページ
($Com) $Link
_HTML_ &design("OYA",$nam,$date,$Name,$email,$d_may,$comment,$url,$ICO,$font,$b_col, $Ip,$ID,$Sex,$Old,$Rank,$t_font,$sml,$k_back,$IL,$ResSub,$ResLink,$QuoURL,$ResURL); $tit=$d_may; foreach ($Low..$High){ ($nam,$date,$name,$email,$d_may,$comment,$url,$font,$ico,$type,$delkey,$ip,$sml) = split(/<>/,$lines[$_]); if(length($lines[$_]) < 10){last;} ($font,$b_col)=split(/;/,$font); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$ip); if($d_may eq ""){$d_may="(無題)";} if($url){$url="http://$url";} if($email ne ""){$email="$emark";} $ICO=""; if($i_mode && $ico){ $ICO.="引用";} $QuoURL="$cgi_f?namber=$type&mode=res&page=$page&no=$no&IN=$nam$pp#F"; $ResSub="レスフォームへ移動"; $ResURL="#F"; $ResLink="-"; &design("RES",$nam,$date,$name,$email,$d_may,$comment,$url,$ICO,$font,$b_col, $Ip,$ID,$Sex,$Old,$Rank,$t_font,$sml,$k_back,$IL,$ResSub,$ResLink,$QuoURL,$ResURL,$_); } &design("END","","","","","","","","","", "","","","","","","","","","",$ResSub,$ResLink,"",$ResURL); if($Top_t && $ThON){$Link="$listi スレッドリスト表\示 / "."$Link";} else{$Link="[!スレッドリスト非表\示モード!] "."$Link";} if($NB){print"
$NB
";} print"
\n"; print"
$Link
返信フォーム
\n"; $v=1; $IDv=" [ID:$pUID]"; if($FORM{"mode2"}){ if($type > 0){$Num="$type";}else{$Num="$namber";} print"
→この記事の関連スレッドを表\示する
\n"; }else{&fom_($#lines+1);} print"
\n"; &foot_; } #--------------------------------------------------------------------------------------------------------------------- # [フォーム] # -> 返信フォームを表示します(fom_) sub fom_ { if($icom){ $icom=~ s//\>\;/g; $icom=~ s/\"/\"\;/g; $icom=~ s/<>/\<\;\>\;/g; } if($KLOG){print"

過去ログには返信できません!

\n";} elsif($s_ret && $P ne "$s_pas"){print"

書き込み権限がありません!

\n";} elsif($ResMax && $_[0] >= $ResMax){print"

レスが$ResMax件を超過 このスレッドには返信できません!

\n";} else{ if($v){$LOW=8; $TI=$tit; if($tit=~ /^Re:/){$tit;}else{$tit="Re: $tit";}} else{ $LOW=4; $TI=$d_may; if($d_may=~ /^Re:/){$tit=$d_may;}else{$tit="Re: $d_may";}} if($ResAf){$RP=0;}else{$RP=$page;} if($o_mail){ if($c_pub){$Pch=" selected";} $Mbox= <<_MAIL_; └>この記事関連のレスをメールで受信しますか? YES  NO / アドレス _MAIL_ } $MF=""; if($txt_f && $oya_f==0){ $MF.="$txt_k/\n"; }else{$MF.="";} if($mel_f && $oya_f==0){ $MF.="$sex_t/\n"; }else{$MF.="";} print <<"_HTML_";
$nf$pf _HTML_ if($FORM{"H"}){print"\n";} if($FORMK){ if($icom){$icom=~ s/\n/ /g;} if($c_url){$Cu="";} if($c_B) {$Ch="";} print <<"_HTML_"; $Cu$Ch △[$namber] $TI へ返信 _HTML_ if($#fonts){ print""; }else{print"\n";} print <<"_HTML_"; $MF$Mbox _HTML_ }else{ print <<"_HTML_"; △[$namber] $TI へ返信
Name/FontColor/削除キー/
E-Mail/
コメント/
$CM
$Mbox _HTML_ if($#fonts){ print""; }else{print"\n";} if($#hr){ print""; }else{print"\n";} if($i_mode){ print "\n"; }else{print"";} print"$MF\n"; } print"
Name/$IDv Title/ 削除キー/
E-Mail/
Comment$CM
 
文字色/\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_B eq ""){$c_B="$hr[0]";} print "\n";} else{print"$hr[$_]\">\n";} } print"
Icon/
\n"; if($AgSg){print"スレッドソ\ート/\n";} else{print"\n";} print<<"_HTML_";

_HTML_ } } #--------------------------------------------------------------------------------------------------------------------- # [ログ書きこみ処理] # -> ログへ記事を書き込みます(wri_) sub wri_ { if($P eq "R"){&er_("書き込みできない権限です!");} if($KLOG){&er_("過去ログは書き込みできません!");} #if($Proxy){ # while(($envkey,$envvalue) = each(%ENV)){ # if($envkey =~ /proxy|squid/i || $envvalue =~ /proxy|squid/i){ # &er_("ProxyServer経由では書き込みできません!"); # } # } #} if($name eq ""){&er_("名前 が未入力!");} if(length($delkey) > 8){&er_("削除キー は8文字以内!");} if($comment eq ""){&er_("コメント が未入力!");} # 日本語文字チェック if($moji_check==1 && &jcode::getcode(\$comment) ne 'sjis'){ &er_('日本語文字が含まれていません.');} if($moji_check==2 && $comment !~ m/[\x80-\xff]/){ &er_('日本語文字が含まれていません.');} if($moji_check==3 && $comment !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) { &er_('ひらがな・カタカナが含まれていません.');} if($NMAX && length($name) > $NMAX){&er_("名前 は$NMAX文字以内!");} if($CMAX && length($comment) > $CMAX){&er_("コメント は$CMAX文字以内!");} if($TMAX && length($d_may) > $TMAX){&er_("タイトル は$TMAX文字以内!");} if($email && $email !~ /(.*)\@(.*)\.(.*)/){&er_("E-Mail の入力内容が不正です!");} if($d_may eq ""){$d_may="(無題)";} if($ico eq "randam"){ srand; $randam = $#ico1; $ico = $ico1[int(rand($randam))]; if($ico eq "" || $ico eq "randam" || $ico eq "master"){ foreach(0..$#ico1){ if($ico1[$_] ne "ramdam" && $ico1[$_] ne "master"){$ico=$ico1[$_];} } } $CICO="randam"; }elsif($ico eq "master"){ $ICO_F=0; foreach (0..$#mas_p){if($mas_p[$_] eq $delkey){$ico=$mas_i[$_]; $ICO_F=1; last;}} if($ICO_F==0){&er_("管理者用アイコンは使用できません!");} $CICO="master"; }else{$CICO=$ico;} if($FORM{'URL'}){ ($KURL,$Ag) = split(/::/,$FORM{'URL'}); $ico=$icoc; $font=$fonrc; $hr=$hrc; $d_may=$FORM{"dmay"}; } if($UID){ if($Ag){$pUID=$Ag;}else{&get_("I");} if($pUID eq "n"){&er_("ブラウザのcookie機能\がOFFでは投稿不可。対応ブラウザにするか、ONにしてください!");} } if($pUID){&set_("I","$pUID");} if($tag){ $comment=~ s/\<\;//g; $comment=~ s/\"\;/\"/g; $comment=~ s/<>/\<\;\>\;/g; } $comment=~ s/\r\n/
/g; $comment=~ s/\r|\n/
/g; if($locks){&lock_($lockf);} open(LOG,"$log") || &er_("Can't open $log","1"); @lines = ; close(LOG); if($bup){&backup_;} ($knum,$kd,$kname,$kem,$ksub,$kcom) = split(/<>/,$lines[0]); $namber=$knum+1; if($kd eq "" && $kcom eq ""){shift(@lines);} $ipip=$ENV{'REMOTE_ADDR'}; if($C==0 || $mode eq "wri"){&set_;} &cry_($delkey); $SeMail=""; @new=(); if($M_Rank){&rank;} &time_(0); if($FORM{"send"}){$Se=$email;}else{$Se="";} if($FORM{"pubmail"}==0 && $o_mail){$email="";} $new ="$namber<>$date<>$name<>$email<>$d_may<>$comment<>$url<>$font;$hr<>$ico<>$type<>$epasswd<>"; $new.="$ipip\:$pUID\:$FORM{'sex'}\:$FORM{'old'}\:$R\:$Time:<>$Se<>\n"; $R=~ s/:/:/g; $FORM{"sex"}=~ s/\:/:/g; $FORM{"old"}=~ s/\:/:/g; if ($res_r == 1 && $type != 0) { @r_data=(); foreach (0 .. $#lines) { $resres = 0; ($nam,$d,$na,$mail,$d_m,$com,$u, $f,$i,$ty,$de,$ip,$sml) = split(/<>/,$lines[$_]); $ty=~ s/\n/0/g; $de=~ s/\n//g; $ip=~ s/\n//g; $i=~ s/\n//; $sml=~ s/\n//; if($name eq $na && $comment eq $com) { &er_("同じ内容は送信不可!","1"); } if($ty == 0 && $nam eq "$type"){ $new_line="$lines[$_]"; $resres=1; if($sml){if($SeMail !~ /$sml/){if($q_mail){$SeMail.=" $sml";}else{$SeMail.=",$sml";}}} if($FORM{"AgSg"}==0){ push(@new,"$new"); push(@new,@r_data); push(@new,$new_line); } }elsif($ty eq "$type"){ push(@r_data,$lines[$_]); $resres=1; if($sml){if($SeMail !~ /$sml/){if($q_mail){$SeMail.=" $sml";}else{$SeMail.=",$sml";}}} } if($resres==0){push(@new,$lines[$_]);} } if($FORM{"AgSg"}){ unshift(@new,$new_line); unshift(@new,@r_data); unshift(@new,"$new"); } }else{ $h=0; $ON=0; @KLOG=(); foreach (0 .. $#lines) { $lines[$_]=~ s/\n//; ($nam,$d,$na,$mail,$d_m,$com,$u, $f,$i,$ty,$de,$ip,$sml) = split(/<>/,$lines[$_]); if($lines[$_] eq "" || $d eq ""){next;} if($name eq $na && $comment eq $com) { &er_("同じ内容は送信不可!","1"); } $ty=~ s/\n/0/g; $de=~ s/\n//g; $ip=~ s/\n//g; $i=~ s/\n//; $sml=~ s/\n//; if($ty==0){$h++;} if(($nam eq $type || $ty eq $type) && $type > 0 && $res_r==0){ if($sml){if($SeMail !~ /$sml/){if($q_mail){$SeMail.=" $sml";}else{$SeMail.=",$sml";}}} } if($ON){if($klog_s){unshift(@KLOG,"$lines[$_]\n");}else{last;}} else{push(@new,"$lines[$_]\n");} if($h >= $max-1){$ON=1;} } } if($type){unshift(@new,"$namber<><><><><><><><><>$namber<><><><>\n");} else{unshift(@new,"$new");} open(LOG,">$log") || &er_("Can't write $log","1"); print LOG @new; close(LOG); if($klog_s && @KLOG){&log_;} if(-e $lockf){rmdir($lockf);} if($t_mail || $o_mail){&mail_;} if($s_ret){$P="$FORM{'P'}";} if($KURL){&ktai("書き込み","$KURL");} } #--------------------------------------------------------------------------------------------------------------------- # [記事一括削除] # -> ログをフォーマットします(s_d_) sub s_d_ { if($FORM{'pass'} ne "$pass"){&er_("パスワードが違います!");} open(DB,">$log"); print DB ""; close(DB); open(RA,">$RLOG"); print RA ""; close(RA); } #--------------------------------------------------------------------------------------------------------------------- # [マニュアル] # -> 最低限の内容を記述したマニュアルっぽいもの(man_) sub man_ { &hed_("Help"); if($TpON){$Tp="";}else{$Tp="";} if($ThON){$Th="";}else{$Th="";} print <<"_HTML_";
$title ヘルプ

□ 基本事項/使用方法
  • 電子掲示板(BBS)について
      電子掲示板(BBS)とは、インターネット上で不特定多数に公開されている公の発言の場です。
      • 無責任な発言や、他人の悪口・個人情報などは、書き込んではいけません。
      • そのような記述があった場合、管理者権限により予\告なく削除され、然るべき処置がとられます。

  • このBBSの記事表\示形態について
      このBBSは$Tp$Th表\示型のBBSです。
        _HTML_ if($Tp){ print"
      • [トピック] ...記事を話題ごとに表\示します。ひとつの話題の多くの記事をスムーズに読む事ができます。
        \n"; print"閲覧/返信したいトピック(話題)タイトルをクリックします。\n"; } if($Th){ print"
      • [スレッド] ...最初から記事内容を表\示します。一度に多くの話題に目を通すことができます。
        \n"; print"初期表\示で$alk_su件のスレッド(話題)とそれぞれの最新$alk_rm件の返信記事を閲覧できます。"; } if($res_n==1){$rescom="
        スレッド表\示の場合は、記事下のフォームから返信可能\です。";} print <<"_HTML_";

  • 記事の投稿方法について
    • 新しい話題を投稿するには...
      初期ページの上部にある入力フォームに必要な情報を入力してください。
      ページを移動していた場合は、上部/下部メニューの [新規作成] をクリックすると初期ページに戻ります。
    • 既に投稿されている記事に、返信記事を投稿するには...
      返信したい記事を表\示し [返信] をクリックして、 必要な情報を入力してください。$rescom

  • その他のメニューについて
    • [検索] をクリックするとログ内の記事をキーワードをから検索できます。 _HTML_ if($M_Rank){print"
    • [発言ランク] をクリックすると名前を元に集計された投稿回数のランキングを表\示します。\n";} if($klog_s){print"
    • [過去ログ] をクリックすると過去の話題を閲覧できます。過去ログの検索は [検索] から行ないます。\n";} print <<"_HTML_";

  • このBBSの機能\について
    • 話題を$max件まで保持し、それら話題内の記事には返信ができます。
      話題が$max件を超えた場合、更新日時が古い話題から _HTML_ if($klog_s){print" [過去ログ] へ保存されます。返信はできません。\n";}else{print"削除されます。\n";} if($ResMax){print"
      また、各話題毎の返信限度数は、$ResMax件です。それ以上は返信できません。";} if($tag){print"
    • コメントにHTMLタグを利用することができます。";} else{print"
    • コメントにHTMLタグを利用することはできません。";} if($UID){ print"
    • 投稿者には個別のIDが発行されます(ランダムな半角英数8文字)。他人に成りすますことを防ぎます。
      \n"; print"この場合、ブラウザのcookieが ON でなければ投稿できません(ブラウザの初期設定ではONになっています)。\n"; } if($SPAM){ print"
    • メールアドレス自動収集ソ\フト対策のため、メールリンクに $SPAM という文字列を付加して表\示しています。
      \n"; print"メールを送る際は $SPAM という文字列を削除してください。\n"; } if($res_n && $Th){ print"
    • マルチレスモードにすると一度にレスがつけられます(内容を別々にできるのはコメント、題名のみ / スレッド表\示のみ)。\n"; } print <<"_HTML_";
    • cookieに対応しています。このBBSに関するcookieを削除することもできます。
      cookie...ブラウザが入力内容を保存しておく機能\です。別のサイトで利用されることは通常ありません。
    • 記事投稿の際 削除キー(任意のパスワード) を入力することで、自分の投稿記事の編集/削除ができます。
    • Noxxx で任意の記事に(xxx は半角数字の記事No)、>>xx で同スレッド内のレスに(xx は半角数字のResNo)にリンクします。
_HTML_ &foot_; } #--------------------------------------------------------------------------------------------------------------------- # [ヘッダ表示] # -> HTMLヘッダを表示します(hed_) sub hed_ { print"Content-type: text/html; charset=Shift_JIS\n"; if($UID && $_[2]==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"; # -> bbs_header.txtヘッダを表示 open(IN, "./bbs_header.txt"); while () { print; } close(IN); print <<"_HED_"; _HED_ #
#if($t_img eq "" && $tsize){print"$title\n";} #elsif($t_img ne ""){print "\n";} #if($cou && $mode eq ""){&con_;} #$MENU ="\n"; #$MENU.="\n"; #$MENU.="\n"; #if($P ne "R" && $s_ret != 1){ # if($page > 0 || $mode || $FORM{"H"} eq "tp"){$MENU.="\n";} # elsif($FORM{"H"} eq "New"){$MENU.="\n";} # else{$MENU.="\n";} #} #$MENU.="\n"; #if($klog_s){$MENU.="\n";} #$MENU.="
\n"; #if($KLOG){print"
(現在 過去ログ$KLOG を表\示中)";} #print"$MENU

\n"; } #--------------------------------------------------------------------------------------------------------------------- # [フッタ表示] # -> HTMLフッタを表示します(foot_) sub foot_ { print <<"_HTML_";
$nf$pf
$MENU
- I-BOARD -
_HTML_ # -> bbs_footer.txtヘッダを表示 open(IN, "./bbs_footer.txt"); while () { print; } close(IN); exit; } #--------------------------------------------------------------------------------------------------------------------- # [フォームデコード] # -> フォーム内容を解釈します(d_code_) sub d_code_ { $ag=$ENV{'HTTP_USER_AGENT'}; if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &er_("文章があまりに長すぎます!"); } 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){ foreach(0..$#NW){ 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 "MCOM"){unshift(@comment,"$value");} if($name eq "MTYPE"){unshift(@type,"$value");} if($name eq "MTITLE"){unshift(@title,"$value");} } $d_may= $FORM{'d_may'}; $name = $FORM{'name'}; $comment=$FORM{'comment'}; $email =$FORM{'email'}; $url = $FORM{'url'}; $url=~ s/^http\:\/\///; $mode = $FORM{'mode'}; $ico = $FORM{'ico'}; $font = $FORM{'font'}; $kiji = $FORM{'kiji'}; $namber=$FORM{'namber'}; $type = $FORM{'type'}; $delkey=$FORM{"delkey"}; $mo =$FORM{"mo"}; $hr =$FORM{"hr"}; $no =$FORM{"no"}; } #--------------------------------------------------------------------------------------------------------------------- # [時刻取得] # -> 時刻を取得します(time_) sub time_ { if($_[0]){$Time=$_[0];}else{$Time=time;} $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($Time); $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"; } #--------------------------------------------------------------------------------------------------------------------- # [UNIX時間逆算] (杜甫々さんのラウンジを参考にしました -> http://tohoho.wakusei.ne.jp/www.htm) # -> UNIX時間を年月日から逆算します (mktime) sub mktime{ #&mktime($year, $mon, $mday, $hour, $min, $sec, $tz); local($year, $mon, $mday, $hour, $min, $sec, $tz) = @_; local(@mdays, $xtime); @mdays = ( 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334); $uru = int(($year - 72) / 4); if (((($year + 1900) % 4) == 0) && ($mon < 2)) { $uru--; } $xtime = $year - 70; $xtime = ($xtime * 365) + $mdays[$mon] + $mday + $uru; $xtime = ($xtime * 24) + $hour + $tz; $xtime = ($xtime * 60) + $min; $xtime = ($xtime * 60) + $sec; return($xtime); } #--------------------------------------------------------------------------------------------------------------------- # [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 + 30*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($_[0] eq "P"){print"Set-Cookie: $s_pas=$s_pas; expires=$date_gmt\n";} elsif($_[0] eq "I"){print"Set-Cookie: UID=$_[1]; expires=$date_gmt\n";} else{ if($SEL_C){$Csel=",sel:$FORM{'sex'}";}else{$Csel="";} if($TXT_C){$Ctxt=",txt:$FORM{'old'}";}else{$Ctxt="";} $cook ="name\:$name\,email\:$email\,url\:$url\,ico\:$CICO\,font\:$font\,hr\:$hr\,delkey\:$delkey"; $cook.="\,pub\:$FORM{'pubmail'}$Csel$Ctxt"; print "Set-Cookie: IBBS=$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 "I"){if($DUMMY{'UID'}){$pUID=$DUMMY{'UID'};}else{$pUID="n";}} else{ @pairs = split(/,/,$DUMMY{'IBBS'}); foreach $pair (@pairs) { ($name, $value) = split(/:/, $pair); $COOKIE{$name} = $value; } $c_name =$COOKIE{'name'}; $c_email=$COOKIE{'email'}; $c_url =$COOKIE{'url'}; $c_ico =$COOKIE{'ico'}; $c_font =$COOKIE{'font'}; $c_B =$COOKIE{'hr'}; $c_key =$COOKIE{'delkey'};$c_pub =$COOKIE{'pub'}; if($FORM{'name'}){$c_name =$FORM{'name'};} if($FORM{'email'}){$c_email=$FORM{'email'};} if($FORM{'url'}) {$c_url =$url;} if($FORM{'ico'}) {$c_ico =$CICO;} if($FORM{'font'}){$c_font =$FORM{'font'};} if($FORM{'hr'}) {$c_B =$FORM{'hr'};} if($FORM{'delkey'}){$c_key=$FORM{'delkey'};} if($FORM{'pubmail'}){$c_pub=$FORM{'pub'};} if($SEL_C){$c_sel=$COOKIE{'sel'};} if($TXT_C){$c_txt=$COOKIE{'txt'};} } } #--------------------------------------------------------------------------------------------------------------------- # [管理ページ] # -> 管理用のページ(del_) sub del_ { if($FORM{'pass'} ne "$pass"){&er_("パスワードが違います!");} &hed_("Manager System"); print"
\n"; print"\n"; print"\n"; print"\n"; print"\n"; #print"\n"; print""; print"\n"; print"\n"; if($FORM{"mode2"} eq "del" || $FORM{"mode2"} eq ""){ @NEW=(); %RES=(); $Tkiji=0; open(DB,"$log"); while(){ ($namber,$date,$name,$email,$d_may,$comment,$url,$font,$ico,$type) = split(/<>/,$_); if($name){if($type){$RES{$type}.="$_";}else{push(@NEW,$_);} $Tkiji++;} } close(DB); $total=@NEW; $Rkiji=$Tkiji-$total; undef(@lines); if(-s $log){$l_size=-s $log;}else{$l_size=0;} $page_=int(($total-1)/$a_max); 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;} $PG=$page/5; print <<"_HTML_";
管理モードヘルプ
記事削除 排除IP/禁止文字 スキン変更 過去ログHTML化 その他機能\
管理モード [$MODE]
  • ログサイズ/$l_sizeバイト 記事数/$Tkiji (親/$total レス/$Rkiji)
  • 記事を編集したい場合、その記事のタイトルをクリック。
  • 削除したい記事にチェックを入れ「削除」ボタンを押します。
  • 名前の下の数字は IPアドレスです。
  • 親記事を削除するとレス記事もすべて削除されます。
  • レス記事は最新$Res_h件が表\示されます。
$nf$pf [記事No指定削除]
・記事Noを指定して削除可能\です。
・記事No入力、[削除]を押してください。
記事No(半角数字)/
$msg
$nf$pf _HTML_ foreach ($page .. $page_end) { ($namber,$date,$name,$email,$d_may,$comment,$url,$font,$ico,$type,$delkey,$ip)=split(/<>/,$NEW[$_]); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$ip); $comment=~ s/
/ /g; if($tag){ $comment =~ s//>/g; } if(length($comment)>100){$comment=substr($comment,0,98); $comment=$comment . '..'; } if($email ne ""){ $name = "$name"; } if($d_may eq ""){ $d_may= "(無題)"; } print <<"_HTML_"; _HTML_ $ResNo=0; (@RES)=split(/\n/,$RES{$namber}); @RES=reverse(@RES); if($#RES-$Res_h >= 0 && $FORM{"resopen"} != $namber){$ResNo=$#RES-$Res_h+1;}else{$ResNo=0;} if($ResNo){ print"\n"; }elsif($FORM{"resopen"} == $namber){ print"\n"; } foreach ($ResNo..$#RES) { ($rnam,$rdate,$rname,$rmail,$rd_may,$rcom,$rurl,$rfont,$rico,$rtype,$rd,$rip)=split(/<>/,$RES[$_]); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$rip); $ReN=$_+1; $resmsg= "
($rtypeレス$ReN)"; $rcom=~ s/
/ /g; if($tag){$rcom=~ s//>/g;} if(length($rcom) > 100){$rcom=substr($rcom,0,98); $rcom=$rcom.'..';} if($rmail ne "") {$rname="$rname";} if($rd_may eq ""){$rd_may="(無題)";} print <<"_HTML_"; _HTML_ } } print "
チェック記事No タイトル投稿者コメント
親記事[$namber] $d_may $name
$Ip
$comment
|+|"; print""; print" No.$namber関連スレッドのレスを全て表\示
|−|"; print""; print" No.$namber関連スレッドのレスを$Res_h件表\示にする
[$rnam]$resmsg $rd_may $rname
$Ip
$rcom

\n"; print "
\n"; $next_line = $page_end + 1; $back_line = $page - $a_max; if($back_line >= 0){ print"[前の$a_max件]\n"; } if($page_end ne $end_data){ print"[次の$a_max件]\n"; } print "

全ページ数 / \n"; $a=0; for($i=0;$i<=$page_;$i++){ $af=$page/$a_max; if($i eq $af){ print "[$i] \n";} else{print "[$i]\n";} $a+=$a_max; } }elsif($FORM{"mode2"} eq "ip"){ ($m,$Log)=split(/:/,$FORM{"m"}); if($m eq "Make"){ open(DB,">$Log") || &er_("Can't make $Log"); print DB ""; close(DB); chmod(0666,"$Log"); $msd="

$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 (0..$#deny) { foreach $u (@d_) {if($u eq "$_"){$F=1; last;}} if($F){$F=0; next;} push(@NEW,"$deny[$_]"); } open (DB,">$Log"); print DB @NEW; close(DB); $msd="

$Log内削除完了

"; } print<<"_HTML_";
  • 指定した物が含まれているとそれぞれ排除されます。
  • [排除IP?]
    IPアドレスは4桁で構\成されており、通常4桁目がアクセス毎に変わります。よって、3桁目までを指定します。
    例) 127.0.0.1 を排除したい場合は 127.0.0. と指定。192.168.0.1 → 192.168.0. (*)自分のIPは絶対に設定しない!
  • [禁止文字列?]
    使用されたくない文字列を指定します。大文字小文字は区別されます。
    例) 宣伝記事→URLを指定。タグ→開始タグの一部 <img <font 等。
$msd
_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"
    "; print"
\n"; }else{ print<<"_EDIT_";
    ■ $Dcom[$_]設定をするファイルの作成
    • $Dcom[$_]を設定するファイル($Deny[$_])がないのでオンラインで設定する場合、このファイルを作成する必要があります。
    • このCGIのあるディレクトリに作成します(このディレクトリのパーミッションが777or755 である必要があります)。
    • ここでうまく作成できない場合は同名ファイルをFTPから作成してください(パーミッション:666)
      $nf$pf
_EDIT_ } } }elsif($FORM{"mode2"} eq "skn"){ local(@SET)=(); local($i,$Com,$SkinFlag)=0; local($SkinCom)=""; if($FORM{"Cng"} && -e "$DDIR\/$FORM{'Cng'}"){ if($locks){&lock_($lockf);} open(SET,"$set[$no]"); while(){ if($_ !~ /\$Dfile/){push(@SET,$_);} else{push(@SET,"\$Dfile\= \"$FORM{'Cng'}\"\;\t\t\# 初期スキンファイル\n"); $SkinFlag=1} } close(SET); if(! -w $set[$no]){chmod(0666,"$set[$no]")}; open (SET,">$set[$no]") || &er_("スキン変更失敗! 設定ファイルのパーミッションを 666 に変更してみてください","1"); print SET @SET; close(SET); if(-e $lockf){rmdir($lockf);} if($SkinFlag){$msg="

スキンファイル $FORM{'Cng'} に変更完了

"; $Dfile=$FORM{"Cng"};} else{$mag="

スキンファイルの設定が設定ファイル内にありません

";} } print <<"_HTML_"; $msg
  • スキンファイルのあるディレクトリ( $DDIR )からHTMLファイルを検索します。
  • 背景色の違うものが、現在設定されているスキンファイル( $Dfile )です。
  • ファイル名をクリックすると簡単な説明と動作イメージが表\示されます。
  • 動作イメージ表\示後、[このスキンファイルに変更する] をクリックするとスキンファイル設定を変更できます。
_HTML_ opendir(DIR,"$DDIR"); while($file=readdir(DIR)){ if($file && $file=~/.htm|.html/){ if($i==0){print"";} print"\n"; if($i==4){print""; $i=0;} $i++; } } closedir(DIR); if($i < 5){print"";} print"
"; if($FORM{"File"} eq $file){$file="$file";} print"$file
"; if($FORM{"File"} && -e "$DDIR\/$FORM{'File'}"){ $Dfile=$FORM{'File'}; open(DE,"$DDIR\/$Dfile"); while(){ if($_=~/\<\!\-\-/){$Com=1; next;} if($_=~/\-\-\>/){last;} if($Com){$SkinCom.="$_";} } close(DE); print"
\n"; print"
["; print"このスキンファイルに変更する]
\n"; print"
$SkinCom
\n"; print"
動作イメージ\n"; &design("OYA","xx","yyyy/mm/dd(week) hh:mm:ss","愛 望努","$emark", "サンプル(親記事)","ここに親記事のコメントが入ります。

このような感じになります。", "http://www.cj-c.com/", "(アイコン)",$font[0],$hr[0],"127.0.0.1","aaaaaaaa","[セレクト]","[テキスト]", "x回",$t_font,"[メール受信:YES]",$k_back,"引用","このスレッドに返信する","[1-1]","",""); &design("RES","yy","yyyy/mm/dd(week) hh:mm:ss","愛 望子","$emark", "サンプル(レス記事)","ここにレス記事のコメントが入ります。

このような感じになります。", "http://www.cj-c.com/", "(アイコン)",$font[0],$hr[0],"127.0.0.1","bbbbbbbb","[セレクト]","[テキスト]", "y回",$t_font,"[メール受信:YES]",$k_back,"引用","","","","","Y"); &design("END","","","","","","","","","", "","","","","","","","","","","このスレッドに返信する","[1-1]","",""); print"
["; print"このスキンファイルに変更する]
\n"; }else{print"\n";} }elsif($FORM{"mode2"} eq "log"){ print"\n"; if($klog_s){ open(KLOG,"$klog_c"); $KLS = ; close(KLOG); print <<"_COPY_";
    1. ファイルは isrch.cgi 等の名前でダウンロードされますので拡張子を .htm or .html に変更してください。
    2. またファイル名も適宜変更してください。
$nf$pf
\n"; }else{print"過去ログ機能\を利用していないのでこの機能\は利用できません。";} print"\n"; }elsif($FORM{"mode2"} eq "etc"){ if($FORM{"mode3"} eq "Backup"){ @lines=(); open(DB,"$log"); while(){push(@lines,$_);} close(DB); &backup_; $msg="

バックアップ完了

"; undef(@lines); }elsif($FORM{"mode3"} eq "LockOff"){ $msg="

ロック解除完了
"; if(-e $lockf){rmdir($lockf); $msg.="($lockf解除)";}else{$msg.="($lockf無し)";} if(-e $c_loc){rmdir($_cloc); $msg.="($c_loc解除)";}else{$msg.="($c_loc無し)";} $msg.="

"; } if($FORM{"C"}){ open(NO,">$c_f") || &er_("Can't write $c_f",'0'); print NO $FORM{"C"}; close(NO); $cnt=$FORM{"C"}; $msg="

カウンタ値編集完了

"; } print<<"_HTML_";
$msg*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_"; $nf$pf [バックアップ機能\]
    /
  • [Backup]ボタンをクリックすると現在のログをバックアップします。
  • バックアップ機\能\を使用している人のみ修復可能\です。
  • バックアップ$bc
  • 次のバックアップは $Nb日(約$Nh時間)後 (マイナスの値の場合、次のログ更新時)

_BUP_ } if($cou){ open(NO,"$c_f") || &er_("Can't open $c_f"); $cnt = ; close(NO); print<<"_HTML_";
$nf$pf[カウンタ値の編集]
    カウント数の編集 /

_HTML_ } print <<"_HTML_";
[ログフォーマット(初期化)]
  • 記事の記録してあるログと、発言ランクのログを初期化します。
  • 実行すると元に戻せなくなるので注意してください。

[ロックファイルの解除(削除)]
  • ロックファイルがどうしても削除されない場合に試してください。問題が無い場合はあまり使わないで下さい
      _HTML_ if(-e $lockf){print"
    • メインログ($lockf):ロック中\n";} if(-e $cloc){print"
    • カウンタログ($cloc):ロック中\n";} print<<"_HTML_";
  • ロック中のログがあっても、ユーザが操作中の場合があります。しばらく様子を見て実行してください。
_HTML_ print""; } &foot_; } #--------------------------------------------------------------------------------------------------------------------- # [記事編集] # -> 記事編集ページを表示します(hen_) sub hen_ { if($P eq "R"){&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_("パスワードが違います!"); }} @new=(); $flag=0; open(DB,"$log"); while($line=){ ($namber,$date,$name,$email,$d_may,$comment,$url, $font,$ico,$type,$epasswd,$ip,$sml) = split(/<>/,$line); if($date eq ""){next;} if($kiji eq "$namber"){ if($mo eq ""){ if($epasswd eq ""){&er_("この記事は削除キーが存在しません!","$kiji");} &cryma_($epasswd,$delkey); if($delkey eq "$pass"){$ok="y";} if($ok eq "n"){&er_("パスワードが違います!");} $hen_l="$cgi_f?no=$no$pp"; }else{$hen_l="$cgi_f?mode=del&pass=$FORM{'pass'}&no=$no$pp";} $type=~ s/\n/0/g; $delkey=~ s/\n//g; $sml=~ s/\n//g; if($FORM{'pass'} eq ""){$FORM{'pass'}=$delkey;} &hed_("Message Editor"); $comment=~ s/
/\n/g; ($font,$hr)=split(/;/,$font); ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$ip); if($tag){$comment=~ s//>/g;} if($o_mail){ if($sml){$SEL=" selected"; if($email eq ""){$email=$sml; $SEL2=" selected";}} $Mbox=<<"_M_"; └関連レスをメールで受信する? / アドレス _M_ } print <<"_HTML_";
$msg
No.$namber [$d_may] の編集
BACK
$nf$pf
$Mbox _HTML_ if($#fonts){ print""; }else{print"\n";} if($#hr){ print""; }else{print"\n";} if($mel_f){ print"\n"; } if($txt_f){ print"\n"; } if($i_mode){ &get_; $ico=$c_ico; print "\n"; }else{print"\n";} print <<"_EDIT_";
Name/ Title/
E-Mail/
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 ""){$hr="$hr[0]";} print"\n";} else{print"$hr[$_]\">\n";} } print"
$sex_t/
$txt_k/"; print"
Icon/("; print"サンプル一覧)
_EDIT_ &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($_[0], $nsalt); } #--------------------------------------------------------------------------------------------------------------------- # [パスワード解読] # -> パスワードを複合化します(cryma_) sub cryma_ { if($_[0]=~ /^\$1\$/){$crptkey=3;}else{$crptkey=0;} $ok="n"; if(crypt($_[1], substr($_[0],$crptkey,2)) eq $_[0]){$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_("パスワードが違います! $ok $delkey");}} if($locks){&lock_($lockf);} @CAS=(); $I=0; open(DB,"$log") || &er_("Can't open $log","1"); while($mens = ){ ($nam,$d,$na,$mail,$d_m,$com,$u,$f,$i,$ty,$epasswd,$ip) = split(/<>/,$mens); $type=~ s/\n/0/g; $epasswd=~ s/\n//g; $ip=~ s/\n//g; $DelFlag=0; if($d eq ""){push(@CAS,"$nam<><><><><><><><><>$nam<><><>\n"); $I=1; next;} foreach (0..$#d_) { if ($d_[$_] eq "$nam" || $d_[$_] eq "$ty") { if($mo eq "" && $d_[$_] eq "$nam"){ if($epasswd eq ""){&er_("この記事は削除キーが存在しません!","1");} &cryma_($epasswd,$delkey); if($delkey eq "$pass"){$ok="m";} if($ok eq "n"){ &er_("パスワードが違います! $ok $delkey","1"); } } $DelFlag=1; last; } } if($DelFlag){if($I==0){$mens="$nam<><><><><><><><><>$nam<><><>\n";}else{next;}} $I=1; push(@CAS,"$mens"); } 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{if($s_ret){$mo="$s_pas";} &html_;} } #--------------------------------------------------------------------------------------------------------------------- # [編集記事置換] # -> 編集記事を編集前の記事と置き換えます(h_w_) sub h_w_ { if($mo){if($FORM{'pass'} ne "$pass"){ &er_("パスワードが違います!"); }} if($NMAX && length($name) > $NMAX){&er_("名前は$NMAX文字以内!");} if($CMAX && length($comment) > $CMAX){&er_("名前は$CMAX文字以内!");} if($TMAX && length($d_may) > $TMAX){&er_("名前は$TMAX文字以内!");} if($email && $email !~ /(.*)\@(.*)\.(.*)/){&er_("E-メールの入力内容が不正です!");} if($tag){ $comment=~ s/\<\;//g; $comment=~ s/\"\;/\"/g; $comment=~ s/<>/\<\;\>\;/g; } $comment=~ s/\r\n/
/g; $comment=~ s/\r|\n/
/g; if($ico eq "randam"){ srand; $randam = $#ico1; $ico = $ico1[int(rand($randam))]; if($ico eq "" || $ico eq "randam" || $ico eq "master"){ foreach(0..$#ico1){ if($ico1[$_] ne "ramdam" && $ico1[$_] ne "master"){$ico=$ico1[$_];} } } }elsif($ico eq "master"){ $ICO_F=0; foreach (0..$#mas_p){if($mas_p[$_] eq $FORM{"pass"}){$ico=$mas_i[$_]; $ICO_F=1; last;}} if($ICO_F==0){&er_("管理者用アイコンは使用できません!");} }elsif($FORM{"URL"}){$ico=$icoc; $d_may=$FORM{"dmay"};} @new=(); $flag=0; if($locks){&lock_($lockf);} open(DB,"$log"); while($line = ){ ($knam,$kda,$kname,$kemail,$kd_may,$kcomment,$kurl, $kfont,$kico,$kt,$kdel,$kip) = split(/<>/,$line); if($kda eq ""){push(@new,"$line"); next;} if($namber eq "$knam"){ if($mo eq ""){ &cryma_($kdel,$FORM{'pass'}); 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; } $font="$font\;$hr"; ($Ip,$ID,$Sex,$Old,$Rank,$UT)=split(/:/,$kip); if($FORM{"send"}){$Se=$email;}else{$Se="";} if($FORM{"pubmail"}==0 && $o_mail){$email="";} $line="$namber<>$kda<>$name<>$email<>$d_may<>$comment<>$url<>$font<>$ico<>$kt<>$kdel<>"; $line.="$Ip\:$ID\:$FORM{'sex'}\:$FORM{'old'}\:$Rank:$UT:<>$Se<>\n"; $flag = 1; } push(@new,"$line"); } close(DB); if($flag==0){&er_("その記事Noは存在しません!");} if($flag==1){ open (DB,">$log"); print DB @new; close(DB); } if(-e $lockf){rmdir($lockf);} if($FORM{'URL'}){&ktai("編集","$FORM{'URL'}");} if($mo){$msg="

編集完了

"; &del_;} else{$msg="

以下の内容で編集しました

"; $FORM{"del"}=$namber; $delkey=$FORM{"pass"}; &hen_;} } #--------------------------------------------------------------------------------------------------------------------- # [ロック処理] # -> ロックファイルを生成します(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"); } } #--------------------------------------------------------------------------------------------------------------------- # [メール通知] # -> 投稿内容をメールで通知します(mail_) sub mail_ { $mail_subj = "$title の投稿通知"; if($type != 0 && $type ne ""){$type="($type Res)";} if($email eq ""){$email='nomail@xxx.xxx';} if($url ne "") {$urls ="http://$url";} if($d_may eq ""){$d_may="(無題)";} $Mail_Msg=<<"_MAIL_"; $mail_subj ---------------- $d_may $type $name($date) $email $urls $comment 返信は $iurl でお願いします -----------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 !~ /$mail[0]/){$SeMail="$mail[0]"."$SeMail";}} else{if(($email ne $mail[0]) && ($SeMail !~ /$mail[0]/)){$SeMail="$mail[0]"."$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: UPP MAILER\n"; print MAIL "To: $mail[0]\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 "$Mail_Msg\n"; close(MAIL); } } } #--------------------------------------------------------------------------------------------------------------------- # [URLなどを判断] # -> コメント内のリンク、文字色などを処理(auto_) sub auto_ { $_[0]="$_[0]"; $_[0]=~ s/>((>|>|>)[^<]*)/>$1<\/font>/g; $_[0]=~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1$2<\/a>/g; $_[0]=~ s/([^\w^\.^\~^\-^\/^\?^\&^\+^\=^\:^\%^\;^\#^\,^\|]+)(>>|>>|>>)([0-9\-]+)/$1$2$3<\/a>/g; $_[0]=~ s/([^\w^\.^\~^\-^\/^\?^\&^\+^\=^\:^\%^\;^\#^\,^\|]+)(No|NO|no|No.|NO.|no.)([0-9]+)/$1$2$3<\/a>/g; } #--------------------------------------------------------------------------------------------------------------------- # [カウンタ処理] # -> カウンタを動かしたり表示したりします(con_) sub con_ { if($locks){&lock_($c_loc);} open(NO,"$c_f") || &er_("Can't open $c_f","2"); $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","2"); print NO $cnt; close(NO); } if(-e $c_loc){rmdir($c_loc);} while(length($cnt) < $fig){ $cnt = 0 . $cnt; } @cnts = split(//,$cnt); print"

"; if($m_pas){foreach(0..$#cnts){print"";}} else{print"$cnt";} print"
\n"; } #--------------------------------------------------------------------------------------------------------------------- # [エラー表示] # -> エラー内容を表示します(er_) sub er_ { if(-e $lockf && $_[1]==1){rmdir($lockf);} if(-e $c_loc && $_[1]==2){rmdir($c_loc);} if($FORM{"URL"}){ ($KURL,$Ag) = split(/::/,$FORM{'URL'}); &ktai("ERROR-$_[0]
未","$KURL"); } if($MENU 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){&log_n;} $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"; &log_n; } #--------------------------------------------------------------------------------------------------------------------- # [過去ログ生成] # -> 過去ログファイルを生成します(log_n) sub log_n { $new_flag = 1; open(DB,">$klog_f") || &er_("Can't write $klog_f"); print DB ""; close(DB); chmod(0666,"$klog_f"); } #--------------------------------------------------------------------------------------------------------------------- # [バックアップ処理] # -> ログ内容をバックアップファイルに記録します(backup_) sub backup_{ unless(-e $bup_f){&l_m($bup_f);} if(-M "$bup_f" > $bup || $FORM{"mode3"} 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_; } #--------------------------------------------------------------------------------------------------------------------- # [画像表示] # -> アイコンのサンプル画像一覧を表示します(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_; } #--------------------------------------------------------------------------------------------------------------------- # [発言カウント] # -> 発言回数をカウントアップして保存します(rank) sub rank { open(IN,"$RLOG") || &er_("$RLOG","1"); @R = ; close(IN); $flag=0; @N=(); $T=time; $Wri=0; $RCo=""; foreach $R (@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); } if ($flag == 1 || $Wri) { open(OUT,">$RLOG") || &er_("$RLOG","1"); print OUT @N; close(OUT); } if ($flag == 0) { open(OUT,">>$RLOG") || &er_("$RLOG","1"); print OUT "$name<>1<><>$T<>\n"; close(OUT); } if($RCo eq ""){$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_; } #--------------------------------------------------------------------------------------------------------------------- # [全設定掲示板表示] # -> このCGIで稼動中の掲示板を表示します(all_) sub all_ { 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の最近更新された話題

  • I-BOARD/2001 に設定されている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, $font,$ico,$type,$epasswd,$ip,$sml) = split(/<>/,$_); if($date eq ""){next;} if($type){if($date){unshift(@RES,"$name<>$date<>$type<>");} $N++;} else{if($date){unshift(@RES,"$name<>$date<>$namber<>");} $N++; last;} } close(LOG); if(@RES){($Name,$date,$nam)=split(/<>/,$RES[0]); $MD="namber=$nam&mode=res";} else{$namber="#"; $d_may="記事がありません!"; $date="/"; $MD=""; $Name="/";} } print<<"_TOP_"; _TOP_ } } print"
BBSタイトル 最上部の親記事タイトル記事数更新者更新時間
$title [$namber] $d_may $N$Name$date
"; &foot_; } #--------------------------------------------------------------------------------------------------------------------- # [ログ生成] # -> ログがない場合生成します(l_m) sub l_m { open(DB,">$_[0]") || &er_("Can't write $_[0]"); print DB ""; close(DB); chmod(0666,"$_[0]"); } #--------------------------------------------------------------------------------------------------------------------- # [マルチレス] # -> マルチレス内容を投稿します(w_m_) sub w_m_ { $C=0; foreach $type (@type) { $comment=$comment[$C]; $d_may=$title[$C]; if($comment){&wri_;} $C++; } } #--------------------------------------------------------------------------------------------------------------------- # [記事デザイン読み込み] # -> 記事デザインを読み込んで表示します(design) sub design { local(@_)=@_; if($design eq ""){ $design=1; $Oya=""; $Res=""; $End=""; local($oya,$res,$end)=0; open(DE,"$DDIR\/$Dfile"); while(){ if($_=~/\{oya-s\}/){$oya=1; next;} if($_=~/\{res-s\}/){$res=1; $oya=0; next;} if($_=~/\{res-e\}/){$end=1; $res=0; next;} if($_=~/\{oya-e\}/){last;} if($oya==0 && $res==0 && $end==0){next;} if($oya){$Oya.="$_";} if($res){$Res.="$_";} if($end){$End.="$_";} } close(DE); } if($_[0] eq "OYA"){$Html=$Oya;}elsif($_[0] eq "RES"){$Html=$Res;}elsif($_[0] eq "END"){$Html=$End;} #("","\$No","\$Date","\$Name","\$Email","\$Title","$Comment","\$URL","\$Icon","\$FontColor","\$LineColor", # "\$IP","\$ID","\$Select","\$Text","\$Rank","\$TitleColor","\$ResMail","\$BackColor","\$QuoteLink","$ResForm","\$ResLink","\$QuoteURL","\$ResURL","\$ResNo"); $Html=~ s/\$No/$_[1]/ig; $Html=~ s/\$Date/$_[2]/ig; $Html=~ s/\$Name/$_[3]/ig; $Html=~ s/\$TitleColor/$t_font/ig; $Html=~ s/\$Email/$_[4]/ig; $Html=~ s/\$Title/$_[5]/ig; $Html=~ s/\$Comment/$_[6]/ig; $Html=~ s/\$URL/$_[7]/ig; $Html=~ s/\$Icon/$_[8]/ig; $Html=~ s/\$FontColor/$_[9]/ig; if($_[12]){$_[12]="[ID:$_[12]]";} $Html=~ s/\$LineColor/$_[10]/ig;$Html=~ s/\$IP/$_[11]/ig; $Html=~ s/\$ID/$_[12]/ig; if($_[15] eq "" && $M_Rank){$_[15]="(##)";} $Html=~ s/\$Select/$_[13]/ig; $Html=~ s/\$Text/$_[14]/ig; $Html=~ s/\$Rank/$_[15]/ig; $Html=~ s/\$ResMail/$_[17]/ig; $Html=~ s/\$BackColor/$k_back/ig;$Html=~ s/\$TableLine/$ttb/ig; $Html=~ s/\$QuoteLink/$_[19]/ig;$Html=~ s/\$ResFORM/$_[20]/ig; $Html=~ s/\$ResLink/$_[21]/ig; $Html=~ s/\$QuoteURL/$_[22]/ig; $Html=~ s/\$ResURL/$_[23]/ig; $Html=~ s/\$ResNo/$_[24]/ig; $Html=~ s/\$EditLink/編集<\/a>/ig; $Html=~ s/\$EditURL/$cgi_f?mode=ed_&mo=nam&namber=$_[1]&no=$no$pp/ig; $Html=~ s/\$DelLink/削除<\/a>/ig; $Html=~ s/\$DelURL/$cgi_f?mode=ed_&mo=key&namber=$_[1]&no=$no$pp/ig; print"$Html"; } #--------------------------------------------------------------------------------------------------------------------- # [編集/削除パス入力フォーム] # -> パスワード入力画面を表示します(edit_del) sub edit_del { &hed_("Edit / Delete Key Input"); if($mo eq "nam"){$msg="編集";}elsif($mo eq "key"){$msg="削除";} print<<"_HTML_";
編集/削除キー入力
記事No.$namber を $msg します。削除キーを入力してください。
$nf$pf 削除キー/
_HTML_ &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; }