#!/usr/local/bin/perl use strict; require 'jcode.pl'; ### bbs.cgi ver 2.31 (2001/08/22) # システム情報 use vars qw($KEEPLOGCOUNT); $KEEPLOGCOUNT = 4096; # ログファイル保持数(システム設定) #================================================== # システム関連(タイムゾーン・シグナル) #================================================== #タイムゾーンをセットする { $ENV{'TZ'} = "JST-9"; } #シグナル対処関数 sub SigExit { exit(0); } #対応シグナル { $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "SigExit"; } #================================================== # 初期情報の取得(POST) #================================================== { use vars qw(%FORM); use vars qw($buffer); my (@pairs, $name, $value, $check); $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split /&/,$buffer;$buffer=undef; foreach (@pairs) { ($name, $value) = split /=/; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2',$1)/eg; $value =~ s//>/g; $value =~ s/\r\n|\r|\n/
/g; $value =~ s/^(?:
)+//g; $value =~ s/(?:
)+$//g; $value =~ s/(?:
){4,}/


/g; $value =~ s/($check)[\201-\237\340-\374]
/$1
/g; $buffer .= $value; $FORM{$name} = $value; } } if((&jcode'getcode(*buffer))[1] ne 'sjis'){ DispError("ERROR!","ERROR:Sjisで書いてね。。。"); } if($FORM{'submit'} !~ /^[\x81-\x95|\xE0-\xEF]/ || length($FORM{'submit'}) < 6){ DispError("ERROR!","ERROR:文字化けしちゃうよ。。。"); } if(length($FORM{'time'})<9){ DispError("ERROR!","ERROR:フォーム情報が不正です!"); } } #================================================== # 設定 #================================================== { use vars qw(%SETTING); use vars qw(%FLAG); use vars qw($HOST); use vars qw($DATE); use vars qw($ID); # 各種PATH生成 use vars qw($WWWPATH); use vars qw($PATH); use vars qw($DATPATH); use vars qw($TEMPPATH); use vars qw($IMODEPATH); $FORM{'bbs'} =~ s/\0//g; $PATH = "../" . $FORM{'bbs'} . "/"; $DATPATH = $PATH . "dat/"; $TEMPPATH = $PATH . "html/"; $IMODEPATH = $PATH . "i/"; use vars qw($NOWTIME); $NOWTIME = time; $FLAG{'FROM'}=$FORM{'FROM'}; $FLAG{'mail'}=$FORM{'mail'}; } #================================================== # 初期情報の取得(設定ファイル) #================================================== { # 設定ファイルを読む my ($m_pass,$m_key,$m_value); $m_pass = $PATH . "SETTING.TXT"; if(-e $m_pass){ open(FILE,$m_pass); foreach (){ chop; ($m_key,$m_value) = split /=/; $SETTING{$m_key} = $m_value; } close(FILE); }else{ # 設定ファイルがない(ERROR) DispError("ERROR!","ERROR:ユーザー設定が消失しています!"); } # 欠落情報の補完 unless($SETTING{'BBS_THREAD_NUMBER'}){$SETTING{'BBS_THREAD_NUMBER'}=20;} unless($SETTING{'BBS_CONTENTS_NUMBER'}){$SETTING{'BBS_CONTENTS_NUMBER'}=10;} unless($SETTING{'BBS_LINE_NUMBER'}){$SETTING{'BBS_LINE_NUMBER'} = 30;} unless($SETTING{'BBS_MAX_MENU_THREAD'}){$SETTING{'BBS_MAX_MENU_THREAD'}=100;} unless($SETTING{'BBS_BG_COLOR'}){$SETTING{'BBS_BG_COLOR'}="#FFFFFF";} unless($SETTING{'BBS_MENU_COLOR'}){$SETTING{'BBS_MENU_COLOR'}="#CCFFCC";} unless($SETTING{'BBS_MAKETHREAD_COLOR'}){$SETTING{'BBS_MAKETHREAD_COLOR'}="#CCFFCC";} unless($SETTING{'BBS_THREAD_COLOR'}){$SETTING{'BBS_THREAD_COLOR'}="#EFEFEF";} unless($SETTING{'BBS_SUBJECT_COLOR'}){$SETTING{'BBS_SUBJECT_COLOR'}="#FF0000";} unless($SETTING{'BBS_TEXT_COLOR'}){$SETTING{'BBS_TEXT_COLOR'}="#000000";} unless($SETTING{'BBS_NAME_COLOR'}){$SETTING{'BBS_NAME_COLOR'}="#008800";} unless($SETTING{'BBS_LINK_COLOR'}){$SETTING{'BBS_LINK_COLOR'}="#0000FF";} unless($SETTING{'BBS_ALINK_COLOR'}){$SETTING{'BBS_ALINK_COLOR'}="#FF0000";} unless($SETTING{'BBS_VLINK_COLOR'}){$SETTING{'BBS_VLINK_COLOR'}="#660099";} unless($SETTING{'BBS_TITLE_COLOR'}){$SETTING{'BBS_TITLE_COLOR'}="#000000";} unless($SETTING{'BBS_SUBJECT_COUNT'}){$SETTING{'BBS_SUBJECT_COUNT'}=64;} unless($SETTING{'BBS_NAME_COUNT'}){$SETTING{'BBS_NAME_COUNT'}=64;} unless($SETTING{'BBS_MAIL_COUNT'}){$SETTING{'BBS_MAIL_COUNT'}=64;} unless($SETTING{'BBS_MESSAGE_COUNT'}){$SETTING{'BBS_MESSAGE_COUNT'}=4096;} #unless($SETTING{'BBS_THREAD_TATESUGI'}){$SETTING{'BBS_THREAD_TATESUGI'}=5;} unless($SETTING{'timecount'}){$SETTING{'timecount'}=15;} unless($SETTING{'timeclose'}){$SETTING{'timeclose'}=15;} unless($SETTING{'BBS_WAIT_MINUTE'}){$SETTING{'BBS_WAIT_MINUTE'}=3;} unless($SETTING{'BBS_MAX_RES_COUNT'}){$SETTING{'BBS_MAX_RES_COUNT'}=1000;} unless($SETTING{'BBS_MAX_RES_SIZE'}){$SETTING{'BBS_MAX_RES_SIZE'}=500;} } #================================================== # 初期情報の取得(日付) #================================================== { # 日付と時間をげとする my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); my ($myear, $mtd, $dday, $uruu); my ($wmon, $wmday, $wwday, $wdday); my ($nmon, $nday, $dtime, $nhour, $nmin, $nsec); my ($qyear, $quruu, $qmon, $qday, $qrokuyou); ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($NOWTIME); $myear = $year + 1900; $wday = ("日", "月", "火", "水", "木", "金", "土")[$wday]; if ( $SETTING{'BBS_LUNISOLAR_CALENDAR'} ) { # 旧暦の計算(qreki.plが必要) # qreki.plの入手先 → http://www3.biwako.ne.jp/~nobuaki/qreki/ require './qreki.pl'; ($qyear, $quruu, $qmon, $qday) = &qreki::calc_kyureki($myear, $mon + 1, $mday); $qrokuyou = ( $qmon + $qday ) % 6; $quruu = ("", "閏")[$quruu]; $qrokuyou = ("大安", "赤口", "先勝", "友引", "先負", "仏滅")[$qrokuyou]; } if (( $SETTING{'BBS_WORLD_CALENDAR'} ) || ( $SETTING{'BBS_DECIMAL_CALENDAR'} )) { # 閏年の判定 if (( $myear % 4 == 0 ) && ( $myear % 100 != 0 ) || ( $myear % 400 == 0 )) { $uruu = 1; } else { $uruu = 0; } # 通日の計算 ( 0 〜 364 ( 平年 ), 365 ( 閏年 ) ) $mtd = ( 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 )[$mon]; $dday = $mtd + $mday - 1; if (( $uruu == 1 ) && ( $mon >= 2 )) { $dday++; } } if ( $SETTING{'BBS_WORLD_CALENDAR'} ) { # 世界暦の計算 if (( $uruu == 1 ) && ( $dday >= 183 )) { $wdday = $dday - 1; } else { $wdday = $dday; } if (( $uruu == 1 ) && ( $dday == 182 )) { $wmon = 6; $wmday = 31; $wwday = "世"; } elsif (( $uruu == 1 ) && ( $dday == 365 ) || ( $uruu == 0 ) && ( $dday == 364 )) { $wmon = 12; $wmday = 31; $wwday = "世"; } else { $wmon = int ( $wdday / ( 91 / 3 )) + 1; $wmday = int ( $wdday - ( $wmon - 1 ) * ( 91 / 3 )) + 1; $wwday = ("日", "月", "火", "水", "木", "金", "土")[($wdday % 7)]; } } if ( $SETTING{'BBS_DECIMAL_CALENDAR'} ) { # 10進の暦法の計算 if ( $dday == 365 ) { $nmon = 9; $nday = 36; } else { $nmon = int ( $dday / 36.5 ); $nday = int ( $dday - $nmon * 36.5 ); } # 10進の時法の計算 $dtime = ( $hour * 3600 + $min * 60 + $sec ) / 0.864; $nhour = int ( $dtime / 10000 ); $nmin = int (( $dtime - $nhour * 10000 ) / 100 ); $nsec = int ( $dtime - $nhour * 10000 - $nmin * 100 ); } # 日付・時間の合成 $DATE = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $myear, $mon + 1, $mday, $wday, $hour, $min); if ( $SETTING{'BBS_LUNISOLAR_CALENDAR'} ) { $DATE .= sprintf(" 旧暦:%04d/%s%02d/%02d(%s) %02d:%02d", $qyear, $quruu, $qmon, $qday, $qrokuyou, $hour, $min); } if ( $SETTING{'BBS_WORLD_CALENDAR'} ) { $DATE .= sprintf(" 世界暦:%04d/%02d/%02d(%s) %02d:%02d", $myear, $wmon, $wmday, $wwday, $hour, $min); } if ( $SETTING{'BBS_DECIMAL_CALENDAR'} ) { $DATE .= sprintf(" 十\進暦:%04d/%01d/%02d #%01d%02d", $myear, $nmon, $nday, $nhour, $nmin); } # ID my $idnum = substr($ENV{'REMOTE_ADDR'}, 8); my $idcrypt = substr(crypt($idnum * $idnum, substr($DATE, 8, 2)), -8); $ID = " ID:".$idcrypt; # 有効期限をつくる my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); my $exp = 24 * 60 * 60; $exp *= 30; #有功日数を乗じる ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($NOWTIME + $exp); $wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wday]; $mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon]; $year = $year+1900;$mday = "0$mday" if ($mday < 10); $FLAG{'expires'} = "$wday, $mday-$mon-$year 00:00:00 GMT"; } #================================================== # ホスト取得 #================================================== { $FLAG{'PROXY'} = 0; my $host2; $HOST = $ENV{'REMOTE_ADDR'}; if ($HOST =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) { $HOST = gethostbyaddr(pack('c4',split(/\./, $HOST)), 2) || $HOST; } if ($ENV{'HTTP_VIA'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_VIA'}; } if ($ENV{'HTTP_X_FORWARDED_FOR'} =~ s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_X_FORWARDED_FOR'}; } if ($ENV{'HTTP_FORWARDED'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_FORWARDED'}; } $host2 = gethostbyaddr(pack('c4', split(/\./, $host2)), 2); $HOST .= "[$host2]" if ($host2); if ($HOST =~ /proxy/i && $host2 eq '') { $FLAG{'PROXY'} = 1; } if ($ENV{'HTTP_USER_AGENT'} =~ /ANONYMIZER/i) { $FLAG{'PROXY'} = 1; } if ($host2){ $FLAG{'PROXY'} = 1; } } #================================================== # i-mode検出 #================================================== { $FLAG{'imode'}=0; if($FORM{'submit'} eq 'かきこむ'){$FLAG{'imode'}=1;} if($ENV{'HTTP_USER_AGENT'} =~ /DoCoMo\//){$FLAG{'imode'}=1;} } #================================================== # パス情報(名前) #================================================== { $FLAG{'cap'}=''; if (-e "../caps.cgi" && $FORM{'mail'} =~ /#.+/) { my ($id1,$name1,$pass1); open(IN,"../caps.cgi"); foreach () { chop; ($id1,$name1,$pass1) = split /<>/; if($FORM{'mail'} =~ /#$pass1/){ $FLAG{'cap'} = "$name1 ★";$ID=" ID:???"; last; } } close(IN); } } #================================================== # アクセス規制 #================================================== { # 不正PROXY使用ですか、、、? # プロキシ制限の実施 if($FLAG{'PROXY'} == 1 && $SETTING{'BBS_PROXY_CHECK'} eq "checked") { DispError("ERROR!","ERROR:PROXY規制中!"); } if($HOST !~/jp$/ && $SETTING{'BBS_OVERSEA_PROXY'} eq "checked") { DispError("ERROR!","ERROR:PROXY規制中!"); } if($HOST !~ /jp$/ && $FORM{'subject'} ne '' && $SETTING{'BBS_OVERSEA_THREAD'} eq "checked") { DispError("ERROR!","jpドメインからスレッド立ててください"); } #-------------------------------ユーザー設定が異常です! if(-e "../z$FORM{'bbs'}/uerror.cgi"){ open (IN,"../$FORM{'bbs'}/uerror.cgi"); foreach (){ chop; if ($HOST =~ /$_/) { DispError("ERROR!","ユーザー設定が異常です!"); } } close(IN); } #-------------------------------リモートホストを公開します。 if (-e "../$FORM{'bbs'}/chubo.cgi" && !($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'})){ open (IN,"../$FORM{'bbs'}/chubo.cgi"); foreach (){ chop; if ($HOST =~ /$_/) { $FORM{'MESSAGE'} .= '

