#!/usr/local/bin/perl
use lib './lib';
use CGI::Lite;
require 'jcode.pl';
# 環境設定
my $platform = 'Unix'; # Unix/Windows/Mac
my $filecode = 'euc'; # euc/sjis/jis
my $directory = './file';
my $password = '';
my $access = 0; # 0:利用にはパスワードが必要 1:不要
my $upload = 0; # 0:アップロードにはパスワードが必要 1:不要
my $delete = 0; # 0:削除にはパスワードが必要 1:不要
my $maxfilesize = 50; # 0:ファイルサイズ n:nキロバイトまで
my $permission = 0664; # ファイルに設定するOS上でのパーミッション
# 環境設定(表示関連)
my $title = 'Walrus File Rack';
my $title_pos = 'right'; # right/left/center
# 環境設定(ファイル名関連)
my @name_add_txt = ('pl', 'cgi', 'php', 'rb', 'htm', 'html', 'shtml'); # '.txt'を付加する拡張子
my @name_add_bin = ('exe'); # '.bin'を付加する拡張子
my $name_do_h2z = 1; # 0:半角カナをそのままにする 1:全角に変換する
my $name_incorrect_char = 1; # 0:ファイル名に含められない文字(<>[]?_*/\)は削除する 1:全角に変換する
my $name_conv_2byte = 1; # 0:全角の英数字、括弧、ハイフンなどをそのままにする 1:半角に変換する
# Wiki の URL (以下はwiki.cgiと同一階層にWalRack2ディレクトリを置いた場合)
my $wiki_url = '../wiki.cgi';
my $wiki_css = '../WalWiki/theme/wiki.css';
# 動作確認用
my $logging = 1;
# コンテンツ格納用
my $form_login;
my $form_list;
my $form_upload;
my $form_log;
my $cgititle = 'Walrus File Rack';
my $subtitle = 'セイウチのあみだな。';
my $version = '2.0.3';
# ディレクトリの確認
$directory =~ s/\/$//;
my $tempdir = $directory.'/temp';
mkdir $directory, 0777 or die $! unless (-d $directory);
mkdir $tempdir, 0777 or die $! unless (-d $tempdir);
# CGI_Liteを使ったフォームデコード
my $cgi=new CGI::Lite;
$cgi->add_timestamp(2);
$cgi->set_directory($tempdir) or die $!;
$cgi->set_platform ($platform);
$cgi->filter_filename ( sub {
# ファイル名変換ルーチンの定義
$form_log .= "ファイル名を確認しています。 ".$_;
$_ = $_[0];
# (1)eucに変換
my $ascii = '[\x00-\x7F]';
my ($match, $code) = jcode::getcode(\$_);
$code = 'euc' if $code eq undef and $match > 0;
if ($code eq 'euc') {
if ($_ !~ /^(?:$jcode::re_euc_c|$jcode::re_euc_kana|$jcode::re_euc_0212|$ascii)*$/ox) {
if ($_ =~ /^(?:$jcode::re_sjis_c|$jcode::re_sjis_kana|$ascii)*$/o) {
$code = 'sjis';
}
}
}
$form_log .= "(${code})";
&jcode::convert(*_, 'euc', $code);
$form_log .= " -> .$_";
# (2)全角/半角の修正(半角カナ、禁則文字を全角、英数字と記号を半角)
if ($name_do_h2z) { &jcode::h2z_euc(*_); }
if ($name_incorrect_char) { &jcode::tr(*_, '<>?[]_*/\\', '<>?[]_*/¥'); }
else { &jcode::tr(*_, '<>?[]_*/\\', ''); }
if ($name_conv_2byte) { &jcode::tr(*_, 'A-Za-z0-9 ()_@−', 'A-Za-z0-9 ()_@-'); }
$form_log .= ' -> '.$_;
# (3)$filecodeに再度変換
&jcode::convert(*_, $filecode, 'euc');
$form_log .= ' -> '.$_;
# (4)禁止拡張子の削除
$_ .= '.txt' if (/\.([^\.]+)$/ and grep {$_ eq $1} @name_add_txt);
$_ .= '.bin' if (/\.([^\.]+)$/ and grep {$_ eq $1} @name_add_bin);
$form_log .= ' -> '.$_.' ';
return $_;
});
my %formdata = $cgi->parse_form_data();
$formdata{'tempfile'} = $tempdir.'/'.$formdata{'file'};
$formdata{'savefile'} = $directory.'/'.$formdata{'file'};
if ((stat($formdata{'tempfile'}))[7] == 0 or $maxfilesize and (stat($formdata{'tempfile'}))[7] > $maxfilesize * 1024) {
$form_log .= (stat($formdata{'tempfile'}))[7] ? "ファイルサイズが大きすぎます。 " : "ファイルサイズが0です。 ";
unlink($formdata{'tempfile'});
delete($formdata{'file'});
}
my %cookies = $cgi->parse_cookies();
my $cookie;
# パスワードの確認
if ($formdata{'pass'} eq $password or $cookies{'pass'} eq $password) {
$access = $upload = $delete = 1;
$cookie = "Set-cookie: pass=$password\n";
} elsif ($formdata{'pass'} or $cookies{'pass'}) {
$form_log .= "パスワードが正しくありません。 ";
}
# ログインフォームの生成
unless ($access and $upload and $delete) {
$form_log .= "ログインフォームを生成します。 ";
if ($access) {
unless ($upload) { $form_login .= "ログイン前は、ファイルのアップロードはできません。 "; }
unless ($delete) { $form_login .= "ログイン前は、ファイルの削除はできません。 "; }
} else {
$form_login .= "ご利用にはパスワードによるログインが必要です。 ";
}
$form_login = <
Login
$form_login
END_OF_LOGIN
}
# ファイル操作処理
&file_receive() if ($formdata{'file'});
&file_remove() if ($formdata{'unlink'});
# ファイルアップロードフォーム生成
if ($access and $upload) {
my $file_size_info = "ファイルサイズの上限は${maxfilesize}キロバイトです。" if ($maxfilesize);
$form_upload = <
File Upload
ファイルのフルパスを入力し、送信開始ボタンをクリックすると、ファイルがアップロードされます。
$file_size_info
END_OF_UPLOAD
}
# ファイルリスト生成
if ($access) {
my ($size, $listdata) = &file_listup;
my $delete_button = $delete ? "" : "(( 削除はログインしないと実行できません ))";
$form_list = <