#!/usr/bin/perl use vars qw(%set %in); #use strict; $set{'log_file'} = './log.cgi'; #ログファイル名 $set{'max_log'} = 30; #保持件数 $set{'max_size'} = 1*1024; #最大投稿容量(KB) $set{'min_flag'} = 0; #最小容量制限を使用する=1 $set{'min_size'} = 100; #最小投稿容量(KB) $set{'file_pre'} = 'up'; #ファイル接頭辞 $set{'src_dir'} = './src/'; #保存ディレクトリ $set{'pagelog'} = 10; #1ページに表示するファイル数 $set{'base_cgi'} = './upload.cgi'; #このスクリプト名 $set{'base_html'} = './upload.html'; #1ページ目のファイル名 $set{'interval'} = 0; #同一IP投稿間隔秒数 $set{'deny_host'} = ''; #投稿禁止IP/HOST ,で区切る ex.(bbtec.net,219.119.66,ac.jp) $set{'per_upfile'} = 0666; #アップロードファイルのパーミッション suexec=0604,other=0666 $set{'admin_name'} = 'admin'; #管理者ログインID $set{'admin_pass'} = '1234'; #管理者パスワード $set{'up_ext'} = 'txt,lzh,zip,rar,gca,mpg,mp3,avi,swf,bmp,gif,jpg,png'; #アップロードできる基本拡張子 半角英数小文字 ,で区切る $set{'up_all'} = 0; #登録以外のものもUPさせられるようにする=1 $set{'ext_org'} = 0; #$set{'up_all'}が1の時オリジナルの拡張子にする=1 $set{'deny_ext'} = 'php,php3,phtml,rb,sh,bat,dll'; #投稿禁止の拡張子 半角英数小文字 ,で区切る $set{'change_ext'} = 'cgi->txt,pl->txt,log->txt,jpeg->jpg,mpeg->mpg'; #拡張子変換 前->後 半角英数小文字 ,で区切る $set{'home_url'} = ''; #[HOME]のリンク先 相対パス又は http://から始まる絶対パス $set{'html_all'} = 1; #[ALL]を出す=1 $set{'dummy_html'} = 0; #ファイル個別HTMLを作成する=1 $set{'find_crypt'} = 1; #暗号化ZIP/RAR/GCAを検出する=1 $set{'binary_compare'} = 0; #既存ファイルとバイナリ比較する=1 $set{'post_flag'} = 0; #PostKeyを使用する=1 $set{'post_key'} = 'postkey'; #PostKey ,で区切ると複数指定 ex.(postkey1,postkey2) $set{'error_level'} = 1; #エラーログを記録する=1 $set{'log_error'} = './error.cgi'; #エラーログファイル名 #初期設定 $set{'per_dir'} = 0777; #ソースアップディレクトリのパーミッション suexec=0701,other=0777 $set{'per_logfile'} = 0666; #ログファイルのパーミッション suexec=0600,other=0666 $set{'ver'} = '19:39 2003/09/24'; unless(-e $set{'log_file'}){ &init; } unless(-e $set{'base_html'}){ &makehtml; } { #デコード $in{'addr'} = $ENV{'REMOTE_ADDR'}; $in{'host'} = gethostbyaddr(pack('c4',split(/\./, $in{'addr'})), 2) || $in{'addr'}; $in{'time'} = time; $in{'date'} = conv_date($in{'time'}); if ($ENV{'CONTENT_LENGTH'} > ($set{'max_size'} * 1024 + 1024)){ &error(106,$ENV{'CONTENT_LENGTH'});} if($ENV{'REQUEST_METHOD'} eq "POST" && $ENV{'CONTENT_TYPE'} =~ /multipart\/form-data/i){ my %FORM; my $subbuff; my $filename; my $valuename; my $upflag; my $valueflag; my $bound; my $mime; my $random = int(rand(900000)) + 100000; binmode(STDIN); while(){ if(/(--.*)\r\n$/){ $bound = $1; last; }} if(-e "$set{'src_dir'}$random.temporary"){ $random++; } if(-e "$set{'src_dir'}$random.temporary"){ $random++; } if(-e "$set{'src_dir'}$random.temporary"){ &error(204); } open(OUT,">$set{'src_dir'}$random.temporary"); binmode(OUT); while(my $buff = ){ if($upflag == 1){ if($buff =~ /Content-Type:\s(.*)\r\n$/i){ $mime = $1; } $upflag++; next;} if($upflag == 2){ $upflag++; next; } if($upflag == 3){ if($buff =~ /^$bound/){ $upflag = 0; next; } if($buff =~ /(.*)\r\n$/){ if($subbuff){ print OUT $subbuff; undef $subbuff; } $buff = $1; $subbuff = "\r\n"; print OUT $buff; next; } if($subbuff){ print OUT $subbuff; undef $subbuff; } print OUT $buff; } if($valueflag == 1){ $valueflag++; next; } if($valueflag == 2){ if($buff =~ /^$bound/){ $valueflag = 0; next; } if($buff =~ /(.*)\r\n$/){ if($subbuff){ $FORM{$valuename} .= $subbuff; undef $subbuff; } $buff = $1; $subbuff = "\r\n"; $FORM{$valuename} .= $buff; next; } if($subbuff){ $FORM{$valuename} .= $subbuff; undef $subbuff; } $FORM{$valuename} .= $buff; } if($buff =~ /^Content-Disposition:\sform-data;\sname=\"upfile\";\sfilename=\"(.*)\"\r\n$/i){ $filename = $1; $upflag = 1; undef $subbuff; next; } if($buff =~ /^Content-Disposition:\sform-data;\sname=\"(.*)\"\r\n$/i){ $valuename = $1; $valueflag = 1; undef $subbuff; next; } if($buff =~ /^$bound--/){ $upflag = 0; $valueflag=0; } } close(OUT); chmod($set{'per_upfile'},"$set{'src_dir'}$random.temporary"); if($upflag || $valueflag){ unlink("$set{'src_dir'}$random.temporary"); &error(108);} $in{'org_pass'} = $in{'pass'} = $FORM{'pass'}; $in{'comment'} = $FORM{'comment'}; $in{'jcode'} = $FORM{'jcode'}; $in{'postkey'} = $FORM{'postkey'}; $in{'upfile'} = $filename; $in{'type'} = $mime; $in{'tmpfile'} = "$set{'src_dir'}$random.temporary"; $in{'orgname'} = $in{'upfile'}; if(-s "$in{'tmpfile'}" == 0){ unlink("$in{'tmpfile'}"); &error(99) } if($set{'min_flag'} && ((-s "$in{'tmpfile'}") < $set{'min_size'} * 1024)){ &error(107,(-s "$in{'tmpfile'}"));} if((-s "$in{'tmpfile'}") > $set{'max_size'} * 1024){ &error(106,(-s "$in{'tmpfile'}"));} if($set{'post_flag'} && !check_postkey($in{'postkey'})){ &error(109); } }else{ my ($buffer,%FORM,@admin_delno); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});} else { $buffer = $ENV{'QUERY_STRING'}; } my @pairs = split(/&/,$buffer); foreach my $pair (@pairs) { my ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if($name eq 'admin_delno'){ push(@admin_delno,$value); }else{ $FORM{$name} = $value; } } $in{'delpass'} = $FORM{'delpass'}; $in{'delno'} = $FORM{'delno'}; $in{'mode'} = $FORM{'mode'}; $in{'checkmode'} = $FORM{'checkmode'}; $in{'admin_delno'} = join(',',@admin_delno); if($in{'delno'} eq $set{'admin_name'} && $in{'delpass'} eq $set{'admin_pass'}){ &admin_mode(); } if(!$in{'delno'} && $in{'delpass'} eq $set{'admin_pass'}){ &makehtml; &quit; } } my @denyhost = split(/,/,$set{'deny_host'}); foreach my $value (@denyhost){ if ($in{'addr'} =~ /$value/ || $in{'host'} =~ /$value/){ &error(101);} } if (length($in{'comment'}) > 128) { $in{'comment'} = substr($in{'comment'},0,128).'...'; } my @form= ($in{'comment'},$in{'orgname'},$in{'type'}); foreach my $value (@form) { # $value =~ s/&/&/g; $value =~ s/"/"/g; $value =~ s//>/g; $value =~ s/\r//g; $value =~ s/\n//g; } ($in{'comment'},$in{'orgname'},$in{'type'}) = @form; } if($in{'mode'} eq 'delete'){ &delete; &quit; } #削除 if(!$in{'upfile'}){ &error(99); } {#メイン処理 open(IN,$set{'log_file'})||&error(303); my @log = ; close(IN); my ($no,$lastip,$lasttime) = split(/<>/,$log[0]); if($in{'time'} <= ($lasttime + $set{'interval'}) && $in{'addr'} eq $lastip){ &error(203);} $in{'ext'} = extfind($in{'orgname'}); if(!$in{'ext'}){ &error(202); } my $orgname; if(split(/\//,$in{'orgname'}) > split(/\\/,$in{'orgname'})){ my @name = split(/\//,$in{'orgname'}); $orgname = $name[$#name]; } else{ my @name = split(/\\/,$in{'orgname'}); $orgname = $name[$#name];} my @salt = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; my $salt = $salt[int(rand(@salt))] . $salt[int(rand(@salt))]; $in{'pass'} = crypt($in{'pass'}, $salt); if($set{'binary_compare'}){ my @files = glob("$set{'src_dir'}*"); foreach my $value (@files){ next if($value =~ /\.temporary$/); if(binarycmp($in{'tmpfile'},$value)){ unlink($in{'tmpfile'}); &error(205,$value);} } } if($set{'find_crypt'}){ open(FILE,$in{'tmpfile'}); binmode(FILE); seek(FILE,0,0); read(FILE,my $buff,4); my $crypt_flag = 0; if($buff =~ /^\x50\x4b\x03\x04$/){ seek(FILE,6,0); read(FILE,my $buff,1); $crypt_flag = 1 if(($buff & "\x01") eq "\x01"); }elsif($buff =~ /^\x47\x43\x41\x58$/){ seek(FILE,8,0); read(FILE,my $length,8); seek(FILE,hex(unpack("H*",reverse $length)) + 4,0); read(FILE,my $buff,1); $crypt_flag = 1 if(($buff & "\x20") eq "\x20"); }elsif($buff =~ /^\x52\x61\x72\x21$/){ my ($crc,$headno,$flag,$headsize,$packsize,$unpacksize); seek(FILE,7,0); while(read(FILE,$crc,2)){ read(FILE,$headno,1);read(FILE,$flag,1); seek(FILE,1,1); read(FILE,$headsize,2); $headsize = hex(unpack("H*",reverse $headsize)); if(($flag & "\x80") ne "\x00"){ read(FILE,$packsize,4); $packsize = hex(unpack("H*",reverse $packsize)); read(FILE,$unpacksize,4); $unpacksize = hex(unpack("H*",reverse $unpacksize)); $packsize -= 8; } if($headno eq "\x74"){ if(($flag & "\x04") eq "\x04"){ $crypt_flag = 1; last; } elsif($unpacksize != 0){ last; } }elsif(($headno & "\x70") ne "\x70"){ $in{'comment'} = '*'.$in{'comment'}; last; } seek(FILE,$headsize + $packsize - 7 ,1); } } close(FILE); $in{'comment'} = '*'.$in{'comment'} if($crypt_flag); } open(IN,$set{'log_file'})||&error(303); @log = ; close(IN); ($no,$lastip,$lasttime) = split(/<>/,$log[0]); shift(@log); $no++; my $tmpno = sprintf("%04d",$no); rename("$in{'tmpfile'}","$set{'src_dir'}$set{'file_pre'}$tmpno.$in{'ext'}"); if (length($orgname) > 128) { $orgname = substr($orgname,0,128).'...'; } my @note; if($set{'post_flag'} && $set{'post_key'}){ push(@note,'PostKey:'.$in{'postkey'}); } if($ENV{'SERVER_SOFTWARE'} =~ /Apache/){ my $disptime; my $time = time() - $in{'time'}; my @str = ('Upload:','秒'); my $disptime = $time.$str[1]; push(@note,$str[0].$disptime); } my $note = join(',',@note); my @new; $new[0] = "$no<>$in{'addr'}<>$in{'time'}<>1\n"; $new[1] = "$no<>$in{'ext'}<>$in{'date'}<>$in{'comment'}<>$in{'type'}<>$orgname<>$in{'addr'}<>$in{'host'}<>$in{'pass'}<>$set{'file_pre'}<>$note<>1\n"; my $i = 2; foreach my $value (@log){ if($i <= $set{'max_log'}){ push(@new,$value); } else{ my ($no,$ext,$date,$comment,$mime,$orgname,$addr,$host,$pass,$filepre,$note,$dummy) = split(/<>/,$value); if(!$dummy){ $filepre = $set{'file_pre'};} $no = sprintf("%04d",$no); if(unlink("$set{'src_dir'}$filepre$no.$ext")){ unlink("$set{'src_dir'}$filepre$no.$ext.html"); }elsif(unlink("$set{'src_dir'}$filepre$no.$ext")){ unlink("$set{'src_dir'}$filepre$no.$ext.html"); }elsif(-e "$set{'src_dir'}$filepre$no.$ext"){ push(@new,$value); }else{ unlink("$set{'src_dir'}$filepre$no.$ext.html"); } } $i++; } logwrite(@new); if($set{'dummy_html'}){ &makedummyhtml("$set{'file_pre'}$tmpno.$in{'ext'}"); } &makehtml(); &quit(); } sub makehtml{ my $buff; my $init; my $page = 0; my $i = 1; open(IN,$set{'log_file'})||&error(303); my $log = my @log = ; close(IN); if($log == 1){ $log++; $init++;} my $lastpage = int(($log - 2)/$set{'pagelog'}) + 1; my $header = q| Uploader
Uploader