あなたのレスまたはスレッドの内容について問題があり、
'; $FORM{'MESSAGE'} .= '管理人からの警告にもかかわらず内容に改善が見られませんでしたので、
'; $FORM{'MESSAGE'} .= "あなたのリモートホスト
($HOST)を公開します。
"; $FORM{'MESSAGE'} .= '解除申請は事務所にお願いします。
'; } } close(IN); } #-------------------------------管理人から警告します。 if (-e "../$FORM{'bbs'}/keikoku.cgi" && !($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'})){ open (IN,"../$FORM{'bbs'}/keikoku.cgi"); foreach (){ chop; if ($HOST =~ /$_/) { $FORM{'MESSAGE'} .= '

あなたのレスまたはスレッドの内容について、管理人から警告します。
'; $FORM{'MESSAGE'} .= '内容に改善が見られない場合、あなたのリモートホストが公開されます。
'; $FORM{'MESSAGE'} .= '解除申請は事務所にお願いします。
'; } } close(IN); } #-------------------------------個別の規制 if (-e "../$FORM{'bbs'}/arashi.cgi" && !($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'})){ open (IN,"../$FORM{'bbs'}/arashi.cgi"); foreach (){ chomp; my ($arashikey , $arashihost); ($arashikey , $arashihost) = (split /<>/ , $_); if (($FORM{'key'} eq $arashikey) && ($HOST =~ /$arashihost/)) { DispError("ERROR!","荒らしさんの使ったリモートホストです。。。"); } } close(IN); } } #================================================== # 情報の修正(名前) #================================================== { #名前がなければ名無しさん(かちゅ〜しゃ使用者とそれ以外で振り分け) $FLAG{'NONAME'} = 0; unless($FORM{'FROM'}){ if (($ENV{'HTTP_USER_AGENT'} =~ /Katjusha/) || ($ENV{'HTTP_USER_AGENT'} =~ /kage/)) { $FORM{'FROM'} = $SETTING{'BBS_NONAME_NAME_KA'}; } else { $FORM{'FROM'} = $SETTING{'BBS_NONAME_NAME'}; } $FLAG{'NONAME'} = 1; if ($FLAG{'cap'}) {$FORM{'FROM'}='';} } if (($ENV{'HTTP_USER_AGENT'} !~ /Katjusha/) && ($ENV{'HTTP_USER_AGENT'} !~ /kage/)) { if ($FORM{'FROM'} eq $SETTING{'BBS_NONAME_NAME_KA'}) { $FORM{'FROM'} = $SETTING{'BBS_NONAME_NAME'}; } } } #================================================== # 情報の修正(キー) #================================================== # サブジェクトがある場合はキーを現在に設定 # サブジェクト&キーがない場合はエラー # サブジェクトが無くキーがある場合はキーを受けとる { if($FORM{'subject'}){ $FORM{'key'} = $NOWTIME; }else{ if(defined($FORM{'key'})){ # キーが数字じゃない場合ばいばい! if($FORM{'key'} =~ /\D/){ DispError("ERROR!","ERROR:キー情報が不正です!"); } }else{ if ($SETTING{'BBS_PASSWORD_CHECK'} eq "checked"){ print "Content-type: text/html; charset=shift_jis\n\n"; print < $SETTING{'BBS_TITLE'} EOF if($SETTING{'BBS_TITLE_PICTURE'}){ print "
"; if($SETTING{'BBS_TITLE_LINK'}){ print ""; } print ""; if($SETTING{'BBS_TITLE_LINK'}){ print ""; } print "
"; }else{ print "
"; if($SETTING{'BBS_TITLE_LINK'}){ print ""; } # print "

