#!/usr/local/bin/perl require 'jcode.pl'; #------------------------------------------------------------------------------------------------------------------ # DONUT SHOPPEスクリプト Ver 2.00b # an-donut 2008/09/28 #------------------------------------------------------------------------------------------------------------------ $copyright = < EOL #------------------------------------------------------------------------------------------------------------------ # ◆Reference Website◆ # 参考にしたサイトです。感謝。 # 三河版 http://www.mikawaban.com/ # サポスク初心者@本家事情 http://pureweb.jp/~big_08/cgi-bin/next/syo/ # IKeJIさん http://ikeji.zone.ne.jp/ # 1998特報!倶楽部 http://www.big.or.jp/~talk/t-club/soft/ # ゴンタくん http://www.nlfty.com/ # 飴砂糖 http://www.amezor.to/ #------------------------------------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------------------------------------ # 掲示板設定(全板共通の設定) #------------------------------------------------------------------------------------------------------------------ $amezo = ' @ Donut Shoppe '; #掲示板名称 $urlbase = 'http://www.an-donut.com/'; #掲示板のURL $urlcgibase = 'http://www.an-donut.com/'; #CGIを置くフォルダのURL $urliconbase = 'http://www.an-donut.com/icon/'; #アイコン画像を置くフォルダのURL $admin = '管理人'; #管理人名称 $adminpass = 'amMoLR7X47VcM'; #管理人PASS $headerurl = '******'; #ヘッダファイル $dirheaderurl = '******'; #各ディレクトリに置くファイル $capurl = '******'; #キャップパスファイル(キャップ設定しない時は空欄。空ファイルは指定しない) $blisturl = '******'; #各板設定ファイル $blogcgi = '******'; #ブログ表示用CGIファイル $chatcgi = '******'; #チャット用CGIファイル $logbbscgi = '******'; #ろぐ積み上げ式表示用CGIファイル $namikarecgi = '******'; #ナミカレ風表示用CGIファイル $linkcgi = '******'; #リファラ消しCGIファイル $rescgi = '******'; #レス表示用CGIファイル $daicgi = '******'; #ヘッドライン用CGIファイル $delrescgi = '******'; #削除権CGIファイル $ngurl = '******'; #NGワードファイル $logbbsfile = '******'; #ろぐ積み上げ式表示用CGIの設定ファイル $hosturl = '******'; #書き込み規制ホスト設定ファイル $cgipath = '../'; #掲示板から見たCGIが在るフォルダ(相対パスで) $bbspath = './'; #このCGIから見た掲示板フォルダの在るフォルダ(相対パスで) $commmax_ch = 5000; #投稿時内容最大サイズ $commmax_li = 50; #投稿時内容最大行数 $subjmax = 50; #投稿時題名最大サイズ $namemax = 60; #投稿時投稿者最大サイズ $mailmax = 60; #投稿時メール最大サイズ $koresmax = 80; #投稿時一言レス最大サイズ $upfilemax = 307200; #投稿時アップロードファイル最大サイズ $korescntmax = 100; #小レス投稿最大件数 $urlmax_li = 10; #投稿時内容に含まれるURLの最大数 $cw = '***'; #NGワード変換文字 $kiriskip = 1; #きり・ぞろスキップ(1=有り,0=無し) $kiriname = 'ヽ(´▽`)/'; #きり番スキップ時の投稿者名 $zoroname = 'ヽ(´▽`)/'; #ぞろ番スキップ時の投稿者名 $delword = 'ヽ(´▽`)/'; #削除時の置換え文字 $proxychk = 1; #PROXYの許可(1=no,0=yes) $keitai = 1; #携帯電話番号をはじく(1=yes,0=no) $jcodechk = 1; #日本語を含まない投稿をはじく(1=yes,0=no) $chainchk = 1; #チェーンレスと思われる投稿をはじく(1=yes,0=no) $iplog_out = *; #書き込み者のIPを保存(1=yes,0=no) $iplog = '******'; #IP保存ログの先頭名 $icon_on = 1; #一つ以上の板でアイコンを使う(1=yes,0=no) $upload_on = 1; #一つ以上の板でアップロード機能を使う(1=yes,0=no) $upload_on_name ="imgsize.pl"; #画像サイズ取得用ファイル(imgsize.plを利用してください) $upload_resize_name ="resize.pl"; #サムネイル作成用ファイル(resize.plを利用してください) if(($upload_on == 1)&&(-e "$upload_on_name")){ #$upload_on_nameと$upload_resize_nameで設定したファイルは require "$upload_on_name"; #このファイルと同一フォルダに置いてください。 } #一つ以上の板でアップロード機能を使う場合は忘れずに if(($upload_on == 1)&&(-e "$upload_resize_name")){ #$upload_on_nameと$upload_resize_nameを設定してください。 require "$upload_resize_name"; #画像が上手く表示されない場合があります。 } #アップロード機能は$upload_onが1なら板ごとに設定可能です $upgazwidth = 95; #画像ファイルの横幅がこれ以上の時サムネイル表示 $upgazheigh = 95; #画像ファイルの縦幅がこれ以上の時サムネイル表示 $textcolor = '#224455'; #掲示板のテキスト色 $textcolor0 = '#ffffff'; #掲示板のテキスト色(背景色が#0で始まるとき) $titlecolor = '#224455'; #掲示板タイトルのテキスト色 $titlecolor0 = '#ffffff'; #掲示板タイトルのテキスト色(背景色が#0で始まるとき) $titlesize = '5'; #掲示板タイトルのフォントサイズ(1〜7で設定してください) $threadbarcolor = '#ffa500'; #スレッドタイトルバーの色 $threadfontcolor = '#ffffff'; #スレッドタイトルの文字色 $threadtablebg = '#ffffff'; #スレッドテーブルの背景色 $threadtabletxt = '#224455'; #スレッドテーブル内の文字色 $kocolor = '#9999FF'; #一言レスのテキスト色 $namecolor = 'forestgreen'; #名前のテキスト色 $hitokoto_on = 1; #レス1の一言レス投稿へのリンクを外す(1=yes,0=no) $hensin_on = 0; #レス1の返信投稿へのリンクを外す(1=yes,0=no) $logchat_on = 0; #チャット用CGIファイルへリンクする(1=yes,0=no) $logbbs_on = 1; #ろぐ積み上げ式表示用CGIファイルへリンクする(1=yes,0=no) $namikare_on = 0; #ナミカレ風表示用CGIファイルへリンクする(1=yes,0=no) $heart = 'http://www.an-donut.com/image/heart.gif'; #ハート画像URL(絶対パスで) $title_left_img_main = '../image/autumn1.gif'; #タイトル左横画像URL(mainフォルダの板) $title_right_img_main = '../image/autumn3.gif'; #タイトル右横画像URL(mainフォルダの板) $title_left_img_other = '../image/0810l.gif'; #タイトル左横画像URL(mainフォルダ以外の板) $title_right_img_other = '../image/0810r.gif'; #タイトル右横画像URL(mainフォルダ以外の板) $rcount_on = 1; #閲覧者数表示をする(1=yes,0=no) $rcount = '******'; #掲示板から見た閲覧者数表示CGIがあるフォルダ(相対パスで) $rcountcgi = '******'; #閲覧者数表示CGIファイル $rcountdat = '******'; #閲覧者数データ保存ファイル $lasttimefile = '******'; #index.htmlの更新時間チェック用ファイル $notreloadsec = ******; #この秒数より間隔があいてなければリロード時index.htmlの書き換えはしない $thredcheck = 1; #新規スレッド作成の間隔をチェックをする(1=yes,0=no) $thredcheckdat = '******'; #新規スレッド作成の間隔チェックデータ保存ファイル $thredchecktime = ******; #新規スレッド作成の許可する秒数(この秒数以上開けば新規スレッド作成可) $rescheck = ******; #投稿内容が直前に投稿した内容と同じかチェックをする(1=yes,0=no) $rescheckdat = '******'; #直前レス内容チェック用ファイル $checkreskazu = 10; #直前レス内容チェックするレスの数 $kaisucheck = *; #連続投稿回数をチェックをする(1=yes,0=no) $kaisucheckdat = '******'; #連続投稿チェック用ファイル $kakikolimit = 10; #連続投稿を許可する回数(それ以上だとホスト規制リスト入り) $checkaidahour = 1; #連続投稿を監視する時間(hour)(1時間単位。1なら1時間。0やマイナスは指定しない) $defname = '名無しさん'; #名前未記入時の名前デフォルト(各板で未設定の場合に使用) $okhostcheck = *; #許可した接続先ホストかチェックをする(1=yes,0=no) $okhosturl = '******'; #接続ホスト許可設定ファイル #設定ここまで #------------------------------------------------------------------------------------------------------------------ # このCGIのソース表示 #------------------------------------------------------------------------------------------------------------------ #自分自身のCGI名取得 $ENV{'SCRIPT_FILENAME'} =~ /\/([^\/]+)$/; $cgi = $1; #amezo.cgi自信の表示 if($ENV{'REQUEST_METHOD'} eq 'GET'){ print "Content-type: text/plain\n\n"; open(R, "./$cgi"); while (){ s/\$headerurl = '([^\"]*)';/\$headerurl = '******';/g; s/\$dirheaderurl = '([^\"]*)';/\$dirheaderurl = '******';/g; s/\$capurl = '([^\"]*)';/\$capurl = '******';/g; s/\$blisturl = '([^\"]*)';/\$blisturl = '******';/g; s/\$blogcgi = '([^\"]*)';/\$blogcgi = '******';/g; s/\$chatcgi = '([^\"]*)';/\$chatcgi = '******';/g; s/\$logbbscgi = '([^\"]*)';/\$logbbscgi = '******';/g; s/\$namikarecgi = '([^\"]*)';/\$namikarecgi = '******';/g; s/\$ngurl = '([^\"]*)';/\$ngurl = '******';/g; s/\$hosturl = '([^\"]*)';/\$hosturl = '******';/g; s/\$linkcgi = '([^\"]*)';/\$linkcgi = '******';/g; s/\$rescgi = '([^\"]*)';/\$rescgi = '******';/g; s/\$daicgi = '([^\"]*)';/\$daicgi = '******';/g; s/\$delrescgi = '([^\"]*)';/\$delrescgi = '******';/g; s/\$logbbsfile = '([^\"]*)';/\$logbbsfile = '******';/g; s/\$iplog_out = ([^\"]*);/\$iplog_out = *; s/\$iplog = '([^\"]*)';/\$iplog = '******';/g; s/\$rcount = '([^\"]*)';/\$rcount = '******';/g; s/\$rcountcgi = '([^\"]*)';/\$rcountcgi = '******';/g; s/\$rcountdat = '([^\"]*)';/\$rcountdat = '******';/g; s/\$lasttimefile = '([^\"]*)';/\$lasttimefile = '******';/g; s/\$notreloadsec = ([^\"]*);/\$notreloadsec = ******; s/\$thredcheckdat = '([^\"]*)';/\$thredcheckdat = '******';/g; s/\$thredchecktime = ([^\"]*);/\$thredchecktime = ******; s/\$rescheck = ([^\"]*);/\$rescheck = ******; s/\$rescheckdat = '([^\"]*)';/\$rescheckdat = '******';/g; s/\$kaisucheck = ([^\"]*);/\$kaisucheck = *; s/\$kaisucheckdat = '([^\"]*)';/\$kaisucheckdat = '******';/g; s/\$okhostcheck = ([^\"]*);/\$okhostcheck = *; s/\$okhosturl = '([^\"]*)';/\$okhosturl = '******';/g; print; } close(R); exit; } #------------------------------------------------------------------------------------------------------------------ # プロセス開始 #------------------------------------------------------------------------------------------------------------------ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); #####環境変数取得 $referer = $ENV{'HTTP_REFERER'}; $user = $ENV{'HTTP_USER_AGENT'}; $content_length="$ENV{'CONTENT_LENGTH'}"; $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; $http_via = $ENV{'HTTP_VIA'}; $http_forwarded = $ENV{'HTTP_FORWARDED'}; $http_x_forwarded_for = $ENV{'HTTP_X_FORWARDED_FOR'}; $http_x_jphone_uid = $ENV{'HTTP_X_JPHONE_UID'}; $http_x_up_subno = $ENV{'HTTP_X_UP_SUBNO'}; $http_x_dcmguid = $ENV{'HTTP_X_DCMGUID'}; if($host eq ''){$host = gethostbyaddr(pack('C4',split(/\./,$addr)),2);} #####接続元のチェック if($user !~ /DoCoMo/i && $user !~ /j-phone/i && $user !~ /Vodafone/i && $user !~ /SoftBank/i && $user !~ /UP\.Browser/i){ #リファラーのチェック $referer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $referer =~ s/http:\/\/an-donut.com\//$urlbase/; $referer =~ /^$urlbase([\w\.\-]+)/ || &error('エラー'); $folder = $1; #PROXY規制処理 if($proxychk == 1){ if($host eq ''){ &error('PROXY規制中'); }else{ if($host =~ /cache|^dns|dummy|^ns|firewall|gate|keep|mail|^news|pop|proxy|smtp|w3|^web|www/i) { &error('PROXY規制中 PROXYの疑いがあります'); } } } } #####アクセス規制処理 if($user =~ /DoCoMo/i){ $user_id = $http_x_dcmguid; }elsif($user =~ /j-phone|Vodafone|SoftBank/i){ $user_id = $http_x_jphone_uid; }elsif($user =~ /UP\.Browser/i){ $user_id = $http_x_up_subno; }else{ $user_id = ''; } #NGホスト規制 open(HOST, "$hosturl"); while(){ chop; $checkhost = $_; if($host =~ /$checkhost/){&error("書き込み規制中");} } close(HOST); #許可した接続ホスト以外は規制 if($okhostcheck == 1){ open(OPH, "$okhosturl"); while(){ chop; $checkokhost = $_; if($host =~ /$checkokhost/){$okhost = 1;} } close(OPH); if($okhost != 1){&error("書き込み規制中 接続先のホストが許可されていません");} } #####フォームでコード if($ENV{'CONTENT_TYPE'} !~ /multipart\/form-data/){ @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'); $value =~ s/&/&/g; $value =~ s/\"/"/g; $value =~ s//>/g; $value =~ s/\r\n/\r/g; $value =~ s/\n/\r/g; $value =~ s/\r/
/g; $value =~ s/[\x82]([\x4F-\x58])/chr(ord($1) - 31)/eg; $form{$name} = $value; } }else{ $buffer =~ /^(.+)\r\n/; $boundary = $1; @pairs = split(/$boundary/, $buffer); foreach $pair(@pairs){ $check_count++; $pair=~ s/\r\n$/\r\nD_End/; @vars = split(/\r\n/, $pair); $vars = @vars; if(($fname eq "")&&($vars > 4)&&($vars[1] =~ /name\=\"(.+)\"\;\sfilename\=\"(.+)\"/)){ $fname = $2; $content_type = $vars[2]; if(($fname ne "")&&($content_type eq "")){ # ($vars[3]に実体,4=D_End $vars 5) foreach($i=3; $i<$vars;$i++){ if($fdata eq ''){ $fdata = $vars[$i]; }else{ $fdata .= "\r\n$vars[$i]"; } } $fdata=~ s/\r\nD_End$//; }else{ #($vars[4]に実体,5=D_End,$vars 6) foreach($i=4; $i<$vars; $i++){ if($fdata eq ''){ $fdata = $vars[$i]; }else{ $fdata .= "\r\n$vars[$i]"; } } $fdata=~ s/\r\nD_End$//; } $count = 0; #95/NTからのアップロードに対応 $fname=~ s/^(.*)\\//; # UNIX からのアップロードに対応 $fname=~ s/^(.*)\///; #ファイル判定。拡張子で判定。対応してない場合、拡張子は"dat"になる。 $Wfname = "dat"; #以下、対応ファイル #画像ファイル if($fname=~ /\.gif$/i){ $Wfname = "gif"; $gaz = 1; } if($fname=~ /\.png$/i){ $Wfname = "png"; $gaz = 1; } if($fname=~ /\.jpe?g$/i){ $Wfname = "jpg"; $gaz = 1; } if($fname=~ /\.bmp$/i){ $Wfname = "bmp"; } #圧縮ファイル if($fname=~ /\.lzh$/i){ $Wfname = "lzh"; } if($fname=~ /\.zip$/i){ $Wfname = "zip"; } if($fname=~ /\.rar$/i){ $Wfname = "rar"; } #オーディオ if($fname=~ /\.midi$/i){ $Wfname = "mid"; } if($fname=~ /\.mid$/i){ $Wfname = "mid"; } if($fname=~ /\.mp3$/i){ $Wfname = "mp3"; } #その他 if($fname=~ /\.txt$/i){ $Wfname = "txt"; } if($fname=~ /\.swf$/i){ $Wfname = "swf"; } }elsif(($vars > 3)&&($vars[1] =~ /name\=\"(\S+)\"/)){ $name = $1; $value = "$vars[3]"; if($vars > 5){ $value .= "\r\n"; foreach($i=4; $i<$vars; $i++){ $value .= "$vars[$i]\r\n"; } $value=~ s/\r\nD_End\r\n$//; } &jcode'convert(*value,'sjis'); $value =~ s/&/&/g; $value =~ s/\"/"/g; $value =~ s//>/g; $value =~ s/\r\n/\r/g; $value =~ s/\n/\r/g; $value =~ s/\r/
/g; $value =~ s/[\x82]([\x4F-\x58])/chr(ord($1) - 31)/eg; $form{$name} = $value; } } } $imode = $form{'imode'}; $chat = $form{'chat'}; $logbbs = $form{'logbbs'}; $namikare = $form{'namikare'}; $name = $form{'name'}; $mail = $form{'mail'}; $comm = $form{'comm'}; $subj = $form{'subj'}; $img = $form{'img'}; $icon = $form{'icon'}; $chuid = $form{'chuid'}; $delpass = $form{'delpass'}; $folder = $form{'folder'} if $form{'folder'}; $res = $form{'res'}; $next = $form{'next'}; $next = 1 if !$next; $reload = 1 if $name eq $subj && $name eq $comm; $reload = 1 unless $name || $subj || $comm; $upfile_length="$content_length"-"length($comm)"-"length($name)"-"length($mail)"-"length($subj)"; $upfile_length_kb=int($upfile_length/1024); $upfilemax_kb=int($upfilemax/1024); $upfile_length > $upfilemax && &error("アップロードファイルが大きすぎます。$upfilemax_kb KB以下にしてください。"); @a = ($comm =~ /
/g); @a + 0 > $commmax_li && &error("投稿内容が長すぎます"); length($comm) > $commmax_ch && &error("投稿内容が大きすぎます"); length($name) > $namemax && &error("投稿者名が長すぎます"); length($mail) > $mailmax && &error("メール内容が大きすぎます"); length($subj) > $subjmax && &error("題名が長すぎます"); $name =~ s/ | //g; $subj =~ s/ | //g; $subj =~ s/〔/</g; $subj =~ s/〕/>/g; #####各板の設定を取得 open(R, "$blisturl"); while(){ chop; ($fol, $color, $title, $subtitle, $pass, $logo, $maxrescnt, $threadcnt, $pagethread, $logmax, $bbsdefname, $iconchek, $imecolumn, $idchek) = split(/,/); last if $fol eq $folder; } close(R); #####$next関連の設定 $next += $pagethread; $nextthread = $pagethread+1; $nextthread2 = $pagethread-1; #####NGワード削除/スキップ open(R, "$ngurl"); while(){ chop; ($ng, $opt) = split(/,/); $ng =~ s/(\W)/\\$1/g; if($opt eq 'n'){ $reload = 1 if $name =~ /$ng/; }elsif($opt eq 'c'){ $reload = 1 if $comm =~ /$ng/; }elsif($opt eq 'm'){ $reload = 1 if $mail =~ /$ng/; }elsif($opt eq 's'){ $reload = 1 if $subj =~ /$ng/; }elsif($opt eq 'i'){ $reload = 1 if $img =~ /$ng/; }elsif($opt eq 'a'){ if($name =~ /$ng/ || $comm =~ /$ng/ || $mail =~ /$ng/ || $subj =~ /$ng/ || $img =~ /$ng/){$reload = 1;} }else{ $name =~ s/$ng/$cw/g;$comm =~ s/$ng/$cw/g;$mail =~ s/$ng/$cw/g;$subj =~ s/$ng/$cw/g;$img =~ s/$ng/$cw/g; } } close(R); #####携帯番号処理 if($keitai == 1){&keitai;} #####タイム情報取得 <imeget; #####一言レス書き込み処理 &kores if (!$reload && $res =~ /\./); #------------------------------------------------------------------------------------------------------------------ # スッレド作成&レス投稿処理 #------------------------------------------------------------------------------------------------------------------ if($next == $nextthread && !$reload){ #####管理人名処理(語りは「#」をつける) $_ = $admin; s/(\W)/\\$1/g; $name =~ s/$_/#$admin/g; #####削除処理 #各掲示板ごとのPASSによる削除 crypt($name, 'am') eq "$pass" && &del; #各掲示板に関係なく管理者PASSによる削除 crypt($name, 'am') eq "$adminpass" && &del; #####キャップ処理 if(open(R, "$capurl")){ while(){ chop; ($cpass, $cname, $ccolor, $senyouicon) = split(/,/); $name =~ s/$cname/#$cname/g; if($name =~ /$cpass/){ $cstyle = " style=\"color=$ccolor\""; $name =~ s/$cpass/$cname/g; $ncolor = "$ccolor"; if($mail =~ /$cpass/ && $iconchek == 1){ $icon = "$senyouicon"; ($cappass, $mail) = split(/!/, $mail); } $cap_id = 1; last; }else{ $ncolor = $namecolor; } } close(R); }else{ $ncolor = $namecolor; } $res && undef $subj; $name || &noname; $comm || &error("コメントが入力されていません"); $res || $subj || &error("題名が入力されていません"); #####投稿内容をチェック $prevx = $comm; #URLが多い投稿をチェック @url = ($prevx =~ /http\:\/\//g); @url + 0 > $urlmax_li && &error("URLが多すぎます"); #日本語を含まない投稿をチェック if($jcodechk){ $prevx =~ s/ |^age//g; if($prevx ne ''){ &error("日本語の投稿が無いです.") if($comm !~ /[\x80-\xff]/); } } #チェーンレス投稿をチェック #####チェーンレス投稿をチェック if($chainchk){ if($prevx =~ /つ|箇所|個|ヶ所|ヵ所|カ所|か所|ケ所|かしょ|カショ|カショ|カイ|かい|回/ && $prevx =~ /書き込み|書込み|書きこみ|かきこ|かき込み|カキコ|カキコ|はって|張\って|貼\って|貼\り付け|貼\りつけ|張\りつけ|張\り付け|はりつけ|張\付|貼\付|はり付け|ハリツケ|ハリツケ|コピペ|コピペ|こぴぺ|張\れば|貼\れば|はれば|ハレバ|ハレバ|貼\ると|張\ると|はると|ハルト|ハルト|貼\ったら|張\ったら|はったら/){ &error("チェーンレス投稿の疑いがあります."); } } #返信レス行だけの投稿をチェック $prevx = '
' . $prevx . '
'; $prevx =~ s/
>.*?(?=
)//g; $prevx =~ s/
>.*?(?=
)//g; $prevx =~ s/
//g; $prevx || &error('返信の内容しかありません.'); #####新規スレッド作成チェック if($subj && $thredcheck == 1){✓} #####直前レス(他のスレ含む)と同じ内容かチェック if($rescheck == 1){&chyokuzenrescheck;} #####書き込み時間・新規スレッドhtml名の決定 $date = "20$year\/$month\/$mday($wday)$hour\:$min\:$sec"; $res = "$year$month$mday$hour$min$sec" unless $res; #####書き込み者IP記録用情報 if($iplog_out == 1){ $ipname = substr($name, 0, 14); $ipcomm = substr($comm, 0, 40); } #####URL自動リンク $comm =~ s/(http\:[\w\.\~\-\/\?\+\=\:\@\%\;\#\&]+)/&url($1)/eg; #####スレッド内リンク $comm =~ s/>>([0-9]+)\-([0-9]+)/>>$1\-$2<\/a>/g; $comm =~ s/>>([0-9]+)(?![-\d])/>>$1<\/a>/g; #####ハート画像変換 $comm =~ s/はあとはあと//g; #####使用可能タグ処理 $comm = &tag_change($comm); #####トリップ処理 $name =~ s/◆/◇/g; if($name =~/#(.+)/){ $key = $1; $salt = substr($key."H.", 1, 2); $salt =~ s/[^\.-z]/\./go; $salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/; $trip = substr(crypt($key, $salt),-10); $name =~ s/#(.+)/ ◆$trip/g; } #####メール欄処理 $mail && ($name = "$name"); #####ID処理 $idnum = substr($addr, 8); $idcrypt = substr(crypt($idnum * $idnum, substr($date, 8, 2)), -8); if($idchek == 1){ if($mail ne '' || $cap_id == 1 || $name =~/◆/){ $ID = " ID:???"; }else{ $ID = " ID:$idcrypt"; } $IDNO = $ID; }elsif($idchek == 2){ if($cap_id == 1){ $ID = " ID:???"; }else{ $ID = " ID:$idcrypt"; } $IDNO = $ID; }else{ $IDNO = ''; } #####ログファイルを開きレス番号取得 $file = "$bbspath$folder/$res.html"; if($mail eq "sage"){$tst = (stat($file))[9];} open(W, "+< $file") || $subj && open(W, "> $file") || &error('スレッドがありません.'); flock(W, 2); while(){ last unless /
(\d+)/; $cnt = $1; $pos = tell(W); $prev = $_; } seek(W, $pos, 0); $cnt++; #####二重カキコチェック $prev =~ s/
//; $prev =~ s/
//; $prev =~ s/
画像(.*)KB\)//; $prev =~ s/
ファイル(.*)KB\)//; $prev =~ s/
(.*)<\/dl>//; $prev =~ s/
//; $prev =~ s/
<\/td>//; $prev =~ s/<\/font><\/td><\/tr><\/table>//; $prev =~ /投稿者:(.+) <\/b><\/font>.+
(.+) <\/dl>/; $name eq $1 && $comm eq $2 && print W && &error('二重カキコです.'); $comm eq $2 && print W && &error('前レスと同じ内容の書き込みです.'); #####一言れす&返信レス定義 $subjk = "
"; $subjk_link = " □一言"; $subjh = " □返信"; #####きりぞろゲット防止ちぇっく if($kiriskip){ if($cnt =~ /00$/ && $cnt != $maxrescnt){ if($idchek == 1 || $idchek == 2){ $kiriid = " ID:???"; } $line = <
$cnt 投稿者:$kiriname  投稿日:$date$kiriid$subjk_link$subjh
$cnt $subjk EOL $line =~ s/\n//g; print W "$line\n"; $cnt++; $subjk_link = " □一言"; $subjh = " □返信"; } if($cnt =~ /111$|222$|333$|444$|555$|666$|777$|888$|999$/ && $cnt != $maxrescnt){ if($idchek == 1 || $idchek == 2){ $kiriid = " ID:???"; } $line = <
$cnt 投稿者:$zoroname  投稿日:$date$kiriid$subjk_link$subjh
$cnt $subjk EOL $line =~ s/\n//g; print W "$line\n"; $cnt++; $subjk_link = " □一言"; $subjh = " □返信"; } } #####画像URL欄 & UPファイル欄処理 #アップロードされたファイルのKBサイズ(表示用)を決める if(("$upfile_length" > 0)&&("$upfile_length_kb"==0)){ $file_data_size=1; }else{ $file_data_size="$upfile_length_kb"; } $file_data_size="($file_data_size KB)"; #UPファイル欄処理 if($Wfname ne "" ){ $Wfname = "$res$cnt.$Wfname"; $thumb = "$res$cnt" . "s.jpg"; $qvga = "$res$cnt" . "q.jpg"; open(F,"> $bbspath$folder/$Wfname"); binmode(F); print F $fdata; close F; #本文表示用リンク if ($gaz == 1){ &imgsize("$bbspath$folder/$Wfname"); $height=$IMGSIZE{'height'}; $width=$IMGSIZE{'width'}; #QVGAサイズ画像作製 if($width < $height){ $w_qvga = int(320/$height*$width); $h_qvga = 320; } else { $w_qvga = 240; $h_qvga = int(240/$width*$height); } imgbbs::imgresize("$bbspath$folder/$Wfname","$bbspath$folder/$qvga",$w_qvga,$h_qvga,75,0); #サムネイル画像作製 if($width > $upgazwidth || $height > $upgazheigh){ $h_bairitsu = $upgazwidth/$width; $w_bairitsu = $upgazheigh/$height; if($h_bairitsu < $w_bairitsu){ $w = $upgazwidth; $h = int($h_bairitsu*$height); }else{ $w = int($w_bairitsu*$width); $h = $upgazheigh; } imgbbs::imgresize("$bbspath$folder/$Wfname","$bbspath$folder/$thumb",$w,$h,40,0); $w_size = "width=$w"; $h_size = "height=$h"; $comm = "$comm
画像: $fname -$file_data_size"; }else{ $w_size = "width=$width"; $h_size = "height=$height"; $comm = "$comm
画像: $fname -$file_data_size"; } } else { $comm = "$comm
ファイル:$fname<\/A> -$file_data_size"; } } #画像URL欄 & アイコン処理 if($img ne "" && $img ne "http://"){ $img =~ s/\.cgi|mailto/anko/gi; if($img =~/\.jpg$|\.gif$|\.png$|\.jpeg$|\.pjpeg$/i){ $comm = "$comm
"; if($icon ne ""){ $comm = "
\"$icon\"<\/td>$comm<\/font><\/td><\/tr><\/table>"; } } if($img =~/\.htm$|\.html$|\/$/i){ if($icon ne ""){ $comm = "
\"$icon\"<\/td>$comm<\/font><\/td><\/tr><\/table>"; } $comm = "$comm
"; } }else{ if($icon ne "" ){ $comm = "
\"$icon\"<\/td>$comm<\/font><\/td><\/tr><\/table>"; } } #####削除権PASSの処理 if($delpass && $subj){ $crypass = crypt($delpass, 'am'); $delrespass = "[削除権スレッド]"; $delmode = "削除PASS<\/font> <\/form>"; open(DL,">> $bbspath$folder/$logbbsfile"); flock(DL,2); print(DL "$res,$crypass,,,,,,,,,,,,\n"); flock(DL,8); close(DL); }else{ $delrespass = ''; $delmode = ''; } #####題名定義 if($subj){ $subj1 = "$subj "; $subj2 = "
$subj $delrespass
"; if($hitokoto_on){ undef $subjk; undef $subjk_link; } if($hensin_on){ undef $subjh; } } #####レス書き込み処理 $line = <
$cnt 投稿者:$name  投稿日:$date$IDNO$subjk_link$subjh
$comm $delmode$subjk EOL $line =~ s/\n//g; print W "$line\n"; $rescnt = $cnt; #####最大レス数チェック(メッセージ書込) if($cnt >= $maxrescnt){ <imeget; $newres = "$year$month$mday$hour$min$sec" unless $newres; $cnt = $cnt+1; $line = <
$cnt 投稿者:スレッド閉店です。  投稿日:閉店終了
最大レス数に達しましたのでこれ以上書き込めません。
次のスレッドへ移行して下さい。
$urlbase$folder/$newres.html EOL $line =~ s/\n//g; print W "$line\n"; } #####投稿欄書き込み処理 $toukouran = '1'; &toukou; $line = $toukouform; $line =~ s/\n//g; print W "$line\n"; truncate(W, tell(W)); flock(W, 8); close(W); if($mail eq "sage"){ utime $tst, $tst, $file; } #####index?.html表示用ログ作成 $startres = $cnt; &koresv; #####書き込み者のIPを保存 if($iplog_out == 1){&iplogout;} #####連続投稿回数をチェック if($kaisucheck == 1){&renzokukakikocheck;} #####最大レス数チェック(全レス分をカキコ不可にする+新規スレッド自動生成) if($cnt >= $maxrescnt){ chmod 0404,"$bbspath$folder/$res.html"; chmod 0404,"$bbspath$folder/dat/$res.html"; &newthread; } } #------------------------------------------------------------------------------------------------------------------ # index?.html作成 #------------------------------------------------------------------------------------------------------------------ $page = '2' if $next != $nextthread; $index = "index$page.html"; $file = "$bbspath$folder/$index"; $kijitop = $next-$pagethread; $main = "(メイン)" if $folder eq 'main'; ($color, $bg) = split(/!/, $color); $bg1 = " background=\"$bg\"" if $bg; $bg2 = " $bg" if $bg; $bgstyle = "body{background: $color url('$bg2') fixed\;}" if $bg; if($color =~ "#0"){$color2 = $textcolor0;$color3 = $titlecolor0; }else{$color2 = $textcolor;$color3 = $titlecolor;} #####上部タイトルバナー $logo = "
" if $logo; if($folder eq 'main'){ $title_left_img = " "; $title_right_img = " "; }else{ $title_left_img = " "; $title_right_img = " "; } #####index.htmlの更新時間のチェック if($next == $nextthread){ $time = time; open(K, "$bbspath$folder/$lasttimefile"); $lasttime = ; close(K); if($time - $lasttime < $notreloadsec && $reload){&redirect;} open(K, "> $bbspath$folder/$lasttimefile"); print K "$time"; close(K); } #####上部表示 open(W, "+< $file"); &redirect unless flock(W, 6); print W < $title$amezo$main $copyright
$logo $title_left_img$title$amezo$main$title_right_img
$subtitle