Now.. Testing..

EOM my $maxsize = 'Max '.dispsize($set{'max_size'}*1024); my $minsize; if($set{'min_flag'}){ $minsize = 'Min '.dispsize($set{'min_size'}*1024).' - '; } $header .= qq|
FILE($minsize$maxsize *$set{'max_log'}Files)
|; $header .=' DelKey:
COMMENT

'; if($set{'post_flag'}){ $header .= 'PostKey
'; } $header .= '
'; my $allsize = 0; my @files = glob("$set{'src_dir'}*"); foreach my $value (@files){ $allsize += (-s "$value"); } $allsize = dispsize($allsize); my $footer = "
Used ${allsize}\n
"; if($set{'up_all'} && !$set{'ext_org'}){ $footer .= $set{'up_ext'}.' +'; } elsif(!$set{'up_all'}){ $footer .= $set{'up_ext'}; } $footer .= "\n
No. key
\n"; $footer .= "\n"; if($set{'home_url'}){ $set{'home_url'} = qq|[HOME] |;} if($set{'html_all'}){ my $buff; my $no = 1; my $time = time; my $subheader; foreach my $value (@log){ my ($no,$ext,$date,$comment,$mime,$orgname,$addr,$host,$pass,$dummy) = split(/<>/,$value); if(!$dummy){ next; } $buff .= makeitem($value); } $subheader .= "[ALL] "; while($no <= $lastpage){ if($no == $page) { $subheader .= "\[$no\] ";} else{ if($no == 1){ $subheader .= "\[$no\] "} else{$subheader .= "\[$no\] ";} } $no++; } $subheader .= "\n\n"; open(OUT,">./all.html")||&error(306,"./all.html"); print OUT $header."
".$set{'home_url'}.$subheader."
".$buff.$footer; close(OUT); chmod($set{'per_upfile'},"./all.html"); }else{ unlink("./all.html"); } while($log > $i){ $buff .= makeitem($log[$i]) unless($init); if(($i % $set{'pagelog'}) == 0||$i == $log -1){ $page++; my $subheader; my $no = 1; my $time = time; if($set{'html_all'}){ $subheader .= "[ALL] "; } while($no <= $lastpage){ if($no == $page) { $subheader .= "\[$no\] ";} else{ if($no == 1){ $subheader .= "\[$no\] "} else{$subheader .= "\[$no\] ";} } $no++; } $subheader .= "
NAMECOMMENTSIZEDATEMIMEORIG
\n\n"; my $loghtml; if($page == 1){ $loghtml = $set{'base_html'}; } else{ $loghtml = "./$page.html"; } open(OUT,">$loghtml") || &error(306,"$loghtml"); print OUT $header."
".$set{'home_url'}.$subheader."
".$buff.$footer; close(OUT); chmod($set{'per_upfile'},$loghtml); undef $buff; } $i++; } while($page < 1000){ $page ++; if(-e "$page.html"){ unlink("$page.html"); }else{ last; } } } sub delete{ my $mode = $_[0]; my @delno = split(/,/,$_[1]); my $delno; my $flag = 0; my $tmpaddr; if($mode eq 'admin' || $in{'delno'} =~ /(\d+)/){ $delno = $1; }else{ return; } open(IN,$set{'log_file'})|| &error(303); my @log = ; close(IN); if($in{'addr'} =~ /(\d+).(\d+).(\d+).(\d+)/){ $tmpaddr = "$1.$2.$3."; } foreach my $value (@log){ my ($no,$ext,$date,$comment,$mime,$orgname,$addr,$host,$pass,$filepre,$note,$dummy) = split(/<>/,$value); my $delflag = 0; if(!$addr){ next; } if($mode eq 'admin'){ foreach my $delno (@delno){ if($no == $delno){ $delflag = 1; last; } } }elsif($no == $delno && ($in{'delpass'}||$addr =~ /^$tmpaddr/)){ unless ($addr =~ /^$tmpaddr/){ my $salt = substr($pass, 0, 2); my $delpass = crypt($in{'delpass'},$salt); if ($in{'delpass'} ne $set{'admin_pass'} && $delpass ne $pass){ last; } } $delflag = 1; } if($delflag){ # open(OUT,">>./del.cgi"); print OUT $value; close(OUT); $flag = 1; if(!$dummy){ $filepre = $set{'file_pre'};} $no = sprintf("%04d",$no); if(unlink("$set{'src_dir'}$filepre$no.$ext")){ unlink("$set{'src_dir'}$filepre$no.$ext.html"); undef $value; }elsif(unlink("$set{'src_dir'}$filepre$no.$ext")){ unlink("$set{'src_dir'}$filepre$no.$ext.html"); undef $value; }elsif(!(-e "$set{'src_dir'}$filepre$no.$ext")){ unlink("$set{'src_dir'}$filepre$no.$ext.html"); undef $value; } } } if($flag){ logwrite(@log); &makehtml(); } } sub quit{ my ($cookiename,$buff); my $flag = 0; my @tmpfiles = glob("$set{'src_dir'}*.temporary"); foreach my $value (@tmpfiles){ if((stat($value))[10] < time - 60*60){ unlink("$value"); $flag++; } } &makehtml() if($flag); $buff =<<"EOM"; EOM if($in{'jcode'} || $in{'mode'} eq 'delete'){ $buff .=<<"EOM"; \n|; } $buff .=<<"EOM"; Uploader