$SETTING{'BBS_TITLE'}

"; if($SETTING{'BBS_TITLE_LINK'}){ print "
"; } print "
"; } print "\n"; print <
\n"; print " \n"; print <
$SETTING{'BBS_TITLE'}
EOF if ($SETTING{'BBS_PROXY_CHECK'} eq "checked") { print " ■PROXY規制中■
\n"; } print "
"; &HTM("../right.txt"); print <
EOF &HTM($PATH."head.txt"); print "
タイトル:  
名前: E-mail(省略可)
内容:
EOF &HTM("../bottom.txt"); print "

\n
\n"; print "

\n"; exit; } DispError("ERROR!","ERROR:サブジェクトが存在しません!"); } } } #================================================== # 書き込み確認。 #================================================== { if ($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'}){ $FORM{'subject'}=~s/&/&/g;$FORM{'subject'}=~s/"/"/g; $FLAG{'FROM'}=~s/&/&/g;$FLAG{'FROM'}=~s/"/"/g; $FORM{'mail'}=~s/&/&/g;$FORM{'mail'}=~s/"/"/g; $FORM{'MESSAGE'}=~s/&/&/g;$FORM{'MESSAGE'}=~s/"/"/g; if ($FORM{'mail'}=~/hirakata/){&hirakata;} # if ($SETTING{'BBS_HIRAKATA_CHECK'} eq "checked"){&hirakata;} my $message2=$FORM{'MESSAGE'};$FORM{'MESSAGE'} =~ s/
/\n/g; # my $message2=$FORM{'MESSAGE'};$FORM{'MESSAGE'} =~ s/
/\n/g; print "Content-type: text/html; charset=shift_jis\n\n"; if (!$FLAG{'imode'}){ print < $SETTING{'BBS_TITLE'} 書き込み確認。

書き込みに関して様々なログ情報が記録されています。
公序良俗に反したり、他人に迷惑をかける書き込みは控えて下さい
タイトル:$FORM{'subject'}
名前:$FLAG{'FROM'} E-mail(省略可): $FORM{'mail'}
内容:
    $message2


変更する場合は戻るボタンで戻って書き直して下さい。
EOF exit; } else { print < 書き込み確認。

書き込みに関して様々なログ情報が記録されています。
公序良俗に反したり、他人に迷惑をかける書き込みは控えて下さい
タイトル:$FORM{'subject'}
名前:$FLAG{'FROM'} E-mail(省略可): $FORM{'mail'}
内容:
    $message2

全責任を負うことを承諾して
変更する場合は戻るボタンで戻って書き直して下さい。
EOF exit; } } } #================================================== # 名前いれてちょ。。。 #================================================== { if($SETTING{'NANASHI_CHECK'} eq 1 && $FLAG{'NONAME'} && $FLAG{'cap'} eq ''){ DispError("ERROR!","ERROR:名前いれてちょ。。。"); } if($SETTING{'SUBBBS_CGI_ON'} eq 1 && $ENV{'HTTP_COOKIE'} eq ''){ if(!$FLAG{'imode'}){ if($SETTING{'BBS_NAMECOOKIE_CHECK'} eq "checked"){ print "Set-Cookie: NAME=$FLAG{'FROM'}; expires=$FLAG{'expires'}; path=/\n"; } if($SETTING{'BBS_MAILCOOKIE_CHECK'} eq "checked"){ print "Set-Cookie: MAIL=$FLAG{'mail'}; expires=$FLAG{'expires'}; path=/\n"; } } DispError("ERROR!","ERROR:クッキーをオンにしてちょ。"); } } #================================================== # ブラウザ変ですよん #================================================== { if($ENV{'HTTP_USER_AGENT'} =~ /Mozilla/){ if($ENV{'HTTP_REFERER'} !~ /$ENV{'HTTP_HOST'}/){ DispError("ERROR!","ERROR:ブラウザ変ですよん"); } if($ENV{'HTTP_REFERER'} !~ /$FORM{'bbs'}/ && $FORM{'subject'} eq ''){ DispError("ERROR!","ERROR:ブラウザ変ですよん"); } } } #================================================== # スレッドの書き込み規制 #================================================== { my $keyfile = $FORM{'key'} . ".dat"; if(-s "$DATPATH$keyfile" > 550000) { DispError("ERROR!","ERROR:このスレッド大きすぎます"); } if(-e "$DATPATH$keyfile"){ #データを取得 use vars qw(@keytemp); open(DAT,"$DATPATH$keyfile"); @keytemp=; close(DAT); my ($date, $subject); $date = (split /<>/,$keytemp[@keytemp-1])[2]; $subject = (split /<>/,$keytemp[0])[4]; chomp($subject); $FLAG{'subject'} = $subject; $FLAG{'subnum'} = @keytemp; if ($date =~/Over|\Qストッパー\E|停止/) { DispError("ERROR!","ERROR:このスレッドには書けません!"); } } } #================================================== # フィールドサイズの判定 #================================================== if(! $FLAG{'cap'}){ # 末尾の空白を削る my $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; $FORM{'FROM'} =~ s/($check)(?: | )+$/$1/g; $FORM{'mail'} =~ s/($check)(?: | )+$/$1/g; $FORM{'subject'} =~ s/($check)(?: | )+$/$1/g; $FORM{'MESSAGE'} =~ s/($check)(?: | )+
/$1
/g; $FORM{'MESSAGE'} =~ s/($check)(?: | )+$/$1/g; # unless ($FORM{'FROM'}) {$FORM{'FROM'} = ' ';} if(length($FORM{'subject'}) > $SETTING{'BBS_SUBJECT_COUNT'}){ DispError("ERROR!","ERROR:サブジェクトが長すぎます!"); } if(length($FORM{'FROM'}) > $SETTING{'BBS_NAME_COUNT'}){ DispError("ERROR!","ERROR:名前が長すぎます!"); } if(length($FORM{'mail'}) > $SETTING{'BBS_MAIL_COUNT'}){ DispError("ERROR!","ERROR:メールアドレスが長すぎます!"); } if(length($FORM{'MESSAGE'}) > $SETTING{'BBS_MESSAGE_COUNT'}){ DispError("ERROR!","ERROR:本文が長すぎます!
このエラーが出る時は、掲示板が移転している場合があります。。"); } if(length($FORM{'MESSAGE'}) == 0){ DispError("ERROR!","ERROR:本文がありません!"); } } #================================================== # NGワードチェック #================================================== #if (-e "../$FORM{'bbs'}/ngword.cgi" && !($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'})){ if (-e "../$FORM{'bbs'}/ngword.cgi"){ open (IN,"../$FORM{'bbs'}/ngword.cgi"); foreach (){ chomp; $_ =~ s/\r\n|\r|\n//g; $FORM{'MESSAGE'} =~ s/\Q$_\E/(NGワード)<\/b>/g; # if ($FORM{'MESSAGE'} =~ /$_/) { # DispError("ERROR!","ERROR:NGワードが含まれています。書き直してちょ。"); # } } close(IN); } #================================================== # スレッド立てすぎチェック #================================================== { if($FORM{'subject'} && $SETTING{'BBS_THREAD_TATESUGI'}>=2){ my $file = $PATH . "RIP.cgi"; my @IP; if(-e $file){ open(RIP,"<$file"); @IP = ; close(RIP); foreach(@IP){ chop; if($HOST eq $_){ DispError("ERROR!","ERROR:スレッド立てすぎです。。。"); } } @IP=@IP[0..$SETTING{'BBS_THREAD_TATESUGI'}-2]; } unshift(@IP,$HOST); open(WIP,">$file"); eval{flock(WIP,2);}; foreach(@IP){ print WIP "$_\n"; } eval{flock(WIP,8);}; close(WIP); chmod(0666,$file); } } #================================================== # 連続投稿規制 #================================================== { if($SETTING{'timecount'}>=2){ my ($key,$host1);my @IP;my $count=0;my $file = $PATH . "timecheck.cgi"; if(-e $file){ open(RIP,"<$file"); @IP = ; close(RIP); foreach(@IP){ chop; ($key,$host1) = split /<>/; if($HOST eq $host1){ if($FORM{'time'} eq $key){ DispError("ERROR!","ERROR:2重カキコですか??"); } $count++; } } @IP=@IP[0..$SETTING{'timecount'}-2]; } if($count >= $SETTING{'timecount'}) { DispError("ERROR!","ERROR:連続投稿ですか??"); } unshift(@IP,"$FORM{'time'}<>$HOST"); open(WIP,">$file"); eval{flock(WIP,2);}; foreach(@IP){ print WIP "$_\n"; } eval{flock(WIP,8);}; close(WIP); chmod(0666,$file); } } #================================================== # 置き換え #================================================== { $FORM{'FROM'} =~s/◆/◇/g; if (($FORM{'FROM'} ne $SETTING{'BBS_NONAME_NAME'}) && ($FORM{'FROM'} ne $SETTING{'BBS_NONAME_NAME_KA'})){ $FORM{'FROM'} =~s/★/☆/g; } $FORM{'FROM'} =~ s/&(rl[emo]|lr[emo]);//g; $FORM{'mail'} =~ s/&(rl[emo]|lr[emo]);//g; $FORM{'subject'} =~ s/&(rl[emo]|lr[emo]);//g; $FORM{'FROM'} =~s/削除/"削除"/g; $FORM{'FROM'} =~s/sakujyo/"sakujyo"/g; $FORM{'FROM'} =~s/管理人/"管理人"/g; $FORM{'FROM'} =~s/管直人/"管直人"/g; $FORM{'FROM'} =~s/菅直人/"菅直人"/g; # トリップ my ($key,$salt); $FORM{'FROM'} =~ s/&#/<&>/g; if($FORM{'FROM'}=~/#(.+)/){ $key = $1; $salt = substr($key."H.", 1, 2); $salt =~ s/[^\.-z]/\./go; $salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/; $FLAG{'trip'} = substr(crypt($key, $salt),-10); } $FORM{'FROM'} =~ s/#.*//g; $FORM{'FROM'} =~ s/<&>/&#/g; $FORM{'mail'} =~ s/#.*//g; if($FLAG{'trip'}){ $FORM{'FROM'}.=" "if($FORM{'FROM'}); $FORM{'FROM'}.=""; } if($FLAG{'cap'}){ $FLAG{'cap'}="@$FLAG{'cap'}"if($FORM{'FROM'}); $FORM{'FROM'}.="$FLAG{'cap'}"; } my $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; $FORM{'FROM'} =~ s/($check)fusianasan/$1/g; $FORM{'FROM'} =~ s//<\/b>$HOST/g; if ($FORM{'FROM'} =~ /($check)nukeanasan/){ $FORM{'FROM'} =~ s/($check)nukeanasan/$1/g; my $USERAGENT = $ENV{'HTTP_USER_AGENT'}; if ($USERAGENT =~ /[\0-\37\177-\377]/){ DispError("ERROR!","ERROR:User Agentをいじってんじゃねぇよゴルァ(゚Д゚)"); } $USERAGENT =~ s//>/g; $FORM{'FROM'} =~ s//<\/b>$USERAGENT<\/small><\/font>/g; } $FORM{'FROM'} =~ s//◆<\/b>$FLAG{'trip'}/g; $FORM{'MESSAGE'} =~ s/\t//g; if ($FORM{'mail'} =~ /hirakata/){&hirakata;} # if ($SETTING{'BBS_HIRAKATA_CHECK'} eq "checked"){&hirakata;} $FORM{'MESSAGE'} =~ s/($check)[\201-\237\340-\374]&/$1&/g; $FORM{'MESSAGE'} =~ s/(>>\d+-?\d*)/$1<\/r>/g; $FORM{'MESSAGE'} =~ s/>>(\d+)-(\d+)<\/r>/>>$1-$2<\/a>/g; $FORM{'MESSAGE'} =~ s/>>(\d+)-<\/r>/>>$1-<\/a>/g; $FORM{'MESSAGE'} =~ s/>>(\d+)<\/r>/>>$1<\/a>/g; $FORM{'MESSAGE'} =~ s/<\/?r>//g; } #================================================== # 情報の修正 #================================================== { # UNICODE置き換え $FORM{'mail'} =~ s/&#[x0-9a-fA-F;]+/&;/g; $FORM{'subject'} =~ s/&#[x0-9a-fA-F;]+/&;/g; if ($SETTING{'BBS_UNICODE'} ne "pass"){ $FORM{'FROM'} =~ s/&#[x0-9a-fA-F;]+/&;/g; $FORM{'MESSAGE'} =~ s/&#[x0-9a-fA-F;]+/?/g; } # 1行データからは改行を削ります $FORM{'FROM'} =~ s/
//g; $FORM{'mail'} =~ s/
//g; $FORM{'subject'} =~ s/
//g; # デカ文字対策 $FORM{'FROM'} =~ s/"/"/g; $FORM{'mail'} =~ s/"/"/g; $FORM{'subject'} =~ s/"/"/g; ##$FORM{'mail'} =~ s/ //g; # 末尾にsjisの1バイト目があったら削る my $check1 = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; my $check2 = '[\201-\237\340-\374]'; $FORM{'FROM'} =~ s/($check1)$check2$/$1/g; $FORM{'mail'} =~ s/($check1)$check2$/$1/g; $FORM{'subject'} =~ s/($check1)$check2$/$1/g; $FORM{'MESSAGE'} =~ s/($check1)$check2$/$1/g; # mail欄にpreと入れると
を、teletypeと入れるとを挿入
	if ($FORM{'mail'} =~ /pre/) {
		$FORM{'MESSAGE'} = "
$FORM{'MESSAGE'}
"; $FORM{'MESSAGE'} =~ s/
/
/g; } elsif ($FORM{'mail'} =~ /teletype/) { $FORM{'MESSAGE'} = "$FORM{'MESSAGE'}"; } } #================================================== # ID・IP表示 #================================================== { if ($FORM{'mail'} ne '' && $SETTING{'BBS_FORCE_ID'} ne "checked") { $ID = " ID:???"; } if ($SETTING{'BBS_ADMIN_NAME'} && $FLAG{'cap'} =~ /$SETTING{'BBS_ADMIN_NAME'}/) { $ID = " ID:$SETTING{'BBS_ADMIN_ID'}"; } if ($SETTING{'BBS_NO_ID'} ne "checked") { $DATE .= $ID; } if ($SETTING{'BBS_DISP_IP'} eq "checked") { $DATE .=" [ $HOST ]"; } } #================================================== # ファイル操作(サブジェクトファイル読み込み) #================================================== { use vars qw(@PAGEFILE); use vars qw(%SUBJECT); use vars qw($FILENUM); my ($subtt,$subtm,$subval,$subnum); my ($file, $value, $filename); my $subject = $PATH . "subject.txt"; my $keyfile = $FORM{'key'} . ".dat"; undef $subtm; undef $subtt; # サブジェクトファイルを読み込む open(SUBR,"<$subject"); eval{flock(SUBR,1);}; foreach(){ chop; ($file, $value) = split /<>/; unless($file){next;} $filename = $DATPATH . $file; if(-e $filename){ # datが存在する場合順番に追加 push(@PAGEFILE,$file); $SUBJECT{$file} = $value; } } eval{flock(SUBR,8);}; close(SUBR); # サブジェクト数を取得 $FILENUM=@PAGEFILE; if($FORM{'subject'}){$FILENUM++;} # ログを定数に揃える if($FILENUM > $KEEPLOGCOUNT){ for(my $start=$KEEPLOGCOUNT;$start<$FILENUM;$start++){ my ($key,$delfile); $delfile = $DATPATH . $PAGEFILE[$start]; unlink($delfile); $key = $PAGEFILE[$start]; $key =~ s/([^\.]*)\.dat/$1/; $delfile = $TEMPPATH . $key . ".html"; unlink($delfile); } $FILENUM = $KEEPLOGCOUNT; my @temp; @temp = @PAGEFILE[0..$FILENUM]; undef @PAGEFILE; @PAGEFILE = @temp; } # サブジェクトが存在するか? unless($FORM{'subject'}){ # 無い場合 # データファイルがあるか検証 unless(-e "$DATPATH$keyfile"){ DispError("ERROR!","ERROR:該当スレッドがありません!"); } $subval = $FLAG{'subject'}; $subnum = $FLAG{'subnum'}; $subnum++; # if($subnum > 999){$subnum++;} }else{ # サブジェクトがある場合それは新規スレッドである・・ $subval = $FORM{'subject'}; $subnum = 1; } # レス数とdat容量が規定値を超えていたらレス数を+1する my $datafile = $DATPATH . $FORM{'key'} . ".dat"; if ($subnum > ($SETTING{'BBS_MAX_RES_COUNT'} - 1)) {$subnum++;} if (-s "$datafile" >= ($SETTING{'BBS_MAX_RES_SIZE'} * 1024)) {$subnum++;} $subtt = "$subval ($subnum)"; $subtm = "$keyfile<>$subtt"; # サブジェクトハッシュを書き換える $SUBJECT{$keyfile}=$subtt; #スレの1と現在のメール欄からデフォルトのモードを判定 unless ($FORM{'subject'}) { open (MODE,"../$FORM{'bbs'}/dat/$FORM{'key'}.dat"); my @LOG = ; close (MODE); my $mailcom = (split /<>/,$LOG[0])[1]; undef @LOG; if ($mailcom =~/hane/) {$FLAG{'submode'} = 'hane';} elsif ($mailcom =~/kage/) {$FLAG{'submode'} = 'kage';} elsif ($mailcom =~/sage/) {$FLAG{'submode'} = 'sage';} elsif ($mailcom =~/dame/) {$FLAG{'submode'} = 'dame';} else {$FLAG{'submode'} = '';} } if ($FORM{'mail'} =~/^age/) {$FLAG{'submode'} = '';} elsif ($FORM{'mail'} =~/hane/) {$FLAG{'submode'} = 'hane';} elsif ($FORM{'mail'} =~/kage/) {$FLAG{'submode'} = 'kage';} elsif ($FORM{'mail'} =~/sage/) {$FLAG{'submode'} = 'sage';} elsif ($FORM{'mail'} =~/dame/) {$FLAG{'submode'} = 'dame';} # サブジェクトテキストを開く { my $newsub; $newsub = ""; # haneのときは適当な場所に飛ばす if ($FLAG{'submode'} eq 'hane') { my (@temp,$random); srand; $random = int(rand (@PAGEFILE - 1)); foreach(@PAGEFILE){ if(@temp == $random){ $temp[@temp]=$keyfile; $newsub .= "$subtm\n"; } if($_ ne $keyfile){ $temp[@temp]=$_; $newsub .= "$_<>$SUBJECT{$_}\n"; } } @PAGEFILE=@temp; # kageのときは真ん中に持ってくる } elsif ($FLAG{'submode'} eq 'kage') { my (@temp,$middle); $middle = int(@PAGEFILE / 2); foreach(@PAGEFILE){ if(@temp == $middle){ $temp[@temp]=$keyfile; $newsub .= "$subtm\n"; } if($_ ne $keyfile){ $temp[@temp]=$_; $newsub .= "$_<>$SUBJECT{$_}\n"; } } @PAGEFILE=@temp; # sageの時は上がらない } elsif ($FORM{'subject'} eq "" && $FLAG{'submode'} eq 'sage') { foreach(@PAGEFILE){ $newsub .= "$_<>$SUBJECT{$_}\n"; } # dameの時は一番下に移す } elsif ($FLAG{'submode'} eq 'dame') { my @temp; foreach(@PAGEFILE){ if($_ ne $keyfile){ $temp[@temp]=$_; $newsub .= "$_<>$SUBJECT{$_}\n"; } } $temp[@temp]=$keyfile; $newsub .= "$subtm\n"; @PAGEFILE=@temp; # それ以外は全てage(一番上に移す) } else { my @temp; $temp[0]=$keyfile; $newsub = "$subtm\n"; foreach(@PAGEFILE){ # 上がるキーは一番最初に持ってくる # keyfileは現在書き込みしたスレッドキー(上がっている) if($_ ne $keyfile){ $temp[@temp]=$_; $newsub .= "$_<>$SUBJECT{$_}\n"; } } @PAGEFILE=@temp; } #一括書き込み(板飛び対策入り) # 読み書きモードでオープン open(SUBW,"+<$subject"); eval{flock(SUBW,2);}; # ファイルポインタを先頭に seek(SUBW, 0, 0); print SUBW $newsub; # 新ファイルサイズを出力 eval{truncate(SUBW, tell(SUBW));}; # (念のため)ロック解除はクローズ処理任せに # eval{flock(SUBW,8);}; close(SUBW); } # i-mode用テキストを開く { unless(-e $IMODEPATH){ mkdir($IMODEPATH,0777); } my $imodeindex = $IMODEPATH . "index.html"; open(SUBW,">$imodeindex"); eval{flock(SUBW,2);}; # 一括書き込み print SUBW "\n"; print SUBW "\n"; print SUBW "$SETTING{'BBS_TITLE'}\n"; print SUBW "\n"; print SUBW "おんぷちゃんねる i-mode
トップ
"; print SUBW "$SETTING{'BBS_TITLE'}
"; my ($count,$key,$end,$subtitle); if($FILENUM<30){$end=$FILENUM;}else{$end=30;} for($count=1;$count<=$end;$count++){ @PAGEFILE[$count-1]=~ /(\d*)\.dat/; $key = $1; $subtitle = $SUBJECT{@PAGEFILE[$count-1]}; &jcode::z2h_sjis(\$subtitle); print SUBW "$count: $subtitle
"; } $count=@PAGEFILE; if ($count > 30){ print SUBW "
\n"; } print SUBW "
\n"; print SUBW < タイトル:
名前:
mail:
コメント


