#!/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/$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_";
アプするファイル($limitk Kまで)
\n"; if($gzip_enable){ print "
gzip compress:"; print "yesno"; } print "
コメント(※コメント無記入の場合リロードになります\n"; print "/URLはオートリンクします" if($autolink); print ")
\n"; print "\n"; print "
\n"; print " del pass: \n" if($del_enable); print " post pass: \n" if($postpass_enable); print "
\n"; print "
\n" if($listform_enable); print "$count_startから$counter " if($counter_enable); print "\n"; print ' D:投稿記事削除' if($del_enable); print ' C:CRC表示' if($dcrc_enable); print ' 5:md5表示' if($md5_enable); print "\n"; print "
| 過去ログ検索 | 画像閲覧 | 環境設定 $links
ページ:[ALL] \n"; $total = @lines; $count = int(($total-1)/$lmax); for($i=0;$i<=$count;$i++){ if($i eq $page){$disp = $i + 1; print "[$disp] \n";}else{ $disp = $i + 1; print "[$disp] \n"; } } # for print "
\n"; if($listform_enable){ print "Range\: - \n"; print " md5\n" if($md5_enable); print " CRC\n" if($dcrc_enable); print " \n"; print "
\n"; } (@lines < $lmax) || (@lines = @lines[$page2 .. $page2+$lmax-1]); &print_postdata(@lines); print "
対応ファイルフォーマット:\n"; print "\n"; for($i = 0; $i < $#MEXT; $i++) { print "
\n" if(($i % 12) == 0); print "*.$MEXT[$i] "; } print "*.$MEXT[$i]"; print "

