#!/usr/bin/perl
## ~---------------------
## ~ 取得資料
## ~---------------------
sub getdata{
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $in, $ENV{'CONTENT_LENGTH'});
}else{
$in = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/,$in);
foreach $pair(@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #解碼
$value =~ s/\,/,/g; #取代,號
$value =~ s/\r\n/
/g; #取代斷行
if ($FORM{$name} ne ''){
$FORM{$name} = "$FORM{$name},$value"; #給予FORM
}else{
$FORM{$name} = $value;
}
}
}
## ~---------------------
## ~ 係統設定
## ~---------------------
$perl_url = 'download.pl'; ## 程式位置
$data_url = 'download/data.cgi'; ## 資料庫位置
$sn_url = 'download/sn.txt'; ## 流水號檔
$id = 'victor'; ## 管理帳號
$pass = '1v9i8c7t7o9r'; ## 管理密碼
$s_url{'out'} = 'download_out.htm' ; ## 外部樣版
$s_url{'table'} = 'download/table.htm' ; ## 表格樣版
$s_url{'adm_m'} = 'download/adm_menu.htm' ; ## 管理員選單樣版
$s_url{'adm_t'} = 'download/adm_table.htm' ; ## 管理員表格樣版
$s_url{'login'} = 'download/login.htm' ; ## 管理員登入樣版
$s_key{'in'} = '!~in~!'; ## 外部樣版置入
$s_key{'name'} = '!~name~!'; ## 名稱
$s_key{'text'} = '!~text~!'; ## 簡介
$s_key{'d_url'} = '!~d_url~!'; ## 載點
$s_key{'c_time'} = '!~c_time~!'; ## 次數
$s_key{'size'} = '!~size~!'; ## 大小
$s_key{'pic'} = '!~pic~!'; ## 圖片位置
$s_key{'url'} = '!~url~!'; ## 程式位置
$s_key{'sn'} = '!~sn~!'; ## 檔案編號
## ~---------------------
## ~ 主要程式
## ~---------------------
&getdata; ## 取得資料
&getcookie; ## 取得Cookie
&setadmcookie; ## 設定ADMCookie
&loadskins; ## 載入樣版
if ($FORM{mode} eq 'new' && &c_idps == 1){
&newfile;
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif($FORM{mode} eq 'download'){
&addtime($FORM{sn});
print "Location: $FORM{url}\n\n"; ## 跳到檔案
exit;
}elsif($FORM{mode} eq 'login'){
print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭
$skin_get{login}=~ s/$s_key{url}/$perl_url/g;
$skin_get{out} =~ s/$s_key{in}/$skin_get{login}/g;
print "$skin_get{out}";
exit;
}elsif($FORM{'mode'} eq 'out' && &c_idps == 1){
$date_gmt = "1987, 1\-1\-1 1:1:1 GMT";
print "Set-Cookie:id=0; expires=$date_gmt\n";
print "Set-Cookie:pass=0; expires=$date_gmt\n";
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif($FORM{mode} eq 'fix' && &c_idps == 1){
&fixfile($FORM{sn});
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif($FORM{mode} eq 'top' && &c_idps == 1){
&topfile($FORM{sn});
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif($FORM{mode} eq 'del' && &c_idps == 1){
&delfile($FORM{sn});
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif(&c_idps == 1){
&shelladmhtml;
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}
&shellhtml;
exit;
## ~---------------------
## ~ 輸出網頁
## ~---------------------
sub shellhtml{
print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭
if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");}
@gd=;
close(GD);
foreach $gad(@gd){
($GD{'name'},$GD{'text'},$GD{'d_url'},$GD{'pic'},$GD{'size'},$GD{'c_time'},$GD{'sn'})= split(/,/,$gad) ;
chomp($GD{'sn'});
$gethtml = $skin_get{table};
foreach $keyi(keys %s_key){
$gethtml =~ s/$s_key{$keyi}/$GD{$keyi}/g;
}
$htmlshell .= $gethtml;
}
if ($htmlshell eq ''){
$htmlshell='
';
}
$htmlshell .= "";
$skin_get{out} =~ s/$s_key{in}/$htmlshell/g;
print "$skin_get{out}";
}
## ~---------------------
## ~ 輸出管理員用網頁
## ~---------------------
sub shelladmhtml{
print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭
if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");}
@gd=;
close(GD);
$GD{'url'} =$perl_url;
$htmlshell = $skin_get{'adm_m'};
$htmlshell =~ s/$s_key{url}/$perl_url/g;
foreach $gad(@gd){
($GD{'name'},$GD{'text'},$GD{'d_url'},$GD{'pic'},$GD{'size'},$GD{'c_time'},$GD{'sn'})= split(/,/,$gad) ;
chomp($GD{'sn'});
$gethtml = $skin_get{adm_t};
foreach $keyi(keys %s_key){
$gethtml =~ s/$s_key{$keyi}/$GD{$keyi}/g;
}
$htmlshell .= $gethtml;
}
if ($htmlshell eq ''){
$htmlshell='
';
}
$htmlshell .= "";
$skin_get{out} =~ s/$s_key{in}/$htmlshell/g;
print "$skin_get{out}";
}
## ~---------------------
## ~ 新增下載資料
## ~---------------------
sub newfile{
if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");}
@gd=;
close(GD);
&getsn;
$name = $FORM{'name'};
$text = $FORM{'text'};
$d_url = $FORM{'d_url'};
$pic = $FORM{'pic'};
$size = $FORM{'size'};
$wd = "$name,$text,$d_url,$pic,$size,0,$sn\n";
unshift(@gd,$wd);
## 對檔尾的斷行去除
$last=pop(@gd); #取出
chomp($last);
push(@gd,$last); #放回
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
&addsn;
}
## ~---------------------
## ~ 刪除檔案
## ~---------------------
sub delfile{
## 取得記錄檔
if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");}
@gd=;
close(GD);
$delsn=$_[0];
foreach $gad(@gd){
($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ;
chomp($sn);
if ($delsn == $sn){
$gad='';
}
}
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
}
## ~---------------------
## ~ 檔案置頂
## ~---------------------
sub topfile{
## 取得記錄檔
if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");}
@gd=;
close(GD);
$topsn=$_[0];
foreach $gad(@gd){
($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ;
chomp($sn);
if ($topsn == $sn){
splice(@gd,$i,1);
unshift(@gd,"$name,$text,$d_url,$pic,$size,$c_time,$sn\n");
}
$i++;
}
## 對檔尾的斷行去除
$last=pop(@gd); #取出
chomp($last);
push(@gd,$last); #放回
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
}
## ~---------------------
## ~ 增加次數
## ~---------------------
sub addtime{
## 取得記錄檔
if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");}
@gd=;
close(GD);
$addsn=$_[0];
foreach $gad(@gd){
($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ;
chomp($sn);
if ($addsn == $sn){
$c_time++;
$gad= "$name,$text,$d_url,$pic,$size,$c_time,$sn\n";
}
}
## 對檔尾的斷行去除
$last=pop(@gd); #取出
chomp($last);
push(@gd,$last); #放回
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
}
## ~---------------------
## ~ 修改檔案
## ~---------------------
sub fixfile{
## 取得記錄檔
if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");}
@gd=;
close(GD);
$fixsn=$_[0];
$name = $FORM{'name'};
$text = $FORM{'text'};
$d_url = $FORM{'d_url'};
$pic = $FORM{'pic'};
$size = $FORM{'size'};
$c_time= $FORM{'c_time'};
foreach $gad(@gd){
($temp,$temp,$temp,$temp,$temp,$temp,$sn)= split(/,/,$gad) ;
chomp($sn);
if ($fixsn == $sn){
$gad= "$name,$text,$d_url,$pic,$size,$c_time,$sn\n";
}
}
## 對檔尾的斷行去除
$last=pop(@gd); #取出
chomp($last);
push(@gd,$last); #放回
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
}
## ~---------------------
## ~ 設定ADM的Cookie
## ~---------------------
sub setadmcookie{
if ($FORM{id} ne '' && $FORM{pass} ne ''){
print "Set-Cookie:id=$FORM{id};\n";
print "Set-Cookie:pass=$FORM{pass};\n";
$COOKIE{id}=$FORM{id};
$COOKIE{pass}=$FORM{pass};
}
}
## ~---------------------
## ~ 得到Cookie
## ~---------------------
sub getcookie{
$cookies = $ENV{'HTTP_COOKIE'};
@pairs = split(/;/,$cookies); ##取得不同組的cookie
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ s/ //g;
$COOKIE{$name} = $value;
}
if ($FORM{'pass'} ne ''){ $COOKIE{'pass'}=$FORM{'pass'};}
if ($FORM{'id'} ne ''){ $COOKIE{'id'}=$FORM{'id'};}
}
## ~---------------------
## ~ 得到頁數資料
## ~---------------------
sub get_page{
$FORM{page}-=1;
if ($book_m <= $page_ch){ ## 篇數沒有超過指定的換頁數
$book_s=0;
$book_e=$book_m-1;
}else{
if ($book_m % $page_ch==0){
$page_m=$book_m / $page_ch;
}else{
$page_m=int($book_m / $page_ch)+1;
}
if ($FORM{page}+1>=$page_m){ ## 最後一頁 或超過
$FORM{page}=$page_m-1;
$book_s=$FORM{page} * $page_ch;
$book_e=$book_m -1 ;
}else{
if ($FORM{page} < 0){
$FORM{page}=0;
}
$book_s=$FORM{page} * $page_ch;
$book_e=(($FORM{page}+1) * $page_ch)-1;
}
}
if ($page_m eq ''){
$page_m=0;
}
}
## ~---------------------
## ~ 載入所有樣版
## ~---------------------
sub loadskins{
foreach $skinkey(keys %s_url) {
&loadskin($s_url{$skinkey},$skinkey)
}
}
## ~---------------------
## ~ 載入樣版
## ~---------------------
sub loadskin{
if ( !( open(SKIN,"<$_[0]") ) ){&error("$_[0] 樣版 無法讀取");}
@gskin=;
close(SKIN);
foreach $line(@gskin){
$skin_get{$_[1]}="$skin_get{$_[1]}$line";
}
}
## ~---------------------
## ~ 得到流水號
## ~---------------------
sub getsn{
if ( !( open(SN,"<$sn_url") ) ){&error("$sn_url無法讀取");}
$sn=;
close(SN);
## 流水號檔內容為空 設為0
if ($sn eq '') {
$sn=0;
}
}
## ~---------------------
## ~ 遞增流水號
## ~---------------------
sub addsn{
$sn++;
if ( !( open(SN,">$sn_url") ) ){&error("$sn_url無法存檔");}
print SN $sn;
close(SN);
}
## ~---------------------
## ~ 發生錯誤
## ~---------------------
sub error{
print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭
print "發生錯誤 : $_[0]" ;
exit;
}
## ~---------------------
## ~ 確認帳號密碼
## ~---------------------
sub c_idps{
if(($FORM{id} eq $id && $FORM{pass} eq $pass) ||
($COOKIE{id} eq $id && $COOKIE{pass} eq $pass)){
return 1;
}else{
return 0;
}
}