EOF print SUBW "
\n"; eval{flock(SUBW,8);}; close(SUBW); # パーミッション調整 chmod(0666,$imodeindex); } # 過去ログメニューをかーくー { my $sub = $PATH . "subback.html"; open(HED,">$sub"); eval{flock(HED,2);}; print HED< EOF my $dat; for(my $count=1;$count<=$FILENUM;$count++){ $PAGEFILE[$count-1]=~/(\d+)\.dat/; $dat=$1; print HED "$count: $SUBJECT{$PAGEFILE[$count-1]} \n"; } print HED "
倉庫はこちら"; print HED ""; eval{flock(HED,8);}; close(HED); } } #================================================== # クッキー発行 #================================================== { if(!$FLAG{'imode'}){ # クッキー食わせる if($SETTING{'BBS_NAMECOOKIE_CHECK'} eq "checked"){ print "Set-Cookie: NAME=$FLAG{'FROM'}; expires=$FLAG{'expires'}; path=/\n"; } if($SETTING{'BBS_MAILCOOKIE_CHECK'} eq "checked"){ print "Set-Cookie: MAIL=$FLAG{'mail'}; expires=$FLAG{'expires'}; path=/\n"; } } } #================================================== # ファイル操作(DATファイル更新) #================================================== { my $datafile = $DATPATH . $FORM{'key'} . ".dat"; open(OUT, ">> $datafile"); eval{flock(OUT,2);}; print OUT "$FORM{'FROM'}<>$FORM{'mail'}<>$DATE<>$FORM{'MESSAGE'}<>$FORM{'subject'}\n"; push(@keytemp,"$FORM{'FROM'}<>$FORM{'mail'}<>$DATE<>$FORM{'MESSAGE'}<>$FORM{'subject'}\n"); # レス数が規定値を超えるとスレストをかける if ($FLAG{'subnum'} > ($SETTING{'BBS_MAX_RES_COUNT'} - 2)) { my $maxres = $SETTING{'BBS_MAX_RES_COUNT'}; my $maxres1 = $maxres + 1; print OUT "$maxres1<><>Over $maxres Thread<>このスレッドは$maxresを超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。<>\n"; push (@keytemp,"$maxres1<><>Over $maxres Thread<>このスレッドは$maxresを超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。<>\n"); } # dat容量が規定値を超えるとスレストをかける if (-s "$datafile" >= ($SETTING{'BBS_MAX_RES_SIZE'} * 1024)) { my $maxsize = $SETTING{'BBS_MAX_RES_SIZE'} . "KB"; print OUT "$maxsize<><>Over $maxsize data<>このスレッドは$maxsizeを超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。<>\n"; push (@keytemp,"$maxsize<><>Over $maxsize data<>このスレッドは$maxsizeを超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。<>\n"); } eval{flock(OUT,8);}; close(OUT); # ----------------------------------------------------------------------- if(-e $PATH."log/"){ my $log = $PATH . "log/" . $FORM{'key'} . ".cgi"; my $num=$FLAG{'subnum'};$num++; open(WIP,">>$log"); eval{flock(WIP,2);}; print WIP "$num<>$ENV{'REMOTE_ADDR'}<>$HOST<>$NOWTIME\n"; eval{flock(WIP,8);}; close(WIP); chmod(0600,$log); } # ----------------------------------------------------------------------- # パーミッション調整 chmod(0666,$datafile); chmod(0777,"$DATPATH"); chmod(0777,"$PATH"); } #================================================== # ファイル操作(HTML作成用作業ファイル更新) #================================================== #HTML用DATを作成 { MakeWorkFile($FORM{'key'}); #パーミッション調整 chmod(0777,$TEMPPATH); } #================================================== # 本HTML吐き処理 #================================================== { use vars qw($INDEXFILE); $INDEXFILE = $PATH . "index.html"; open(HTM,">$INDEXFILE"); eval{flock(HTM,2);}; print HTM < $SETTING{'BBS_TITLE'} EOF if($SETTING{'BBS_TITLE_PICTURE'}){ print HTM "
"; if($SETTING{'BBS_TITLE_LINK'}){ print HTM ""; } print HTM ""; if($SETTING{'BBS_TITLE_LINK'}){ print HTM ""; } print HTM "
"; }else{ print HTM "
"; if($SETTING{'BBS_TITLE_LINK'}){ print HTM ""; } # print HTM "