EOM %in = %set = undef; print "Content-type: text/html\n\n"; print $buff; exit; } sub admin_mode{ &errorclear() if($in{'mode'} eq 'errorclear'); &delete('admin',$in{'admin_delno'}) if($in{'mode'} eq 'delete'); open(IN,$set{'log_file'})||error(303); my @log = ; close(IN); my ($header,$buff,$footer,$value); $buff =<<'EOM'; Sn Uploader Support Script EOM $buff .= leaddisp(0,1,1).'
NAMECOMMENTSIZEDATEMIMEORIG
Upload Info
'; $buff .= qq|
\n

\n|."\n\n"; shift(@log); foreach (@log){ $buff .= makeitem($_,'admin'); } $buff .= '
DELNAMECOMMENTSIZEADDRHOSTDATENOTEMIMEORIG


'; if($set{'error_level'}){ $buff .= leaddisp(-1,0,1).'
Error Info
'; $buff .= qq|
|; $buff .= "\n\n"; if(open(IN,$set{'log_error'})){ @log = reverse(); close(IN); foreach (@log){ my ($date,$no,$note,$addr,$host) = split(/<>/); $buff .= "\n"; }} $buff .= "
DATEADDRHOSTNOTE
$date$addr$host$note


\n"; } $buff .= leaddisp(-1,-1,0); $buff .= '
Setting Info
'."\n\n"; $buff .= tablestr('スクリプトVer',$set{'ver'}); $buff .= tablestr('メインログファイル',$set{'log_file'}); if($set{'error_level'}){$buff .= tablestr('エラーログファイル',$set{'log_error'}); }else{ $buff .= tablestr('エラーログ記録','無'); } $buff .= tablestr('保持件数',$set{'max_log'}); $buff .= tablestr('最大投稿容量',dispsize($set{'max_size'}*1024).' '.($set{'max_size'}*1024).'Bytes'); if($set{'min_flag'}){ $buff .= tablestr('最小制限容量',dispsize($set{'min_size'}*1024).' '.($set{'min_size'}*1024).'Bytes'); } else{ $buff .= tablestr('最小制限容量',"無"); } $buff .= tablestr("ファイル接頭辞",$set{'file_pre'}); $buff .= tablestr("保存ディレクトリ",$set{'src_dir'}); $buff .= tablestr('1ページに表示するファイル数',$set{'pagelog'}); if($set{'interval'} > 0){ $value = $set{'interval'}.'秒'; }else{ $value = '無'; } $buff .= tablestr('同一IP投稿間隔秒数制限',$value); if($set{'up_ext'}){ $set{'up_ext'} =~ s/,/ /g; $buff .= tablestr('投稿可能基本拡張子',$set{'up_ext'}); } if($set{'deny_ext'}){ $set{'deny_ext'} =~ s/,/ /g; $buff .= tablestr('投稿禁止拡張子',$set{'deny_ext'}); } if($set{'change_ext'}){ $set{'change_ext'} =~ s/,/ /g; $set{'change_ext'} =~ s/>/>/g; $buff .= tablestr('拡張子変換',$set{'change_ext'}); } if($set{'up_all'}){ $buff .= tablestr('指定外拡張子アップロード許可','有'); if($set{'ext_org'}){ $buff .= tablestr('指定外ファイル拡張子','オリジナル'); }else{ $buff .= tablestr('指定外ファイル拡張子','bin'); }} else{$buff .= tablestr('指定外拡張子アップロード許可','無');} if($set{'find_crypt'}){ $value = '有'; }else{ $value = '無';} $buff .= tablestr('暗号化アーカイブ検出(ZIP/RAR/GCA)',$value); if($set{'binary_compare'}){ $value = '有'; }else{ $value = '無';} $buff .= tablestr('バイナリ比較',$value); if($set{'post_flag'}){ $value = '有'; }else{ $value = '無';} $buff .= tablestr('PostKey投稿制限',$value); if($set{'home_url'}){ $buff .= "\n";} $buff .= '
HOMEURL$set{'home_url'}
'; print "Content-type: text/html\n\n"; print $buff; exit; } sub extfind{ my $orgname = @_[0]; my @filename = split(/\./,$orgname); my $ext = $filename[$#filename]; $ext =~ tr/[A-Z]/[a-z]/; foreach my $value (split(/,/,$set{'change_ext'})){ my ($src,$dst) = split(/->/,$value); if($ext eq $src){ $ext = $dst; last; }} foreach my $value (split(/,/,$set{'deny_ext'})){ if($ext eq $value){ &error(206,$ext); }} foreach my $value (split(/,/,$set{'up_ext'})){ if ($ext eq $value) { return $value; } } if(length($ext) >= 5 || length($ext) == 0){ $ext = 'bin'; } unless ($ext =~ /^[A-Za-z0-9]+$/){ $ext = 'bin'; } if($set{'up_all'} && $set{'ext_org'}){ return $ext;} elsif($set{'up_all'}){ return 'bin'; } return 0; } sub conv_date{ my @date = localtime($_[0]); $date[5] -= 100; $date[4]++; if ($date[5] < 10) { $date[5] = "0$date[5]" ; } if ($date[4] < 10) { $date[4] = "0$date[4]" ; } if ($date[3] < 10) { $date[3] = "0$date[3]" ; } if ($date[2] < 10) { $date[2] = "0$date[2]" ; } if ($date[1] < 10) { $date[1] = "0$date[1]" ; } if ($date[0] < 10) { $date[0] = "0$date[0]" ; } my @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); return ("$date[5]/$date[4]/$date[3]($w[$date[6]]),$date[2]:$date[1]:$date[0]"); } sub dispsize{ my $size = $_[0]; if($size >= 1024*1024*1024*100){ $size = int($size/1024/1024/1024).'GB';} elsif($size >= 1024*1024*1024*10){ $size = sprintf("%.1fGB",$size/1024/1024/1024);} elsif($size > 1024*1024*1024){ $size = sprintf("%.2fGB",$size/1024/1024/1024);} elsif($size >= 1024*1024*100){ $size = int($size/1024/1024).'MB'; } elsif($size > 1024*1024){ $size = sprintf("%.1fMB",$size/1024/1024); } elsif($size > 1024){ $size = int($size/1024).'KB'; } else{ $size = int($size).'B';} return $size; } sub makeitem{ my ($src,$mode) = @_; my ($buff,$check); my ($no,$ext,$date,$comment,$mime,$orgname,$addr,$host,$pass,$filepre,$note,$dummy) = split(/<>/,$src); if(!$dummy){ $filepre = $set{'file_pre'}; } my $orgno = $no; $no = sprintf("%04d",$no); my $size = dispsize(-s "$set{'src_dir'}$filepre$no.$ext"); if($mode eq 'admin'){ if($addr eq $host){ undef $host; } if($in{'checkmode'} eq 'allcheck'){$check = ' checked';} if(-e "$set{'src_dir'}$filepre$no.$ext.html"){$buff = "$filepre$no.$ext$comment$size$addr$host$date$note$mime$orgname\n";} else{ $buff = "$filepre$no.$ext$comment$size$addr$host$date$note$mime$orgname\n";} }else{ if(-e "$set{'src_dir'}$filepre$no.$ext.html"){$buff = "$filepre$no.$ext$comment$size$date$mime$orgname\n";} else{ $buff = "$filepre$no.$ext$comment$size$date$mime$orgname\n";} } return $buff; } sub makedummyhtml{ my $filename = $_[0]; my $buff = "$filename"; $buff .= qq|Download $filename|; $buff .= ''; open(OUT,">$set{'src_dir'}$filename.html")||&error(307,"$set{'src_dir'}$filename.html"); print OUT $buff; close(OUT); chmod($set{'per_upfile'},"$set{'src_dir'}$filename.html"); return 1; } sub logwrite{ my @log = @_; open(OUT,"+>$set{'log_file'}")||&error(304); eval{ flock(OUT, 2);}; eval{ truncate(OUT, 0);}; seek(OUT, 0, 0); print OUT @log; eval{ flock(OUT, 8);}; close(OUT); chmod($set{'per_upfile'},$set{'log_file'}); return 1; } sub binarycmp{ my ($src,$dst) = @_; return 0 if (-s $src != -s $dst); open(SRC,$src)||return 0; open(DST,$dst)||return 0; my ($buff,$buff2); binmode(SRC); binmode(DST); seek(SRC,0,0); seek(DST,0,0); while(read(SRC,$buff,4096)){ read(DST,$buff2,4096); if($buff ne $buff2){ close(SRC); close(DST); return 0; } } close(SRC); close(DST); return 1; } sub init{ open(OUT,">$set{'log_file'}")||&error(304); print OUT "0<>0<>0<>1\n"; close(OUT); chmod($set{'per_logfile'},$set{'log_file'}); unless (-d "$set{'src_dir'}"){ mkdir("$set{'src_dir'}",$set{'per_dir'}); chmod($set{'per_dir'},"$set{'src_dir'}"); open(OUT,">$set{'src_dir'}index.html"); close(OUT); chmod($set{'per_upfile'},"$set{'src_dir'}index.html"); } } sub check_postkey{ my $inputkey = @_[0]; my @key = split(/,/,$set{'post_key'}); foreach my $key (@key){ if($inputkey eq $key){ return 1; } } return 0; } sub leaddisp{ my @src = @_; my ($str,$count); foreach my $value (@src){ my ($mark,$name,$link); $count++; if($count == 1){ $name = 'Upload Info'; $link = 'up'; } elsif($count == 2){ $name = 'Error Info'; $link = 'error'; next if(!$set{'error_level'}); } elsif($count == 3){ $name = 'Setting Info'; $link = 'set'; } if($value){ if($value > 0){ $mark = '▼'; }else{ $mark = '▲'; } $str .= qq|${mark}${name} |; } else{ $str .= qq|[$name] |; } } return $str; } sub errorclear{ open(OUT,">$set{'log_error'}")||return 0; eval{ flock(OUT, 2);}; eval{ truncate(OUT, 0);}; seek(OUT, 0, 0); eval{ flock(OUT, 8);}; close(OUT); chmod($set{'per_upfile'},$set{'log_file'}); return 1; } sub tablestr{ my ($value1,$value2) = @_; return ("$value1$value2\n"); } sub error{ my ($no,$note) = @_; my $message; if($no == 99){ $message = "UpFileなし";} elsif($no == 101){ $message = "投稿禁止HOST";} elsif($no == 106){ $message = "POSTサイズ超過"; $note = dispsize($note);} elsif($no == 107){ $message = "POSTサイズ過小"; $note = dispsize($note);} elsif($no == 108){ $message = "POSTデータ不完全";} elsif($no == 109){ $message = "POSTKey不一致";} elsif($no == 202){ $message = "拡張子合わず";} elsif($no == 203){ $message = "投稿早すぎ";} elsif($no == 204){ $message = "一時ファイル書き込めず";} elsif($no == 205){ $message = "同一ファイル存在";} elsif($no == 206){ $message = "禁止拡張子";} elsif($no == 303){ $message = "ログファイルに読み込めず";} elsif($no == 304){ $message = "ログファイルに書き込めず";} elsif($no == 306){ $message = "ファイルリストHTML書き込めず";} elsif($no == 307){ $message = "ファイルHTMLファイル書き込めず";} unlink($in{'tmpfile'}); if($note){ $message .= ' ';} if($set{'error_level'} && $no > 100){ unless(-e $set{'log_error'}){ open(OUT,">$set{'log_error'}"); close(OUT); chmod($set{'per_logfile'},$set{'log_error'}); } open(OUT,">>$set{'log_error'}"); print OUT "$in{'date'}<>$no<>$message$note<>$in{'addr'}<>$in{'host'}<>1\n"; close(OUT); } &quit(); }