<?php
include_once('./_common.php');

// clean the output buffer
ob_end_clean();

$no = (int)$no;

@include_once($board_skin_path.'/download.head.skin.php');

// 쿠키에 저장된 ID값과 넘어온 ID값을 비교하여 같지 않을 경우 오류 발생
// 다른곳에서 링크 거는것을 방지하기 위한 코드
if (!get_session('ss_view_'.$bo_table.'_'.$wr_id))
    alert('잘못된 접근입니다.');

// 다운로드 차감일 때 비회원은 다운로드 불가
if($board['bo_download_point'] < 0 && $is_guest)
    alert('다운로드 권한이 없습니다.\\n회원이시라면 로그인 후 이용해 보십시오.', G5_BBS_URL.'/login.php?wr_id='.$wr_id.'&amp;'.$qstr.'&amp;url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;wr_id='.$wr_id));

$sql = " select bf_source, bf_file from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '$wr_id' and bf_no = '$no' ";
$file = sql_fetch($sql);
if (!$file['bf_file'])
    alert('파일 정보가 존재하지 않습니다.');

$nonce = isset($_REQUEST['nonce']) ? preg_replace('/[^0-9a-z\|]/i', '', $_REQUEST['nonce']) : '';

if (function_exists('download_file_nonce_is_valid') && !defined('G5_DOWNLOAD_NONCE_CHECK')){
    if(! download_file_nonce_is_valid($nonce, $bo_table, $wr_id)){
        alert('토큰 유효시간이 지났거나 토큰이 유효하지 않습니다.\\n브라우저를 새로고침 후 다시 시도해 주세요.', G5_URL);
    }
}

// JavaScript 불가일 때
$js = (isset($_GET['js'])) ? $_GET['js'] : '';
if($js != 'on' && $board['bo_download_point'] < 0) {
    $msg = $file['bf_source'].' 파일을 다운로드 하시면 포인트가 차감('.number_format($board['bo_download_point']).'점)됩니다.\\n포인트는 게시물당 한번만 차감되며 다음에 다시 다운로드 하셔도 중복하여 차감하지 않습니다.\\n그래도 다운로드 하시겠습니까?';
    $url1 = G5_BBS_URL.'/download.php?'.clean_query_string($_SERVER['QUERY_STRING'], false).'&js=on';
    $url2 = clean_xss_tags($_SERVER['HTTP_REFERER']);

    if( $url2 && stripos($url2, $_SERVER['REQUEST_URI']) !== false ){
        $url2 = G5_BBS_URL.'/board.php?'.clean_query_string($_SERVER['QUERY_STRING'], false);
    }

    //$url1 = 확인link, $url2=취소link
    // 특정주소로 이동시키려면 $url3 이용
    confirm($msg, $url1, $url2);
}

$is_manager = apms_admin($xp['xp_manager']);

if (!$is_manager && $member['mb_level'] < $board['bo_download_level']) {
    $alert_msg = '다운로드 권한이 없습니다.';
    if ($member['mb_id'])
        alert($alert_msg);
    else
        alert($alert_msg.'\\n회원이시라면 로그인 후 이용해 보십시오.', G5_BBS_URL.'/login.php?wr_id='.$wr_id.'&amp;'.$qstr.'&amp;url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;wr_id='.$wr_id));
}

$filepath = G5_DATA_PATH.'/file/'.$bo_table.'/'.$file['bf_file'];
$filepath = addslashes($filepath);
if (!is_file($filepath) || !file_exists($filepath))
    alert('파일이 존재하지 않습니다.');

// 사용자 코드 실행
$is_apms_download = true;
$ss_name = 'ss_down_'.$bo_table.'_'.$wr_id.'_'.$no;

@include_once($board_skin_path.'/download.skin.php');

