#!/usr/local/bin/perl #use strict; # 変数の宣言を厳密に行う場合は有効に # ============================================================ # ファイルをアップロードするための CGI # upload.cgi v2.5, copyright(c)1999/04/01- Heppoko # URL: http://homepage1.nifty.com/~heppoko/ # MAIL: heppoko@kun.ne.jp # ============================================================ # このプログラムは,ウェブページにファイルをアップロードするための # プログラムです.ftp 等を使わずファイルを投稿出来ます. # また,アップロードされたファイルを管理する機能もあります. # # 機能の紹介などについては,同梱の readme.html を参照して下さい. # ============================================================ # ☆プログラム配置例 # ============================================================ # cgi-bin/(任意のディレクトリ) # | # |-- upload.cgi (705) ... 【必須】CGI プログラム (同梱) # |-- hcgilib.pl (604) ... 【必須】CGI ライブラリ # |-- jcode.pl (604) ... 【必須】日本語変換ライブラリ # |-- back.gif (604) ... 壁紙を設定する場合のみ必要 # |-- tback.gif (604) ... タイトル部分に壁紙を設定する場合のみ必要 # |-- .hosts_deny (604) ... UP不許可ホストを設定する場合のみ必要 # |-- .hosts_allow (604) ... UP許可ホストを設定する場合のみ必要 # |-- .uploadrc (604) ... リソースを設定する場合のみ必要 # |-- # |-- gif/ (705) ... 【必須】gif データ用ディレクトリ # | |-- ***.gif (604) ... 【必須】gif データ (同梱) # |-- data/ (707) ... 【必須】データ用ディレクトリ (作る) # |-- upload/ (707) ... 【必須】ファイルアップロード用ディレクトリ (作る) # # 注:データ用ディレクトリにはパスワードファイル等が保存されるため, # ブラウザからアクセス出来ない場所に設定することが推奨されます. # アクセス制限が不可能な場合は,ディレクトリ名を推測しにくい名前に # 変更することをお勧めします.例: data -> d3r4hoge # ☆アップロード許可・不許可ホスト設定ファイルは以下のように書きます # # [.hosts_deny / .hosts_allow] # cow.momo.or.jp # 210.100.10.* # ^hoge.* # # 上記の例のように Perl の正規表現を使うことができます. # # ちなみに,許可ホストの方が不許可ホストよりも優先されます. # 特定のホストのホストからのアクセスのみを許可する場合は # 以下のように書けば良いことになります. # # [.hosts_deny] # .* # # [.hosts_allow] # cow.momo.or.jp # # この例では cow.momo.or.jp のみがアップロード許可ホストになります. # ☆リソースファイルは以下のように書きます # # [.uploadrc] # $uploaddir = 'upload2'; # $hcgilibname = '../cgi-lib/hcgilib.pl'; # ... # $admin_page_title = 'へにょへにょはうすトップページ'; # # (変更する定数だけを書いておけばOKです) # # リソースファイル中の定数の設定は,以下↓の定数定義の設定よりも # 優先されます.リソースファイルを書いておけば,CGI プログラムの # バージョンを上げる時の作業が楽になります. # # 但し,リソースファイルの中で日本語を使用する場合には,この # プログラムと同じ文字コードを使用する必要があります. # 標準では EUC コードとなっていますので,リソースファイル # も EUC コードで記述して下さい. # # 定数が追加・変更される場合がありますので,たまには # 以下↓の定数定義も見てやって下さいまし. # ============================================================ # ☆使用法 # ============================================================ # 単純に呼び出すだけで OK です. # # あっぷろーど # ============================================================ # ☆プログラム本体 # ============================================================ # -------------------------------------------------- # 定数定義 # -------------------------------------------------- # # 変更可能な定数 # # 管理データ保存用ディレクトリ: 707 にしておく必要があります. # ブラウザからアクセス出来ない場所に設定することを推奨します $datadir = 'data'; # アップロード先ディレクトリ: 707 にしておく必要があります $uploaddir = 'upload'; # アップロード先ディレクトリの URL 表現: # @nifty 等のように,CGI 用のディレクトリとデータ用のディレクトリの # URL が異なるサーバの場合に指定します.極悪サーバの IIS にも有効? #$uploadurl = 'http://homepage1.nifty.com/~heppoko/upload'; # gif ファイル(同梱)を置いたディレクトリ: $gifdir = 'gif'; # ライブラリの場所 $hcgilibname = 'hcgilib.pl'; # jcode ライブラリの場所 $jcodelibname = 'jcode.pl'; # 壁紙の場所 #$bg_filename = 'back.gif'; # タイトルの背景画像の場所 #$title_bg_filename = 'tback.gif'; # 背景色 $bgcolor = "#FFEFDF"; # タイトルの色 $title_color = "black"; # タイトルの背景色 $title_bgcolor = "#EFFFEF"; # 登録可能なファイルのサイズの上限(byte 単位): # 1つのファイルで $max_filesize byte を越えるものは登録出来ません $max_filesize = 600000; # ファイルサーバの容量(byte 単位): # 全ファイルのサイズが $max_all_filesize byte を越えることは出来ません $max_all_filesize = 1000000; # 同時にアップロードするファイルの数 $file_num = 3; # エラーログ記録用フラグ: エラーログを残す場合は true に設定します # エラーログは $datadir 以下に .errlog というファイル名で保存されます # ログはへっぽこ CGI のアクセスログ解析などで解析できます. $record_errlog = 'true'; # 管理者パスワードを使用したときに,アップロードに関する全ての制限を # 無くします.(どこからでも,どんなファイルでもアップロード可能になる) # 但し,パスワードが盗まれた場合の危険が増大しますのでご注意下さい. $admin_upload_all = 'false'; # ユーザの認証(ログイン手続き)を実行します.クッキー機能を使用すること # によって,一度認証を終えたブラウザからは以後24時間認証が省略されます. # (但し,本来は httpd のユーザ認証を使用するべきです.この機能のセキュ # リティレベルはあまり高くありません) $user_certification = 'false'; # ユーザ(および管理者)のパスワードでのみアップロードを可能にします. # それ以外のパスワードをアップロード時に使用することは出来ません. $user_only_upload = 'false'; # ファイルのダウンロード数を表示する場合に true に設定します. # 但し,false の場合でもダウンロード数は記録されています. $download_count = 'true'; # このページのタイトル $title = '☆みんなのぎゃらりい☆'; # 管理者(この CGI を設置した人)のウェブページ $admin_page_url = 'http://homepage1.nifty.com/~heppoko/'; # 管理者(この CGI を設置した人)のウェブページのタイトル $admin_page_title = 'Heppoko House Light'; # 注意:ファイル,ディレクトリ名はこの cgi プログラムからの相対位置の # 指定になります. # リソースファイルがあれば読み込む.リソースファイルには,上記の変数の # 設定を記述することが出来ます.リソースファイルの変数の設定が優先されます. if(-e ".uploadrc") { require ".uploadrc"; } # # 変更すべきでない定数 # # このプログラムの場所 $prog_filename = 'upload.cgi'; # アップロードを許可するホスト(またはIPアドレス)を書いたファイル $hosts_allow_filename = '.hosts_allow'; # アップロードを許可しないホスト(またはIPアドレス)を書いたファイル $hosts_deny_filename = '.hosts_deny'; # 管理者のパスワードを記録するファイル($datadir以下に自動的に作成される) $admin_passwd_filename = '.admin_passwd'; # ユーザのパスワードを記録するファイル($datadir以下に自動的に作成される) $user_passwd_filename = '.user_passwd'; # ファイル情報を記録するファイル($userdatadir以下に自動的に作成される) $fileinfo_filename = '.fileinfo'; # ディスク情報を記録するファイル($datadir以下に自動的に作成される) $diskinfo_filename = '.diskinfo'; # ロックディレクトリ名($datadir以下に自動的に作成される) $lock_dirname = '.upload_lock'; # ロックエラーのカウント用ファイル($datadir以下に自動的に作成される) $lock_error_count_filename = '.lock_err'; # エラーログファイル($datadir以下に自動的に作成される) $errlog_filename = '.errlog'; # ファイル一時格納用ディレクトリ($datadir以下に自動的に作成される) $upload_tmp_dir = '.upload_tmp_dir'; # カレントディレクトリマーカ画像場所 $cd_filename = "$gifdir/cd.gif"; # ファイルロック解除の最大待ち時間(秒) $max_wait_time = 5; # ロックディレクトリが残ってしまったと判断するまでのlockエラー回数 $max_lock_error_count = 10; # フォームデータ受信バッファサイズ(byte) $form_rec_buf_size = 4096; # ファイル名に使用出来る文字を制限する $restrict_filename = 'true'; # 編集可能ファイル.通常は自動判別によって編集可能(テキスト)ファイルが決定 # されるが,文字コードの関係で自動判別を誤る場合がある(多い).ここで明示的に # 指定することによってそれを回避する. @editable_filename = ('\.txt'); # アップロード禁止ファイル.セキュリティ上アップされるとまずいファイル等. # 追加するのは構いませんが,【デフォルトのものを消すべきではありません】. # html ファイルをアップロード出来るようにするのは大変危険です. @ng_filename = ('^\.htaccess$', '^\.htpasswd$', '^\.upload_lock$', '\..?htm.?$', '\.cgi$'); # アップロード許可ファイル.アップロード禁止ファイルよりも優先されます. @ok_filename = (); # 例: *.txt のみをアップ可能にしたい場合 # ng_filename = ('.*'); # ok_filename = ('\.txt$'); # 拡張子等に応じて画像を表示 $image{'txt'} = "$gifdir/text.gif"; $image{'doc'} = "$gifdir/text.gif"; $image{'log'} = "$gifdir/text.gif"; $image{'gif'} = "$gifdir/image.gif"; $image{'jpg'} = "$gifdir/image.gif"; $image{'jpeg'} = "$gifdir/image.gif"; $image{'png'} = "$gifdir/image.gif"; $image{'bmp'} = "$gifdir/image.gif"; $image{'mid'} = "$gifdir/sound.gif"; $image{'wav'} = "$gifdir/sound.gif"; $image{'zip'} = "$gifdir/arc.gif"; $image{'lzh'} = "$gifdir/arc.gif"; $image{'tgz'} = "$gifdir/arc.gif"; $image{'gz'} = "$gifdir/arc.gif"; $image{'exe'} = "$gifdir/exe.gif"; # フォルダの扱いはやや特殊 $image{'folder'} = "$gifdir/folder.gif"; # 標準画像 $image{'std_image'} = "$gifdir/file.gif"; # ソフト名 $softname = 'upload v2.5'; # サポートページの場所 $support_page_url = 'http://homepage1.nifty.com/~heppoko/'; # -------------------------------------------------- # サブルーチンのみで使用されるグローバル変数の定義 # -------------------------------------------------- # オブジェクト my ($myEzHTML, $myFormData, $myPasswd, $myPasswd2, $myLock, $myFileInfo); # 参照 my ($values); # スカラー my ($host_name, $ipaddr); my ($sec,$min,$hour,$mday,$mon,$year); my ($host_allow, $userupdir, $userupurl, $userdatadir, $subdir, $sortmethod, $downfile); my ($all_filesize); my ($d_passwd, $d_comment_up, $d_email, $d_username, $d_override); my ($d_cookie, $f_cookie, $d_comment_md); my ($form_error); # -------------------------------------------------- # メイン処理(特に理由がない限り変更しないで下さい) # -------------------------------------------------- # ライブラリを読み込む require $hcgilibname; require $jcodelibname; # リモートホスト名とアドレスの取得 ($host_name,$ipaddr) = accesslog::getRemoteHostInfo(); # ホスト名が分からない場合は IP アドレスを使用 $host_name = $host_name ? $host_name : $ipaddr; # 時刻の記録 ($sec,$min,$hour,$mday,$mon,$year) = accesslog::getTime(); # ezhtml オブジェクトの実装 $myEzHTML = EzHTML->new($prog_filename, $title, $title_bgcolor, $bg_filename, $bgcolor, $admin_page_url, $admin_page_title, $support_page_url, $softname, $title_color, $title_bg_filename); if($record_errlog eq 'true') { $myEzHTML->setErrlogFilename("$datadir/$errlog_filename"); } # 一時ディレクトリを空にする if(!-e "$datadir/$upload_tmp_dir") { mkdir("$datadir/$upload_tmp_dir", 0777) || error("致命的エラー: 一時ディレクトリ $datadir/$upload_tmp_dir の作成に失敗しました"); } # FormData2 オブジェクトの実装 $myFormData = FormData2->new(); # 受信データサイズの上限を設定 $myFormData->setMaxDataSize($max_filesize); # フォームデータ受信バッファサイズを設定 $myFormData->setBufferSize($form_rec_buf_size); # 一時ディレクトリを設定 $myFormData->setTmpDir("$datadir/$upload_tmp_dir"); # POST と GET の両方を受け付ける $myFormData->setGET('true'); $myFormData->setPOST('true'); # フォームから送られるデータの受信 $form_error = $myFormData->receive(); # ファイル名とデータ値のハッシュの参照を取得 $values = $myFormData->getValues(); # 管理者用 Passwd オブジェクトの実装 $myPasswd = Passwd->new("$datadir/$admin_passwd_filename", $prog_filename, '管理者', \$myEzHTML, \$myFormData); # 管理者パスワードを読み込む,必要ならば設定する. $myPasswd->loadPasswd(); # ユーザ用 Passwd オブジェクトの実装 $myPasswd2 = Passwd->new("$datadir/$user_passwd_filename", $prog_filename, 'ユーザ', \$myEzHTML, \$myFormData); # ユーザパスワードを読み込む,必要ならば設定する. $myPasswd2->loadPasswd(); # ユーザパスワードの認証を行う. if($user_certification eq 'true') { $myPasswd2->requestPasswd(); } # ロックオブジェクトの実装 $myLock = Lock->new("$datadir/$lock_dirname", $max_wait_time); # ファイル情報オブジェクトの実装 $myFileInfo = FileInfo->new(); # --------------------------- # リモートホストがアップロードを許可されているかどうかの取得 $host_allow = check_remotehost(); # ユーザディレクトリ,サブディレクトリの取得 ($userupdir, $userupurl, $userdatadir, $subdir, $downfile) = get_dirs(); # ソート方法の取得 $sortmethod = get_sortmethod(); # ファイル情報をグローバル変数に読み込む load_fileinfo($myFileInfo, $userdatadir); # ディスク情報を読み込む $all_filesize = load_diskinfo(); # クッキー情報読み込み ($d_username, $d_passwd, $d_comment_up, $d_comment_md, $d_cookie, $d_override, $d_email) = load_cookie(); # クッキーを使用するかどうか(チェックボックスの設定) $f_cookie = get_value('cookie'); # メッセージ表示後に戻るページを指定 $myEzHTML->setRetPageURL("$prog_filename?page=Main&dir=$subdir&sort=$sortmethod"); # # どこのフォームからのデータなのかを判定し,適切な処理を行う # # 送信されたファイルのサイズが大き過ぎるか,不正なデータが送られている場合は # エラーメッセージを表示 if($form_error) { error("ファイルのサイズが大きすぎるか,または不正なデータが送られています.
エラーメッセージ :
$form_error
[ファイルの管理][アップロード][ディレクトリの作成][ヘルプ]
★ファイルの管理★
ファイルのダウンロード | ファイル名をクリックして下さい. |
ディレクトリの移動 | ディレクトリ名をクリックして下さい. |
ツリー表示 | ディレクトリ・ファイルのツリー構造を表示します.「部分ツリー表示」では,現在のディレクトリ以外のファイルは表示しません. |
情報の変更 | ファイル名やコメント等を変更します.対象にチェックを入れ,アップロード時に設定したパスワードと同じパスワードを入力したのちに[情報の変更]ボタンを押して下さい. |
ファイルの編集 | テキストファイルの編集を行います.対象にチェックを入れ,アップロード時に設定したパスワードと同じパスワードを入力したのちに[編集]ボタンを押して下さい.テキストファイルの判別に失敗する場合が多々ありますので,その場合は管理者にお問い合わせ下さい. |
ファイルの移動 | 対象にチェックを入れ,アップロード時に設定したパスワードと同じパスワードを入力したのちに[移動]ボタンを押して下さい. |
ファイルの削除 | 対象にチェックを入れ,アップロード時に設定したパスワードと同じパスワードを入力したのちに[削除]ボタンを押して下さい. |
★アップロード★
アップロード | 送信ファイル名(「半角英数字」及び「-(ハイフン)」「_(アンダーバー)」「.(ドット)」のみ使用可),コメント(省略可),E-MAILアドレス(省略可),ユーザ名(省略不可),パスワード(省略可)を指定した後に[アップロード]ボタンを押して下さい. |
★ディレクトリの作成★
ディレクトリの作成 | ディレクトリ名(「半角英数字」及び「-(ハイフン)」「_(アンダーバー)」「.(ドット)」のみ使用可),コメント(省略可),E-MAILアドレス(省略可),ユーザ名(省略不可),パスワード(省略可)を入力した後に[ディレクトリの作成]ボタンを押して下さい.ただし,複数階層のサブディレクトリを一度の操作で作成することは出来ません. |
★その他★
TIPS1 | 「ファイル名」「登録日」「ユーザ名」の表示をクリックすれば,各項目別にソートすることが出来ます. |
TIPS2 | 「設定を保存」をチェックしておけば,ユーザ名やパスワード等をブラウザに記憶させることが出来ます.保存されたユーザ名やパスワード等は全ての機能で共通に使用されます. |
現在のディレクトリ名: | $sdir |
現在のディレクトリ名: | $sdir |
ファイル名 | 容量(byte) | 登録日 | コメント | ユーザ名 |
EOF
if($filesize) {
print " \n";
} else {
print " \n";
}
print < |
EOF
if($filesize) {
print " $ffilesize | \n"; } else { print "(directory) | \n"; } print <$comment |
EOF
if($email) {
print " $username\n";
} else {
print " $username\n";
}
print < |
|
|
|
|
|
---|
[移動先]
EOF print_dir_tree('move', $passwd, $onn_all); print "