Files
hustoj/web/download.php

111 lines
4.0 KiB
PHP

<?php
////////////////////////////Common head
require_once( './include/db_info.inc.php' );
require_once( './include/llm_guidance.inc.php' );
if((!isset($OJ_DOWNLOAD))||!$OJ_DOWNLOAD){
$view_errors="Download Disabled!";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
$sid=isset($_GET['sid']) ? intval($_GET['sid']) : 0;
$requested_name=isset($_GET['name']) ? $_GET['name'] : '';
$name=llm_guidance_testcase_base($requested_name);
if($sid<=0 || $name===null){
$view_errors="无效的测试点下载请求。";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
$sql="select problem_id,contest_id,user_id,result from solution where solution_id=?";
$data=pdo_query($sql,$sid);
//var_dump($sql);
if(count($data)>0){
$row=$data[0];
$pid=$row[0];
$cid=$row[1];
$uid=$row[2];
$result_code=intval($row[3]);
$is_admin=isset($_SESSION[$OJ_NAME.'_'.'administrator']);
if(!(isset($_SESSION[$OJ_NAME.'_'.'user_id']) && strval($uid) === strval($_SESSION[$OJ_NAME.'_'.'user_id'])
|| $is_admin
)){
$view_errors="not your submission";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
if(!$is_admin){
$diff_disabled=isset($OJ_SHOW_DIFF) && !$OJ_SHOW_DIFF;
$spj_rows=pdo_query("select spj from problem where problem_id=?",$pid);
$hidden_spj=!empty($spj_rows)
&& $spj_rows!==-1
&& intval($spj_rows[0][0])===2
&& !empty($OJ_HIDE_RIGHT_ANSWER);
$runtime_info="";
$allowed_testcases=array();
if($result_code===5 || $result_code===6){
$runtime_rows=pdo_query("select error from runtimeinfo where solution_id=?",$sid);
$runtime_info=(!empty($runtime_rows) && $runtime_rows!==-1) ? $runtime_rows[0][0] : "";
$allowed_testcases=llm_guidance_diff_testcase_names($runtime_info);
if(isset($OJ_DL_1ST_WA_ONLY) && $OJ_DL_1ST_WA_ONLY){
$allowed_testcases=array_slice($allowed_testcases,0,1);
}
}
$authorized_testcase=in_array($name,$allowed_testcases,true);
$unsafe_full_diff=llm_guidance_has_full_diff_sections($runtime_info);
if($diff_disabled
|| $hidden_spj
|| $unsafe_full_diff
|| ($result_code!==5 && $result_code!==6)
|| !$authorized_testcase){
$view_errors="当前提交或测试点未获授权,暂不提供测试数据下载。";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
}
if(isset($OJ_NOIP_KEYWORD)&&$OJ_NOIP_KEYWORD){
$now = date('Y-m-d H:i', time());
$sql = "select 1 from `contest` where contest_id=? and `start_time` < ? and `end_time` > ? and `title` like ?";
$rrs = pdo_query($sql, $cid ,$now , $now , "%$OJ_NOIP_KEYWORD%");
$flag = count($rrs) > 0 ;
if($flag){
$view_errors = "<h2> $MSG_NOIP_WARNING </h2>";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
}
$infile="$OJ_DATA/$pid/$name.in";
$outfile="$OJ_DATA/$pid/$name.out";
if(!is_file($infile) || !is_file($outfile)){
$view_errors="测试点文件不存在。";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
$zipname = tempnam(__dir__.'/upload', '');
$zip = new ZipArchive();
if ($zip->open($zipname, ZIPARCHIVE::CREATE) !== TRUE) {
exit ('无法打开文件,或者文件创建失败');
}
$files = [ $infile,$outfile ];
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
$fileContent = file_get_contents($file);
$file = iconv('utf-8', 'GBK', basename($file));
$zip->addFromString($file, $fileContent);
}
$zip->close();
header('Content-Type: application/zip;charset=utf8');
header('Content-disposition: attachment; filename='.$name. date('Y-m-d') . '.zip');
header('Content-Length: ' . filesize($zipname));
readfile($zipname);
unlink($zipname);
die();
}
?>