// 이미 다운로드 받은 파일인지를 검사한 후 게시물당 한번만 포인트를 차감하도록 수정
if (!get_session($ss_name) && $is_apms_download) {

	// 다운로드 내역확인
	$is_download = true;

	// 자신의 글이라면 통과
    // 관리자인 경우 통과
    if (($write['mb_id'] && $write['mb_id'] == $member['mb_id']) || $is_admin || $is_manager) {
       	$is_download = false;

	} else if ($board['bo_download_level'] >= 1) { // 회원이상 다운로드가 가능하다면

		if($member['mb_id'] && $board['bo_download_point'] < 0) {
			$row = sql_fetch(" select count(*) as cnt from {$g5['point_table']} where mb_id = '{$member['mb_id']}' and po_rel_table = '$bo_table' and po_rel_id = '$wr_id' and po_rel_action = '다운로드' ");
			if($row['cnt']) {
				$is_download = false;
			}
		}

        if ($is_download) {

			// 다운로드 포인트가 음수이고 회원의 포인트가 0 이거나 작다면
			if ($member['mb_point'] + $board['bo_download_point'] < 0) {
		        alert('보유하신 포인트('.number_format($member['mb_point']).')가 없거나 모자라서 다운로드('.number_format($board['bo_download_point']).')가 불가합니다.\\n\\n포인트를 적립하신 후 다시 다운로드 해 주십시오.');
			}

			// 게시물당 한번만 차감하도록 수정
		    insert_point($member['mb_id'], $board['bo_download_point'], "{$board['bo_subject']} $wr_id 파일 다운로드", $bo_table, $wr_id, "다운로드");
		}
    }

	if($is_download) {
		// 다운로드 카운트 증가
	    $sql = " update {$g5['board_file_table']} set bf_download = bf_download + 1 where bo_table = '$bo_table' and wr_id = '$wr_id' and bf_no = '$no' ";
	    sql_query($sql);
        sql_query(" update {$write_table} set as_download = as_download + 1 where wr_id = '{$wr_id}' ", false);

		// 새글DB 업데이트
		apms_board_new('as_download', $bo_table, $wr_id);
	}

	// 다운로드 카운트를 증가시키고 세션을 생성 
	$_SESSION[$ss_name] = true;
}

$g5['title'] = '다운로드 &gt; '.conv_subject($write['wr_subject'], 255);

//파일명에 한글이 있는 경우
/*
if(preg_match("/[\xA1-\xFE][\xA1-\xFE]/", $file['bf_source'])){
    // 2015.09.02 날짜의 파이어폭스에서 인코딩된 문자 그대로 출력되는 문제가 발생됨, 2018.12.11 날짜의 파이어폭스에서는 해당 현상이 없으므로 해당 코드를 사용 안합니다.
	$original = iconv('utf-8', 'euc-kr', $file['bf_source']); // SIR 잉끼님 제안코드
} else {
    $original = urlencode($file['bf_source']);
}
*/

$original = urlencode($file['bf_source']);

@include_once($board_skin_path.'/download.tail.skin.php');

/*
// Required for some browsers 
if(ini_get('zlib.output_compression')) 
	ini_set('zlib.output_compression', 'Off');

// Determine Content Type 
$ext = apms_get_ext($original); 
switch ($ext) { 
	case 'pdf'	: $fctype = 'application/pdf'; break; 
	case 'exe'	: $fctype = 'application/octet-stream'; break; 
	case 'zip'	: $fctype = 'application/zip'; break; 
	case 'doc'	: $fctype = 'application/msword'; break; 
	case 'xls'	: $fctype = 'application/vnd.ms-excel'; break; 
	case 'ppt'	: $fctype = 'application/vnd.ms-powerpoint'; break; 
	case 'gif'	: $fctype = 'image/gif'; break; 
	case 'png'	: $fctype = 'image/png'; break; 
	case 'jpeg'	: 
	case 'jpg'	: $fctype = 'image/jpg'; break; 
	default		: $fctype = 'application/force-download'; break;
} 

header("Pragma: public");
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private", false);
header("Content-Type: $fctype"); 
header("Content-Disposition: attachment; filename=\"$original\"");
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize("$filepath"));
ob_clean(); 
flush(); 
*/

if(preg_match("/msie/i", $_SERVER['HTTP_USER_AGENT']) && preg_match("/5\.5/", $_SERVER['HTTP_USER_AGENT'])) {
    header("content-type: doesn/matter");
    header("content-length: ".filesize($filepath));
    header("content-disposition: attachment; filename=\"$original\"");
    header("content-transfer-encoding: binary");
} else if (preg_match("/Firefox/i", $_SERVER['HTTP_USER_AGENT'])){
    header("content-type: file/unknown");
    header("content-length: ".filesize($filepath));
    header("content-disposition: attachment; filename=\"".basename($file['bf_source'])."\"");
    header("content-description: php generated data");
} else {
    header("content-type: file/unknown");
    header("content-length: ".filesize($filepath));
    header("content-disposition: attachment; filename=\"$original\"");
    header("content-description: php generated data");
}
header("pragma: no-cache");
header("expires: 0");
flush();

$fp = fopen($filepath, 'rb');

// 4.00 대체
// 서버부하를 줄이려면 print 나 echo 또는 while 문을 이용한 방법보다는 이방법이...
//if (!fpassthru($fp)) {
//    fclose($fp);
//}

$download_rate = 10;

while(!feof($fp)) {
    //echo fread($fp, 100*1024);
    /*
    echo fread($fp, 100*1024);
    flush();
    */

    print fread($fp, round($download_rate * 1024));
    flush();
    usleep(1000);
}
fclose ($fp);
flush();
?>