\n"; print "その他のファイルフォーマット:特に指定の無い限り*.xxxとして保存されます。
\n"; print "ログ保持限界は$maxで1ページにつき$lmaxdef件づつ\表\示します。\n"; &print_footer; }#html END #URLリスト出力 sub list{ local($start,$end,$p,$id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc); $start = $FORM{'lstart'}; $end = $FORM{'lend'}; $ext = $FORM{extlist} if($FORM{extlist}); $p = 0; print "Content-type: text/plain\n\n"; foreach(@lines){ $_ =~ s/\n//g; ($id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc) = split(/\t/, $_); $p = 1 if($id eq $end); if($ext){next if($type ne $ext);} if($FORM{md5list} eq "checked"){ if($FORM{dcrclist} eq "checked"){ print qq!$storeurl$prefix$id.$type\t$md5\t$dcrc\n! if($p); } else{ print qq!$storeurl$prefix$id.$type\t$md5\n! if($p); } } else{ if($FORM{dcrclist} eq "checked"){ print qq!$storeurl$prefix$id.$type\t$dcrc\n! if($p); } else{ print qq!$storeurl$prefix$id.$type\n! if($p); } } last if($id eq $start); } } #カウンター処理 sub count{ if(!open(DATA,"$count_file")){ &error('カウンタデータファイルが開けません','スクリプトの設定を見直してください');} $counter = ; close (DATA); $counter++; if(!open(DATA,">$count_file")){ &error('カウンタデータファイルを書込みモードで開けません','ファイルのパーミッションを見直してください');} eval { flock DATA, 2; }; print DATA $counter; eval { flock DATA, 8; }; close (DATA); } #投稿ファイル削除処理 sub del{ local($target_id,$target_pass) = @_; local($target_type,$id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc); local($admindel) = 0; foreach $_ (@lines){ chop($_); ($id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass) = split(/\t/, $_); if($id eq $target_id){$target_type=$type; $org_pass=$pass; $p=1; last;} else{next;} } &error('削除エラー','該当ファイル無し') if(!$p); if($admindel_enable && $adminpass eq (crypt($target_pass, $adminseed))){$admindel = 1;} if(!$admindel){ &error('削除エラー','削除禁止ファイルです') if($org_pass eq '*'); &error('削除エラー','パスワードが違います') if($org_pass ne (crypt($target_pass, $del_seed))); } if($ftp_enable){ 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$target_id.$target_type\n"; print FTP "quit\n"; close(FTP); } else{unlink("$storedir$prefix$target_id.$target_type");} open(DB,">$log_file"); eval { flock DB, 2; }; foreach $_ (@lines){ ($id, $type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc) = split(/\t/, $_); if($id eq $target_id){next;} else{$_=~s/\n//g; print DB "$_\n";} } eval { flock DB, 8; }; close(DB); } #エラー出力 sub error{ print "Content-type: text/html\n\n"; &print_header('Notice!'); print <<"ERROR";
$_[0]

$_[1]

Return
ERROR &print_footer; exit; } sub readlog{ if(!open(DB,"$log_file")){&error('ログファイルがオープンできません','スクリプトの設定を見直してください。');} seek(DB,0,0); @lines = ; $end_num = (split(/\t/,$lines[0]))[0] if($listform_enable); close(DB); } sub tjoin { local(@data) = @_; foreach (@data) { next if(!$_); s/\s/ /go; } return join("\t", @data); } sub htmlenc { local($str) = @_; $str =~ s/\&/&/go; $str =~ s/\/>/go; $str =~ s/\"/"/go; return $str; } #md5コマンドからmd5 CRCを得る sub md5{ open MD5, "$md5_path $_[0] |"; local($val) = ; close MD5; $val =~ s/ //g; $val = (split(/\=/,$val))[1]; return $val; } #md5表示 sub md5_disp{ local($target_id,$ans,$id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5); $target_id = $_[0]; foreach $_ (@lines){ chop($_); ($id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc) = split(/\t/, $_); if($id eq $target_id){$ans = $md5; last;} else{next;} } &error('エラー','該当ファイルが存在しないか、md5チェックサムが記録されていません。') if(!$ans); &error("$target_idのmd5チェックサム","$ans"); } #POSTデータを文字列に変換して返す sub post_decode{ local($post_str); while(){ last if($_=~/^$bound/); next if($_=~/^\r\n/); next if($_=~/^Content/); $post_str .=$_; $post_str=~s/\r\n//; } return $post_str; } #ログファイルを検索して結果を収納した配列を返す sub search_log{ local($search_str) = $_[0]; local($count) = 0; local(@ans); local($id,$type,$comment,$host,$brauza,$date,$size,$ctype); local($start,$end,$ext); $start = $FORM{sstart}; $end = $FORM{send}; $ext = $FORM{extlist}; $min = $FORM{size_min}; $max = $FORM{size_max}; &jcode'convert(*search_str,'sjis') if(!$FORM{nojcode}); $search_str = quotemeta($search_str); foreach (@lines){ $_=~s/\n//g; ($id,$type,$comment,$host,$brauza,$date,$size,$ctype) = split(/\t/); if($id >= $start && $id <= $end){ if($ext ne '' && $ext ne $type){next;} else{ if($size >= $min){ if($size <= $max || !$max){ if($_ =~ /$search_str/){$ans[$count] = $_; $count++;} } } } } else{next;} } return @ans; } #過去ログ検索のトップページ/結果 表示 sub search_result{ if($FORM{sstart}){$sstart = $FORM{sstart};} else{$sstart = '001';} if($FORM{send}){$send = $FORM{send};} else{$send = $end_num;} if($FORM{size_min}){$size_min = $FORM{size_min};} else{$size_min = 1;} if($FORM{size_max}){$size_max = $FORM{size_max};} else{$size_max = '';} if($FORM{extlist}){$ext = $FORM{extlist}; $extv = $FORM{extlist};} else{$ext = '拡張子'; $extv = '';} print "Content-type: text/html\n"; if($gzipenc_enable && $gzipence){&gzip_encode;} else{print "\n";} &print_header('過去ログ検索'); print <<"FORM"; 検索文字列:
範囲: -
サイズ:K〜Kの間で jcode.plを使わない FORM print "\n"; print ' D:投稿記事削除' if($del_enable); print ' C:CRC表示' if($dcrc_enable); print ' 5:md5表示' if($md5_enable); print "\n"; print '
'; if($search_hit){&print_postdata(@search_ary);} if($search_str){ print "

\"$search_str\"は$search_hit件見つかりました。

" if($search_hit); print "

\"$search_str\"は見つかりませんでした。

" if(!$search_hit); } &print_footer; } #dcrcからターゲットファイルのCRCを得る sub dcrc{ open DCRC, "$dcrc_path $_[0] |"; local($val) = ; close DCRC; $val = (split(/ /,$val))[1]; return $val; } #CRC表示 sub dcrc_disp{ local($target_id,$ans,$id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc); $target_id = $_[0]; foreach $_ (@lines){ chop($_); ($id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc) = split(/\t/, $_); if($id eq $target_id){$ans = $dcrc; last;} else{next;} } &error('エラー','該当ファイルが存在しないか、CRCチェックサムが記録されていません。') if(!$ans); &error("$target_idのCRCチェックサム","$ans"); } #投稿制限用パスチェック sub postpass{ local($input_postpass) = &post_decode; if($postpass ne crypt($input_postpass,$postseed)){ if($ftp_enable){open DB, ">$ftp_data"; print DB ""; close DB;} else{unlink "$storedir$prefix$id.$type";} return 0; } else{return 1;} } sub image_view{ local($disp) = $_[0]; local(@image); local($image_num, $prev5, $prev, $next5, $next, $count) = 0; &readlog; foreach $_ (@lines){ ($id,$type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc) = split(/\t/, $_); if($type eq 'jpg' || $type eq 'gif' || $type eq 'png' || $type eq 'xbm'){ $image[$count] = "$id,$type,$comment,$date,$size"; $count++; if(!$count && !$disp){$disp = $count;} } } $image_num = @image; $image_num = 0 if($image_num < $disp); $prev5 = $disp - 5; $prev = $disp - 1; $next5 = $disp + 5; $next = $disp + 1; print "Content-type: text/html\n\n"; &print_header('画像閲覧'); print "
\n"; if(!$image_num){ print "

画像ファイルが見つかりません

\n"; print "

Return

\n"; print "
\n"; } else{ if($prev5 < 0){ print '<<[prev 5] '; }else{ ($id,$type,$comment,$date,$size) = split(/,/, $image[$prev5]); print "<<[prev 5] \n"; } if($prev < 0){ print '<[prev] '; }else{ ($id,$type,$comment,$date,$size) = split(/,/, $image[$prev]); print "<[prev] \n"; } print "Return \n"; if($next > ($image_num-1)){ print '[next]> '; }else{ ($id,$type,$comment,$date,$size) = split(/,/, $image[$next]); print "[next]> \n"; } if($next5 > ($image_num-1)){ print '[next 5]>>'; }else{ ($id,$type,$comment,$date,$size) = split(/,/, $image[$next5]); print "[next 5]>>\n"; } ($id,$type,$comment,$date,$size) = split(/,/, $image[$disp]); print "

$prefix$id.$type
$date サイズ:$size K

$comment

"; print "\n"; } print "\n"; &print_footer; } #Reload sub reload{ if($ftp_enable){open DB, ">$ftp_data"; print DB ""; close DB;} else{unlink "$storedir$prefix$id.$type";} &readlog; &html; exit; } #HTMLのヘッダ部分 sub print_header{ local($subtitle) = $_[0]; local($title_h); if(!$subtitle){$title_h = $title} else{$title_h = "$title -$subtitle-";} print <<"HEADER"; $title_h $body
$title_h

$info

HEADER } #投稿記事部分のHTML sub print_postdata{ local(@matrix) = @_; local($id, $type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc); print "\n"; print "\n" if($acte); print "\n"; print "\n" if($commente); print "\n" if($sizee); print "\n" if($mimee); print "\n" if($datee); print "\n" if($md5e && $md5_enable); print "\n" if($crce && $dcrc_enable); print "\n"; foreach $_ (@matrix){ $_=~s/\n//g; ($id, $type,$comment,$host,$brauza,$date,$size,$ctype,$pass,$md5,$dcrc) = split(/\t/, $_); next unless($id); print "\n"; if($acte){ print "\n"; } if($anothere){ if($ftp_enable){print qq! \n!;} else{print qq! \n!;} } else{ if($ftp_enable){print qq! \n!;} else{print qq! \n!;} } print "\n" if($commente); print "\n" if($sizee); print "\n" if($mimee); print "\n" if($datee); print "\n" if($md5e && $md5_enable); print "\n" if($crce && $dcrc_enable); print "\n"; } print "
ACTNAMECOMMENTSIZE(KB)MIMEDATEMD5CRC
\n"; print "D\n" if($del_enable); print " C\n" if($dcrc_enable && !$crce); print " 5\n" if($md5_enable && !$md5e); print "[$prefix$id.$type][$prefix$id.$type][$prefix$id.$type][$prefix$id.$type]$comment$size$ctype$date$md5$dcrc
\n"; } #HTMLのフッタ部分 sub print_footer{ print "
ゆいのーと + \n"; print "$copyright $modified\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 "MD5
      \n" if($md5_enable); print "CRC
      \n" if($dcrc_enable); print <<"ENV"; ACT
      COMMENT
      SIZE
      MIME
      DATE
  • 動作設定
      ファイルを開く時は別窓で開く
      ENV print "gzip圧縮転送
      " if($gzipenc_enable); print <<"ENV";

    cookieを利用しています。
    上記の設定で「$title」を訪問することができます。

  • 戻る 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__