$SETTING{'BBS_TITLE'}

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

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

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

"; &HTM("../bottom_ad.txt",1); print HTM "\n"; print HTM "
"; eval{flock(HTM,8);}; close(HTM); &location; } sub HTM { my ($file,$h) = @_; if(-e $file){ if($h){select(HTM);} open(IN, "$file"); print while ; close(IN); if($h){select(STDOUT);} } } sub location { if ($FLAG{'imode'}){ $PATH .= "i/index.html"; # $PATH =~ s/^\.\.\///g; print "Content-Type: text/html; charset=shift_jis\n\n"; print < 書き込みが完了しました。

掲示板に戻る
元のスレッドに戻る
EOF }else{ $PATH .= "index.html"; if ($SETTING{'BBS_LOCATION_CHECK'} eq 'checked') { print "Location: $PATH \n\n"; } else { print "Content-Type: text/html; charset=shift_jis\n\n"; print < 書きこみました。 書きこみが終わりました。

画面が切り替わるまでしばらくお待ち下さい。 EOF } } exit; } #エラー画面(エラー処理) #DispError(TITLE,TOPIC); sub DispError { my ($title,$topic)=@_; print "Content-Type: text/html; charset=shift_jis\n\n"; #----------------------------------------------------------------------- print < $title $topic
    $FORM{'subject'}
    名前: $FORM{'FROM'}
    E-mail: $FORM{'mail'}
    内容:
    $FORM{'MESSAGE'}

