Files
hustoj/web/submit.php
2026-04-10 16:36:57 +08:00

517 lines
14 KiB
PHP

<?php session_start();
require_once "include/db_info.inc.php";
require_once "include/my_func.inc.php";
require_once "include/email.class.php";
require_once "include/base64.php";
if(isset($OJ_CSRF) && $OJ_CSRF && $OJ_TEMPLATE=="syzoj" && !isset($_SESSION[$OJ_NAME.'_'.'http_judge']))
require_once(dirname(__FILE__)."/include/csrf_check.php");
if (!isset($_SESSION[$OJ_NAME . '_' . 'user_id'])) {
$view_errors = "<a href=loginpage.php>$MSG_Login</a>";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
}
require_once "include/memcache.php";
require_once "include/const.inc.php";
$now = strftime("%Y-%m-%d %H:%M", time());
$user_id = $_SESSION[$OJ_NAME.'_'.'user_id'];
$language = intval($_POST['language']);
if (!$OJ_BENCHMARK_MODE) {
$sql = "SELECT count(1) FROM `solution` WHERE result<4";
$result = mysql_query_cache($sql);
$row = $result[0];
if ($row[0] > 50) {
$OJ_VCODE = true;
}
if ($OJ_VCODE) {
$vcode = $_POST["vcode"];
}
$err_str = "";
$err_cnt = 0;
if ($OJ_VCODE && ($_SESSION[$OJ_NAME.'_'."vcode"]==null || $vcode!=$_SESSION[$OJ_NAME.'_'."vcode"] || $vcode=="" || $vcode==null)) {
$_SESSION[$OJ_NAME.'_'."vcode"] = null;
$err_str = $err_str.$MSG_VCODE_WRONG."\n";
$err_cnt++;
$view_errors = $err_str;
$_SESSION[ $OJ_NAME . '_' . "vfail" ]=true;
require "template/".$OJ_TEMPLATE."/error.php";
exit(0);
}else{
$_SESSION[ $OJ_NAME . '_' . "vfail" ]=false;
}
}
$test_run = false;
if (isset($_POST['cid'])) {
$pid = intval($_POST['pid']);
$cid = intval($_POST['cid']);
$_GET['cid']=$cid;
require_once("contest-check.php");
$test_run = $cid<0;
if($test_run) $cid =-$cid ;
$sql = "SELECT `problem_id`,'N' FROM `contest_problem` WHERE `num`='$pid' AND contest_id=$cid";
}
else {
$id = intval($_POST['id']);
$test_run = $id<=0;
$sql = "SELECT `problem_id`,defunct FROM `problem` WHERE `problem_id`='$id' ";
if(!($test_run||isset($_SESSION[$OJ_NAME.'_'.'administrator'])))
$sql .= " and defunct='N'";
}
//echo $sql;
if(!$test_run){
$res = mysql_query_cache($sql);
if (isset($res) && count($res)<1 && !isset($_SESSION[$OJ_NAME.'_'.'administrator']) && !((isset($cid)&&$cid<=0) || (isset($id)&&$id<=0))) {
$view_errors = $MSG_LINK_ERROR."<br>";
require "template/".$OJ_TEMPLATE."/error.php";
exit(0);
}
}
if ($res[0][1]!='N' && !($test_run||isset($_SESSION[$OJ_NAME.'_'.'administrator']))) {
// echo "res:$res,count:".count($res);
// echo "$sql";
$view_errors = $MSG_PROBLEM_RESERVED."<br>";
if (isset($_POST['ajax'])) {
echo $view_errors.$res[0][1];
exit(0);
}
else {
require "template/".$OJ_TEMPLATE."/error.php";
}
exit(0);
}
$title = "";
if (isset($_POST['id'])) {
$id = intval($_POST['id']);
if($id<=0) $id=-$id;
$langmask = $OJ_LANGMASK;
}
else if (isset($_POST['pid']) && isset($_POST['cid']) && $_POST['cid']!=0) {
$pid = intval($_POST['pid']);
$cid = intval($_POST['cid']);
if ($test_run) {
$cid = -$cid;
}
//check user if private
$sql = "SELECT `private`,langmask,title FROM `contest` WHERE `contest_id`=$cid AND `start_time`<='$now' AND `end_time`>'$now'";
//"SELECT `private`,langmask FROM `contest` WHERE `contest_id`=? AND `start_time`<=? AND `end_time`>?";
//$result = pdo_query($sql, $cid, $now, $now);
$result = mysql_query_cache($sql);
$rows_cnt = count($result);
if ($rows_cnt != 1) {
$view_errors .= $MSG_NOT_IN_CONTEST;
require "template/" . $OJ_TEMPLATE . "/error.php";
exit(0);
}
else {
$row = $result[0];
$isprivate = intval($row[0]);
$langmask = $row[1];
$title = $row[2];
if ($isprivate==1 && !isset($_SESSION[$OJ_NAME.'_'.'c'.$cid])) {
$sql = "SELECT count(*) FROM `privilege` WHERE `user_id`=? AND `rightstr`=?";
$result = pdo_query($sql, $user_id, "c$cid");
$row = $result[0];
$ccnt = intval($row[0]);
if ($ccnt==0 && !isset($_SESSION[$OJ_NAME.'_'.'administrator'])) {
$view_errors = $MSG_NOT_INVITED."\n";
require "template/" . $OJ_TEMPLATE . "/error.php";
exit(0);
}
}
}
$sql = "SELECT `problem_id` FROM `contest_problem` WHERE `contest_id`=? AND `num`=?";
$result = pdo_query($sql, $cid, $pid);
$rows_cnt = count($result);
if ($rows_cnt != 1) {
$view_errors = $MSG_NO_PROBLEM."\n";
require "template/".$OJ_TEMPLATE."/error.php";
exit(0);
}
else {
$row = $result[0];
$id = intval($row['problem_id']);
if ($test_run) {
$id = -$id;
}
}
}
else {
$id = 0;
/*
$view_errors= "No Such Problem!\n";
require("template/".$OJ_TEMPLATE."/error.php");
exit(0);
*/
$langmask = $OJ_LANGMASK;
$test_run = true;
}
if ($language > count($language_name) || $language < 0) {
$language = 0;
}
$language = strval($language);
if ($langmask&(1<<$language)) {
$view_errors = $MSG_NO_PLS."\n[$language][$langmask][".($langmask&(1<<$language))."]";
require "template/".$OJ_TEMPLATE."/error.php";
exit(0);
}
$source = $_POST['source'];
$input_text = "";
if (isset($_POST['input_text'])) {
$input_text = $_POST['input_text'];
}
if (isset($_POST['encoded_submit'])) {
$source = decode64($source);
}
$input_text = preg_replace("(\r\n)", "\n", $input_text);
if ($test_run) {
$id = -$id;
}
$tempfile = $_FILES ["answer"] ["tmp_name"];
if($tempfile!=""){
if($language!=23){
$source=file_get_contents($tempfile);
$len = strlen($source);
unlink($tempfile);
}else{
$source="Main.sb3";
}
}
$origin_name=trim($_FILES ["answer"]['name']);
$solution_file = "$OJ_DATA/$id/solution.name";
if(file_exists($solution_file)){
$solution_name=trim(file_get_contents($solution_file));
if($origin_name!=$solution_name){
$source="uploaded file name [$origin_name] is not [$solution_name] ";
}
}
$source_user = $source;
//use append Main code
$prepend_file = "$OJ_DATA/$id/prepend.".$language_ext[$language];
if (isset($OJ_APPENDCODE) && $OJ_APPENDCODE && file_exists($prepend_file)) {
$source = file_get_contents($prepend_file)."\n".$source;
}
$append_file = "$OJ_DATA/$id/append.".$language_ext[$language];
//echo $append_file;
if (isset($OJ_APPENDCODE) && $OJ_APPENDCODE && file_exists($append_file)) {
$source .= "\n".file_get_contents($append_file);
//echo "$source";
}
//end of append
$spj=pdo_query("select spj from problem where problem_id=?",$id);
if(count($spj)>0) $spj=$spj[0][0];
if ($language == 6 && $spj!= 2) {
$source = "# coding=utf-8\n".$source;
}
if ($test_run) {
$id = 0;
}
if($language!=23) $len = strlen($source);else $len = $_FILES['answer']['size'];
//echo $source;
setcookie('lastlang', $language, time()+360000);
$ip = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$REMOTE_ADDR = $_SERVER['HTTP_X_FORWARDED_FOR'];
$tmp_ip = explode(',', $REMOTE_ADDR);
$ip = htmlentities($tmp_ip[0], ENT_QUOTES, "UTF-8");
}
if ($len < 2) {
$view_errors = $MSG_TOO_SHORT.$tempfile."<br>";
require "template/".$OJ_TEMPLATE."/error.php";
exit(0);
}
if ($len > 65536) {
$view_errors = $MSG_TOO_LONG."<br>";
require "template/" . $OJ_TEMPLATE . "/error.php";
exit(0);
}
if (!$OJ_BENCHMARK_MODE) {
// last submit
if(!isset($OJ_SUBMIT_COOLDOWN_TIME)) $OJ_SUBMIT_COOLDOWN_TIME = 5;
$now = strftime("%Y-%m-%d %X", time()-$OJ_SUBMIT_COOLDOWN_TIME);
$sql = "SELECT `in_date`,solution_id FROM `solution` WHERE `user_id`=? AND in_date>? ORDER BY `in_date` DESC LIMIT 1";
$res = pdo_query($sql, $user_id, $now);
if (!empty($res)) {
/*
$view_errors = $MSG_BREAK_TIME."<br>";
require "template/".$OJ_TEMPLATE."/error.php";
exit(0);
// 预防WAF抽风
*/
if(isset($_GET['ajax'])){
echo -1;
}else{
$statusURI = "status.php?user_id=".$_SESSION[$OJ_NAME.'_'.'user_id'];
if (isset($cid)) {
if(isset($_GET['spa'])) $statusURI .="&spa";
$statusURI .= "&cid=$cid&fixed=";
}
if (!$test_run) {
header("Location: $statusURI");
} else {
echo $res[0][1];
}
}
exit();
}
}
if (~$OJ_LANGMASK&(1<<$language)) {
$sql = "SELECT nick FROM users WHERE user_id=?";
$nick = pdo_query($sql, $user_id);
if ($nick) {
$nick = $nick[0][0];
}
else {
$nick = "Guest";
}
if (!isset($pid)) {
$sql = "INSERT INTO solution(problem_id,user_id,nick,in_date,language,ip,code_length,result) VALUES(?,?,?,NOW(),?,?,?,14)";
$insert_id = pdo_query($sql, $id, $user_id, $nick, $language, $ip, $len);
}
else {
$sql = "INSERT INTO solution(problem_id,user_id,nick,in_date,language,ip,code_length,contest_id,num,result) VALUES(?,?,?,NOW(),?,?,?,?,?,14)";
if ((stripos($title,$OJ_NOIP_KEYWORD)!==false) && isset($OJ_OI_1_SOLUTION_ONLY) && $OJ_OI_1_SOLUTION_ONLY) {
$delete = pdo_query("DELETE FROM solution WHERE contest_id=? AND user_id=? AND num=?", $cid, $user_id, $pid);
if ($delete>0) {
$sql_fix = "UPDATE problem p INNER JOIN (SELECT problem_id pid ,count(1) ac FROM solution WHERE problem_id=? AND result=4) s ON p.problem_id=s.pid SET p.accepted=s.ac;";
$fixed = pdo_query($sql_fix,$id);
$sql_fix = "UPDATE problem p INNER JOIN (SELECT problem_id pid ,count(1) submit FROM solution WHERE problem_id=?) s ON p.problem_id=s.pid SET p.submit=s.submit;";
$fixed = pdo_query($sql_fix,$id);
}
}
$insert_id = pdo_query($sql, $id, $user_id, $nick, $language, $ip, $len, $cid, $pid);
}
if($language==23){
mkdir($OJ_DATA."/$id/sb3");
copy($tempfile,$OJ_DATA."/$id/sb3/$insert_id.sb3");
}
$sql = "INSERT INTO `source_code_user`(`solution_id`,`source`) VALUES(?,?)";
pdo_query($sql, $insert_id, $source_user);
$sql = "INSERT INTO `source_code`(`solution_id`,`source`) VALUES(?,?)";
pdo_query($sql, $insert_id, $source);
if ($test_run) {
$sql = "INSERT INTO `custominput`(`solution_id`,`input_text`) VALUES(?,?)";
pdo_query($sql, $insert_id, $input_text);
}
else {
$sql = "UPDATE problem SET submit=submit+1 WHERE problem_id=?";
pdo_query($sql,$id);
if (isset($cid) && $cid>0) {
$sql = "UPDATE contest_problem SET c_submit=c_submit+1 WHERE contest_id=? AND num=?";
pdo_query($sql,$cid,$pid);
}
}
////remote oj
$result=0;
$sql="select remote_oj from problem where problem_id=?";
$remote_oj=pdo_query($sql,$id);
if(isset($remote_oj[0])){
$remote_oj=$remote_oj[0][0];
if($remote_oj!=""){
$result=16;
$sql="update solution set result=16,remote_oj=? where solution_id=?";
pdo_query($sql,$remote_oj,$insert_id);
}
}
////poison robot account,give system resources to the REAL people
if(isset($OJ_POISON_BOT_COUNT) && $OJ_POISON_BOT_COUNT >0 &&
!(isset($_SESSION[$OJ_NAME."_administrator"])||
isset($_SESSION[$OJ_NAME."_source_browser"])||
isset($_SESSION[$OJ_NAME."_contest_creator"])||
isset($_SESSION[$OJ_NAME."_problem_editor"])
)
){
$sql="select count(1) from solution where user_id=? and result=4 and problem_id=?";
$count=pdo_query($sql,$user_id,$id);
if($count) $count=$count[0][0];
if($count>=$OJ_POISON_BOT_COUNT){
$result=rand(5,11);
$memory=rand(100,2000);
$time=rand(100,2000);
$sql="update solution set memory=?,time=?,judger='poisoner' where solution_id=?";
pdo_query($sql,$memory,$time,$insert_id);
if( $OJ_ADMIN != "root@localhost" ){
email($OJ_ADMIN,$MSG_SYS_WARN,"$DOMAIN $MSG_USER $user_id $MSG_IS_ROBOT");
}
}
/* //prepare system ready for even worse robots
$now = strftime("%Y-%m-%d %X", time()-$OJ_SUBMIT_COOLDOWN_TIME * 6 );
$sql="select count(1) from solution where user_id=? and in_date > ?";
$count=pdo_query($sql,$user_id,$now);
if($count>=$OJ_POISON_BOT_COUNT){
$sql="update users set defunct='Y' where user_id=?";
pdo_query($sql,$_SESSION[$OJ_NAME."_user_id"]);
$sql="select ip from users where user_id=? ";
$ip=pdo_query($sql,$_SESSION[$OJ_NAME."_user_id"]);
if(count($ip)>0){
$ip=$ip[0][0];
if($ip!="" && $ip!="127.0.0.1"){
$sql="update users set defunct='Y' where ip=?";
pdo_query($sql,$ip);
}
}
unset($_SESSION[$OJ_NAME.'_'.'user_id']);
setcookie($OJ_NAME."_user","");
setcookie($OJ_NAME."_check","");
session_destroy();
header("Location:index.php");
}
*/
}
$sql = "UPDATE solution SET result=? WHERE solution_id=?";
pdo_query($sql,$result,$insert_id);
//using redis task queue
if ( $OJ_REDIS && $result==0 ) {
$redis = new Redis();
$redis->connect($OJ_REDISSERVER, $OJ_REDISPORT);
if (isset($OJ_REDISAUTH)) {
$redis->auth($OJ_REDISAUTH);
}
$redis->lpush($OJ_REDISQNAME, $insert_id);
$redis->close();
}
}
if (isset($OJ_UDP) && $OJ_UDP && $result==0 ) {
trigger_judge($insert_id); // moved to my_func.inc.php
}
if ($OJ_BENCHMARK_MODE) {
echo $insert_id;
exit(0);
}
$statusURI = strstr($_SERVER['REQUEST_URI'], "submit", true)."status.php";
if (isset($cid)) {
$statusURI .= "?cid=$cid";
}
$sid = "";
if (isset($_SESSION[$OJ_NAME.'_'.'user_id'])) {
$sid .= session_id().$_SERVER['REMOTE_ADDR'];
}
if (isset($_SERVER["REQUEST_URI"])) {
$sid .= $statusURI;
}
//echo $statusURI."<br>";
$sid = md5($sid);
$file = "cache/cache_$sid.html";
//echo $file;
if ($OJ_MEMCACHE) {
$mem = new Memcache();
if ($OJ_SAE) {
$mem = memcache_init();
}
else {
$mem->connect($OJ_MEMSERVER, $OJ_MEMPORT);
}
$mem->delete($file, 0);
}
elseif (file_exists($file)) {
unlink($file);
}
//echo $file;
$statusURI = "status.php?user_id=".$_SESSION[$OJ_NAME.'_'.'user_id'];
if(isset($_GET['spa'])) $statusURI .="&spa";
if (isset($cid)) {
$statusURI .= "&cid=$cid&fixed=";
}
if (!$test_run&&!isset($_GET['ajax'])) {
header("Location: $statusURI");
}
else {
if (isset($_GET['ajax'])) {
echo $insert_id;
}
else {
?>
<script>window.parent.setTimeout("fresh_result('<?php echo $insert_id; ?>')",1000);</script><?php
}
}
?>