#! /usr/bin/perl # # updown2.cgi # # 2.221 : 2/12/08 : copyrightを修正 # 2.220 : 12/20/07 : エラーメッセージを修正 # 2.219 : 12/7/07 : 内挿入文にページ下を追加 # 2.218 : 11/3/07 : アップロードページ別ページオプションを追加 # 2.217 : 9/12/07 : 管理用削除オプションを追加 # 2.216 : 5/31/07 : タイトル変更機能を追加 # 2.215 : 5/30/07 : ファイルサイズの単位を修正 # 2.214 : 5/29/07 : 1ページ表示件数オプションを追加 # 2.213 : 2/18/07 : ファイル置き換え機能を追加 # 2.212 : 1/24/07 : 管理用設定のタイトルに半角スペースを適用できるよう修正 # 2.211 : 1/3/07 : body内挿入分の「タイトルの下」を修正 # 2.210 : 12/6/06 : Divide by zeroを修正 # 2.209 : 11/23/06 : ファイル総サイズ表示、総アップロードサイズ制限、制限処理を追加 # 2.208 : 11/16/06 : 時間設定モードを追加 # 2.207 : 10/25/06 : ダウンロードページへ移動のオプションを追加 # 2.206 : 8/24/06 : セットアップファイル作成を修正 # 2.205 : 8/9/06 : ページ内挿入分設定を追加 # 2.204 : 8/7/06 : カウントファイル更新を修正 # 2.203 : 6/4/06 : ファイル削除時の処理を修正 # 2.202 : 5/30/06 : エラーメッセージを修正 # 2.201 : 5/12/06 : 拡張子を省略した場合元の拡張子を使うように修正 # 2.2 : 5/10/06 : updown.cgiから機能追加 # # http://www.hidekik.com # # $Id: updown2.cgi,v 1.34 2008/02/12 06:07:31 Hideki Kanayama Exp $ # Copyright(c) 2002-2008 Hideki Kanayama All rights reserved use strict; use CGI qw(:cgi-lib); use CGI::Carp qw(fatalsToBrowser); use File::Copy; use File::Basename; my $version = "2.221"; my $lastmodifiedyear = "2008"; my $admindat = "adminpwd.dat"; my $uppwddat = "uppwd.dat"; my $dlpwddat = "dlpwd.dat"; my $setupfile = "updown_setup.pl"; my $script = basename($0); my $charset = "Shift_JIS"; ############# 環境設定ここから ######################## our $dldir = "../updown"; our $dllistfile = "updown.lst"; our $dlcountfile = "dlcount.lst"; # バックグラウンド設定 our $bgimage_en = 0; our $bgimagefile="sample.jpg"; our $bgcolor="#ffffff"; #タイトル our $title = 'アップダウン2'; #トップへのリンク our $toplink_en = 1; our $toplink_link = "../updown2.html"; our $toplink_title = 'トップへ'; # アップロード禁止な拡張子 our $prohibit_en = 1; our $prohibit_extention = "cgi pl"; # 半角スペースで区切る #アップファイル最大サイズ(MB) our $maxsize2 = 10; #アップロードできる合計ファイルサイズ制限 1:有効 0:無効 our $total_maxsize_en = 0; #アップロードできる合計ファイルサイズ制限有効時のサイズ(MB) our $total_maxsize = 100; #合計ファイルサイズに達した場合の処理 0:アップロード禁止 1:古いファイルを削除 our $after_reached_limit = 0; #合計ファイル数、サイズ、平均表示 1:有効 0:無効 our $total_number_en = 1; our $total_size_en = 1; our $average_size_en = 1; #ダウンロードカウンター表示 1:有効 0:無効 our $dlcount_disp_en = 1; #アップロードパスワード 1:有効 0:無効 our $uppwd_en = 0; #ダウンロードパスワード 2:全ファイル共通 1:個別ファイルごと 0:無効 our $dlpwd_en = 0; #管理人のみ削除可能 1:有効 0:無効 our $del_by_admin_only = 0; #アップロードページ別ページ 1:有効 0:無効 our $uppage_en = 0; # ダウンロードページへ移動 1:有効 0:無効 our $goto_dlpage = 0; # 1ページ表示件数 1:有効 0:無効 our $page_en = 0; our $disp_num_in_a_page = 50; #スタイルシート our $style_sheet_en = 1; our $style_sheet = ' '; #挿入文 our $head_insert_en = 0; our $head_insert = ''; #ページ上部に表示させる文 1:on, 0:off our $body_insert1_en = 0; our $body_insert2_en = 0; our $body_insert3_en = 0; our $body_insert4_en = 0; our $body_insert1 = ''; our $body_insert2 = ''; our $body_insert3 = ''; our $body_insert4 = ''; # 時間設定 our $localtime_en = 1; our $offset_from_gmt = 9; ############# 環境設定ここまで ######################## if (-e "$setupfile"){ require "$setupfile"; } my $bgset; if ($bgimage_en == 1){ $bgset = "background=\"$bgimagefile\""; } else { $bgset = "bgcolor=\"$bgcolor\""; } $CGI::POST_MAX = $maxsize2 * 1048576; my $maxsize = $CGI::POST_MAX; if ($maxsize > 1048576){ $maxsize = sprintf("%.1fMB",$maxsize/1048576); } elsif ($maxsize > 1024){ $maxsize = sprintf("%.1fkB",$maxsize/1024); } else { $maxsize = sprintf("%dB",$maxsize); } my $q = new CGI; my $cgierror = $q->cgi_error; &error($cgierror) if ($cgierror); my %in = $q->Vars; while (my ($key,$value)=each %in){ if ($key ne 'upfile'){ $value =~ s//>/g; my $br; if ($key eq 'style_sheet' || $key eq 'head_insert' || $key eq 'body_insert1' || $key eq 'body_insert2' || $key eq 'body_insert3' || $key eq 'body_insert4' ){ $br = "
"; } else { $br = ""; } if ($value =~ /\r\n/) { $value =~ s/\r\n/$br/g; } if ($value =~ /\n/) { $value =~ s/\n/$br/g; } if ($value =~ /\r/) { $value =~ s/\r/$br/g; } if ($value =~ /,/) { $value =~ s/,/&\#44;/g; } $in{"$key"}=$value; } } if (! -e "$admindat"){ if ($in{mode} ne 'adminpwd'){ &setadminpwd; } else { &wradminpwd; } } if ($uppwd_en){ if (! -e "$uppwddat"){ if ($in{mode} ne 'wrupdlpwd'){ &setupdlpwddat(0); } else { &wrupdlpwd; } } } if ($dlpwd_en == 2){ if (! -e "$dlpwddat"){ if ($in{mode} ne 'wrupdlpwd'){ &setupdlpwddat(1); } else { &wrupdlpwd; } } } my @alldata; if (open(FILE,"< $dllistfile")) { @alldata=; close(FILE); } @alldata = reverse @alldata; if ($in{mode} eq 'register' or $in{mode} eq 'replace'){ ®ister; } elsif ($in{mode} eq 'delete'){ &delete; } elsif ($in{mode} eq 'setup'){ &setup; } elsif ($in{mode} eq 'wrsetup'){ &wrsetup; } elsif ($in{mode} eq 'uppage'){ &uppage; } elsif ($in{mode} eq 'download'){ &download; } elsif ($in{mode} eq 'go_dl'){ &go_dl; } else { &display; } ################## 登録 ########################### sub register { if ($in{'sub'} eq "" || $in{'upfile'} eq "") { &error("$in{sub}:$in{upfile}:タイトル、またはファイル名を正しく入れてください。"); } if ($in{'pwd'} eq "" and $del_by_admin_only == 0) { &error("削除用パスワードを正しく入れてください。"); } if ($dlpwd_en == 1 and $in{'dlpwd'} eq "") { &error("ダウンロード用パスワードを正しく入れてください。"); } my $fname; my $upfile = $q->param('upfile'); my ($tmp1, $tmp2, $orgext) = fileparse($upfile,'\.[^\.]*?$'); if ($in{'fname'} eq ""){ $fname = basename($upfile); } else { $fname=$in{'fname'}; } $fname =~ s/^.+[\/\\]([^\/\\]+)$/$1/; #just in case $fname .= "$orgext" if ($fname !~ /\.[^\.]*?$/); if ($fname !~ /^[\w\.\-]+$/) { &error("$fname:アップ後のファイル名は半角英数、ドット、ハイフン、アンダースコアで。"); } my $origcount; if ($total_maxsize_en){ my $total_size; my @sizelist; my @countlist; my $origsize; if (open(FILE,"< $dllistfile")) { flock FILE, 1; foreach (){ my ($count,$file,$title,$size,$update,$pwd,$host,$addr,$dlpwd)=split(/,/); my ($d_dev,$d_ino,$d_mode,$d_nlink,$d_uid,$d_gid,$d_rdev,$d_size,$d_atime,$d_mtime,$d_ctime,$d_blksize,$d_blocks)=stat("$dldir/$file"); $d_size = &size_unconvert($d_size); $total_size += $d_size; push @countlist, $count; $sizelist[$count]=$d_size; if ("$file" eq "$fname"){ $origsize = $d_size; } } close(FILE); } if ($in{mode} eq 'replace'){ $total_size -= $origsize; } my $upload_size = $ENV{CONTENT_LENGTH}; my $total_maxsize2 = $total_maxsize * 1048576; my $size_left = $total_size; if ($upload_size > $total_maxsize2){ my $tmp = &size_convert($upload_size); &error("ファイルサイズが$tmpです。
サーバーにアップロードされる合計が${total_maxsize}MBを超えるのでアップロードできません。"); } elsif ($total_size + $upload_size > $total_maxsize2){ if ($after_reached_limit){ foreach my $num (@countlist){ &delete_body($num,1); $size_left -= $sizelist[$num]; if ($size_left + $upload_size < $total_maxsize2){ last; } } } else { my $tmp = &size_convert($total_maxsize2 - $total_size); &error("サーバーにアップロードされる合計が${total_maxsize}MBを超えるのでアップロードできません。
$tmpまでならアップロードできます。"); } } } if ($uppwd_en){ my $uppwd; if (open(FILE,"< $uppwddat")){ $uppwd = ; close(FILE); } if ($in{'uppwd'} eq "") { &error("アップロード用パスワードを正しく入れてください。"); } elsif (! (&checkcrypt($in{uppwd},"$uppwd") || &checkcrypt($in{uppwd},&adminpwd))){ &error("アップロード用パスワードが違います。"); } } my @suffix_list = split /\s+/, $prohibit_extention; my ($body_name, $path_name, $suf_name) = fileparse($fname,@suffix_list); if ($suf_name and $prohibit_en){ &error("$suf_nameの拡張子ではアップロードが禁止されています。"); } my $outfile = "$dldir/$fname"; if (-e "$outfile" and $in{mode} eq 'register') { &file_conflict("$fname"); # &error("同じファイル名がサーバー上に存在します。
アップ後のファイル名を変更してやり直してください。"); } if ($in{mode} eq 'replace'){ if (open(FILE,"< $dllistfile")) { flock FILE, 1; foreach (){ my ($count,$file,$title,$size,$update,$pwd,$host,$addr,$dlpwd)=split(/,/); if ("$file" eq "$fname"){ $origcount = $count; } } close(FILE); &delete_body($origcount,0); } } my $fh = $q->upload('upfile'); my $cgierror = $q->cgi_error; &error($cgierror) if (!$fh && $cgierror); copy ($fh, $outfile) or &error("アップロードに失敗しました。$outfileにアップできません。:$!"); chmod (0666,$outfile); close($fh); my ($d_dev,$d_ino,$d_mode,$d_nlink,$d_uid,$d_gid,$d_rdev,$d_size,$d_atime,$d_mtime,$d_ctime,$d_blksize,$d_blocks)=stat("$outfile"); my $size = &size_convert($d_size); my $count; if (open(DLFILE,"< $dllistfile")){ flock DLFILE, 1; my @dummy; while(){ ($count,@dummy)=split(/,/); } close(DLFILE); } $count++; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = $localtime_en ? localtime($d_mtime) : gmtime($d_mtime+$offset_from_gmt*3600); my $update = sprintf("%s年%s月%s日%02s時%02s分",$year+1900,$mon+1,$mday,$hour,$min); my $remote_host=$ENV{'REMOTE_HOST'}; my $remote_addr=$ENV{'REMOTE_ADDR'}; my $encpwd = &makecrypt($in{pwd}); my $encuppwd = &makecrypt($in{uppwd}); my $encdlpwd = &makecrypt($in{dlpwd}); open(DAT,">> $dllistfile"); flock DAT, 2; print DAT "$count,$fname,$in{sub},$size,$update,$encpwd,$remote_host,$remote_addr,$encdlpwd\n"; close(DAT); open(DLCOUNT,">> $dlcountfile"); flock DLCOUNT, 2; print DLCOUNT "$count,0\n"; close(DLCOUNT); chmod(0666,"$dllistfile"); print "Location: $script\n\n"; } sub size_convert { my $d_size = shift; my $size; if ($d_size > 1048576){ $size = sprintf("%.1fMB",$d_size/1048576); } elsif ($d_size > 1024){ $size = sprintf("%.1fkB",$d_size/1024); } else { $size = sprintf("%dB",$d_size); } return $size; } sub size_unconvert { my $d_size = shift; my $size; if ($d_size =~ /MB$/){ $size = $d_size * 1048576; } elsif ($d_size =~ /kB$/){ $size = $d_size * 1024; } else { $size = $d_size; } return $size; } ###################### 削除 ######################### sub delete { if ($in{'deletefile'} == 0) { &error("削除するタイトルを選んでください。"); } my $delnumber = $in{deletefile}; if ($in{'pwd'} eq "") { &error("削除用パスワードを正しく入れてください。"); } &delete_body($delnumber,0); print "Location: $script\n\n"; } sub delete_body { my ($delnumber,$nopwd) = @_; my @newlist=(); my @newcount=(); open(DLFILE,"< $dllistfile"); while(){ chomp; my ($count,$file,$title,$size,$update,$pwd,$host,$addr,$dlpwd)=split(/,/); if ($count == $delnumber){ if ((&checkcrypt($in{pwd},"$pwd") && ($pwd ne '') && $del_by_admin_only == 0) or &checkcrypt($in{pwd},&adminpwd) or $nopwd){ if ($in{newtitle} ne ''){ push(@newlist,"$count,$file,$in{newtitle},$size,$update,$pwd,$host,$addr,$dlpwd\n"); } else { unlink("$dldir/$file"); } } else { if ($del_by_admin_only){ &error("管理人のみ削除変更できます。"); } else { &error("パスワードが違います。"); } } } else { push(@newlist,"$_\n"); } } close(DLFILE); my $dlnum; open(DLCOUNT,"< $dlcountfile"); flock DLCOUNT, 1; while(){ my ($count,$num)=split(/,/); if ($count != $delnumber or $in{newtitle} ne ''){ push(@newcount,"$_"); } } close(DLCOUNT); open(DAT,"+< $dllistfile") or &error("$dllistfileに書き込みできません。"); flock DAT, 2; truncate DAT, 0; seek DAT, 0, 0; print DAT @newlist; close(DAT); open(DAT,"+< $dlcountfile") or &error("$dlcountfileに書き込みできません。"); flock DAT, 2; truncate DAT, 0; seek DAT, 0, 0; print DAT @newcount; close(DAT); } ############################## セットアップ ################################ sub setup { if ($in{'pwd'} eq "") { &error("管理用パスワードを正しく入れてください。"); } if (!&checkcrypt($in{pwd},&adminpwd)){ &error("パスワードが違います。"); } &beginning; my @bgimage_check; my @toplink_check; my @head_insert_check; my @style_sheet_check; my @prohibit_check; my @dlcount_disp_check; my @uppwd_check; my @dlpwd_check; my @del_by_admin_check; my @uppage_check; my @goto_dlpage_check; my @localtime_check; my @body_insert1_check; my @body_insert2_check; my @body_insert3_check; my @body_insert4_check; my @total_maxsize_check; my @after_reached_limit_check; my @total_number_check; my @total_size_check; my @average_size_check; my @page_check; $bgimage_check[$bgimage_en] = "checked"; $toplink_check[$toplink_en] = "checked"; $head_insert_check[$head_insert_en] = "checked"; $style_sheet_check[$style_sheet_en] = "checked"; $prohibit_check[$prohibit_en] = "checked"; $dlcount_disp_check[$dlcount_disp_en] = "checked"; $uppwd_check[$uppwd_en] = "checked"; $dlpwd_check[$dlpwd_en] = "checked"; $del_by_admin_check[$del_by_admin_only] = "checked"; $uppage_check[$uppage_en] = "checked"; $goto_dlpage_check[$goto_dlpage] = "checked"; $localtime_check[$localtime_en] = "checked"; $body_insert1_check[$body_insert1_en] = "checked"; $body_insert2_check[$body_insert2_en] = "checked"; $body_insert3_check[$body_insert3_en] = "checked"; $body_insert4_check[$body_insert4_en] = "checked"; $total_maxsize_check[$total_maxsize_en] = "checked"; $after_reached_limit_check[$after_reached_limit] = "checked"; $total_number_check[$total_number_en] = "checked"; $total_size_check[$total_size_en] = "checked"; $average_size_check[$average_size_en] = "checked"; $page_check[$page_en] = "checked"; print <
  • ディレクトリ、ファイルの設定は、$scriptから見た相対パス、又は絶対パスで指定してください。CGIと同じディレクトリの場合、.(半角ドット)でOKです。バックグランドファイルやロゴファイルはhttp://からのリンクの指定も可能\です。
  • 管理人パスワードを変更するには、$admindatを削除して、$scriptを実行しなおしてパスワードを再入力してください。
  • これらの設定は$setupfileに保存されます。また、$setupfileをエディタ等で変更してもこの設定ページに反映されます。
  • $scriptがバージョンアップされた場合、単純に$scriptだけを置き換えるだけで設定はそのまま使えます。
  • $admindatと$setupfileのファイル名はこの設定ページでは変更できません。変更したい場合は$scriptの中で変更してください。
  • 管理人パスワードで他人の登録ファイルを削除することができます。
  • 数字やカラー指定は必ず半角で指定してください。全角やブランクだとCGIが起動しなくなります。万一間違って全角で書いてしまった場合は、$setupfileをエディタで開きその場所を半角に正しく修正してください。それで直ります。
