#! /usr/bin/perl #↑上の行はプロバイダーの環境に合わせて設定してください。 #☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ # WonderCatStudio Bulletin Board System 7.311 # BBS Note 7.x # 2000/12/07 >> LastModify 2003/08/11 # Created by WonderCatStudio NoraNeko #☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ ################################################################################################# # ################################################################################################# checkRemoteHost(); sub checkRemoteHost { my $RHOST = $ENV{'REMOTE_HOST'}; open(IN, "ip.cgi"); while ($xx = ) { if ($RHOST =~ m/$xx/) { print "Content-type: text/html\n\n"; exit; } } close(IN); } ################################################################################################# # ################################################################################################# ################################################################################################# # ################################################################################################# sub checkProxyList { my $RADDR = $ENV{'REMOTE_ADDR'}; $RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; my $query_addr = "$4.$3.$2.$1.niku.2ch.net"; my $addr = join('.', unpack('C*', gethostbyname($query_addr))); if ($addr eq '127.0.0.2') { print "Content-type: text/html\n\n"; exit; } return 0; } ################################################################################################# # ################################################################################################# ############################################ ########## 設定項目はありません ########## ############################################ #----------------------------------------------------------------------------- &Initialize; sub Initialize{ $BBS_Version = '7.31'; sub AdminPassCheck; sub AdminPageOpen; sub BrowsCss; sub CountFileOpen; sub DelImageFile(); sub errorexit; sub escape(); sub unescape(); sub FileAnalyze(); sub FileListCheck(); sub FileLogDel(); sub FileLogList; sub FileLogWrite(); sub FileLogResWrite(); sub FileSave(); sub FastBoot; sub FormMultipart; sub Function; sub filelock; sub fileunlock; sub fl(); sub call(); sub accid(); sub randstr; sub CatalogOpen; sub CookieWrite; sub GetCookie; sub GetFileCookie; sub GetBrowse; sub GetDate(); sub GetForm; sub GetMsgPassword(); sub HelpOpen; sub Initialize; sub ImgContinue; sub ImgReplace; sub MsgConvert; sub MsgEsc(); sub MsgWrite; sub MsgDelete; sub MsgReflesh; sub PostCheck(); sub PasswordCheck(); sub PageOpen; sub PageForm; sub PaintInt; sub PaletteOpen(); sub Panic; sub TagConvert(); sub Restore; sub AppName(); sub SetPCH_Size; sub SetFormValue(); ################################################################################################# # ################################################################################################# checkProxyList(); sub checkProxyList { return 0; my $RADDR = $ENV{'REMOTE_ADDR'}; $RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; my $query_addr = "$4.$3.$2.$1.niku.2ch.net"; my $addr = join('.', unpack('C*', gethostbyname($query_addr))); if ($addr eq '127.0.0.2') { DispError("host errors"); } return 0; } ################################################################################################# # ################################################################################################# #---------------------------------------------------------- #弄らないで(^^; Editing prohibition! $paint_cgi= './paint.cgi' if(!$paint_cgi); $config_cgi= './config.cgi'if(!$config_cgi); $Version='BBS NOTE '.$BBS_Version.' '; require $config_cgi; $maxData=$MaxUpLoadData; errorexit ('1','設定ファイルの互換性エラー','「config.cgi」'.$CONFIG_VERSION.' はこの '.$BBS_Version.' バージョンと互換性がありません!
互換した設定ファイルを使用して下さい。') if($CONFIG_VERSION ne 'Moon Dance'); $lock_sleep=1; $lock_try = 5; $lock_sec = 60; $lockdir = $FileSave_DIR.'/lock'; $cookie_file=$FileSave_DIR.'/cookie.log'; &call('Initialize'); require $skin_cgi; defined &SkinInit&& &SkinInit; eval pack'H*','6D792024633D273C42523E436C69656E742050726F6772616D203C4120485245463D22687474703A2F2F273B0A24436C69656E745665723D244D6F64756C655665723F273C42523E4D6F64756C6520272E244D6F64756C655665723A27273B0A24436C69656E745665722E3D24632E277777772E67742E73616B7572612E6E652E6A702F7E6F636F73616D612F22205441524745543D225F626C616E6B223E28432982B582A182BF82E182F1287368692D6379616E293C2F413E20276966247369694170706C65745F5573653B0A24436C69656E745665722E3D273C42523E436C69656E742050726F6772616D202843292082A8816082CC286F686E6F2927696624506963747572654242534170706C65745F5573653B0A24436C69656E745665722E3D24632E277777772E67656F6369746965732E636F2E6A702F53696C69636F6E56616C6C65792D53616E4A6F73652F383630392F22205441524745543D225F626C616E6B223E2843292082C982C8286E696E6129203C2F413E276966244242535061696E7465724170706C65745F5573653B0A24415050535F434F44453D33353838373B2646756E6374696F6E'; } #------------------------------------------------------------ sub Function{ &Captor if($fc eq 'captor'); &FormMultipart; &call('Function'); if($fc eq 'write'){&MsgWrite;&PageOpen} elsif($fc eq 'page'){&AdminPassCheck if$FORM{'password'};&PageOpen} elsif($fc eq 'repost'){&RePostOpen} elsif($fc eq 'post'){&PostOpen} elsif($fc eq 'delete'){&MsgDelete} elsif($fc eq 'del'){&AdminPassCheck;&MsgDelete} elsif($fc eq 'continue'){&ImgContinue} elsif($fc eq 'pch_size'){&SetPCH_Size} elsif($fc eq 'help'){&HelpOpen} elsif($fc eq 'admin'){&AdminPageOpen} elsif($fc eq 'reflesh'){&AdminPassCheck;&MsgReflesh;&PageOpen} elsif($fc eq 'restore'){&AdminPassCheck;&Restore} elsif($fc =~ /paint|open/){&PaintOpen} &PageOpen; } ################################################################### # / ページを開く / # sub PageOpen{ &call('PageOpen'); $FORM{mode}=$MODE_TOGGLE_TURN[0] if(!$FORM{mode}); &GetCookie; if($fc eq 'write'){&CookieWrite} elsif($fc eq 'rev'){ &call('Receive'); if(-e $cookie_file){&GetFileCookie} $fc='page'; }else{ if(!"$fc$FORM{mode}$FORM{sort}"){ $FORM{mode} = $COOKIE{mode} if($COOKIE{mode}); $FORM{sort} = $COOKIE{sort} if($COOKIE{sort}); } if($COOKIE{lock} !=1 && $COOKIE{mode} ne $FORM{mode} || $COOKIE{sort} ne $FORM{sort}){ &GetDate(); @FORM{name,mail,url,flower,password}=($name,$mail,$url,$flower,$passwrd); &CookieWrite; } } defined &Catalog&& &Catalog||&CatalogOpen if($FORM{'mode'} eq 'catalog' && $fc ne 'rev'); &FileLogList; $FORM{page}=1 if ($FORM{page} eq ''); $page=(($FORM{page}-1) * $ViewMessage); $page=$FORM{page}=0 if($page >= $LogTotal); &FastBoot if($LogTotal == 0 && !$adminMode); &PageForm; &GetBrowse; print "Content-type: text/html\n$Exp\n"; &HTML_HEAD; if(!$AdvanceLayerForm){$LayerForm_Use=($USER_OS=~/Win/ && $AGENT eq 'MSIE')?$LayerForm_Use:0} print $SKIN_MAIN_FORMAT; # 管理モードである表示 if($adminMode){ my $File_DIR = $1 if($FileSave_DIR=~/([^\\\/]+$)/); $IndexFile = $1 if($IndexFile=~/([^\\\/]+$)/); my $REFLESH='
'.$ADD_VALUE.'
「'.$IndexFile.'」を最新の情報に書き換えします。

'if$index_reflesh_Use; my $AdminMenuFont = defined $AdminMenu_Font ? $AdminMenu_Font : 'color=white'; my $AdminMenuBegin = defined $AdminMenu_Begin ? $AdminMenu_Begin : "

★ 管理モード ★

"; my $AdminMenuEnd = defined $AdminMenu_End ? $AdminMenu_End : '

'; print <$REFLESH

$ADD_VALUE 「$File_DIR」ディレクトリのファイルを解析します。
総ログデータサイズや総画像サイズなどを知ることが出来ます。

$ADD_VALUE
ログを調査して「ファイルログ」「カウントログ」を再構\築します。
何らかの原因でファイルログが破損、初期化してしまった場合に行って下さい。