EOF #####ヘッダーファイル表示 open(R, "$headerurl"); print W while ; close(R); #####閲覧者数表示 if($rcount_on eq '1'){ print W <
EOF } #####アップローダー機能使用時の注意書き if($imecolumn eq '2' && $upload_on eq '1'){ print W <

※あなたのパソ\コン上にあるファイルを、直接BBS上にアップロードできます.
※最大添付ファイルデータ量は $upfilemax_kb KBまでです.
※対応ファイルフォーマット:.gif .png .jpg .bmp .lzh .zip .rar .midi .mid .mp3 .txt .swf
※対応ファイルフォーマット以外は .dat として保存されます.
※.gif .png .jpg のファイルフォーマットの場合、画像が縮小表\示されます.
※著作権等の法律上問題があるものはアップロードしないでください.
※アップされたファイルによって被害が生じても、当掲示板では一切責任は負いません.

EOF } #####新規投稿欄表示 $toukouran = '0'; &toukou; print W "$toukouform"; #####次のページへのボタン表示 print W < 〜 EOF #####ヘッドライン表示 $ken = $next-$pagethread; $ken2 = $next+40-$nextthread; print W <
最新題名  〜$kenから$ken2番目のスレッド〜  スレッド一覧は→こちら
EOF opendir(DIR, "$bbspath$folder/dat"); @dir = readdir(DIR); closedir(DIR); for($i=0;$dir[$i];$i++){ $ts = ($dir[$i] =~ /^\d+\.html/) ? (stat("$bbspath$folder/dat/$dir[$i]"))[9] - 800000000 : ' '; $dir[$i] = "$ts,$dir[$i]"; } @dir = sort {$b cmp $a;} @dir; if($subj && $dir[$logmax]){ &logmove; } for($i=$next - $nextthread;$i < $next+40-$nextthread && $dir[$i];$i++){ ($ts, $file) = split(/,/, $dir[$i]); last if $ts eq ' '; open(R, "$bbspath$folder/dat/$file"); @resthred = ; close(R); $resthred[0] =~ /([^\<]*)<\/b>/; $restitle = $1; $resthred[$#resthred] =~ /
(\d+)/; $k = $1; $j = $i+1; if ($k ne "1") {$k = "($k)";} else { undef $k; } if($i >= ($next - $nextthread) && $i <= ($next - $nextthread)+$nextthread2) { print W " $j$restitle$k
\n"; } else { print W " $j:$restitle$k
\n"; } $jhead = $ken-1; $jhead_last = $jhead+40; $jhead %= 10; if($j =~ /$jhead$/ && $j != $jhead_last){ print W "
\n"; } } print W <

EOF #####各板ごとの特別の表示 open(R, "$bbspath$folder/$dirheaderurl"); print W while ; close(R); #####各スレッド表示 for($i=$next - $nextthread;$i < $next - 1 && $dir[$i];$i++){ ($ts, $file) = split(/,/, $dir[$i]); last if $ts eq ' '; $j2=$i+1; $up=$j2-1; $down=$j2+1; $up2=$next-$nextthread; $down2=$next; print W <
EOL open(R, "$bbspath$folder/dat/$file"); $_ = ; $file =~ /(.+)\.html/; $res = $1; s/
//; s/
<\/td>/"; }elsif($imecolumn eq '2'){ if($upload_on eq '1'){ $imecolu = " enctype\=\"multipart\/form\-data\""; $imecolu2 = ""; }else{ $imecolu = ''; $imecolu2 = ''; } }else{ $imecolu = ''; $imecolu2 = ''; } #新規orレス if($toukouran eq '0'){ $shinki1 = "□新規投稿
"; $shinki2 = ""; $reskakiko1 = ''; $reskakiko2 = ''; $reskakiko3 = " 削除権スレッド投稿 リロード"; $reskakiko4 = ''; $kakikomibotan = "新規投稿/リロード"; }elsif($toukouran eq '1'){ $shinki1 = ''; $shinki2 = ''; $reskakiko1 = ''; $reskakiko2 = ""; $reskakiko3 = " 掲示板に戻る 上へ"; $reskakiko4 = ""; $kakikomibotan = "↑へのレスカキコ"; }else{ $shinki1 = ''; $shinki2 = ''; $reskakiko1 = "
◆<\/font><\/a>▲<\/font><\/a>$j2<\/font>▼<\/font><\/a><\/td>/; s///; s///; s///g; s///g; s///g; print W; for($j=0;;$j++){ s///g; s///g; s///g; print W; } close(R); $file =~ /(.+)\.html/; $res = $1; $toukouran = '2'; &toukou; print W "$toukouform"; } #####下部表示 #次のページへのボタン表示 print W <
EOF #アクセスランキング用(CJ Club(http://www.cj-c.com/)『Lime Counter+W』使用)必要なければコメントアウト print W < EOF #最下部書き込みとindex?.html作成後の処理 print W < EOF truncate(W, tell(W)); flock(W, 8); close(W); &subback; #####連続投稿回数が規定回数に達した旨のメッセージ表示 if($kakikokiseiiki == 1){&error("はじめの投稿から" . $checkaidahour . "時間での連続投稿規制回数に達しました.同一IPでの投稿はできません.");} &redirect; #----------------------------------------------------------------------------------------------------------- # 各種サブルーチン #----------------------------------------------------------------------------------------------------------- #####書き込み後の戻り先 sub redirect { undef $index unless $page; if($imode){ if($user =~ /UP\.Browser/i){$kddi = "<\?xml version=\"1.0\" encoding=\"Shift_JIS\"\?>"}else {$kddi = '';} print "Content-type: text/html\n\n$kddi書き込み完了
掲示板に戻る<\/a>\n"; }elsif($chat){ print "Location: $urlcgibase$chatcgi/$folder/$chat/fra\n\n\n"; }elsif($logbbs){ print "Location: $urlcgibase$logbbscgi/$folder/$logbbs/\n\n\n"; }elsif($namikare){ print "Location: $urlcgibase$namikarecgi/$folder/$namikare/\n\n\n"; }else{ print "Location: $urlbase$folder/$index\n\n\n"; } exit; } #####エラー表示 sub error { print "Content-type: text/html\n\n

$_[0]

"; exit; } #####削除&その他処理 sub del { #管理人名変換 if($mail){ $name = $admin; undef $mail unless $mail =~ /\@/; $cap_id = 1; return; } print "Content-type: text/html\n\n"; exit unless $res; $file = "$bbspath$folder/$res.html"; $dat_file = "$bbspath$folder/dat/$res.html"; #パーミッションを落とす時 if($comm =~ /x/){ chmod 0404,"$file"; chmod 0404,"$dat_file"; print "パーミッションを404に変更
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #パーミッションを戻す時 if($comm =~ /○/){ chmod 0604,"$file"; chmod 0604,"$dat_file"; print "パーミッションを604に変更
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #スレッド順位を最上位にさせる時 if($comm =~ /up/){ $nt = time; utime $nt, $nt, "$file"; utime $nt, $nt, "$dat_file"; print "スレッド順位を最上位に変更
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #スレッド順位を最下位にさせる時 if($comm =~ /down/){ utime 0, 0, "$file"; utime 0, 0, "$dat_file"; print "スレッド順位を最下位に変更
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #ログを移動させる時 if($comm =~ /move=(.+)/){ $movefol = $1; if($movefol){ open(R, $file); @lines = ; close(R); open(W, "+> $file"); flock(W, 2); foreach(@lines){ /
/; $moveupfile = "$1"; s///; /; close(R); open(W, "+> $dat_file"); flock(W, 2); foreach(@lines){ s///; s/スレッドを$movefolフォルダに移動
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜
移動先の板も新規投稿ボタンを押してリロードして下さい"; exit; }else{ print "スレッドの$movefolフォルダへの移動が失敗しました
〜ブラウザの戻るボタンで戻って下さい〜"; exit; } } #画像&インナーフレーム削除 if($comm =~ /img(\d+)/){ $resno = $1 - 1; $ts = (stat("$file"))[9]; open(W, "+< $file"); flock(W, 2); seek(W, 0, 0); @LINE = ; if ( $LINE[$resno] =~ /
画像&インナーフレーム削除
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #upファイル削除 if($comm =~ /up(\d+)/){ $resno = $1 - 1; $upno = $resno +1; $ts = (stat("$file"))[9]; open(W, "+< $file"); flock(W, 2); seek(W, 0, 0); @LINE = ; if ( $LINE[$resno] =~ /
画像 :/ ) { $updel = "
画像 : <(.+?) <"; } else { $updel = "
ファイル : <(.+?) <"; } $LINE[$resno] =~ /
/; $delfilename = "$bbspath$folder/$1"; $LINE[$resno] =~ /upファイル削除
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #小レス削除 if($comm =~ /ko(\d+).(\d+)/){ $resno = $1 - 1; $koresno = $2; $ts = (stat("$file"))[9]; open(W, "+< $file"); flock(W, 2); seek(W, 0, 0); @LINE = ; if ( $LINE[$resno] =~ /$koresno<\/B>/ ) { $kodel = "$koresno<\/B>"; } else { $kodel = "$koresno<\/b>"; } $LINE[$resno] =~ s/$kodel(.+?)<\/font>/$kodel $delword<\/font>/; truncate(W, 0); seek(W, 0, 0); print W @LINE; flock(W, 8); close W; utime($ts+1,$ts+1,"$file"); &lastresget; &koresv; print "小レス削除終了
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #小レス全削除 if($comm =~ /koall(\d+)/){ $resno = $1 - 1; $ts = (stat("$file"))[9]; open(W, "+< $file"); flock(W, 2); seek(W, 0, 0); @LINE = ; $LINE[$resno] =~ s/
(\d+)<\/b>(.+?)<\/font>/
$2<\/b> $delword<\/font>/g; $LINE[$resno] =~ s/
(\d+)<\/B>(.+?)<\/font>/
$2<\/B> $delword<\/font>/g; truncate(W, 0); seek(W, 0, 0); print W @LINE; flock(W, 8); close W; utime($ts+1,$ts+1,"$file"); &lastresget; &koresv; print "小レス全削除終了
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #スレッド削除 if(!$comm){ unlink($file); unlink($dat_file); unlink glob ("$bbspath$folder/$res*.gif"); unlink glob ("$bbspath$folder/$res*.jpg"); unlink glob ("$bbspath$folder/$res*.png"); unlink glob ("$bbspath$folder/$res*.bmp"); unlink glob ("$bbspath$folder/$res*.lzh"); unlink glob ("$bbspath$folder/$res*.zip"); unlink glob ("$bbspath$folder/$res*.rar"); unlink glob ("$bbspath$folder/$res*.mp3"); unlink glob ("$bbspath$folder/$res*.mid"); unlink glob ("$bbspath$folder/$res*.txt"); unlink glob ("$bbspath$folder/$res*.swf"); unlink glob ("$bbspath$folder/$res*.dat"); print "スレッド削除終了
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; exit; } #レス削除 $comm = ',' . $comm . ','; $comm =~ s/(\d+)\-(\d+)/join(',',($1..$2))/eg; $comm =~ s/
/,/g; $ts = (stat($file))[9]; open(R, $file); @lines = ; close(R); open(W, "+> $file"); flock(W, 2); foreach(@lines){ if(/
(\d+)/ && ($n=','.$1.',') && $comm =~ /$n/){ //; $delfilename = "$bbspath$folder/$1"; //投稿者:$delword<\/a> <\/b>/; s/投稿日:(.+?)
/投稿日:$delword<\/font>
/; s/
(.+?)<\/dl>//; s/
(.+?)<\/dl>/
$delword <\/dl>/; } print W; unlink($delfilename); unlink($delthumbname); unlink($delqvganame); } flock(W, 8); close(W); print "レス削除終了
〜ブラウザの戻るボタンで戻り、新規投稿ボタンを押してリロードして下さい〜"; utime $ts+1, $ts+1, $file; &lastresget; &koresv; exit; } #####小レス書き込み処理 sub kores { if ($comm ne ""){ length($comm) > $koresmax && &error('投稿内容が大きすぎます'); # $comm =~ s/^(\#[^<]*)/$1<\/SPAN>/g; # $comm =~ s/^(#[^<]*)/$1<\/font>/g; $res =~ /^(\d+)\.(\d+)$/; $res = $1; $rescnt = $2; $ko = $2 - 1; $kofile = "$bbspath$folder/$res.html"; $ts = (stat("$kofile"))[9]; open(LOG, "+< $bbspath$folder/$res.html") || &error('スレッドがありません.'); $date = "'$year/$month/$mday $hour:$min:$sec"; flock(LOG, 2); seek(LOG, 0, 0); @LINE = ; if ( $LINE[$ko] =~ /(\d+)<\/B> (.+?)<\/font>/ ) { $mago = $1 + 1; $kolastcomm = $2; $kolastcomm =~ /(.+?) '(.+?)/; $beforcomm = $1; if ($beforcomm eq $comm) {flock(LOG, 8); &error("二重カキコです.");} if ($mago > $korescntmax) {flock(LOG, 8); &error("最大投稿件数を越えました.");} } else { $mago = 1; } $LINE[$ko] =~ s/(\d+)<\/B>/$1<\/b>/; $LINE[$ko] =~ s//
$mago<\/B> $comm $date<\/font>/; truncate(LOG, 0); seek(LOG, 0, 0); print LOG @LINE; flock(LOG, 8); close(LOG); utime $ts+1, $ts+1, $kofile; $reload = 1; } &lastresget; &koresv; if($iplog_out == 1){&iplogout;} } #####index?.html表示用ログ作成&小レス裏周り処理 sub koresv { $startres = $startres - $threadcnt; if($startres < 1){ $startres = 1; } $res =~ /^(\d+)/; $res2 = $1; $rcnt = 0; $ts = (stat("$bbspath$folder/$res2.html"))[9]; open(R,"$bbspath$folder/$res2.html") || return; flock(R, 2); open(W,">$bbspath$folder/dat/$res2.html"); flock(W, 2); while(){ last if /^
(\d+)<\/B>/; if ($1 > 5){ $en = $1; $sn = $en - 4; /($sn.*)/; $str = $1; s/.*/

$str/; } } continue { $rcnt++; if($rcnt == 1 || $rcnt > $startres){ s///; s/(.+?)<\/head>//; s///; s///; print W; } } flock(W, 8); close W; flock(R, 8); close R; utime($ts+1,$ts+1,"$bbspath$folder/dat/$res2.html"); } #####最終レス数取得 sub lastresget { open(LOG, "$bbspath$folder/dat/$res.html"); while(){ last unless /
(\d+)/; $startres = $1; } close(LOG); } #####スレッド一覧表示用htmlへの書き込み sub subback { $file = "$bbspath$folder/subback.html"; $date = "20$year\/$month\/$mday($wday)$hour\:$min\:$sec"; open(SUB, "+> $file"); &redirect unless flock(SUB, 6); print SUB <『$title$amezo$main』のスレッド一覧
$logo$title$amezo$main
$subtitle