こちらでリロードしてください。 GO!
EOF my $headad = "../headad.txt";if(-e $headad){open(IN, "$headad");print while ;close(IN);} print < EOF #----------------------------------------------------------------------- exit; } #作業用ファイル作成 #MakeWorkFile(KEY-NUMBER); sub MakeWorkFile { my $key = $_[0]; my $workfile = $TEMPPATH . $key . ".html"; my $datafile = $DATPATH . $key . ".dat"; my (@messx,@content); my ($mailto,$time,$brmax,$topnum,$firstlog,$lognum,$name,$mail,$subject,$message); if(!-e $datafile){ open(SHTM,">$workfile"); print SHTM "return"; close(SHTM); return; } open(SHTM,">$workfile");# ログテンポラリを開く eval{flock(SHTM,2);}; # ログのカキコ数を取得 $lognum = @keytemp; # 1つ目の要素を読み込む $firstlog = $keytemp[0]; # 改行カット chomp($firstlog); # 1つ目の要素を加工する ($name,$mail,$time,$message,$subject) = split /<>/,$firstlog; my $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; $message =~ s/($check)(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/$1$2\:$3<\/a>/igo; # サブジェクトテーブルを吐き出す(ここは必ず1行にまとめること(処理効率)) #----------------------------------------------------------------------- print SHTM <
[\$ANCOR:$lognum]$subject
EOF #----------------------------------------------------------------------- # 1つ目の要素のメールへのリンクを作成 # 末尾にsjisの1バイト目があったら削る my $check1 = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; my $check2 = '[\201-\237\340-\374]'; $mail =~ s/($check1)$check2$/$1/g; $name =~ s/($check1)$check2$/$1/g; if($mail ne ''){ $mailto = "$name"; }else{ $mailto = "$name"; } # 1つ目の要素を吐き出す print SHTM "
1 名前:$mailto 投稿日:$time
$message


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