$ADMIN_FUNCTION $PAGE_FormTAG$AdminMenuEnd EOF undef $login; } for($n=$page,$cnt=0;($cnt < $ViewMessage && $cnt < $LogTotal);$n++,$cnt++){ &fl($fileNo[$n]); if(-e "$LogFile") { open(MSG,$LogFile);@FileData=;close(MSG); $LogSize=-s $LogFile; &MsgLine;&call('MsgLine'); if($adminMode){ #----------------<管理者モード時の消すボタン------------------- print <$ADD_VALUE $ADD_VALUE DEL print $DEL_FUNCTION; #-------------------------------------------------------------- } } } &HTML_FOOT; undef %ENV; exit; } ################################################################### # / カタログ表示 / # sub CatalogOpen{ $CATALOG_View = $ViewMessage = $CATALOG_W * $CATALOG_H; &FileLogList; $FORM{page}=1 if ($FORM{page} eq ''); $page = (($FORM{page}-1) * $CATALOG_View); $page = $FORM{page} = 0 if($page >= $LogTotal); &PageForm; &GetCookie; if($COOKIE{mode} ne $FORM{mode} || $COOKIE{sort} ne $FORM{sort}){ &GetDate(); &CookieWrite; } print "Content-type: text/html\n$Exp\n"; &HTML_HEAD;print $SKIN_MAIN_FORMAT; $CATALOG_View = $LogTotal if($LogTotal < $CATALOG_View); print <
HTML for($n=$page,$cnt=0,$Tcnt=$CATALOG_W;($cnt < $CATALOG_View && $n < $LogTotal);$n++){ &fl($fileNo[$n]); if(-e "$LogFile") { $LogSize=-s $LogFile; open(MSG,$LogFile);my @FileData=;close MSG; $_=shift @FileData;chomp;$MSG=''; ($Cnum,$Cname,$Cdate,$CTitle,$_,$_,$_,$_,$_,$_,$Csrc,$Cw,$Ch,$Csize,$LOG__,$Cthumb,$Cptime,$Capp,$ADD_FORMAT) = split(/\t/); undef %l; foreach(split/\x08/, $ADD_FORMAT){s/^([^=]*)=(.*)$/$l{$1} = $2/e}; $ANI_Enable=$Csrc=~/\.pch|jpeg$/i?1:0; $IMG_Enable=&FileListCheck($Csrc)?1:0; $LOG_ThumbSRC = (grep /\.jpg|png|gif$/i,$Cthumb,$l{thumbsrc})[0]; $LOG_AnimeSRC = (grep /\.pch|jpeg$/i,$Csrc,$Cthumb,$l{animesrc})[0]; $LOG_FileSRC = (grep /\.jpg|png|gif$/i,$Csrc)[0]; $RES_Enable=($MaxResmesg > $LogSize && $Cnum ne '' && $fc ne 'delete')?1:0; $PCH_Enable=$LOG_AnimeSRC?1:0; $Csize=$Csize>1000? int $Csize/1000:1; my($Image,$Anim); if($IMG_Enable){ if($LOG_ThumbSRC){ $Image = "\"$CTitle"; }else{ my $w = ' width='.$CATALOG_KeepW if($CATALOG_KeepW ne ''&&$CATALOG_KeepW != 0); if($ANI_Enable){ $Csrc .= '&width='.$Cw.'&height='.$Ch; $Image = "しぃちゃんお絵描き
アニメデータ ( $Csize KB )
$CTitle ($Cname)

"; }else{ $Image = "\"$CTitle" } } if($RES_Enable){ $Image = "".$Image.''; }else{ $Image = "".$Image.''; } }else{ $Image = '

画像なし

' } if($PCH_Enable){ $Anim = "☆アニメデータあり"; } print "

'; $Tcnt--;$cnt++; if(($cnt) % $CATALOG_W ==0){ print ""; $Tcnt=$CATALOG_W; if($cnt < $CATALOG_View){ print "\n"; } } } } for(;($Tcnt > 0)&&($Tcnt != $CATALOG_W);$Tcnt--){ print ''; if($Tcnt-1 == 0){ print "\n"; } } print <
$Image
$CATALOG_FONT DATE : $Cdate
$Anim $CATALOG_FONT_END"; if($adminMode){ #---------------<管理者モード時の消すボタン>------------------ print < $ADD_VALUE DEL #------------------------------------------------------------- } print '
 
HTML &HTML_FOOT; exit } ################################################################### # / 二重投稿チェック / # sub PostCheck(){ &call('PostCheck'); return if($MultiplePostingLv == 0); if($_[0]) { my($msglog_time,$msg_name,$msg_title,$msg_mesg,$msg_IP,$msg_imgsize)=split /\t/,$_[0];undef %ACC; my $dny_flag=0; $msg_IP =~ s/\(.*\)//; $msg_imgsize=~ s/\s//g; if($msg_imgsize){ if($MultiplePostingLv == 5){$msglog_time=int $msglog_time; if((time() - $msglog_time)-$MultipleDnyTime < 0){$dny_flag=1} }else{ if(($msg_imgsize eq $FORM{'file_length'}) && ($msg_IP eq $IP)){$dny_flag=1}} }else{ if($MultiplePostingLv == 5){$msglog_time=int $msglog_time; if((time() - $msglog_time)-$MultipleDnyTime < 0){$dny_flag=1} }elsif($MultiplePostingLv == 4){ if($msg_IP eq $IP){$dny_flag=1} }elsif($MultiplePostingLv == 3){ if(($msg_name eq $name) && ($msg_IP eq $IP)){$dny_flag=1} }elsif($MultiplePostingLv == 2){ if(($msg_name eq $name) && ($msg_title eq $title) && ($msg_IP eq $IP)){$dny_flag=1} }elsif($MultiplePostingLv == 1){ if(($msg_name eq $name) && ($msg_title eq $title) && ($msg_mesg eq $mesg_log) && ($msg_IP eq $IP)){$dny_flag=1} } } if($dny_flag){ fileunlock; if($fc eq 'captor'){ print "Content-type: text/plain\n\nerror\nエラー!!\n二重投稿です\n投稿は拒否されました。\nしばらく時間をおいて再度投稿して下さい。"; exit; }else{ errorexit ('post','二重投稿です','投稿は拒否されました。
もう一度よくお確かめ下さい。'); } } } } ################################################################### # / インデックスを最新のメッセージに書き換える / # sub MsgReflesh{ &call('MsgReflesh'); if($index_reflesh_Use){ $MsgRefleshFlag=1; &FileLogList; filelock; my @back=($fc, $passwrd, $FORM{mode}, $adminMode, $LayerForm_Use, $name, $mail, $url, $flower); $LayerForm_Use=$adminMode=0; $name=$mail=$url=$flower=$passwrd=$fc=$FORM{mode}=""; &PageForm; open(INDEXFILE,">$IndexFile"); select INDEXFILE; &HTML_HEAD; print $SKIN_MAIN_FORMAT; for($n=0;($n < $ViewMessage && $n < $LogTotal);$n++){ &fl($fileNo[$n]); if(-e "$LogFile") { $LogSize=-s $LogFile; open(MSG,$LogFile); @FileData=; close(MSG); &MsgLine;&call('MsgLine'); } } print $SKIN_FOOTER_FORMAT; close(INDEXFILE); select STDOUT; fileunlock; ($fc, $passwrd, $FORM{mode}, $adminMode, $LayerForm_Use, $name, $mail, $url, $flower)=@back; undef $MsgRefleshFlag; undef $PAGE_FORM_FLAG; &call('MsgRefleshEnd'); } } ############################################################# # / ページ切り替えタグ生成 / # sub PageForm{ $PageLink_Style = 1 if$adminMode; if($MsgRefleshFlag){ $passwrd=$fc=$FORM{mode}=''; } if(!$PAGE_FORM_FLAG){ $PAGE_LinkTAG=$PAGE_FormTAG=''; my $MaxPage=int ($LogTotal / $ViewMessage); $MaxPage++ if($LogTotal-($MaxPage * $ViewMessage) > 0); return if($MaxPage < 2); my $fc_b=($fc eq ''||$fc eq 'write')?'page':$fc; my $nMaxPage =$MaxPage; my $MODE=''; my $Next,$N=0; my $page=$FORM{page}?$FORM{page}:1; my $Pass=$password if($adminMode); if($FORM{'mode'}){ $MODE="&mode=$FORM{'mode'}"; $ADD_VALUE.=''; } my $PageLink=" 0){ $Next++; $nMaxPage--; if($Next == $page){ if($Next - 1 > 0){ $N=$Next -1; $PAGE_LinkTAG .= $PageLink.$N.'">'; } if($Next < $MaxPage){ $N=$Next +1; $PAGE_LinkTAG .= ''.$PageLink.$N.'">'; } last; } } $Next=0;$nMaxPage=$MaxPage; $PAGE_LinkTAG .= "<\/A><< 前のページ 次のページ > "; # $PAGE_LinkTAG .= "<\/A><< 前のページ 次のページ > "; while($nMaxPage > 0){ $Next++; $nMaxPage--; if($Next == $page){ $PAGE_LinkTAG .= ''.$Next.' ';next } $PAGE_LinkTAG .= ''.$PageLink.$Next.'">'.$Next.' '; } my $PageTag=''.$ADD_VALUE.'
'; $PAGE_FormTAG='
'; $Next=0;$nMaxPage=$MaxPage; while($nMaxPage > 0){ $Next++;$nMaxPage--; if($Next == $page){ if($Next - 1 > 0){ $_=$Next -1; $PAGE_FormTAG .= $PageTag.'
'; } if($Next < $MaxPage){ $_=$Next +1; $PAGE_FormTAG .= $PageTag.'
'; } last } } $Next=0; $PAGE_FormTAG .= $PageTag.''; $PAGE_FORM_FLAG=1; } } #################################################### # / 管理者パスワード入力ページ表示 / # sub AdminPageOpen {eval << '_SUB_'; &call('AdminPageOpen'); &GetCookie; if($password eq $passwrd){$FORM{'password'}=$passwrd;$adminMode =1;$login='

自動ログインしました

';&PageOpen} $TXT_ADMIN_TITLE= '管理者パスワード入力'if(!$TXT_ADMIN_TITLE); $TXT_ADMIN = '

管理者パスワードを入力して下さい

'if(!$TXT_ADMIN); my $AdminPageBegin = defined $AdminPageBegin ? $AdminPage_Begin : '



'; my $AdminPageEnd = defined $AdminPageEnd ? $AdminPage_End : ''; my $ADD_VALUE = &SetFormValue($SKIN_MODE_URL); print "Content-type: text/html\n\n"; print <$TXT_ADMIN_TITLE $TXT_HEADER $AdminPageBegin $TXT_ADMIN
$ADD_VALUE
$AdminPageEnd
[BACK]
$TXT_BBS_MSGDOWN
$Version$SkinVer$ClientVer
EOF _SUB_ exit } ################################################################### # / メッセージチェック&タグ除去 / # sub MsgConvert{ &call('MsgConvert'); my ($len,@error,$errorstr,$errormark); &MsgEsc(0,*name,*mesg); &MsgEsc(1,*mail,*url); if($fc eq 'write'){ if($add_Thread eq ""){ &MsgEsc(0,*title); if($title eq ""&&$Input_Title){ $title = "記入なし"; # push @error,'タイトルの記述がありません!'; } } if($name eq ""){ $name = "記入なし"; # push @error,'名前の記述がありません!'; } if($mesg eq ""){ $mesg = "記入なし"; # push @error,'メッセージの記述がありません!'; } $len = length $name; if($len > $Maxnamelen){ push @error,'名前の文字数が多すぎます!'." 現在値 $len\/制限値 $Maxnamelen"; } $len = length $mail; if($len > 0 && $mail !~ /(.*)\@(.*)\.(.*)/ && $mail ne 'sage'){ # push @error,'メールの入力内容が正しくありません! 半角英数などお確かめ下さい。'; } if($len > $Maxmaillen){ push @error,'メールの文字数が多すぎます!'." 現在値 $len\/制限値 $Maxmaillen"; } $len = length $title; if($len > $Maxtitlelen){ push @error,'タイトルの文字数が多すぎます!'." 現在値 $len\/制限値 $Maxtitlelen"; } $len = length $url; if($len > $MaxURLlen){ push @error,'URLの文字数が多すぎます!'." 現在値 $len\/制限値 $MaxURLlen"; } $len = length $mesg; if($len > $Maxmesg){ push @error,'メッセージの文字数が多すぎます!'." 現在値 $len\/制限値 $Maxmesg"; } if(!$mail && $Input_Mail){ push @error,'メールの記述がありません!'; } if(!$passwrd && $Input_Password){ push @error,'パスワードの記述がありません!'; } } if(@error){ $errormark = $ErrorMark ? $ErrorMark : '■'; if($fc eq 'captor'){ map{$errorstr.="$errormark$_\n"}@error; errorexit('post','',$errorstr); }else{ map{$errorstr.="$errormark$_
"}@error; errorexit('post','投稿エラー!',"
$errorstr

もう一度よくお確かめ下さい。"); } } # 使用可能タグ if($TAGS_Use && ($errstr = &TagConvert(*mesg,*OKTags))){ errorexit('post','タグが閉じられていません', "$errstrタグは閉じる必要があります。"); } # リンクを有効に if($URLAutoLink){$mesg =~ s/https?:\/\/([-.!~*'()\w;\/?:\@&=+\$,%#]+)/&MsgURI($1)/eg} if($MailAutoLink){$mesg =~ s/mailto\:([\w\.\?\#\_\:\;\/\%\&\$\"\!\'\(\)\=\~\^\-\+\|\@]*)/$1<\/A>/ig} # 改行をBRに変換 $mesg=~ s/\x0D\x0A/\n/go; $mesg=~ s/\x0D/\n/go; $mesg=~ s/\x0A/\n/go; $mesg=~ s/\n+$//go; $mesg=~ s/^\n+//go; # 引用文 if($Msg_Quotation){ for($m=0;$m<2;$m++){$mesg=~ s/(^|\n)(>|>|#)(.+)(\n|$)/$1$Msg_Quot_Font$2$3$Msg_Quot_Font_End$4/g} } $LineCntCapa=($mesg =~ s/\n\n/

/img);$LineCntCapa*=2; $LineCntCapa+=($mesg =~ s/\n/
/img); if($LineCntCapa > $MaxLine){ errorexit ('post','メッセージの行数が多すぎます', "メッセージの行数が多すぎます!
現在値:$LineCntCapa \/ 制限:$MaxLine") }; $mesg_log=$mesg; if(($flower||$Panic_Mode == 1)&&$Panic_Mode != 2){&Panic(*mesg,$PanicTable,$PanicDat)} } ################################################################### # / URL / # sub MsgURI(){ my $uri= $_[0]; my $e; $uri =~ s/\"\;/\%22/g; $e = '<'.$2 if($uri =~ s/([-.!~*'()\w;\/?:\@&=+\$,%#]+)\<\;(.+)/$1/g); $e .= '"' if($uri=~s/\%22$//); return "
http\:\/\/$uri<\/A>$e"; } ################################################################### # / Jcode & タグ除去 / # sub MsgEsc(){ local($f,@v)=@_; foreach(@v){ if($f){ ${$_}=~s/^\w+\:\/*//go; ${$_}=~s/( |\x81\x40)//go; }else{ &jcode'convert($_,"sjis")if($jcode_pl=~/jcode/); } ${$_}=~s/\"/\"\;/go; ${$_}=~s//\n/igo; $ref_str =~ s/\<\;P>/\n\n/igo; @parts = split(/(>)/,$ref_str); undef $ref_str; $end = pop @parts; foreach(@parts){ if(index $_,'<' > -1){ my($n,$aliment,$need,$slash,@l); foreach $_pertag(@ref_tags){ my($tag,@tag_element) = split /:/,$_pertag; if(s/\<\;(\/)?$tag(\s+.*|$)/<$1$tag/i){ $slash=$1; if($tag eq 'PRE'){ $flag_pre = $flag_pre != 1?1:0; } if($slash eq ''){ $_cnt[$n]++; }else{ $_cnt[$n]--; } if(!$flag_pre){ $aliment = $2; $aliment =~ s/\=/\&equ\;/gi; $aliment =~ s/\&equ\;\"\;([\w-.!~*'();\/?:\@\&\+\$,%\#\x80-\xFF]+)\"\;(\s|$)/\&equ\;\"\;$1\e\"\;$2/g; $URLAutoLink=0 if($tag eq 'A'); if($tag eq 'FONT'){ $aliment =~ s/\bSIZE\&equ\;\"\;(\w*)(?:\e)\"\;/size=\"$1\"/i; $aliment =~ s/\bCOLOR\&equ\;\"\;([\w\#]*)(?:\e)\"\;/color=\"$1\"/i; $aliment =~ s/\bFACE\&equ\;\"\;(.*)(?:\e)\"\;/face=\"$1\"/i; }elsif($tag eq 'DIV'){ $aliment =~ s/\bALIGN\&equ\;\"\;(CENTER|LEFT|RIGHT)(?:\e)\"\;/align=\"$1\"/i; } foreach$e(@tag_element){ $aliment =~ s/(\s*)$e\&equ\;\"\;([^ ]*)(?:\e)\"\;/$1$e\=\"$2\"/si; } }elsif($tag ne 'PRE'){s/0){ ($tag) = split /:/,$ref_tags[$n],1; $s = "$_個所" if $_>1; $errstr.= "<$tag>$s "; } $n++ } return $errstr if($errstr); $ref_str = $str.$end; return 0; } ############################################################# # / 書き込み処理全般 / # sub MsgWrite{ # jcodeLE.pl は Copyright(c)Yui Suzuki さん作です。 # http://www.cup.com/yui/ require $jcode_pl if($jcode_pl); &call('MsgWrite'); if($MetaCookie_use){utime time,time,$BBSNoteCGI} &GetBrowse; &GetDate(); errorexit ('1','投稿エラー','投稿は受け付けられませんでした')if($ENV{'REQUEST_METHOD'} ne 'POST'); # 通常書込、返信 if($fc eq "write"){ ($name,$mail,$url,$title,$mesg,$passwrd,$flower,$paint_time,$app,$add_Thread,$interrupt) =@FORM{name,mail,url,title,mesg,password,flower,paint_time,app,l,interrupt}; &MsgConvert; if(!$ImageUpload_Use && $FORM{file}){ errorexit ('1','投稿エラー','アップロードは禁止されています。') unless($BBSPainterApplet_Use && $app eq 'pai'); } } #if($add_Thread < 4200){ #errorexit ('1',"書き込みが終了しています。$add_Thread"); #exit; #} # しぃ拡張ヘッダ解析 if(($fc ne "write")&&(length $FORM{'ExpHead'} > 0)){ my(@head,$t,$f); # a = Applet Header : i = Script Callback if(substr($FORM{'ExpHead'},0,1) eq 'a'){$t='\=';$f='\&'}else{$t="\t";$f="\f"} $FORM{'ExpHead'}=~s/\&\;/&/g; @head=split(/$f/, $FORM{'ExpHead'}); foreach(@head){ my($ah, $val)=split /$t/; my @v = ( 'app','agent','accid','app_add','anime_speed', 'newpass','mode','No','id','title', 'passwrd','paint_add','paint_time', 'name','mail','url','mesg','flower', @SII_ADD_PARAM,@PIC_ADD_PARAM ); foreach(@v){ next if($ah ne $_); &unescape(\$val); $$ah=$val; } } &MsgEsc(0,*app,*title,*passwrd,*newpass,*agent); @FORM{flower,password}=($flower,$passwrd); $browse=$agent if(length $agent > 0); &MsgConvert; } $paint_time='' if(!$PaintTime_Use); $app = $App if $app eq ""; # 描画時間処理 if($paint_time){ &MsgEsc(0,*paint_time,*paint_add); $paint_time=int($paint_time-$paint_add); if($paint_time > 0){ my($p_day,$p_hour,$p_min,$p_sec); $TIME = time + $TIME_DIFF_SEC; $paint_time = $TIME - $paint_time; if($paint_time >= 86400){ $p_day = int $paint_time / 86400; $paint_time -= $p_day*86400; } if($paint_time >= 3600){ $p_hour = int $paint_time / 3600; $paint_time -= $p_hour*3600; } if($paint_time >= 60){ $p_min = int $paint_time / 60; $paint_time -= $p_min*60; } $p_sec = $paint_time; $p_day=$p_day == 0?'':$p_day.'日'; $p_hour=$p_hour == 0?'':$p_hour.'時間'; $p_min=$p_min == 0?'':$p_min.'分'; $p_sec=$p_sec == 0?'':$p_sec.'秒'; $paint_time = $p_day.$p_hour.$p_min.$p_sec } }else{$paint_time=''} filelock; &CountFileOpen; # 画像ファイル解析 delete $FORM{file_name}; delete $FORM{thumbnail_name}; delete $FORM{animedata_name}; &FileAnalyze('file',$FileSave_DIR,$FileNameHead); # 二重投稿チェック &PostCheck($acc_check); if($app eq 'pai' && $FORM{'file_length'} > $MaxPaintData){ fileunlock; errorexit ('1','画像の受信データサイズが制限値を超えました。',$MaxPaintData.'byte 以下のデータサイズにして下さい。現在値:'.$FORM{'file_length'}.' byte'); }elsif($fc eq 'write' && $FORM{'file_length'} > $MaxUpLoadData){ fileunlock; errorexit ('post','アップロードするファイルのデータが大きすぎます',$MaxUpLoadData.'byte 以下のデータサイズにして下さい。'); } if(length $FORM{'thumbnail'} > $MaxThumbnailData){ delete $FORM{thumbnail}; if(!$OverflowDataDel){ fileunlock; errorexit ('post','サムネイルファイルのデータが大きすぎます',$MaxThumbnailData.'byte 以下のデータサイズにして下さい。'); } }else{ &FileAnalyze('thumbnail',$FileSave_DIR,$ThumbnailNameHead); } if(length $FORM{'animedata'} > $MaxAnimeData){ delete $FORM{animedata}; if(!$OverflowDataDel){ fileunlock; errorexit ('post','アニメデータが大きすぎます',$MaxThumbnailData.'byte 以下のデータサイズにして下さい。'); } }else{ &FileAnalyze('animedata',$FileSave_DIR,$ThumbnailNameHead); } # パスワード暗号化 $crypt_pass=$crypt_Use ? crypt($passwrd,'ID'):$passwrd if($passwrd ne ""); # 画像データの保存 if($FORM{'file_length'} > 0 ){ if($maxImageWidth < $FORM{'file_width'}||$maxImageHeight < $FORM{'file_height'}){ fileunlock; errorexit ('post','画像サイズが大きすぎます', $maxImageWidth.'x'.$maxImageHeight.'ピクセル以下の画像をアップロードして下さい。
現在値 '.$FORM{'file_width'}.'x'.$FORM{'file_height'}) } &call('FileSave'); &ImgReplace; &FileSave }else{$FORM{file_name}=$FORM{file_length}=""} # 画像がなくてコメントのみ投稿できない設定時 if($FORM{file_name} eq ""&&$NotCommentOnlyPost&&$interrupt eq ""&&$add_Thread eq ""){ fileunlock; errorexit ('post','コメントのみの投稿はできません', '必ず画像も投稿して下さい
') } #通常書込 if($add_Thread eq ""||$interrupt){ # 待機ログ if($fc eq 'captor'){ $wait_flag=1 if(!$name || !$mesg || ($Input_Mail && $mail eq '') || ($Input_Title && $title eq '') || ($Input_Password && $passwrd eq '')); $crypt_pass=$crypt_Use ? crypt($passwrd,'ID'):$passwrd; if(&OpenFileCookie($id,'',0)){ &DelImageFile(@FCookie{file_name,thumb_name,anime_name}); } open(CREV,">$cookie_file"); my $cnt;@c = reverse @c; foreach(@c){ my($in) = split /\t/,$_,2; $cnt++; if($in < $T || $cnt > $MainImgWait_Limit){ ($_,$_,$_,$_,$_,$_,$_,$_,$del_img,$del_thumb,$del_anime)=split /\t/; &DelImageFile($del_img,$del_thumb,$del_anime); next; } print CREV; } &call('CookieLog'); print CREV join ("\t", time,$id,$wait_flag, $name,$mail,$url,$flower,$app, $FORM{file_name},$FORM{thumbnail_name},$FORM{animedata_name}, $FORM{'file_width'},$FORM{'file_height'},$FORM{'file_length'},$paint_time,$accid, map{"$_=$$_"}@SII_ADD_PARAM,@PIC_ADD_PARAM ); print CREV "\n"; close(CREV); } if(!$wait_flag){ # お絵描き後フォーム入力の割込書込 if($interrupt){ if(!&OpenFileCookie('',$interrupt,0)){ fileunlock; errorexit ('1','エラー','指定された画像は見当たりませんでした。
すでに処理された可能性があります。'); } open(CREV,">$cookie_file"); my $cnt;@c = reverse @c; foreach(@c){ my($in) = split /\t/,$_,2; if($interrupt ne $in){ $cnt++; if($in < $T || $cnt > $MainImgWait_Limit){ ($_,$_,$_,$_,$_,$_,$_,$_,$del_img,$del_thumb,$del_anime)=split /\t/; &DelImageFile($del_img,$del_thumb,$del_anime); next; } print CREV; } } close CREV; fileunlock; unlink $cookie_file if(-z $cookie_file); @FORM{file_name,thumbnail_name,animedata_name,file_width,file_height,file_length} = @FCookie{file_name,thumb_name,anime_name,width,height,file_length}; ($app,$paint_time) = @FCookie{app,paint_time}; } if($FORM{animedata_name}){ $log_thumb = $FORM{animedata_name}; $MSG_ADD_FORMAT .= "thumbsrc=$FORM{thumbnail_name}\b" if($FORM{thumbnail_name} ne ''); }else{ $log_thumb = $FORM{thumbnail_name}; } $ac_Thread++; &FileLogWrite($FORM{file_name},$log_thumb,$ac_Thread); &fl($ac_Thread); open(MSGFILE,">$LogFile"); # 親ログ メッセージフォーマット local $MsgFormat= join "\t", $ac_msgcnt, # メッセージカウント $name, # 名前 $C_date, # 投稿時間 $title, # タイトル $mail, # メール $url, # URL $mesg, # メッセージ $HOST, # ホスト $IP, # IP $browse, # ブラウザ $FORM{file_name}, # 画像ファイル名 $FORM{'file_width'}, # 画像幅 $FORM{'file_height'}, # 画像高さ $FORM{'file_length'}, # 画像データサイズ $crypt_pass, # パスワード $log_thumb, # サムネイル or アニメデータのファイル名 $paint_time, # 描画時間 $app, # アプレット情報 $MSG_ADD_FORMAT; # 拡張領域 $MsgFormat=~s/\n//g; &call('Log_Write'); print MSGFILE $MsgFormat."\n"; if($interrupt){ foreach(@FileData){print MSGFILE}; } close(MSGFILE); } } else{ # 返信書込 &fl($add_Thread); # 返信許容オーバー if($MaxResmesg < -s $LogFile){ fileunlock; errorexit ('post','このメッセージに返信できる許容値を超えました', 'このスレッドに対して返信はできません。
新しくメッセージを作成して下さい。'); } &call('Log_AddWrite'); open(MSGFILE,"<$LogFile");my @FileData=;close MSGFILE; my $l=0; my @Re=split /\t/, $FileData[0]; # IP優先親レス割込書込 if($Re[8] eq $IP && @FileData > 1 eq '' && !length $Re[6]){ open(MSGFILE,">$LogFile"); $MsgFormat=join "\t", $Re[0], # カウント引継ぎ $name, # 名前 $C_date, # 投稿時間 $title, # タイトル $mail, # メール $url, # URL $mesg, # メッセージ $HOST, # ホスト $IP, # IP $browse, # ブラウザ @Re[10..13], # 引継ぎ $crypt_pass, # パスワード @Re[15..18]; # 引継ぎ }else{ # 子ログ メッセージフォーマット open(MSGFILE,">>$LogFile"); $MsgFormat=join "\t", $ac_msgcnt, # メッセージカウント $name, # 名前 $C_date, # 投稿時間 $mesg, # メッセージ $crypt_pass, # パスワード "$IP\($HOST\)", # IP(ホスト) $mail, # メール $url, # URL $AGENT_S, # ブラウザ 略式 $USER_OS, # OS 略式 $RES_ADD_FORMAT; # 拡張領域 } $MsgFormat=~s/\n//g; print MSGFILE $MsgFormat."\n"; &FileLogResWrite($add_Thread); close(MSGFILE); } if(open(FILE,">>$reslog_file")) { print FILE "$C_date\t$name\t$mesg\t$mail\t$url\t$IP\n"; close(FILE); } if(open(FILE,">$count_file")) { $ac_msgcnt++; print FILE "$ac_Thread\t$ac_msgcnt\t$access\n"; print FILE time()."\t$name\t$title\t$mesg_log\t$IP\($HOST\)\t$FORM{'file_length'}"; close(FILE); } fileunlock; # PCHアップ時画像サイズ情報が無かった場合 if($WCS_PCH){ errorexit ('c','PCHファイルの画像サイズを入力して下さい',"

横幅 x 縦幅 アニメ再生スピード指定 一度書き込むと修正できません"); } &MsgReflesh; } ################################################################### # / メッセージ削除 / # sub MsgDelete{eval << '_SUB_'; &GetCookie; &PageOpen if($FORM{'No'} eq ""); my $Re=&GetMsgPassword($FORM{'No'}); if($Re == -1){errorexit ('1','データが存在しませんでした','指定されたデータは存在しませんでした')} if($FORM{'password'} ne $password){ if(!&PasswordCheck($FORM{'password'},$Re)){errorexit ('1','パスワードが違います','パスワードが間違っています!
もう一度よくお確かめ下さい。')} } &call('MsgDelete'); if($FORM{'No'} =~ /(\d+)\-(\d+)/){ my $No = $2; filelock; open(MSG,">$LogFile"); foreach(@FileData) { my @l=split /\t/,$_,2; print MSG if($No ne $l[0]); } close MSG; fileunlock; &MsgReflesh; } elsif($FORM{'No'} =~ /(\d+)/){ filelock; &call('Log_PreDelete'); open(MSG,"<$LogFile"); my @l=split /\t/,;close MSG; foreach(split /\x08/,$l[18]){($_,$v)=split /=/;$$_=$v} &DelImageFile($l[10],$l[15],$thumbsrc,$animesrc); &FileLogDel($FORM{'No'}); unlink ($LogFile); &call('Log_Delete'); fileunlock; &MsgReflesh; } &PageOpen; _SUB_ exit } sub escape(){ local($_)=@_; $$_ =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; } sub unescape(){ local($_)=@_; $$_ =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; } sub fl(){ local($_)=sprintf("%06d",@_[0]);$LogFile="$FileSave_DIR/$MessageNameHead$_.log"; } ################################################################### # / 画像データ解析 / # sub FileAnalyze(){ eval pack'H*','24563D756E7061636B22253332432A222C2456657273696F6E3B28246F626A5F666F726D2C246F626A5F706174682C246F626A5F6865616429203D405F2069662824563D3D373635332026262024415050535F434F44453D3D333538383729'; local($mime,$fext,$obj_jhead,$pointer); $obj_length=length $FORM{$obj_form}; $FORM{$obj_form.'_length'}=$obj_length; return if($obj_length == 0); &call('FileAnalyze'); #---バイナリヘッダでチェック if($FORM{$obj_form} =~ /^GIF\d\d[a-z].+/) { $obj_ext='.gif'; $FORM{$obj_form.'_Content-Type'}='image/gif'; } elsif($FORM{$obj_form} =~ /^\x89\x50\x4E\x47\r\n\x1A\n.+/) { $obj_ext='.png'; $FORM{$obj_form.'_Content-Type'}='image/x-png'; } elsif($FORM{$obj_form} =~ /^\xFF\xD8\xFF\xE0\x00.+/) { $obj_ext='.jpg'; $FORM{$obj_form.'_Content-Type'}='image/jpeg'; } elsif($FORM{$obj_form} =~ /^\x1F\x8B\x08\x00.+/) { $sii_pch_ext = '.pch' if($sii_pch_ext eq ''); $obj_ext=$sii_pch_ext; $FORM{$obj_form.'_Content-Type'}='image/pch'; } if($obj_ext eq '') { #--- MIMEタイプをチェック $mime=$FORM{$obj_form.'_Content-Type'}; if( $mime =~ /image\/gif/i) { $obj_ext='.gif'; } # GIF elsif($mime =~ /image\/jpeg/i) { $obj_ext='.jpg'; } # JPEG elsif($mime =~ /image\/x-png/i) { $obj_ext='.png'; } # PNG } #--- M拡張子をチェック if($obj_ext eq '') { $fext =$FORM{$obj_form.'_filename'}; if($fext =~ /\.gif$/i) { # GIF $obj_ext='.gif'; $FORM{$obj_form.'_Content-Type'}='image/gif'; } elsif($fext =~ /\.jpe?g$/i) { # JPEG $obj_ext='.jpg'; $FORM{$obj_form.'_Content-Type'}='image/jpeg'; } elsif($fext =~ /\.png$/i) { # PNG $obj_ext='.png'; $FORM{$obj_form.'_Content-Type'}='image/x-png'; } elsif($fext =~ /\.pch$/i) { # PCH $obj_ext='.pch'; $FORM{$obj_form.'_Content-Type'}='image/pch'; } } if($obj_ext eq '') { errorexit ('post','不明なファイル形式がアップロードされました','対応している形式のみアップロードして下さい。'); } #--- ファイル名決定 my $No = sprintf("%06d",$access); $FORM{$obj_form.'_name'}=$obj_head.$No.$obj_ext; if($obj_ext eq '.gif') { # ヘッダ所得 if($FORM{$obj_form} =~ /^GIF\d\d[a-z](.)(.)(.)(.).+/s) { $FORM{$obj_form.'_width'} =ord($2)*256 + ord($1); $FORM{$obj_form.'_height'}=ord($4)*256 + ord($3); } else { # ヘッダ異常 $FORM{$obj_form.'_width'} =0; $FORM{$obj_form.'_height'}=0; } } elsif($obj_ext eq '.png') { if($FORM{$obj_form} =~ /^\x89\x50\x4E\x47\r\n\x1A\n.{10}(.)(.)..(.)(.).+/s) { $FORM{$obj_form.'_width'} =ord($1)*256 + ord($2); $FORM{$obj_form.'_height'}=ord($3)*256 + ord($4); } else { # ヘッダ異常 $FORM{$obj_form.'_width'} =0; $FORM{$obj_form.'_height'}=0; } } elsif($obj_ext eq $sii_pch_ext) { if($FORM{'file_width'} > 0){ $s = pack("v",int $anime_speed); $w = pack("v",$FORM{'file_width'}); $h = pack("v",$FORM{'file_height'}); $FORM{$obj_form} =~ s/^(\x1F\x8B\x08\x00).{6}(.+)/$1$s$w$h$2/s } elsif($FORM{$obj_form} =~ /^\x1F\x8B\x08\x00(.)(.)(.)(.)(.)(.).+/s) { $FORM{$obj_form.'_width'} =ord($4)*256 + ord($3); $FORM{$obj_form.'_height'}=ord($6)*256 + ord($5); $WCS_PCH=1if($FORM{$obj_form.'_width'}==0); } }elsif($obj_ext eq '.jpg') { $pointer=2; while() { $obj_jhead=substr($FORM{$obj_form}, $pointer, 9); # SOF(Start Of Frame)マーカーを検索 # FFC0 : Baseline DCT, Huffman coding # FFC1 : Extended sequential DCT, Huffman coding # FFC2 : Progressive DCT, Huffman coding if($obj_jhead =~ /\xff(.)(.)(.)(.?)(.?)(.?)(.?)(.?)/s) { if(($1 eq "\xc0") ||($1 eq "\xc1") ||($1 eq "\xc2")) { $FORM{$obj_form.'_width'} =ord($7)*256 + ord($8); $FORM{$obj_form.'_height'}=ord($5)*256 + ord($6); last; } else { $pointer += ord($2)*256 + ord($3) + 2; } } else { # ヘッダ所得不能 $FORM{$obj_form.'_width'} =0; $FORM{$obj_form.'_height'}=0; last; } } } else { $FORM{$obj_form.'_width'} =0; $FORM{$obj_form.'_height'}=0; } } ################################################################### # / ファイルログ / # sub FileLogList{ undef %logfilelist;undef @fileNo; local($NO,$T,@Log,$n,$s,@S); if(!(-e "$filelog") ){ #ファイルが存在しない場合新規作成 open(MSGFILE,">$filelog"); } if(open(LOG,"<$filelog")) { @Log=; close(LOG); $n=0; $FORM{'sort'}=$SortMode if($FORM{'sort'} eq ""); if($FORM{'sort'}){ foreach(@Log){ ($NO,$_,$s)=split(/\t/); $NO =~ s/\s//g;$NO =~ s/\((.*)\)//; $T=$1; $T='0000/00/00[00:00:00]'if($T eq ""); $_ =~ s/\s//g; if($NO ne ""){$n++;push @S,"$T\=$NO"} $logfilelist{$_}=1; } @S=reverse sort @S; foreach(@S){ ($_,$NO)=split(/\=/); push @fileNo,$NO } }else{ foreach(@Log){ ($NO,$_,$s)=split(/\t/); $NO =~ s/\s//g; $NO =~ s/\(.*\)//; $_ =~ s/\s//g; if($NO ne ""){$n++;push @fileNo,$NO} $logfilelist{$_}=1; } } $LogTotal=$n } } sub FileListCheck(){ return if(!$_[0]); return 1 if($logfilelist{$_[0]}); } sub FileLogWrite(){eval << '_SUB_'; my ($filename,$thumbnailname,$Thread)=@_; my (@Log,$cnt,$t);$cnt=1; if(open(LOG,"<$filelog")) { @Log=; close(LOG); } if(open(LOG,">$filelog")){ $filename=$filename?"\t".$filename:''; $thumbnailname=$thumbnailname?"\t".$thumbnailname:''; $t="\($year\/$month\/$mday\[$hour\:$min\:$sec\]\)"; print LOG "$Thread$t$filename$thumbnailname\n"; foreach(@Log){ s/ //g; chomp;next if($_ eq ""); ($msg_thread,$img_name,$sum_name)=split(/\t/); $cnt++; if($cnt > $LogMax){ $msg_thread =~ s/\(.*\)//; &fl($msg_thread); &call('Log_PreDelete'); &DelImageFile($img_name,$sum_name); open(MSG,"<$LogFile"); my @A=split /\t/,; close MSG; undef %l; foreach(split/\x08/, $A[18]){s/^([^=]*)=(.*)$/$l{$1}=$2/e}; &DelImageFile($l{thumbsrc},$l{animesrc}); &call('Log_Delete'); unlink($LogFile); next } print LOG "$_\n"; } close(LOG)} _SUB_ } sub FileLogResWrite(){eval << '_SUB_'; return if($mail eq 'sage'); my($Thread)=@_[0]; my(@Log,$cnt,$t); $cnt=1; if(open(LOG,"<$filelog")){@Log=;close(LOG)} if(open(LOG,">$filelog")){ foreach(@Log){ chomp;next if($_ eq ""); ($NO,$img_name,$sum_name)=split(/\t/); $NO =~ s/(\(.*)//; if($Thread eq $NO){ $t="\($year\/$month\/$mday\[$hour\:$min\:$sec\]\)"; $t.="\t" if($img_name); $img_name.="\t" if($sum_name); print LOG "$Thread$t$img_name$sum_name\n";next; } print LOG "$_\n"; } close(LOG)} _SUB_ } sub FileLogDel(){eval << '_SUB_'; local($Thread)=@_[0]; local(@Log); if(open(LOG,"<$filelog")) { @Log=; close(LOG); } if(open(LOG,">$filelog")){ foreach(@Log){ chomp;if($_ eq ""){next}; ($msg_thread,$img_name,$sum_name)=split(/\t/); $msg_thread =~ s/\(.*\)//; next if($Thread eq $msg_thread); print LOG "$_\n"; } close(LOG) } _SUB_ } sub DelImageFile(){eval << '_SUB_'; foreach $filename(@_){ unlink ($FileSave_DIR.'/'.$filename) } _SUB_ } sub FileSave(){eval << '_SUB_'; if($FORM{file_name} ne ""){ if(open(BIN,">$FileSave_DIR/$FORM{file_name}")) { binmode BIN; print BIN $FORM{'file'};close BIN; } if($FORM{thumbnail_name} ne ""){ if(open(BIN,">$FileSave_DIR/$FORM{thumbnail_name}")) { binmode BIN; print BIN $FORM{'thumbnail'};close BIN; } } if($FORM{animedata_name} ne ""){ if(open(BIN,">$FileSave_DIR/$FORM{animedata_name}")) { binmode BIN; print BIN $FORM{'animedata'};close BIN; } } $access++; } _SUB_ } sub CountFileOpen{ if(open(FILE,"<$count_file")) { local(@ACC)=; $acc_check = $ACC[1]; my @AccLine=split(/\t/ , $ACC[0]); ($ac_Thread ,$ac_msgcnt ,$access)=@AccLine[0..2]; $access =~ s/\s//g; }else{ if(open(FILE,">$count_file")){print FILE "0\t0\t0";} $ac_msgcnt=$ac_Thread=$access=0; } close(FILE) } ################################################################### # / PCHサイズ書込 / # sub SetPCH_Size{eval << '_SUB_'; $W = int $FORM{'width'}; $H = int $FORM{'height'}; $A = int $FORM{'speed'}; $E = 'サイズ指定がおかしいです。
0以上 655535以下で指定して下さい。'; errorexit ('1','エラー',$E) if($W == 0||$H == 0||$W > 655535||$H > 655535); &fl($FORM{'No'}); if(-e "$LogFile") { open(MSG,$LogFile);@FileData=;close(MSG); $_=shift @FileData; @l = split(/\t/); errorexit ('1','パスワードが違います','パスワードが間違っています!
もう一度よくお確かめ下さい。')if($FORM{'password'} ne $password &&!&PasswordCheck($FORM{'password'},$l[14])); } $pch="$FileSave_DIR/$l[10]"; if(open(PCH,"<$pch")){ binmode(PCH); $PCHSIZE = -s $pch; read(PCH, $PCHHEAD, 10); read(PCH, $PCHDATA, $PCHSIZE-10); close PCH; if($PCHHEAD =~ /(\x1F\x8B\x08\x00)\x00{6}/){ filelock; $s = pack("v",$FORM{'speed'}); $w = pack("v",$FORM{'width'}); $h = pack("v",$FORM{'height'}); open(PCH,">$pch");binmode(PCH); print PCH "$1$s$w$h$PCHDATA"; open(MSG,">$LogFile"); $l[11]=$FORM{'width'}; $l[12]=$FORM{'height'}; print MSG join "\t",@l; print MSG foreach(@FileData); close (PCH,MSG); fileunlock; }else{errorexit ('1','エラー','このデータには書き込み出来ません。')} } &PageOpen _SUB_ exit } ################################################################### # / 続きから描く / # sub ImgContinue{eval << '_SUB_'; errorexit ('2','エラー','この機能は使用できません')if(!$Image_Continue_Use); &GetBrowse;&GetCookie; if($Input_Mail){ $FORM{mail}=$mail if $mail; if($FORM{mail} =~ /(.*)\@(.*)\.(.*)/ || $FORM{mail}eq'sage'){ &CookieWrite; } else { my $t = '*メールの入力内容が正しくありません
半角英数などお確かめ下さい。'if $FORM{mail}; errorexit ('c','メールアドレスを入力して下さい',"$t
$ADD_VALUE 投稿にはメールアドレスが必須です")if!$mail; } } my $cFlag; &fl($FORM{No}); if(open(LOG,"<$LogFile")) { $_=;close(LOG); @l=split /\t/; my @a=split(/\x08/,$l[18]); foreach(@a){($_,$v)=split /=/;$$_=$v} }else{ errorexit ('2','エラー','指定されたNoは見つかりませんでした') if(!$cFlag); } $OKj=1 if($l[10]=~/\.jpg$|\.gif$/); $OKp=1 if($l[10]=~/\.jpeg$|\.pch$/||$l[15]=~/\.jpeg$|\.pch$/||$animesrc=~/\.jpeg$|\.pch$/); if($FORM{"mode"} eq 'jpg'){ $cFlag = 2 }elsif($FORM{"mode"} eq 'pch'){ $cFlag = 3 } $Image=$l[10]=~/\.jpeg$|\.pch$/?'描画アニメデータ':""; $err = '復帰できるデータがありません'; errorexit ('2','エラー',$err) if($OKj+$OKp < 1); if($cFlag > 1){ errorexit ('1','パスワードが違います','パスワードが間違っています!
もう一度よくお確かめ下さい。') unless($FORM{'password'} eq $password || &PasswordCheck($FORM{'password'},$l[14]) || !$Image_Continue_Pass || $Image_Continue_Pass==2 && $FORM{'t'} eq 'new' ); if($cFlag == 3){ if($l[10] =~/\.jpeg$|\.pch$/){ $Lfile=$l[10]; }elsif($l[15] =~/\.jpeg$|\.pch$/){ $Lfile=$l[15]; }elsif($animesrc=~/\.jpeg$|\.pch$/){ $Lfile=$animesrc; }else{errorexit ('2','エラー',$err)} $FORM{'anime'}='true'; }elsif($cFlag == 2 && $l[10] =~/\.jpg$|\.gif$/){ $Lfile=$l[10]; $FORM{'anime'}='false'; }else{errorexit ('2','エラー',$err)} $pch = "$FileURL_DIR/$Lfile"; $FORM{'width'} = $l[11]; $FORM{'height'} = $l[12]; $l[16]=~ s/(\d+)日//; $p_day = $1; $l[16]=~ s/(\d+)時間//; $p_hour= $1; $l[16]=~ s/(\d+)分//; $p_min = $1; $l[16]=~ s/(\d+)秒//; $p_sec = $1; $paint_add_time = ($p_day*24*3600)+($p_hour*3600)+($p_min*60)+$p_sec; if($sii_archive=~/applet\.cgi/){ if(-e 'pch.cgi'){$pch = "pch.cgi?$Lfile"} elsif(-e '../pch.cgi'){$pch = '../pch.cgi?'.$Lfile} else{errorexit ('1','pch.cgiが見つかりません!','続きから描く場合の画像・アニメデータを表示させるにはpch.cgiが必要です。
WonderCatStudioより入手して下さい。')} $pch = "pch.cgi?$Lfile" } &escape(\$LOG_app);&escape(\$FORM{'password'});&escape(\$FORM{'newpass'});&escape(\$browse); $cgi_param.="&mode=$FORM{'t'}&No=$FORM{'No'}&app_add=$l[17]&passwrd=$FORM{'password'}&newpass=$FORM{'newpass'}"; $param = $Lfile=~/\.pch$|\.jpeg$/?'pch_file':'image_canvas'; $PARAM_SII.=""; $SII_ARGUMENT.=$cgi_param; $sii_FormCallback = 'false' if($FORM{'t'} eq 'rep'); &PaintOpen; } $OKj=$OKj==1 ? '':''; $OKp=$OKp==1 ? '':''; if($Image_Continue_Pass){$PINPUT ="パスワード:"} else{$PINPUT =""} print "Content-type: text/html\n$Exp\n"; &HTML_HEAD; print <

Continue No.$FORM{No}

$OKb$Image
$ADD_VALUE

画像を $PINPUT
新しいパスワード:
$I
[
BACK]
HTML &HTML_FOOT; _SUB_ exit } ################################################################### # / 画像差し替え / # sub ImgReplace{ $crypt_pass=$crypt_Use ? crypt($newpass,'ID'):$newpass if($fc eq 'captor' && $newpass ne ''); if($mode eq 'new'){ $app = &AppName($app_add); } return if($mode ne 'rep'); &fl($No); if(-e "$LogFile") { open(MSG,$LogFile);@FileData=;close(MSG); $_=shift @FileData;chomp; my @l = split(/\t/); if($Image_Continue_Pass && !&PasswordCheck($passwrd,$l[14]) && $passwrd ne $password ){ print "Content-type: text/plain\n\nerror\nエラー!!\nパスワードが違っています。\投稿は正常に行われませんでした。"; fileunlock;exit } open(MSG,">$LogFile"); $app = &AppName($l[17]); my (%A,$log_thumb); foreach(split/\x08/,$l[18]){s/^([^=]*)=(.+)/$A{$1}=$2/e}; &DelImageFile($l[10],$l[15],$A{'animesrc'},$A{'thumbsrc'}); if($FORM{animedata_name}){ $log_thumb = $FORM{animedata_name}; $A{'thumbsrc'} = $FORM{thumbnail_name}; }elsif($FORM{thumbnail_name}){ $log_thumb = $FORM{thumbnail_name}; delete $A{'animesrc'}; }else{ delete $A{'thumbsrc'}; } $MSG_ADD_FORMAT=join"\b",map{"$_=$A{$_}"}keys %A; $l[14]=$crypt_pass if($newpass ne ''); print MSG "$l[0]\t$l[1]\t$C_date\t$l[3]\t$l[4]\t$l[5]\t$l[6]\t$HOST\t$IP\t$browse\t$FORM{file_name}\t$FORM{'file_width'}\t$FORM{'file_height'}\t$FORM{'file_length'}\t$l[14]\t$log_thumb\t$paint_time\t$app\t$MSG_ADD_FORMAT\n"; foreach(@FileData){print MSG}; close(MSG); } if(open(LOG,"<$filelog")){@Log=;close(LOG)} if(open(LOG,">$filelog")){ foreach(@Log){ chomp;next if($_ eq ""); ($NO,$img_name,$sum_name)=split(/\t/); $NO =~ s/\(.*//; if($No eq $NO){ my $t="\($year\/$month\/$mday\[$hour\:$min\:$sec\]\)"; $t.="\t" if($img_name); print LOG "$No$t$FORM{file_name}\t$log_thumb\n";next; } print LOG "$_\n"; } close(LOG)} &FileSave; if(open(FILE,">$count_file")) { $ac_msgcnt++; print FILE "$ac_Thread\t$ac_msgcnt\t$access\n"; print FILE time()."\t$name\t$title\t$mesg_log\t$IP\($HOST\)\t$FORM{'file_length'}"; close(FILE); } fileunlock; &MsgReflesh; undef %FORM; print "Content-type: text/plain\n\nok"; exit } sub AppName(){eval << '_SUB_'; if(@_[0] eq 'sii'){ @_[0] = 'sii*1'; }elsif(@_[0] eq ''){ @_[0] = '+sii'; }elsif(@_[0]=~/(\+?)sii\*?(\d*)/){ $up = $1; $cnt = $2+1; @_[0] = $up.'sii*'.$cnt; }else{@_[0] = $app} return @_[0] _SUB_ } ############################################################# #お絵かきページを開く # sub PaintOpen{#eval << '_SUB_'; errorexit ('p','エラー','「'.$paint_cgi.'」が見つかりませんでした。
このファイルはVer7.0よりお絵かきするのに必要となりました。')if(!-e $paint_cgi); require $paint_cgi; errorexit ('1','お絵描きCGIの互換性エラー','「paint.cgi」'.$PAINT_VERSION.' はこの '.$BBS_Version.' バージョンと互換性がありません!
互換した設定ファイルを使用して下さい。') if($PAINT_VERSION ne 'Hydrangea Canvas'); if($fc eq 'paint_sii'){&Open_sii} elsif($fc eq 'paint_pai'){&Open_pai} elsif($fc eq 'paint_pic'){&Open_pic} elsif($fc eq 'open_pch'){&Open_pch} else{&Open_sii} #_SUB_ exit } ################################################################### # / ログ解析&修復 / # sub Restore{eval << '_SUB_'; my $ADD_VALUE = &SetFormValue($SKIN_MODE_URL); my($TotalMsgByte,$TotalIMGByte,$ThreadID,$IMG_ID,$MSG_ID,$MSG_CNT,@FileList,,$TITLE)=0; &GetDate(); if(! opendir DIR,$FileSave_DIR){errorexit ('1','ディレクトリが開けません','「'.$FileSave_DIR.'」ディレクトリが開けませんでした。
config.cgiをよくお確かめ下さい。')}; while ($_=readdir DIR){ if($_ =~ /$MessageNameHead.*\.log/){ push @FileList,$_;$MSG_CNT++; } } print "Content-type: text/html\n\n"; $TITLE=$FORM{analyze}?'解析':'復元'; print < $TITLE

データディレクトリ$TITLE

EOF #SORT @FileList=reverse sort @FileList; open(FLOG, ">$filelog")if(!$FORM{analyze}); foreach(@FileList){ $MSG_SIZE=-s "$FileSave_DIR/$_"; open(MSG,"<$FileSave_DIR/$_");my @LOG=;close(MSG); print ""; my($_f_ID,$_f_src,$_f_sum,$_f_ani,$IMG_SIZE); $IMG_F=$IMG_S=$IMG_A = ' '; $_ =~ s/$MessageNameHead(.*)\.log//; if($ThreadID < $1){$ThreadID=int $1}; $_f_ID=int $1; ($AC_msgcnt,$name,$date,$title,$mail,$url,$mesg,$HOST,$IP,$BROWSER,$FileSRC,$FileW,$FileH,$FileSize,$_,$ThumbnailName,$Paint_Time,$ADD_FORMAT)=split(/\t/,shift @LOG); undef %l; foreach(split/\x08/, $ADD_FORMAT){s/^([^=]*)=(.*)$/$l{$1} = $2/e}; $LOG_ThumbSRC = (grep /\.(jpg|png|gif)$/i,$ThumbnailName,$l{thumbsrc})[0]; $LOG_AnimeSRC = (grep /\.(pch|jpeg)$/i,$FileSRC,$ThumbnailName,$l{animesrc})[0]; $LOG_FileSRC = (grep /\.(jpg|png|gif)$/i,$FileSRC)[0]; if($LOG_FileSRC){ $IMG_SIZE=-s "$FileSave_DIR/$LOG_FileSRC"; $TotalIMGByte+=$IMG_SIZE; $TotalDATAByte+=$IMG_SIZE; if($IMG_SIZE > 0){ $IMG_SIZE=~s/(.*\d)(\d{3})/$1.$2/g; $IMG_F="○ \($IMG_SIZE byte\)"; $_f_src="\t".$LOG_FileSRC; $LOG_FileSRC = "$LOG_FileSRC"; }else{$IMG_F='× Not Found'} }else{$LOG_FileSRC = ' '} if($LOG_ThumbSRC){ $IMG_SIZE=-s "$FileSave_DIR/$LOG_ThumbSRC"; $TotalTHUMBByte+=$IMG_SIZE; $TotalDATAByte+=$IMG_SIZE; if($IMG_SIZE > 0){ $IMG_SIZE=~s/(.*\d)(\d{3})/$1.$2/g; $IMG_S="○ \($IMG_SIZE byte\)"; $_f_sum="\t".$LOG_ThumbSRC; $LOG_ThumbSRC = "$LOG_ThumbSRC"; }else{$IMG_S='× Not Found'} }else{$LOG_ThumbSRC = ' '} if($LOG_AnimeSRC){ $IMG_SIZE=-s "$FileSave_DIR/$LOG_AnimeSRC"; $TotalANIMEByte+=$IMG_SIZE; $TotalDATAByte+=$IMG_SIZE; if($IMG_SIZE > 0){ $IMG_SIZE=~s/(.*\d)(\d{3})/$1.$2/g; $IMG_A="○ \($IMG_SIZE byte\)"; $_f_sum="\t".$LOG_AnimeSRC; $LOG_AnimeSRC = "$LOG_AnimeSRC"; }else{$IMG_A='× Not Found'} }else{$LOG_AnimeSRC = ' '} foreach(@LOG){ chomp ;@Re=split(/\t/); $date=$Re[2] if($date < $Re[2]); } $date =~ /^(\d*)\/(\d\d)\/(\d\d).*(\d\d\:\d\d)$/; $date="\($1\/$2\/$3\[$4\:00\]\)"; print FLOG "$_f_ID$date$_f_src$_f_sum\n"if(!$FORM{analyze}); if($FileSRC =~ /$FileNameHead(.*)\.(png|jpg|gif|pch|jpeg)$/){ if($IMG_ID < $1){$IMG_ID=$1}; } if($ThumbnailName =~ /$ThumbnailNameHead(.*)\.(png|jpg|gif|pch|jpeg)$/){ if($IMG_ID < $1){$IMG_ID=$1}; } if($AC_msgcnt =~ /(\d*)/){ if($MSG_ID < $1){$MSG_ID=$1}; } foreach(@LOG){ @Re=split(/\t/); if($Re[0] =~ /(\d*)/){ if($MSG_ID < $1){$MSG_ID=$1}; } } print "\n"; $TotalMsgByte +=$MSG_SIZE; } $MSG_ID++;$IMG_ID++; if(!$FORM{analyze}){ open(CLOG, ">$count_file"); print CLOG "$ThreadID\t$MSG_ID\t$IMG_ID\n"; close(CLOG) } close(FLOG)if(!$FORM{analyze}); $TotalDATAByte+=$TotalMsgByte; $TotalMsgByte=~s/(.*\d)(\d{3})/$1.$2/g; $TotalIMGByte=~s/(.*\d)(\d{3})/$1.$2/g; $TotalTHUMBByte=~s/(.*\d)(\d{3})/$1.$2/g; $TotalANIMEByte=~s/(.*\d)(\d{3})/$1.$2/g; $TotalDATAByte=~s/(.*\d)(\d{3})/$1.$2/g; print <
ログファイル(サイズ) ID 画像 存在(サイズ) サムネイル 存在(サイズ) アニメデータ 存在(サイズ)
".$_." \( $MSG_SIZE byte\)$AC_msgcnt$LOG_FileSRC$IMG_F$LOG_ThumbSRC$IMG_S$LOG_AnimeSRC$IMG_A
ログ数
正常なスレッドID
正常な画像ID
正常なメッセージID
総メッセージログサイズ 
総画像データサイズ
総サムネイルサイズ
総アニメデータサイズ
全データサイズ
$MSG_CNT
$ThreadID
$IMG_ID
$MSG_ID
$TotalMsgByte byte
$TotalIMGByte byte
$TotalTHUMBByte byte
$TotalANIMEByte byte
$TotalDATAByte byte
EOF if(!$FORM{analyze}){print "

以上の設定で復元しました。"} print <
$ADD_VALUE

EOF _SUB_ exit } #Restore ################################################################### # / ヘルプ / # sub HelpOpen{eval << '_SUB_'; &GetCookie; if($FORM{lock}=~/0|1/){ $COOKIE{lock}=$FORM{lock}; $COOKIE{mode}=$FORM{mode}; $COOKIE{sort}=$FORM{sort}; &CookieWrite; } # ヘルプ:アプレットの表記(PaintBBS) $TXT_HELP_SII = <<'_TXT_'; ■お絵かきJavaアプレットには「お絵かきしぃ掲示板PaintBBS」のものを使用しています。
Javaなお子様的HP http://www.gt.sakura.ne.jp/~ocosama/
動作環境:Java1.*が使うことの出来るブラウザ(IEやネットスケープ等)


_TXT_ # ヘルプ:アプレットの表記(PictureBBS) $TXT_HELP_OHONO = <<'_TXT_'; ■PictureBBSお絵かきJavaアプレットにはお〜のさん「PictureBBS」のものを使用しています。


_TXT_ # ヘルプ:アプレットの表記(BBSPainter) $TXT_HELP_NINA = <<'_TXT_'; ■BBSPainterお絵かきJavaアプレットにはになさん「BBSPainter」のものを使用しています。
ば科学的愛情 http://www.geocities.co.jp/SiliconValley-SanJose/8609/


_TXT_ my (@sm,@ss,@sl); my $n = $COOKIE{mode} eq 'light'?1: $COOKIE{mode} eq 'catalog'?2: $COOKIE{mode} eq 'noimage'?3:0; $sm[$n] = ' selected'; $ss[int $COOKIE{sort}] = ' selected'; $sl[int $COOKIE{lock}] = ' checked'; print "Content-type: text/html\n$Exp\n"; print < BBS設定 $TXT_HEADER

$TXT_HELP_TOP

WonderCatStudio
Powerd by WonderCatStudio

EOF print $TXT_HELP_SII if($siiApplet_Use); print $TXT_HELP_OHONO if($PictureBBSApplet_Use); print $TXT_HELP_NINA if($BBSPainterApplet_Use); print <
■初期表\示モードを記憶する (Cookie)
固定 解除

■基本設定
*キャンバスの最大解像度は「閲覧時の画像の最大解像度」までです。 EOF my @cfg = ( 'ログ保存件数',"$LogMax 件", '受信する最大文字',"$Maxmesg byte", '返信できる最大許容値',"$MaxResmesg byte", 'お絵描き最大受信データサイズ',"$MaxPaintData byte", 'お絵かきアニメ最大受信データサイズ',"$MaxAnimeData byte", 'サムネイル最大受信データサイズ',"$MaxThumbnailData byte", 'アップロード画像の最大受信データサイズ',"$MaxUpLoadData byte", '受信オーバー時の処置',($OverflowDataDel&&'破棄'||'エラー表示'), '受信する画像の最大解像度',"$maxImageWidth x $maxImageHeight", '閲覧時の画像の最大解像度',"$viewLimitW x $viewLimitH", '■詳細情報','', '名前最大文字数',"$Maxnamelen byte", 'メール最大文字数',"$Maxmaillen byte", 'URL最大文字数',"$MaxURLlen byte", 'タイトル最大文字数',"$Maxtitlelen byte", 'メッセージ最大文字数',"$Maxmesg byte", 'メッセージ最大行数',"$MaxLine 行", 'URL自動リンク',($URLAutoLink&&'する'||'しない'), 'Mailto自動リンク',($MailAutoLink&&'する'||'しない'), '引用文の色変え',($Msg_Quotation&&'する'||'しない'), 'タイトル記入',($Input_Title&&'必要'||'不要'), 'メール記入',($Input_Mail&&'必要'||'不要'), 'パスワード記入',($Input_Password&&'必要'||'不要'), 'コメントのみの投稿',($NotCommentOnlyPost&&'禁止'||'許可'), '画像アップロード',($ImageUpload_Use&&'許可'||'禁止'), '画像を続きから描く',($Image_Continue_Use&&'許可'||'禁止'), '続きから描くパスワード',(!$Image_Continue_Pass&&'不要'||$Image_Continue_Pass==1&&'必要'||'差し替え時のみ必要'), 'フラワーパニック',(!$Panic_Mode&&'ユーザによる選択式'||$Panic_Mode==1&&'強制使用'||'使用しない'), '描画アニメーション',($sii_animation_save eq 'user' &&'ユーザによる選択式'||$sii_animation_save eq 'true'&&'強制記録'||'記録しない'), 'Perl ',$], 'Server OS ',$^O, ); for($c=0;$c<@cfg;$c++){ print "$cfg[$c-1]".@cfg[$c]."\n"if($c%2); } if($TAGS_Use){ print ''.$F.' ■使用可能タグ *閉じタグ必須
'; foreach(@OKTags){print "\<\;$_\>\;\ \;"} print ''; } print <
[BACK]
$TXT_BBS_MSGDOWN
$Version$SkinVer$ClientVer
EOF _SUB_ exit } sub PaletteOpen(){ my $Palette_name=@_[0]; my $l_name,$p_name,@value; open(Palette,"$color_Palette_file"); while ($_=){ s/[\t\s]//g; @_=split /\,/; $l_name=shift;$p_name=shift; push @Palette,$l_name."\t".$p_name; if($Palette_name eq $l_name){@C_Palette=@_} } close Palette; } ################################################################### # / エラー / # errorexit([エラー番号],[エラータイトル],[エラー内容]) sub errorexit{eval << '_SUB_'; ($E_Flag,$E_TITLE,$E_BODY)=@_; &call('errorexit'); &fileunlock if($LOCKED); if($fc eq 'captor'){ $E_BODY =~ s/
/\n/ig; print "Content-type: text/plain\n\nerror\nエラー!!\n$E_TITLE\n$E_BODY\n再度投稿しなおして下さい。"; exit } my $eADMIN; if($E_Flag eq "0"){$eADMIN="\[ADMIN\] "} elsif(($E_Flag eq "post")&&(!$E_NoPost)){ print "Content-type: text/html\n$Exp\n"; $fc ='post';&HTML_HEAD; $_=$SKIN_MAIN_FORMAT; s/(name="title")/$1 value="$title"/si; s/(name="mesg".*)(<\/textarea>)/$1$FORM{'mesg'}$2/si; if($FORM{'l'} ne ""){ s/(.*)//si; $ImageUpload_Use=0 } if($interrupt){ s/(name="fc" VALUE="write">)/$1/si; $ImageUpload_Use=0 } s//

$E_TITLE<\/H1>
$E_BODY
$TXT_ERROR/si; $SKIN_MAIN_FORMAT=$_; &PostForm; print $SKIN_MAIN_FORMAT; &HTML_FOOT; exit; }elsif($E_Flag eq "ref"){ $REF = "\n"; } print "Content-type: text/html\n$Exp\n" if($E_Flag ne 'skin'); eval '&skin("SKIN_ERROR_HTML")'; $_=$SKIN_ERROR_HTML; if(!$_){ print < $REF$E_TITLE$TXT_HEADER



$E_TITLE


$E_BODY
$TXT_ERROR

$eADMIN\[BACK\]
$TXT_BBS_MSGDOWN
$Version$SkinVer$ClientVer
EOF }else{ s/(.*)//si; $SKIN_HEAD_FORMAT=$1; s/(.*)//si; $SKIN_FOOTER_FORMAT=$1; s/(.*)//si; $SKIN_MAIN_FORMAT=$1; if($E_Flag eq "c"){ $E_BODY.='
'; }else{ $E_BODY.='
'; } $_=$SKIN_HEAD_FORMAT; s/()(.*)(<\/TITLE>)/$1$E_TITLE$3/si; s/(<\/HEAD>)/$TXT_HEADER\n$1/si; print; $_=$SKIN_MAIN_FORMAT; s/<BODY>/<BODY $BODY>/si; s/\$ErrorTitle/$E_TITLE/si; s/\$ErrorMessage/$E_BODY/si; s/\$TXT_ERROR/$TXT_ERROR/si; s/href="RELOAD"/href="$BBSNoteCGI$SKIN_MODE_RE"/sig; print; $_=$SKIN_FOOTER_FORMAT; s/<!--SKIN_TXT_BBS_MSGDOWN-->/$TXT_BBS_MSGDOWN/si; s/<!--SKIN_Version:begin-->.*<!--SKIN_Version:end-->/$ADMIN$Version$SkinVer$ClientVer/si; print; } _SUB_ exit } #DLL ################################################################### # / フォーム取得 / # sub GetForm{ my $func; if($ENV{'REQUEST_METHOD'} eq 'GET'){$func=$ENV{QUERY_STRING}} else{read (STDIN, $func, $ENV{'CONTENT_LENGTH'})} my @parts=split(/&/, $func); foreach(@parts) { my($v_name, $value)=split(/=/); $value =~ tr/+/ /; &unescape(\$value); $FORM{$v_name}=$value; }} ################################################################### # / マルチパート取得 / # sub FormMultipart{ binmode(STDIN);binmode(STDOUT); undef %FORM; if($ENV{'CONTENT_TYPE'} =~ /\Amultipart\/form-data/) { my($func,$bound,@forms,@pairs,$pair); if($ENV{'REQUEST_METHOD'} eq 'GET'){$func=$ENV{QUERY_STRING}} else{read (STDIN, $func, $ENV{'CONTENT_LENGTH'})} my $CR="\r\n"; # 改行コード split(/$CR/,$func,2); #始めの二行を飛ばす $bound=quotemeta @_[0]; @forms=split(/$bound/,$func); shift(@forms);pop(@forms);my $f; foreach(@forms) { s/^$CR//;$f=0;s/\s$//;s/\s$//; ($FORM_head,$FORM_data)=split(/$CR$CR/,$_,2); $FORM_head =~ s/$CR/; /g; $FORM_head =~ s/: /=/g; $FORM_head =~ s/\"//g; @pairs=split(/; /,$FORM_head); foreach$pair(@pairs) { my($param_name,$param_value)=split(/=/,$pair,2); if($param_name eq 'name'){next if($f);$f=1} $names{$param_name}=$param_value; } foreach(keys(%names)) { $FORM{"$names{name}_$_"}=$names{$_}; } $FORM{$names{name}}=$FORM_data; } }else{&GetForm} $fc=$FORM{'fc'} } ################################################################### # / 時間関係 / # sub GetDate(){ $TIME = @_[0] eq ''? time + $TIME_DIFF_SEC:@_[0]; @youbi=("Sun","Mon","Tue","Wed","Thu","Fri","Sat"); @tuki=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); ($sec,$min,$hour,$mday,$month,$year,$wday) = gmtime(time + 2*365*24*3600);$year += 1900; $cookielimit=sprintf( "%s, %02d-%s-%4d %02d:%02d:%02d GMT",$youbi[$wday],$mday,$tuki[$month],$year,$hour,$min,$sec); @T=localtime($TIME); ++$T[4];$T[5] += 1900; $date=sprintf( "%4d/%02d/%02d (%s) %02d:%02d:%02d",$T[5],$T[4],$T[3],$youbi[$T[6]],$T[2],$T[1],$T[0]); $date=~/(\d*)\/(\d\d)\/(\d\d) \((.*)\) (\d\d)\:(\d\d)\:(\d\d)/; $year=$1;$month=$2;$mday=$3;$week=$4;$hour=$5;$min=$6;$sec=$7; $C_date="$year\/$month\/$mday ($week) $hour\:$min"; $Today="$year\/$month\/$mday"; $C_before="$year\/$month\/$mday\($hour\:$min\:$sec\)"; chop($date) if($date =~ /\n$/); } ################################################################### # / ブラウザ関係 / # sub GetBrowse{eval << '_SUB_'; $IP=$ENV{'REMOTE_ADDR'}; $HOST=$ENV{'REMOTE_HOST'}; if($HOST eq '') { $HOST=$IP; } if($HOST eq $IP) { $HOST=gethostbyaddr(pack('C4',split(/\./,$IP)),2) || $IP} $browse= $ENV{'HTTP_USER_AGENT'}; $browse =~ s/</</g; $browse =~ s/>/>/g; $browse =~ s/\n//g; if($browse=~ /Opera\/? ?(\d+)/){$AGENT="Opera";$AGENT_S="Opera $1"} elsif($browse=~ /MSIE (\d+)/){$AGENT="MSIE";$AGENT_S="MSIE ".$1} elsif($browse=~ /DreamPassport/){$AGENT="DC";$AGENT_S="DreamPassport"} elsif($browse=~ /iCab \w\/?([\d\.]*)/){$AGENT="iCab";$AGENT_S="iCab $1"} elsif($browse=~ /Safari\/?([\d\.]*)/){$AGENT="Safari";$AGENT_S="Safari $1"} elsif($browse=~ /Mozilla\/5/){$AGENT="NN";if($browse=~ /Netscape\/?([\w\.]+)/){$AGENT_S="NN $1"}else{$AGENT_S="Mozilla"}} elsif($browse=~ /Mozilla\/(4|3)/ && $browse!~ /Compatible/){$AGENT="NN";$AGENT_S="NN $1"} elsif($browse=~ /MSIE/){$AGENT="MSIE";$AGENT_S="MSIE"} else{$AGENT="OTHER";$AGENT_S="OTHER"} local(@BrowsOS)=( 'Windows XP,WinXP', 'Windows NT 5.1,WinXP', 'Windows NT 5,Win2000', 'Windows NT,WinNT', 'Windows 2000,Win2000', 'Win2000,Win2000', 'WinNT,WinNT', 'Win95,Win95', 'Windows 95,Win95', 'Windows 98,Win9x', 'Mac OS X,MacOSX', 'Mac_PowerPC,Mac', 'Macintosh,Mac', 'PPC,Mac', '68K,Mac', 'DreamPassport,DC', 'FREEBSD,FreeBSD', 'FRINBSD,FrinBSD', 'BSD/OS,HP-UX', 'Linux,Linux' ); foreach(@BrowsOS){ @_=split(/,/); if($browse =~ /\Q@_[0]\E/){ $USER_OS=@_[1];last } } if($USER_OS eq "Win9x"){$USER_OS=$browse =~ /Win 9x/?'WinMe':'Win98'} if(($USER_OS eq "Mac")&&($browse =~ /MSIE 5.22/)){$USER_OS='MacOSX'} $USER_OS='OTHER' if($USER_OS eq ''); _SUB_ } sub GetMsgPassword(){eval << '_SUB_'; local($ThreadID)=@_[0]; if($ThreadID =~ /(\d+)\-(\d+)/){ $MsgNo=$1;local($AesNo)=$2; &fl($MsgNo); if(-e "$LogFile") { open(MSG,$LogFile);@FileData=<MSG>;close(MSG); foreach(@FileData) { @l=split(/\t/); return $l[4] if($AesNo eq $l[0]); } } return -1; } &fl($ThreadID); if(-e "$LogFile") { open(MSG,$LogFile);@FileData=<MSG>;close(MSG); $line=shift @FileData; @LogLine=split(/\t/ , $line); $_=$LogLine[14];chomp; return $_ } return -1; _SUB_ } sub PasswordCheck(){eval << '_SUB_'; local($pass)=@_[0];local($c_pass)=@_[1]; if($crypt_Use){ if($c_pass eq crypt($pass,'ID')){return 1} } else{ if($c_pass eq $pass){return 1} } return 0; _SUB_ } ################################################################### # / ぱにっくるーちん / # ぽなさん改良さんくす♪ http://shillest.net/ sub Panic{eval << '_SUB_'; local(*mesg, $C_table, $datfile)=@_; $PanicFile=$datfile if($datfile ne ''); open(PANIC, "<$PanicFile"); my(@c,$plen,$panic_before,$panic_after,$panic_conf,$panic_tagpre,$panic_tagpost); if($C_table eq 'black'){ @c=("CCCCFF","6666FF","9966FF","9999FF","CC99FF","FFCCFF","FF99FF","FF33FF","FF66CC","FF99CC","FFCCCC","FF99FF","FF99CC","FF9999","FF6666","FF3333","FF9999","FF9933","FFCC66","FFFF99","FFFF66","99FF99","99FF66","66FF66","00CC00","00CC66","00CC99","00FF99","33FFCC","66FFCC","99FFCC"); } elsif($C_table eq 'custum'){ @c=@PanicColorTable } else{ @c=("9999FF","0099FF","0033CC","6600CC","6600FF","9966FF","9933FF","9900CC","CC00CC","FF00FF","FF66FF","FF99FF","FF99CC","FF6699","FF0099","FF0066","FF3333","FF6666","FF3333","FF6633","FF6600","FF9900","FFCC33","669900","009966","00CC00","33CC99","00CCCC","336699","663399","CC3399"); } $plen = @c; while ( $panic_before=<PANIC> ) { #↑1行目 break unless ( $panic_after=<PANIC> ); #2行目 break unless ( $panic_conf =<PANIC> ); #3行目 break unless ( <PANIC> ); #4行目は空読み chomp($panic_before,$panic_after,$panic_conf); if($panic_conf eq "brand") { $panic_tagpre="<B><Font color=\"$c[rand $plen]\">"; $panic_tagpost='</Font></B>'} elsif($panic_conf eq "bbrand") { $panic_tagpre="<B><Font color=\"$c[rand $plen]\" SIZE=\"+1\">"; $panic_tagpost='</Font></B>'} elsif($panic_conf eq "rand") { $panic_tagpre="<Font color=\"$c[rand $plen]\">";$panic_tagpost='</Font>'} elsif($panic_conf eq "") { $panic_tagpre=''; $panic_tagpost=''} elsif($panic_conf eq "irand") { $panic_tagpre="<i><Font color=\"$c[rand $plen]\">"; $panic_tagpost='</Font></i>'} elsif($panic_conf eq "b") { $panic_tagpre='<b>'; $panic_tagpost='</b>'} elsif($panic_conf eq "i") { $panic_tagpre='<i>'; $panic_tagpost='</i>'} elsif($panic_conf eq "Bbrand") { $panic_tagpre="<B><Font color=\"$c[rand $plen]\" SIZE=\"+2\">"; $panic_tagpost='</Font></B>'} elsif($panic_conf eq "Birand") { $panic_tagpre="<i><Font color=\"$c[rand $plen]\" SIZE=\"+2\">"; $panic_tagpost='</Font></i>'} elsif($panic_conf eq "birand") { $panic_tagpre="<i><Font color=\"$c[rand $plen]\" SIZE=\"+1\">"; $panic_tagpost='</Font></i>'} $mesg =~ s/([\201-\237\340-\374][\100-\374]|[\40-\177\241-\337]|^)\Q$panic_before\E/$1$panic_tagpre$panic_after$panic_tagpost/g; } close(PANIC); _SUB_ } sub CookieWrite{eval << '_SUB_'; &GetDate(); my($c_name,$c_mail,$c_url,$c_pass,$c_flower); $c_name=$name=$FORM{'name'}; $c_name=$COOKIE{name}if(!$c_name&&!exists $FORM{name}); $c_mail=$mail=$FORM{'mail'}; $c_mail=$COOKIE{mail}if(!$c_mail&&!exists $FORM{mail}); $c_mail =~ s/mailto\://g; $c_url=$url=$FORM{url}; $c_url=$COOKIE{url}if(!$c_url&&!exists $FORM{url}); $c_url =~ s/http\:\/\///g; $c_pass=$passwrd=$FORM{'password'}; $c_pass=$COOKIE{passwrd}if(!$c_pass&&!exists $FORM{password}); $c_flower=$flower=$FORM{'flower'}; $c_flower=$COOKIE{flower}if(!$c_flower&&!exists $FORM{flower}); if($flower eq "1"){$PanicON="Checked"} if(($fc eq 'page' || $fc eq '') && $COOKIE{lock}!=1){ if($COOKIE{mode} ne $FORM{mode}){ $c_mode=$FORM{mode}; } else { $c_mode=$COOKIE{mode}; } if($COOKIE{sort} ne $FORM{sort}){ $c_sort=$FORM{sort}; } else { $c_sort=$COOKIE{sort}; } } else { $c_mode=$COOKIE{mode}; $c_sort=$COOKIE{sort}; } &escape(\$c_name);&escape(\$c_mail);&escape(\$c_url);&escape(\$c_pass);&escape(\$c_flower); $CookieData="BBSNote\=version\:Ver7x\,name\:$c_name\,mail\:$c_mail\,url\:$c_url\,flower\:$c_flower\,passwrd\:$c_pass\,mode\:$c_mode\,sort\:$c_sort\,lock\:$COOKIE{lock}\,$ADD_COOKIE>; expires=$cookielimit"; &call('CookieWrite'); print "Set-Cookie: $CookieData\n"; if($MetaCookie_use){$Meta_Cookie .= "<META HTTP-EQUIV=\'Set-Cookie\' CONTENT=\'$CookieData\'>"} _SUB_ } sub OpenFileCookie(){ my ($id,$in,$acc) = @_; open(CREV,"<$cookie_file");@c=<CREV>;close CREV; @c = reverse @c; $T = time - ($MainMsgForm_Limit*60); undef %FCookie; foreach (@c){ my($c_time,$ID,$flag,$name,$mail,$url,$flower,$app,$imagename,$thumbname,$animename,$width,$height,$length,$paint_time,$accid,@addparam)=split /\t/; chomp $accid; if((($id eq $ID || $in eq $c_time) && $c_time > $T) || ($acc eq $accid)){ $rev_flag = $flag; $imgname = $imagename; %FCookie=( time => $c_time, name => $name, mail => $mail, url => $url, flower => $flower, app => $app, file_name => $imagename, thumb_name => $thumbname, anime_name => $animename, width => $width, height => $height, file_length => $length, paint_time => $paint_time, accid => $accid ); foreach(@addparam){ chomp; my($ah, $val) = split /=/; foreach(@SII_ADD_PARAM,@PIC_ADD_PARAM){ next if($ah ne $_); &unescape(\$val); $$ah=$val; } } $PanicON = ' checked'if$FORM{flower}; return 1 } } } sub GetFileCookie{ $FORM{id} = $FORM{'amp;id'} if($FORM{'amp;id'}); filelock; if(&OpenFileCookie($FORM{id},'',0)){ open(CREV,">$cookie_file"); $r_pass = &randstr; foreach(@c){ my($c_time,$ID) = split /\t/,$_,3; if($FORM{id} eq $ID){ s/$ID/&randstr/e; } print CREV; } close CREV; unlink $cookie_file if(-z $cookie_file); fileunlock; $interrupt=$FCookie{time}; $c_pass=$FORM{password}; $FORM{name}&& &CookieWrite||&GetCookie; $TXT_HEADER.='<META HTTP-EQUIV="Expires" CONTENT="no-cache"><META HTTP-EQUIV="Pragma" CONTENT="no-cache">'; &PostOpen if $rev_flag; }else{fileunlock} &CookieWrite; return } sub GetCookie{ $name="";$mail='';$url='';$PanicON=""; if($ENV{"HTTP_COOKIE"}){ my ($s,$e); my $c =$ENV{"HTTP_COOKIE"}; $s=index $c,"BBSNote="; if($s != -1){ $e=index $c,">",$s; $e=length $c if($e == -1); local(@cdata); @cdata=split(/\,/, substr $c,$s,$e-$s); foreach(@cdata){ local($c_name, $val)=split(/\:/); &unescape(\$val); $COOKIE{$c_name}=$val } $C_before=$COOKIE{'C_before'}; $name=$COOKIE{name}; $mail=$COOKIE{mail}; $url=$COOKIE{url}; $flower=$COOKIE{flower}; $passwrd=$COOKIE{passwrd}; $PanicON="Checked" if($flower eq "1"); &call('GetCookie') } } } sub AdminPassCheck{ errorexit ('1','パスワードが違います','パスワードが間違っています!<BR>もう一度よくお確かめ下さい。')if($FORM{'password'} ne $password );$adminMode =1; $passwrd = $FORM{'password'}; } sub BrowsCss{eval << '_SUB_'; &GetBrowse; &GetCookie if $fc ne 'rev'; $T_SIZE=$AGENT eq 'MSIE'?30:20; local($FmaxData)=int($maxData / 1000); if($ImageUpload_Use){ $POST_COUTION_MSG1="$Font_UserTag \* 受信できる画像の最大データサイズは<B> $FmaxData </B>KB までです。(最大解像度 \: $maxImageWidth x $maxImageHeight )<BR>\n"; $POST_COUTION_MSG1.= '* 画像ファイルには <B>JPG・PNG・GIF・PCH</B> が使用できます。<BR>'.$Font_UserEndTag; } $POST_COUTION_MSG2=$Font_UserTag.'* パスワードは半角英数で8文字まで有効です。'.$Font_UserEndTag; _SUB_ } sub FastBoot{ if($NotFastCheck eq "true"){return} my @err=('が見つかりません。<br>','が適切なパーミッションではありません。<br>'); my $errstr; if(! -e $FileSave_DIR){ if(!mkdir $FileSave_DIR,0777){ $errstr.= "「$FileSave_DIR」ディレクトリ".$err[0]; } chmod 0777,$FileSave_DIR; } $errstr.= "「$FileSave_DIR」はディレクトリではありません。<br>" if(! -d $FileSave_DIR); $errstr.= "「$FileSave_DIR」ディレクトリ".$err[1] if(! -R $FileSave_DIR || ! -W $FileSave_DIR || ! -X $FileSave_DIR); if(! -e $count_file){ $errstr.= "カウントファイル「$count_file」".$err[0]} elsif(! -W $count_file){$errstr.= "カウントファイル「$count_file」".$err[1]} if(! -e $filelog){ $errstr.= "ファイルログ「$filelog」".$err[0]} elsif(! -W $filelog){ $errstr.= "ファイルログ「$filelog」".$err[1]} $errstr.= "パニックファイル「$PanicFile」".$err[0]if(! -e $PanicFile); $errstr.= "パレットファイル「$color_Palette_file」".$err[0]if(! -e $color_Palette_file); errorexit ('0','起動エラー',$errstr) if($errstr); } sub SetFormValue(){ my($a,$b,$c); foreach(split /&/,$_[0]){ ($b,$c) = split /=/; $a.='<input type="hidden" name="'.$b.'" value="'.$c.'">'if($b); } return $a; } sub randstr{ my($n,$ti,$id); while($n<8){$ti=chr(int(rand(74)+48));if($ti =~ /\w/){$n++;$id.=$ti}} return $id; } sub accid(){ my $a = $_[0]; my (@str,$re); while($a =~ s/(.{8})//){ push @str,$1; } push @str,$a if($a); if($crypt_Use){ foreach(@str){ $re.=crypt($_,'AC'); } }else{ $re = join '',@str; } return "$re"; } sub call(){foreach(eval '@'.@_[0]){eval}} ################################################################### # / ファイルロック / # sub filelock { $try=$lock_try; while(!mkdir($lockdir,0755)){ if(--$try <= 0) { if((-M $lockdir)*86400 > $lock_sec) { rmdir($lockdir)if(-e $lockdir); last; } $e1='只今他の方が書き込み中です。';$e2=$lockdir.'しばらく待ってから再度投稿を行って下さい。'; errorexit ('5',$e1,$e2) if($fc ne 'captor'); print "Content-type: text/plain\n\nerror\nエラー!!\n$e1\n$e2";exit } sleep($lock_sleep); } $LOCKED = 1; } sub fileunlock { rmdir($lockdir)if(-e $lockdir); $LOCKED = 0; }