スレッド一覧 最終更新:$date
\n \n
EOF for($i=0; $dir[$i];$i++){ ($ts, $file) = split(/,/, $dir[$i]); last if $ts eq ' '; open(R, "$bbspath$folder/dat/$file"); @resthred = ; close(R); $resthred[0] =~ /([^\<]*)<\/b>/; $restitle = $1; $resthred[$#resthred] =~ /
(\d+)/; $k = $1; $j = $i+1; if ($k ne "1") {$k = "($k)";} else { undef $k; } print SUB " $j:$restitle$k
\n"; if($j =~ /25$|50$|75$/ && $j != $logmax){ print SUB "
\n"; } if($j =~ /00$/ && $j != $logmax && $j){ print SUB "

\n"; } } print SUB <


 
掲示板に戻る
EOF truncate(SUB, tell(SUB)); flock(SUB, 8); close SUB; } #####有効タグ復活処理 sub tag_change { local($_) = $_[0]; 1 while s/(.*)(<(s)>(.*)<\/s>)/$1$4<\/s>/i; 1 while s/(.*)(<(u)>(.*)<\/u>)/$1$4<\/u>/i; $_; } #####無記名投稿処理 sub noname { if($bbsdefname eq ''){$bbsdefname = $defname;} $name = "$bbsdefname$_[0]"; } #####ログ移行処理 sub logmove { ($ts, $file) = split(/,/, $dir[$logmax]); if($file =~ /(\d+)\.html/){ $file =~ /(.+)\.html/; $sakujyoresno = $1; open(LOG, "$bbspath$folder/dat/$file"); while(){ last unless /
(\d+)/; $lastres = $1; } close(LOG); $i=$lastres; $thumkakutyousi="s.jpg"; $qvgakutyousi="q.jpg"; $namikakutyousi="nami.dat"; while ($i > 0) { rename("$bbspath$folder/$sakujyoresno$i.jpg","$bbspath$folder/log/$sakujyoresno$i.jpg"); rename("$bbspath$folder/$sakujyoresno$i$thumkakutyousi","$bbspath$folder/log/$sakujyoresno$i$thumkakutyousi"); rename("$bbspath$folder/$sakujyoresno$i$qvgakutyousi","$bbspath$folder/log/$sakujyoresno$i$qvgakutyousi"); rename("$bbspath$folder/$sakujyoresno$i.gif","$bbspath$folder/log/$sakujyoresno$i.gif"); rename("$bbspath$folder/$sakujyoresno$i.png","$bbspath$folder/log/$sakujyoresno$i.png"); rename("$bbspath$folder/$sakujyoresno$i.bmp","$bbspath$folder/log/$sakujyoresno$i.bmp"); rename("$bbspath$folder/$sakujyoresno$i.lzh","$bbspath$folder/log/$sakujyoresno$i.lzh"); rename("$bbspath$folder/$sakujyoresno$i.zip","$bbspath$folder/log/$sakujyoresno$i.zip"); rename("$bbspath$folder/$sakujyoresno$i.rar","$bbspath$folder/log/$sakujyoresno$i.rar"); rename("$bbspath$folder/$sakujyoresno$i.mp3","$bbspath$folder/log/$sakujyoresno$i.mp3"); rename("$bbspath$folder/$sakujyoresno$i.mid","$bbspath$folder/log/$sakujyoresno$i.mid"); rename("$bbspath$folder/$sakujyoresno$i.txt","$bbspath$folder/log/$sakujyoresno$i.txt"); rename("$bbspath$folder/$sakujyoresno$i.swf","$bbspath$folder/log/$sakujyoresno$i.swf"); rename("$bbspath$folder/$sakujyoresno$i.dat","$bbspath$folder/log/$sakujyoresno$i.dat"); unlink("$bbspath$folder/$sakujyoresno$i$namikakutyousi"); $i--; } rename("$bbspath/$folder/$file","$bbspath/$folder/log/$file"); unlink("$bbspath/$folder/dat/$file"); } } #####時刻情報取得 sub ltimeget { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time+32400); $month = ($mon + 1); $year %= 100; $year < 10 && ($year = "0$year"); $month < 10 && ($month = "0$month"); $mday < 10 && ($mday = "0$mday"); $sec < 10 && ($sec = "0$sec"); $min < 10 && ($min = "0$min"); $hour < 10 && ($hour = "0$hour"); $wday = ("日", "月", "火", "水", "木", "金", "土")[$wday]; } #####携帯・PHS番号変換 sub keitai { $comm =~ s/(090[0-9]{8})/090-****-****/g; $comm =~ s/(090[0-9ー−一-]{8,12})/090-****-****/g; $name =~ s/(090[0-9]{8})/090-****-****/g; $name =~ s/(090[0-9ー−一-]{8,12})/090-****-****/g; $mail =~ s/(090[0-9]{8})/090-****-****/g; $mail =~ s/(090[0-9ー−一-]{8,12})/090-****-****/g; $subj =~ s/(090[0-9]{8})/090-****-****/g; $subj =~ s/(090[0-9ー−一-]{8,12})/090-****-****/g; $comm =~ s/(080[0-9]{8})/080-****-****/g; $comm =~ s/(080[0-9ー−一-]{8,12})/080-****-****/g; $name =~ s/(080[0-9]{8})/080-****-****/g; $name =~ s/(080[0-9ー−一-]{8,12})/080-****-****/g; $mail =~ s/(080[0-9]{8})/090-****-****/g; $mail =~ s/(080[0-9ー−一-]{8,12})/080-****-****/g; $subj =~ s/(080[0-9]{8})/090-****-****/g; $subj =~ s/(080[0-9ー−一-]{8,12})/080-****-****/g; $comm =~ s/(070[0-9]{8})/070-****-****/g; $comm =~ s/(070[0-9ー−一-]{8,12})/070-****-****/g; $name =~ s/(070[0-9]{8})/070-****-****/g; $name =~ s/(070[0-9ー−一-]{8,12})/070-****-****/g; $mail =~ s/(070[0-9]{8})/070-****-****/g; $mail =~ s/(070[0-9ー−一-]{8,12})/070-****-****/g; $subj =~ s/(070[0-9]{8})/070-****-****/g; $subj =~ s/(070[0-9ー−一-]{8,12})/070-****-****/g; } #####URL自動リンク sub url { $url = $dsp = $_[0]; $url =~ s/&/&/; if($linkcgi){ $url =~ s/http\:\/\///i; "$dsp"; }else{ "$dsp"; } } #####投稿欄表示 sub toukou { #各機能へのリンク処理 if($logchat_on eq '1'){$logchat_link = " ろぐちゃっと";} if($logbbs_on eq '1'){$logbbs_link = " ろぐBBS";} if($namikare_on eq '1' || $fol eq "namikare"){$namikare_link = " 涙枯";} if($fol eq "blog"){$blog_link = " ブログ表示";} #アイコン欄処理 $icon_on_name ="$bbspath$folder/icon.cgi"; if($iconchek eq '1' && $icon_on eq '1' && -e "$icon_on_name"){ require "$icon_on_name"; &iconselect; $iconsyori = "
アイコン<\/div><\/td>
$iselect アイコンリスト<\/a><\/td><\/tr>"; }else{ $iconsyori = ''; } #画像URL欄&ファイル欄処理 if($imecolumn eq '1'){ $imecolu = ''; $imecolu2 = "
画像URL
ファイル
題名
"; $reskakiko2 = ""; $reskakiko3 = " レス全部を見る 最新レス50$logchat_link$logbbs_link$namikare_link 上へ リロード"; $reskakiko4 = "
"; $kakikomibotan = "↑へのレスカキコ"; } #投稿フォーム $toukouform = <$shinki1 $shinki2 $iconsyori $imecolu2
$reskakiko2投稿者
メール
内容
$reskakiko3
$reskakiko4 EOL } #####新スレッド生成処理 sub newthread { #旧スレッドからスレッドタイトルと削除パスを取得 $ts = (stat("$bbspath$folder/$res.html"))[9]; open(NR,"$bbspath$folder/$res.html") || return; flock(NR, 2); read NR, $prev, 1024; $prev =~ /(.+?)<\/title>/; $subj = $1; if($prev =~ /<!-- PASS:(.*?) -->/){ $crypass = $1; }else{ undef $crypass; } close NR; if($crypass){ $delrespass = "<font size=\"-2\" color=\"$threadfontcolor\">[削除権スレッド]<!-- PASS:$crypass --></font>"; $delmode = "<form method=post action=$cgipath$delrescgi><font size=-1>削除PASS<\/font><input type=text name=pass size=12 style=\"margin:1px;\"><input type=submit value='削除モード' style=\"margin:1px;\"><input type=hidden name='dir' value=$folder><input type=hidden name='res' value=$newres><\/form>"; open(R, "$bbspath$folder/$logbbsfile"); while(<R>){ chop; ($bbsres, $logpass, $logbg, $logbground, $logtext, $loglink, $logalink, $logvlink, $logtitle, $logtitlesize, $logtitleimg, $loghpurl, $logmailto) = split(/,/); last if $bbsres eq $res; } close(R); open(DL,">> $bbspath$folder/$logbbsfile"); flock(DL,2); print(DL "$newres,$crypass,$logbg,$logbground,$logtext,$loglink,$logalink,$logvlink,$logtitle,$logtitlesize,$logtitleimg,$loghpurl,$logmailto\n"); flock(DL,8); close(DL); }else{ undef $delrespass; undef $delmode; } #同タイトルでX番目のスレッドである事を決める $subj =~ /〔(\d+)〕/; $threadcnt = $1 + 1; if($threadcnt == 1){ $threadcnt++; $subj .= "〔$threadcnt〕"; }else{ $subj =~ s/〔(\d+)〕/〔$threadcnt〕/; } #ID処理 if($idchek == 1 || $idchek == 2){ $ID = " ID:???"; $IDNO = $ID; }else{ $IDNO = ''; } #一言レス&返信レスのリンク処理 $subjk = "<!-- ko --><dl><dd><!-- ko_end --></dl>"; $subjk_link = " <a href=\"$cgipath$rescgi/$folder/$newres/k1\" style=\"text-decoration\:none\;\">□一言</a>"; $subjh = " <a href=\"$cgipath$rescgi/$folder/$newres/r1\" style=\"text-decoration\:none\;\">□返信</a>"; if($hitokoto_on){ undef $subjk; undef $subjk_link; } if($hensin_on){ undef $subjh; } #新スレッドを作成 open(NS,">$bbspath$folder/$newres.html"); flock(NS, 2); $line = <<EOL; <html><head><title>$subj
$subj $delrespass
1 投稿者:自動作成  投稿日:$date$IDNO $subjk_link$subjh
前回迄のスレッドこちら
$urlbase$folder/$res.html $delmode$subjk
EOL $line =~ s/\n//g; print NS "$line\n"; $toukouran = '1'; &toukou; $line = $toukouform; $line =~ s/\n//g; print NS "$line\n"; flock(NS, 8); close NS; utime($ts+1,$ts+1,"$bbspath$folder/$newres.html"); #新スレッドのindex?.html表示用ログ作成 $res = $newres; $startres =1; &koresv; } #書き込み者IP記録 sub iplogout { if($iplog_out == 1){ $ipfile = "$bbspath/$folder/$iplog$year$month.dat"; if(!$ipname){$ipname = "小レス$mago";} if(!$ipcomm){$ipcomm = substr($comm, 0, 40);} open(IP,">> $ipfile"); flock(IP,2); print(IP "$res<>$rescnt<>$ipname<>$date<>$ipcomm<>$host<>$addr<>$http_via<>$http_forwarded<>$http_x_forwarded_for<>$user_id\n"); flock(IP,8); close(IP); chmod(0600,$ipfile); if($month == 01){ $delmonth = 10; if($year =~ /^0/){$year = substr($year, -1);} $year = $year-1; if($year < 10){$year = "0$year";} $delyear = $year; }elsif($month == 02){ $delmonth = 11; if($year =~ /^0/){$year = substr($year, -1);} $year = $year-1; if($year < 10){$year = "0$year";} $delyear = $year; }elsif($month == 03){ $delmonth = 12; if($year =~ /^0/){$year = substr($year, -1);} $year = $year-1; if($year < 10){$year = "0$year";} $delyear = $year; }else{ if($month =~ /^0/){$month = substr($month, -1);} $month = $month-3; $delmonth = "0$month"; $delyear = $year; } $delfile = "$bbspath$folder/$iplog$delyear$delmonth.dat"; unlink($delfile); } } #新規スレッド作成チェック sub check { $checkip = $addr; $checktime = time; open(Z, "$thredcheckdat"); while(){ chop; ($checkip_o, $checktime_o) = split; $checkiplist{$checkip_o} = $checktime_o if $checktime - $checktime_o < $thredchecktime; } close(Z); if($checkiplist{$checkip}){ $remain = $thredchecktime - ($checktime - $checkiplist{$checkip}); &error("あと " . $remain . "秒たってから投稿してください"); } $checkiplist{$checkip} = $checktime; open(Z, "> $thredcheckdat"); for (keys %checkiplist){ print Z "$_ $checkiplist{$_}\n"; } close(Z); } #直前レス(他のスレ含む)と同じ内容かチェック sub chyokuzenrescheck { open(CHR, "$bbspath$folder/$rescheckdat"); while(){ chop; $rescheckcomm = $_; if($comm eq $rescheckcomm){ &error("直前の" . $checkreskazu . "回分の書き込みに、全く同じ内容があります."); } } close(CHR); open(HR, "$bbspath$folder/$rescheckdat"); @checkres =
; close(HR); $hozonreskazu = @checkres; $kakikoreskazu = $hozonreskazu - $checkreskazu; for($i=0;$i < $hozonreskazu;$i++){ if($i > $kakikoreskazu){ @commlist = (@commlist,"$checkres[$i]"); } } push(@commlist,"$comm\n"); open(CHR, "> $bbspath$folder/$rescheckdat"); flock(CHR,2); seek(CHR, 0, 0); print(CHR @commlist); flock(CHR,8); close(CHR); } #連続書き込み回数のチェック sub renzokukakikocheck { $checknowtime = time; $checkaidatime = $checkaidahour*60*60; $checkaddr = $addr; $checkkcdat = "$bbspath$folder/$kaisucheckdat"; open(CK, "$checkkcdat"); while(){ chop; ($hozonaddr, $kakikokaisu,$saisyokakikojikan) = split(/,/,$_); } close(CK); if($hozonaddr == $checkaddr){ $kakikokaisu++; if($checknowtime - $saisyokakikojikan <= $checkaidatime){ if($kakikokaisu >= $kakikolimit){ open(CKH, ">> $hosturl"); flock(CKH,2); print(CKH "$hozonaddr\n"); flock(CKH,8); close(CKH); chmod(0600,$hosturl); $hozonjyouhou = "$hozonaddr,1,$checknowtime\n"; $kakikokiseiiki = 1; }else{ $hozonjyouhou = "$hozonaddr,$kakikokaisu,$saisyokakikojikan\n"; } }else{ $hozonjyouhou = "$hozonaddr,1,$checknowtime\n"; } }else{ $hozonjyouhou = "$checkaddr,1,$checknowtime\n"; } open(CKI, "> $checkkcdat"); flock(CKI,2); seek(CKI, 0, 0); print(CKI $hozonjyouhou); flock(CKI,8); close(CKI); chmod(0600,$checkkcdat); }