#!/usr/local/bin/perl
#
#
# 1997.9.14製作
# すくりぷと ばい ゆいちゃっと
# Since 1996
# ■改造版■
$copyright = 'ずるぼん+擬古描 2000年10月26日版';
# 連絡先:zurubon@mailandnews.com
# さらに改造したらここに"+ hogehoge"等と書くと良いかもしれない
$modified = '';
# ずるぼんあぷろだサポートページを作りました。
# 過去の改造版ソース等もここに置いておきます。
# http://zurubon.strange-x.com/uploader/
# 2000年10月26日版変更点
# ・環境設定モードの追加(cookie使用)
# ・過去ログ検索フォームのオプションを増やした
# ・Virtualave設置時にバナーが表示されていなかったのを修正
# ・その他
#
# ***連絡事項***
# ゆいのーと改造版を作ってから1年近く経ちました。
# ソースも後から付けたし付けたしで、より一層、
# ごちゃごちゃで大変汚い状態になってしまいました。
# Perl5でもう一度全てを書き直したいと思います。
# ですので、Perl4は*多分*この版で終わりになると思います。
# 謝辞:みらいあぷろだ管理人様 2000/09/07
# HTMLタグの間違い等、鋭い指摘に感謝
# 随時パクらせて貰ってますヽ(´ー`)ノ
# 当方ネスケユーザーにつき、スタイルシートはまだ勘弁してくだちぃ
# 改竄 by 擬古描 - Sat, Apr 15, 2000 - gkJVMgleaMcTQ
#
# ∧ ∧
# 〜′ ̄(´ー`)<コメントにタグが複数入ってると上手く<等に変換されないのを修正
# UU ̄ U U MIME typeからの拡張子判定の強化
# MIME typeの記録/表示
# アプされたファイルの末尾にゴミがついてウゼェのを解消
#
# 改竄 by 擬古描 - Thu, May 11, 2000 - gkwWZ40tgKf5I
#
# 拡張子の自動判定の強化
# 誤認識の多かったlzh等の対応を強化
#
# 改竄 by 擬古描 - Fri, Jun 30, 2000 - gkHcafwBNEY86
#
# MIME typeが送信されない場合への対応の修正
# MIME typesを少し修正
#
# ***無保証・2次配布条件***
# このスクリプトを使用することによって生じたいかなる
# 損害・事件について、私ずるぼんは引責・補償できません。
# また、2次配布についてはゆいちゃっとさんの配布条件に
# 準ずるものとします。
# ***「FTPモード」使用に関する注意事項***
# 2000年3月17日改修版から保存先にFTPホストを指定できるように
# なっています。
# このFTPモードは十分にテストされているわけではありません。
# したがって安定・高速な動作を希望される場合には使用しないようにしてください。
# また、セキュリティーの面でも問題がありますので保存先のFTPホストに
# クラックされて困るようなサーバーを指定しないでください。
# ***バグレポートは歓迎します***
# 私に直接メールを送るか、@プログラマのアンチダウソコーダー掲示板にでも
# 書き込んでください。
# ただし、私のスキル、余暇にも限界がありますので
# 必ず対処してくれるとは考えないでくださいね(わらぃ
# ***************************
# ***以上のことを了承される方のみご利用ください***
# ***************************
# ################################
# 初期設定 ※必ず設定
# ################################
# このスクリプトのURL(HTTP)
$url = 'http://www.example.com/up/upload.cgi';
# アップロードデータの格納先ディレクトリ
# 推奨パーミッション:700->770->777
# FTPモードの場合は使わないので作る必要なし
$storedir = './source/';
# アップロードデータの格納先ディレクトリURL
# URLリスト作成に使います。
# FTPモード使用の場合は正しく設定しておかないと
# 訪問者がファイルをダウンロードできなくなります。
$storeurl = 'http://www.example.com/up/source/';
# ログファイル
# 推奨パーミッション:600->660->666
$log_file = './sourcelog.txt';
# 表示するタイトル
$title = 'ぁゃιぃわーるど@ずるぼんアプローダ';
# タイトルの下に表示するお知らせ
$info = '
2chから起こしの方はすぐ帰れ来るな出て行けお借りするなつーか死ね(`Д´)輝け
';
# リンクバー
$links = '
';
# 過去ログ検索用jcode.pl
# 解説:jcode.plのサーバーパスを書いてください_(..)_
# 以下はあぷろだ本体と同じディレクトリに置く場合の設定です。
require './jcode.pl';
# ########################################
# もう少し細かい設定
# ########################################
# HTMLのBODY設定
$body = '
';
# HTMLのスタイルシート設定
$css = '
A {text-decoration: none;}
A:link {text-decoration: none;}
A:hover {color: red;}
';
# HTMLの広告バナー設定
# 解説:設置するサーバーに応じて書き換えてください。
$ban = '';
# タイトルの入るオビの色
$obi = '#007f7f';
# 保存ファイル名の接頭辞
# 解説:'up001.jpg'のようなファイル名で保存されます。なにも書かなくてもOKです。
$prefix = 'up';
# コメントのオートリンク
# 1:する 0:しない
$autolink = 1;
# コメントの長さ制限
# 解説:単位はバイトです。
$comment_max = 256;
# デフォルトでの1ページにおける表示件数
$lmaxdef = 25;
# ログの最大件数
$max = 200;
# ファイルサイズ制限(キロバイト単位)
$limitk = 10000;
# URLリスト出力フォーム
# 1:表示する 0:表示しない
$listform_enable = 1;
# カウンター
# 1:使用する 0:使用しない
$counter_enable = 1;
# カウント開始日
# 「2000/01/07から*カウント数*」というように表示されます
$count_start = '2007/07/07';
# カウンタファイル
# 推奨パーミッション:600->660->666
$count_file = './count.txt';
# ロックファイル
# 1:使用する 0:使用しない
$lock = 0;
# ロックファイルのディレクトリ+ファイル名
# ※ロック用ディレクトリ 推奨パーミッション700->770->777
$lockfile = './lock/lock-file.lock';
# 対応ファイル形式
# 半角カンマで区切って特別に対応させたいファイル形式を入力
$support = '';
# ########################################
# セキュリティーに関する設定
# ########################################
# HTMLファイルは拡張子を*.txtに変更する(※イタズラ防止)
# 1:変更する 0:変更しない
$htmlext = 1;
# 投稿者IPのログファイルへの記録
# 1:記録する 0:記録しない
$getip = 1;
# 投稿制限用パスワード
# 解説:投稿者は全て管理者が設定したパスワードを入力しないと
# 投稿できなくなります。
$postpass_enable = 0;
# 投稿制限用パスワード
# 解説:平文のパスワードではなく、encryptされたものが必要です。
# http://zurubon.strange-x.com/crypt.cgiでencryptされたパスワードが作れます。
# またはhttp://zurubon.strange-x.com/crypt.txtを自分の利用するサーバーに設置してください。
$postpass = 'mkRijWlxKDejR';
# 投稿制限用パスワードの'種'
# 解説:上記の投稿制限用パスワードを生成するときに用いた種です。
$postseed = 'mk';
# 連続投稿間隔の制限
# 1:制限する 0:制限しない
$continue_limit = 0;
# 連続投稿制限用データファイル
# 推奨パーミッション:600->666
$continue_file = './continue.cgi';
# 連続投稿を許可する間隔
# 解説:デフォルトは30分。
# 「以前の"同じIP"の投稿から30分経ったら再度投稿してもOK」ということです。
# ◆記述例◆
# 2時間「200」
# 1時間半「130」
# 30分「030」
# 1分「001」
$contine_time = '000';
# アクセス制限
# 1:使用する 0:使用しない
$access_ctl = 1;
# アクセス制限用データファイル
# このファイルにはアクセスを禁止したいホストを「1行1ホスト名(IP)」で記述する
$denylist = './deny.cgi';
# ########################################
# ちょっとむずかしい設定
# ########################################
# 投稿ファイル削除
# 1:使用する 0:使用しない
# 解説:投稿者がパスワードを設定して自分の投稿データを削除できるようになります。
# このオプションを有効にしてもパスワードが何も設定されなかった場合は
# 管理者以外削除できなくなります。
$del_enable = 1;
# 投稿ファイル削除パス生成時の'種'
# 解説:設定文字列を'種'として削除パスワードを生成します。
$del_seed = 'd8';
# 投稿ファイルの管理者削除
# 1:使用する 0:使用しない
# 解説:全ての投稿ファイルを削除できる管理者パスワードを設定します。
# 上記の"投稿ファイル削除"を有効にする必要があります。
$admindel_enable = 1;
# 管理者パスワード
# 平文のパスワードではなくencryptされたものが必要です。
# くずはすくりぷと付属のbbspass.cgiや、
# http://zurubon.strange-x.com/crypt.cgiでencryptされたパスワードが作れます。
$adminpass = 'sXkjEkxE4Jd6';
# 管理者パスワードの'種'
# 解説:上記の投稿制限用パスワードを生成するときに用いた種です。
$adminseed = 'sX';
# gzip圧縮転送を許可する
# 解説:HTMLページをgzipで圧縮転送できるようになります。
# サーバーにかかる負担が多少上昇します。
# 1:許可する 0:許可しない
$gzipenc_enable = 0;
# gzip圧縮転送を許可した場合、
# gzip圧縮転送をデフォルトとするか
# 1:デフォルトとする 0:デフォルトとしない
$gzipenc_def = 0;
# md5チェックサム算出
# 1:使用する 0:使用しない
# 解説:サーバー側のmd5コマンドを利用してファイルのチェックサムを記録します。
# ※アップロード時に記録
$md5_enable = 0;
# md5コマンドのサーバーパス
$md5_path = '/sbin/md5';
# crcチェックサム算出
# 1:使用する 0:使用しない
# 解説:大炸裂氏作のdcrcを利用してファイルのチェックサムを記録します。
# ※アップロード時に記録
# dcrcはhttp://daisakuretsu.hypermart.net/dcrc.htmlから入手できます。
# ソースファイルを入手後、telnetクライアントやtelnet.cgiを使ってコンパイルしてください。
#
# また、FreeBSD3.2R上でコンパイルし、zipで圧縮したものを
# http://zurubon.virtualave.net/uploader/dcrc-fbsd3.x.zipに置いておきます。
# 解凍後、FTPでサーバーに送信する場合は「バイナリ送信モード」で送信し、
# パーミッションを「700」か「755」に設定してください。
# Virtualave、HypermartではFreeBSD3.x系のOSを採用しているようなので
# おそらくこのバイナリが動作します。
$dcrc_enable = 0;
# dcrcの場所
$dcrc_path = './test/dcrc';
# gzipファイル圧縮機能
# 1:使用する 0:使用しない
# 解説:このオプションを有効にしても、圧縮するかどうかは投稿者が選択可能です。
# さらに、圧縮後も元のファイルフォーマットが何であったのか記録します。
$gzip_enable = 0;
# gzipデータ一時保存先ファイル(FTPモード使用時のみ必要)
# 推奨パーミッション:600->660->666
$gzip_data = './gzipdata.cgi';
# FTPモード
# 1:使用する 0:使用しない
$ftp_enable = 0;
# FTP転送先ホスト
$ftp_host = 'ftp.strange.hoge.net';
# FTPユーザー名
$ftp_user = 'hogehoge';
# FTPパスワード
$ftp_pass = '******';
# FTP保存先ディレクトリ
# FTP転送先ホストにログイン後指定されたディレクトリに
# 移動してそこにデータをアップロードします。
$ftp_dir = '.';
# FTPデータ一時保存先ファイル
# 推奨パーミッション:600->660->666
$ftp_data = './ftpdata.cgi';
# MIME types
%MIME =
(
# テキスト
c => "text/c",
css => "text/css",
csv => "text/comma-separated-values",
htm => "text/html",
js => "text/(js|javascript)",
rtf => "text/rtf|application/rtf",
smi => "text/smil-basic|application/smil",
txt => "text/plain",
vbs => "text/vbscript",
xml => "text/xml|application/xml",
# イメージ
bmp => "image/(bmp|x-bmp|x-MS-bmp)",
gif => "image/gif",
ico => "image/x-icon",
jpg => "image/.*jpeg",
png => "image/(png|x-png)",
psd => "image/x-photoshop",
tif => "image/(tiff|x-tiff)",
xbm => "image/(x-xbm|x-xbitmap)",
# ビデオ
asf => "video/(x-ms-asf|x-ms-asf-plugin)|application/x-mplayer2",
avi => "video/(avi|msvideo|x-msvideo)",
mov => "video/quicktime",
mpg => "video/(mpg|mpeg|x-mpeg)",
# オーディオ
aif => "audio/(aiff|x-aiff|x-pn-aiff)",
au => "audio/(basic|x-pn-au)",
m3u => "audio/(mpegurl|x-scpls|x-mpegurl)",
mid => "audio/(mid|midi|x-mid|x-midi)|application/x-midi|music/crescendo|x-music/x-midi",
mod => "audio/x-mod",
mp3 => "audio/(mp3|mpg|mpeg|x-mp3|x-mpg)",
ra => "audio/(x-realaudio|vnd\\.rn-realaudio)",
ram => "audio/x-pn-realaudio",
rm => "application/vnd\\.rn-realmedia",
rpm => "audio/x-pn-realaudio-plugin",
vqe => "audio/x-twinvq-plugin",
vqf => "audio/x-twinvq|application/x-twinvq",
wav => "audio/(wav|x-wav|x-pn-wav|x-pn-windows-acm|x-pn-windows-pcm)",
wma => "audio/x-ms-wma",
# 他
arj => "application/arj",
bin => "application/(octet-stream|x-macbinary)",
dcr => "application/x-director",
exe => "application/(x-exe|x-msdownload)",
gz => "gzip",
hlp => "application/(winhlp|x-winhelp)",
jar => "application/java-archive",
js => "application/x-javascript",
lzh => "lha|lzh|LhasaArchive|LHMelt",
pac => "application/x-ns-proxy-autoconfig",
pdf => "application/pdf",
rar => "application/x-rar-compressed",
sit => "application/x-stuffit",
swf => "application/x-shockwave-flash",
tar => "application/x-tar",
uue => "application/x-uuencode",
wmf => "application/x-msmetafile",
wri => "application/application/x-mswrite",
yz1 => "application/x-yz1",
Z => "application/x-compress",
zip => "zip",
wrl => "model/vrml|x-world/x-vrml",
);
%EMIM =
(
"zip" => "gzip",
);
# ############################################################################
# 以下はスクリプトのエンジン部分。無闇にいじくると動かなくなるかも(ワラ
# ############################################################################
@sup = split(/,/, $support);
@MEXT = sort keys(%MIME);
%sup = ();
grep($sup{$_} = 1, @sup, @MEXT);
if($htmlext != 0)
{
delete $sup{"htm"} if exists $sup{"htm"};
delete $sup{"html"} if exists $sup{"html"};
delete $MIME{"htm"} if exists $MIME{"htm"};
delete $MIME{"html"} if exists $MIME{"html"};
}
@sup = sort keys(%sup);
$host = $ENV{'REMOTE_ADDR'};
$agent = $ENV{'HTTP_USER_AGENT'};
if($access_ctl){
if(!open(DB,"$denylist")){&error('アクセス制限ファイルがオープンできません','');}
@lines = ;
close(DB);
foreach $line (@lines) {
next if(length($line)<4);
chop $line;
if( $host=~/$line/ ){&error('アクセス制限','あなたにはアクセス権限がありません。');}
}
$lines = 0;
}
if($lock){
$retry = 5;
while (!symlink(".", $lockfile)) {
if (--$retry <= 0){unlink($lockfile); exit;}
sleep(1);
}
}
# フォームデータのデコード
$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$page = $FORM{'page'};
$page=0 unless($page);
$lmax = $FORM{'lm'};
$lmax=$lmaxdef unless($lmax);# 一ページにどれだけ表示するか?
$page2 = $page*$lmax;
# 環境設定cookie取得
&get_cookie;
# 検索モード
if($ENV{'QUERY_STRING'} eq "search"){&readlog; &search_result; exit;}
# 画像閲覧モード
if($ENV{'QUERY_STRING'} eq "image"){&image_view; exit;}
# 環境設定モード
if($ENV{'QUERY_STRING'} eq "env"){&env_form; exit;}
# 環境設定モード(cookie送信)
if($FORM{mode} eq 'envset'){&readlog; &html; exit;}
#$dateに現在時刻を入れる
$ENV{'TZ'} = 'JST-9';
$times = time;
(undef,$min,$hour,$mday,$month,$year,$wday,undef,undef) = localtime($times);
$mday = "0$mday" if ($mday < 10);
$hour = "0$hour" if ($hour < 10);
$min = "0$min" if ($min < 10);
$month++;
$month = "0$month" if ($month < 10);
$youbi = ('日','月','火','水','木','金','土') [$wday];
$year = 1900 + $year;
$date = "$year年$month/$mday($youbi)$hour:$min";
#ログを読み込む
&readlog;
#過去ログ検索
if($FORM{'search'} ne ""){
$search_str = $FORM{'search'};
@search_ary = &search_log($search_str);
$search_hit = @search_ary;
&search_result;
exit;
}
#URLリスト作成
if($FORM{'lstart'} ne "" && $FORM{'lend'} ne ""){&list; exit;}
#画像閲覧(番号指定)
if($FORM{'image'} ne ""){
&image_view($FORM{'image'});
exit;
}
#投稿データ削除フォーム
if($FORM{'del'} ne "" && $del_enable){
&error('投稿データ削除',"ID:$FORM{'del'}を削除します
");
}
if($FORM{delid} && $FORM{delpass} ne ""){&del($FORM{delid},$FORM{delpass}); &readlog;}
#md5
&md5_disp($FORM{md5}) if($md5_enable && $FORM{md5} ne "");
#dcrc
&dcrc_disp($FORM{dcrc}) if($dcrc_enable && $FORM{dcrc} ne "");
#ヘルプ
if($FORM{'help'} ne ""){
if($FORM{'help'} eq "gzip"){&error('gzip圧縮機能について','gzipでファイルを圧縮できます。
比較的大きめなテキストファイル等のサイズ減に使えます。
逆にjpegやgif等既に圧縮状態にあるファイルに使ってもあまり効果がありません。
gzip圧縮を有効にしてアップロードしたファイルの拡張子はgzになります。');}
elsif($FORM{'help'} eq "del"){&error('投稿記事削除パスについて',
'投稿者が後々自分の投稿記事を削除したい場合に入力します。
パスワードが入力されないまま投稿された記事は管理者にしか削除できなくなります。
パスワードには10文字未満の英数記号を指定できます。');}
elsif($FORM{'help'} eq "post"){&error('投稿用パスワードについて',
'全ての投稿者は、管理者があらかじめ設定した投稿用パスワードを、"postpass"
フィールドに入力する必要があります。投稿用パスワードは、サイトの管理者から
入手してください。');}
}
#アップロード処理とログへの追加書込み
if ($ENV{'REQUEST_METHOD'} eq "POST") {
($id) = split(/\t/, $lines[0]);
$id=sprintf("%03d",++$id);
&decode;
&write if($comment);
&readlog;
}
#HTMLページ表示
&html;
#ロックファイル削除
unlink($lockfile) if($lock);
#終了
exit;
sub write{
$comment=~s/\t/ /g;
$comment='?????' unless($comment);
$size = $ENV{'CONTENT_LENGTH'}/1024;
$size = 1 if($ENV{'CONTENT_LENGTH'} < 1024);
if($gzip_enable && $gzip_set){
if($ftp_enable){$expfile=$ftp_data;}else{$expfile="$storedir$prefix$id.$type";}
$size = (stat($expfile))[7];
$size = $size/1024;
}
$size = sprintf("%d",$size);
$host = 'anonymous' if(!$getip);
$pass = '*' if(!$del_enable);
$value = &tjoin($id, $type, $comment, $host, $agent, $date, $size, $ctype, $pass, $md5, $dcrc);
$value .= "\n";
#$valueを@linesに加えたのち、書き込む
if(@lines > $max-1){#最大を超えたら削除します。
$del= pop(@lines);
($id, $type) = split(/\t/, $del);
if($ftp_enable){ #2000/03/18早朝のぁぃぁぃ空白氏に感謝
open(FTP, "| ftp -n $ftp_host") || &error('FTP error','ftpの起動に失敗しました');
print FTP "user $ftp_user $ftp_pass\n";
print FTP "cd $ftp_dir\n";
print FTP "del $prefix$id.$type\n";
print FTP "quit";
close(FTP);
}
else{unlink("$storedir$prefix$id.$type");}
}
unshift(@lines,$value);
open(DB,">$log_file");
eval { flock(DB,2); };
seek(DB,0,0);
print DB @lines;
eval { flock(DB,8); };
close(DB);
}
sub decode{
local($size, $expfile);
$limit = $limitk*1024;
return if($ENV{'CONTENT_LENGTH'} > $limit);
return unless($ENV{'HTTP_REFERER'} =~/$url/);
binmode(STDIN);
while(){
last if($_=~/^\r\n/);
$bound = $_ if($_=~/^--/);
if($_ =~ /^Content-Disposition:.*filename="(.*)"/i)
{
$rext = $1;
}
if($_ =~ /^Content-Type:(.*)/i)
{
$ctype = $1;
}
}
$rext =~ s/.*\.//go;
$ctype =~ s/(^\s|\s$)//go;
$bound=~s/\r\n//;
foreach $mext (@MEXT)
{
if($ctype =~ /$MIME{$mext}/)
{
next if (defined($EMIM{$mext}) && $ctype =~ /$EMIM{$mext}/);
$type = $mext;
}
}
if($rext ne "")
{
$rextl = "\L$rext\E";
foreach $ext (@sup)
{
if("\L$ext\E" eq $rextl)
{
$type = $ext;
last;
}
}
}
$type = 'xxx' if($type eq '');
$ctype = "www/none" unless $ctype;
$ctype = &htmlenc($ctype);
if($ftp_enable){open(DB, ">$ftp_data");}
else{open(DB,">$storedir$prefix$id.$type");}
binmode(DB);
$dbuf = "";
while(){
last if($_=~/^$bound/);
print DB $dbuf;
$dbuf = $_;
}
$dbuf =~ s/\r\n$//;
print DB $dbuf;
close (DB);
if($ftp_enable){$expfile = $ftp_data;}
else{$expfile = "$storedir$prefix$id.$type";}
$size = (stat($expfile))[7];
&reload if(!$size);
if($continue_limit){
$cont_val = &continue_check;
if(!$cont_val){
if($ftp_enable){open DB, ">$ftp_data"; print DB ""; close DB;}
else{unlink "$storedir$prefix$id.$type";}
&error('連続投稿制限中','時間を置いてやり直してください');
}
}
if($md5_enable){
if($ftp_enable){$md5 = &md5("$ftp_data");}
else{$md5 = &md5("$storedir$prefix$id.$type");}
}
if($dcrc_enable){
if($ftp_enable){$dcrc = &dcrc("$ftp_data");}
else{$dcrc = &dcrc("$storedir$prefix$id.$type");}
}
$ext = &post_decode;
if($gzip_enable){$gzip_set = &post_decode;}
if($ext ne "ext"){
$validext = grep($ext eq $_, @sup);
if(!$validext){
if($ftp_enable){open(DB, ">$ftp_data"); print DB "dameyo"; close (DB);}
else{unlink("$storedir$prefix$id.$type");}
&error('投稿データエラー', '許可されていない拡張子です。');
}
if($gzip_enable && $gzip_set){
if($ftp_enable){
open(GZIP, "gzip -cf $ftp_data > $gzip_data |"); close(GZIP);
$md5 = &md5("$gzip_data") if($md5_enable);
$dcrc = &dcrc("$gzip_data") if($dcrc_enable);
}
else{
open(GZIP, "gzip $storedir$prefix$id.$type |"); close(GZIP); rename("$storedir$prefix$id.$type.gz","$storedir$prefix$id.gz");
$md5 = &md5("$storedir$prefix$id.gz") if($md5_enable);
$dcrc = &dcrc("$storedir$prefix$id.gz") if($dcrc_enable);
}
}
else{
rename("$storedir$prefix$id.$type","$storedir$prefix$id.$ext") if(!$ftp_enable);
$md5 = &md5("$storedir$prefix$id.$ext") if($md5_enable);
$dcrc = &dcrc("$storedir$prefix$id.$ext") if($dcrc_enable);
}
$type = $ext;
}
elsif($gzip_enable && $gzip_set){
if($ftp_enable){
open(GZIP, "gzip -cf $ftp_data > $gzip_data |"); close(GZIP);
}
else{
open(GZIP, "gzip $storedir$prefix$id.$type |"); close(GZIP);
rename("$storedir$prefix$id.$type.gz","$storedir$prefix$id.gz");
}
$md5 = &md5("$storedir$prefix$id.gz") if($md5_enable);
$dcrc = &dcrc("$storedir$prefix$id.gz") if($dcrc_enable);
}
if($gzip_enable && $gzip_set){$old_ext = $type; $type = 'gz';}
$comment = &post_decode;
#Reload
&reload if(!$comment);
&error('投稿データエラー','コメントが長すぎます') if(length($comment) > $comment_max);
$comment=~s/>/>/g;
$comment=~s/</g;
if($autolink == 1 && $comment =~ /(https?:|ftp:|news:)/){
$comment =~ s/(https?|ftp|news)(:.*)([a-z]|[A-Z]|[0-9]|\/)/$1$2$3<\/a>/g;
}
$comment .="(gzipped\"$old_ext\")" if($gzip_enable && $gzip_set);
if($del_enable){
$input_pass = &post_decode;
$pass = crypt($input_pass, $del_seed);
$pass = '*' if($input_pass eq '');
&error('投稿データエラー','パスワードが長すぎます') if(length($input_pass) > 10);
if($postpass_enable){
&error('投稿用パスワードが違います','投稿用パスワードを管理者から入手してください。') if(!&postpass);
}
}
elsif($postpass_enable){
&error('投稿用パスワードが違います','投稿用パスワードを管理者から入手してください。') if(!&postpass);
}
if($ftp_enable){
$ftp_data = $gzip_data if($gzip_enable && $gzip_set);
open(FTP, "| ftp -n $ftp_host") || &error('FTP error','FTPの起動に失敗しました');
print FTP "user $ftp_user $ftp_pass\n";
print FTP "cd $ftp_dir\n";
print FTP "binary\n";
print FTP "put $ftp_data\n";
if($gzip_enable && $gzip_set){print FTP "rename $ftp_data $prefix$id.gz\n";}
else{print FTP "rename $ftp_data $prefix$id.$type\n";}
print FTP "quit";
close(FTP);
}
}#decode END
sub html{
&count if($counter_enable);
print "Content-type: text/html\n";
&send_cookie if($FORM{mode} eq 'envset');
if($gzipenc_enable && $gzipence){&gzip_encode;}
else{print "\n";}
&print_header;
print <<"_HTML_";
\n";
print "\n" if($listform_enable);
print "\n$ban
\n\n";
close(STDOUT) if($gzipenc_enable && $gzipence);
}
#gzip圧縮転送
sub gzip_encode{
if($ENV{'HTTP_ACCEPT_ENCODING'}=~/gzip/){
if($ENV{'HTTP_ACCEPT_ENCODING'}=~/x-gzip/ ){
print "Content-encoding: x-gzip\n\n";
}else{
print "Content-encoding: gzip\n\n";
}
open(STDOUT,"| gzip -1 -c");
print "\n";
}
}
sub continue_check{
local($date_id, $post_ip, $line_c, $line_num, $ans, $ip, $id);
$date_id = "$year$month$mday$hour$min";
$post_ip = $ENV{'REMOTE_ADDR'};
if(!open(DB, "$continue_file")){&error('連続投稿制限ファイルがオープンできません');}
@line_c = ;
close(DB);
foreach $_ (reverse(@line_c)){
chop($_);
($ip,$id) = split(/:/,$_);
if($post_ip eq $ip){
$ans = $date_id - $id;
if($ans < $contine_time){return 0;}
}
}
push(@line_c, "$post_ip:$date_id");
pop(@line_c) if(@line_c > $max-1);
if(!open(DB,">$continue_file")){
&error('連続投稿制限ファイルを書込みモードで開けません','ファイルのパーミッションを見直してください');}
eval { flock DATA, 2; };
foreach (@line_c){print DB "$_\n";}
eval { flock DATA, 8; };
close (DB);
return 1;
}
sub env_form{
$md5e_c = 'checked' if($md5e);
$crce_c = 'checked' if($crce);
$acte_c = 'checked' if($acte);
$commente_c = 'checked' if($commente);
$sizee_c = 'checked' if($sizee);
$mimee_c = 'checked' if($mimee);
$datee_c = 'checked' if($datee);
$anothere_c = 'checked' if($anothere);
$gzipence_c = 'checked' if($gzipence);
print "Content-type: text/html\n\n";
&print_header('環境設定');
print <<"ENV";
環境設定
戻る
ENV
&print_footer;
}
sub send_cookie{
if($FORM{md5e} eq 'checked'){$md5e=1;}else{$md5e=0;}
if($FORM{crce} eq 'checked'){$crce=1;}else{$crce=0;}
if($FORM{acte} eq 'checked'){$acte=1;}else{$acte=0;}
if($FORM{commente} eq 'checked'){$commente=1;}else{$commente=0;}
if($FORM{sizee} eq 'checked'){$sizee=1;}else{$sizee=0;}
if($FORM{mimee} eq 'checked'){$mimee=1;}else{$mimee=0;}
if($FORM{datee} eq 'checked'){$datee=1;}else{$datee=0;}
if($FORM{anothere} eq 'checked'){$anothere=1;}else{$anothere=0;}
if($FORM{gzipence} eq 'checked'){$gzipence=1;}else{$gzipence=0;}
$cookie = "crce:$crce<>md5e:$md5e<>acte:$acte<>commente:$commente<>sizee:$sizee<>mimee:$mimee<>datee:$datee<>anothere:$anothere<>gzipence:$gzipence";
# 2099年12月31日まで有効 笑い
print "Set-Cookie: env=$cookie; expires=Thursday, 31-Dec-2099 00:00:00 GMT\n";
}
sub get_cookie{
local($key,$value,$db,$db2);
foreach (split(/; /,$ENV{HTTP_COOKIE})){
($key, $value) = split(/=/,$_);
$db{$key} = $value;
}
$env = $db{env};
foreach (split(/<>/,$env)){
($key, $value) = split(/:/,$_);
$db2{$key} = $value;
}
$crce = $db2{crce};
$md5e = $db2{md5e};
$acte = $db2{acte};
$acte = 1 if($acte eq '');
$commente = $db2{commente};
$commente = 1 if($commente eq '');
$sizee = $db2{sizee};
$sizee = 1 if($sizee eq '');
$mimee = $db2{mimee};
$datee = $db2{datee};
$datee = 1 if($datee eq '');
$anothere = $db2{anothere};
$gzipence = $db2{gzipence};
$gzipence = $gzipenc_def if($gzipence eq '');
}
__END__