データディレクトリ
データファイル
ダウンロードカウントファイル
バックグランド 画像を使う カラー設定にする
画像を使う場合の画像ファイル
カラー設定の場合のカラー番号(白:\#ffffff 又は white)
タイトル
トップへのリンク表\示 有り 無し
トップのリンク先
リンク名
アップロード禁止 無効 有効
拡張子半角スペースで区切ってください
アップファイル最大サイズ MB
アップロードできる合計ファイルサイズ制限 有効 無効
有効時にアップロードできる合計ファイルサイズ
MB
合計ファイルサイズに達した場合の処理
アップロード禁止 古いファイルを削除
合計ファイル数、サイズ、平均表\示 ファイル数 有効 無効
ファイルサイズ 有効 無効
平均ファイルサイズ 有効 無効
ダウンロードカウンター表\\示 表\\示 非表\\示
アップロード用パスワード 有効 無効
ダウンロード用パスワード 全ファイル共通 個別のファイルごと 無効
削除オプション 「有効」の場合、アップロード時の削除用パスワードは入れても入れなくてもアップロードできます。
管理人のみ削除可能\ 誰でも削除可能\
アップロードページを別ページ 有効 無効
ダウンロードページへ移動 ダウンロードパスワードを有効にし、画像ファイルをブラウザで開いた場合、右クリックで画像を保存できない場合があります。その場合にこのスイッチを「有効」にすると別ページに移動しそこのリンクからファイルをダウンロードできるようになります。
有効 無効
1ページ表\示件数制限 有効 無効
有効時に1ページに表\示される件数
<head>内挿入文 有効 無効
HTML書式
ポップアップ広告やJavascript、<META>を挿入したい場合にここに記述する。
以下の記述が<head>〜</head>内に挿入される。

スタイルシート 有効 無効

<body>内挿入文 ページ上部に表\示される文をHTMLで記述。ルールやコメント、広告やアクセスカウンタ、リンクなど記すことができます。
タイトルの上 有効 無効

タイトルの下 有効 無効

更新時間表\示の下 有効 無効

ページ下 有効 無効

時間設定 GMTからのオフセット ローカルタイム
GMTからのオフセットに設定した場合、GMTより時間(日本:+9時間)
 
SETUPWIN &ending; } ############################## セットアップ作成 ############################ sub wrsetup { if ($in{'pwd'} eq "") { &error("管理用パスワードを正しく入れてください。"); } if (!&checkcrypt($in{pwd},&adminpwd)){ &error("パスワードが違います。"); } my @nodecode=('style_sheet', 'head_insert', 'body_insert1', 'body_insert2', 'body_insert3', 'body_insert4', ); foreach (@nodecode){ $in{$_} =~ s/
/\n/g; $in{$_} =~ s/<//g; $in{$_} =~ s/,/,/g; } open(FILE,"> $setupfile") || error('$セットアップファイルを作成できません。$setupfileのディレクトリのパーミッションを確認してください。'); print FILE <挿入文 \$head_insert_en = $in{head_insert_en}; \$head_insert = '$in{head_insert}'; #ページ上部に表\示させる文 1:on, 0:off \$body_insert1_en = $in{body_insert1_en}; \$body_insert1 = '$in{body_insert1}'; \$body_insert2_en = $in{body_insert2_en}; \$body_insert2 = '$in{body_insert2}'; \$body_insert3_en = $in{body_insert3_en}; \$body_insert3 = '$in{body_insert3}'; \$body_insert4_en = $in{body_insert4_en}; \$body_insert4 = '$in{body_insert4}'; #時間設定 \$localtime_en = $in{localtime_en}; \$offset_from_gmt = $in{offset_from_gmt}; ############# 環境設定ここまで ######################## 1; END close(FILE); print "Location: $script\n\n"; } ############################## 表示 ################################ sub display { my @countarray; if (open(FILE,"< $dlcountfile")){ while (){ chomp; my ($tmp1, $tmp2) = split /,/; $countarray[$tmp1] = $tmp2; } close(FILE); } my ($d_dev,$d_ino,$d_mode,$d_nlink,$d_uid,$d_gid,$d_rdev,$d_size,$d_atime,$d_mtime,$d_ctime,$d_blksize,$d_blocks)=stat("$dllistfile"); my @monarray=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = $localtime_en ? localtime($d_mtime) : gmtime($d_mtime+$offset_from_gmt*3600); my $date_str = sprintf("%s %02d, %s",$monarray[$mon], $mday, $year+1900); &beginning; &header($date_str); my $total_size; my $partial_size; if ($toplink_en == 1){ print "$toplink_title\n"; } my $from; if ($page_en){ if (! defined $in{from}){ $from = 1; } else { $from = $in{from}; } } print "
\n"; my $allnum = $#alldata; if ($page_en){ print "
    \n"; &displist($allnum); print "

    \n"; } else { print "

      \n"; } my $cnt=1; foreach (@alldata){ chomp; my ($count,$file,$title,$size,$update,$pwd,$host,$addr,$dlpwd)=split(/,/); my $sizeu = &size_unconvert($size); if ($cnt >= $from and $cnt < $from+$disp_num_in_a_page or $page_en == 0){ print "
    1. "; print "$title ($size)"; if ($update eq ''){ ($d_dev,$d_ino,$d_mode,$d_nlink,$d_uid,$d_gid,$d_rdev,$d_size,$d_atime,$d_mtime,$d_ctime,$d_blksize,$d_blocks)=stat("$dldir/$file"); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=$localtime_en ? localtime($d_mtime) : gmtime($d_mtime+$offset_from_gmt*3600); $update = sprintf("%s年%s月%s日%02s時%02s分",$year+1900,$mon+1,$mday,$hour,$min); } print " "; print "(download : $countarray[$count])" if ($dlcount_disp_en); print " .......... $update"; print "
    2. \n"; $partial_size += $sizeu; } $total_size += $sizeu; $cnt++; } if ($page_en){ print "

      \n"; &displist($allnum); print "
      \n"; } my @pr; my $total_num = $#alldata + 1; print "
      このページの合計ファイルサイズ:" . &size_convert($partial_size) if ($total_size_en and $page_en); push @pr, "合計ファイル数:$total_num" if ($total_number_en); push @pr, "合計ファイルサイズ:" . &size_convert($total_size) if ($total_size_en); my $mean_size; if ($#alldata == -1){ $mean_size = 0; } else { $mean_size = $total_size/($#alldata+1); } push @pr, "平均ファイルサイズ:" . &size_convert($mean_size) if ($average_size_en); if ($total_number_en or $total_size_en or $average_size_en) { print "
      \n"; print join ", ", @pr; } print "

    \n"; print "
    \n"; if ($uppage_en){ print "アップロードページへ
    \n"; } else { &upload_and_setup; } print "$body_insert4" if ($body_insert4_en); &ending; } sub upload_and_setup { print <<"EOM";
    EOM if ($uppwd_en){ print < END } if ($dlpwd_en == 1) { print < END } print <
    タイトル
    アップファイル
    アップ後のファイル名
    削除変更用パスワード
    アップロード用パスワード
    ダウンロード用パスワード
     
    EOM print < アップ後のファイル名は半角英数、アンダースコア(_)、ドット(.)、ハイフン(-)のみ受け付けます。
    アップ後のファイル名を省略すると元のファイルと同じ名前でアップされます。
    アップできる最大ファイルサイズは$maxsizeです。
    アップロードはファイルサイズ、通信速度によってそれなりに時間がかかりますので、アップロード中はこのページが再表\示されるまで根気よくお待ちください。
    NOTICE if ($del_by_admin_only) { print <※削除は管理人のみ可能\です。アップロード時の削除用パスワードは入れても入れなくてもアップロードできます。
    END } if ($uppwd_en) { print <※アップロードには管理人から知らされたアップ用パスワードが必要です。
    END } if ($dlpwd_en == 1) { print <※ダウン用パスワードは個別のファイルごとに設定されます。
    END } elsif ($dlpwd_en == 2) { print <※ダウンロードには管理人から知らされたダウン用パスワードが必要です。
    END } print <※パスワードは半角英数で。
    END print "
    "; print "
    \n"; print "\n"; print "
    \n"; print "変更後のタイトル
    \n"; print "削除変更用パスワード
    \n"; print "
    \n"; print "
    "; print < 変更後のタイトルをブランクにするとそのファイルは削除されます。
    削除はサーバーから完全にファイルを削除します。復帰はできません。
    削除変更用パスワードは半角英数で。
    NOTICE print <
    管理用パスワード

    SETUPDISP } sub displist { my $allnum = shift; my $i; for ($i=1;$i<=$allnum+1;$i+=$disp_num_in_a_page){ if ($i == 1){ print ""; } else { print ""; } print $i . "-"; my $last = $i+$disp_num_in_a_page-1; if ($last <= $allnum+1){ print $last; } else { print $allnum+1; } print " \n"; } } sub download { &dlpwd_in("$in{id}") if ($dlpwd_en != 0); &go_dl($in{id}); } sub dlpwd_in { my ($id) = shift; &beginning; print "
    "; print "
    ダウンロード用パスワードを入力してください。
    "; print ""; print ""; print ""; print ""; print "
    "; &ending; } sub go_dl { open(FILE,"< $dllistfile"); flock FILE, 1; my @alldata=; close(FILE); my $hit = 0; my ($count,$file,$title,$size,$update,$pwd,$host,$addr,$dlpwd); foreach (@alldata){ chomp; ($count,$file,$title,$size,$update,$pwd,$host,$addr,$dlpwd)=split(/,/); if ($count == $in{id}) { $hit = 1; last; } } if ($hit == 0){ &error("ファイルが存在しません。"); } if ($dlpwd_en == 1){ if (! &checkcrypt("$in{dlpwd}","$dlpwd")){ &error("ダウンロード用パスワードが違います。"); } } elsif ($dlpwd_en == 2){ open(DLPWD, "< $dlpwddat") or &error("$dlpwddatが存在しません"); my $dlpwddata = ; close(DLPWD); if (! &checkcrypt("$in{dlpwd}","$dlpwddata")){ &error("ダウンロード用パスワードが違います。"); } } open(DLTMP, "> tmp.$$"); open(DLCOUNT,"< $dlcountfile"); flock DLCOUNT, 1; my ($count,$dlcount); while (){ chomp; ($count,$dlcount)=split(/,/); $dlcount++ if ($count == $in{id}); print DLTMP "$count,$dlcount\n"; } close(DLCOUNT); close(DLTMP); rename ("tmp.$$", "$dlcountfile"); if ($goto_dlpage){ &dlpage("$dldir/$file"); } else { print "Location: $dldir/$file\n\n"; } } sub beginning { print "Content-Type: text/html\n\n"; print ""; print < $title HEADPRINT if ($head_insert_en == 1){ print "$head_insert"; } if ($style_sheet_en == 1){ print "\n"; } print "\n"; print "\n"; } sub ending { undef $q; my $year = $lastmodifiedyear; if ($year > 2002){ $year = "2002-$year"; } my $mysite = 'http://www.hidekik.com/'; print "
    updown2.cgi Ver. $version
    Copyright(c) $year, hidekik.com
    \n"; print ""; print ""; exit; } sub header { my $date_str = shift; print "$body_insert1" if ($body_insert1_en); print "

    $title

    \n"; print "$body_insert2" if ($body_insert2_en); print "
    Last Update : $date_str

    \n"; print "$body_insert3" if ($body_insert3_en); } sub error { &beginning; print "
    $_[0]
    \n"; &ending; } sub makecrypt { my $plain = shift; my $salt = join "", ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64]; my $result = crypt($plain,$salt) or crypt($plain,'$1$'.$salt.'$'); return $result; } sub setadminpwd { &beginning; print "
    "; print "
    管理者用パスワードを設定してください。
    "; print ""; print ""; print ""; print "
    "; &ending; } sub wradminpwd { my $passwd = &makecrypt($in{pwd}); if (open(FILE,"> $admindat")){ print FILE "$passwd"; close(FILE); } else { &error('パスワードファイル作成に失敗しました。'); } print "Location: $script\n\n"; } sub checkcrypt { my ($pwd,$encpwd)=@_; return(crypt($pwd,$encpwd) eq "$encpwd"); } sub adminpwd { open(ADMIN,"< $admindat"); my $adminpwd = ; close(ADMIN); return $adminpwd; } sub setupdlpwddat { my $val = shift; my @mes = ('アップ','共通ダウン'); my @n = ('uppwd','dlpwd'); my @subm = ('upsub','dlsub'); &beginning; print "
    \n"; print "
    $mes[$val]ロード用パスワードを設定してください。
    管理人パスワードを入力する必要があります。
    \n"; print "

    \n"; print "管理人パスワード
    \n"; print "

    \n"; print "\n"; print "\n"; print "

    \n"; &ending; } sub wrupdlpwd { if (! &checkcrypt($in{pwd},&adminpwd)) { &error("管理人パスワードが違います。"); } my $file; my $pwd; if ($in{upsub} ne ''){ $file = "$uppwddat"; $pwd = "$in{uppwd}"; } elsif ($in{dlsub} ne ''){ $file = "$dlpwddat"; $pwd = "$in{dlpwd}"; } my $passwd = &makecrypt($pwd); if (open(FILE,"> $file")){ print FILE "$passwd"; close(FILE); } else { &error('パスワードファイル作成に失敗しました。'); } print "Location: $script\n\n"; } sub dlpage { my $dlfile = shift; my $body = basename($dlfile); &beginning; print qq(

    \n); print qq($bodyをダウンロードする

    \n); print qq($titleへ戻る\n); print qq(

    \n); &ending; } sub file_conflict { my $fname = shift; &beginning; print <<"EOM";
    サーバー上に同じ名前のファイル名があります。

    アップロードするファイルのアップ後のファイル名を変更するか、
    新たにアップロードするファイルに置き換えるか選択できます。

    アップファイルはもう一度指定してください。
    アップファイル
    アップ後のファイル名

    サーバー上のファイルを新しいファイルに置き換える場合は、
    サーバー上の元のファイルの削除用パスワードとこの削除用パスワードが一致しなければいけません。

    パスワード
    EOM if ($uppwd_en){ print < END } if ($dlpwd_en == 1) { print < END } print <

    EOM &ending; } sub uppage { &beginning; print "戻る

    \n"; &upload_and_setup; &ending; }