#!/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/\,/&#44;/g;                 #取代,號
        $value =~ s/\r\n/<br>/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=<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='<br><div align="center"></div><table width="500" border="0" align="left"><tr><td><div align="center">沒有檔案</div></td></tr></table><br>';
    }
    $htmlshell .= "<div align=\"left\"><br><a href=\"$perl_url?mode=login\">管理作品下載</a></div>";
    $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=<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='<br><div align="center"></div><table width="500" border="0" align="left"><tr><td><div align="center">沒有檔案</div></td></tr></table><br>';
    }
    $htmlshell .= "<div align=\"left\"><br><a href=\"$perl_url?mode=login\">管理作品下載</a></div>";
    $skin_get{out} =~ s/$s_key{in}/$htmlshell/g;
    print "$skin_get{out}";
}
## ~---------------------
## ~    新增下載資料
## ~---------------------
sub newfile{
    if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");}
        @gd=<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=<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=<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=<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=<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=<SKIN>;
    close(SKIN);
    foreach $line(@gskin){
        $skin_get{$_[1]}="$skin_get{$_[1]}$line";
    }
}
## ~---------------------
## ~     得到流水號
## ~---------------------
sub getsn{
    if ( !( open(SN,"<$sn_url") ) ){&error("$sn_url無法讀取");}
        $sn=<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;
    }
}
