From 5a27c07bba96a426f7ab502217147631cca943a0 Mon Sep 17 00:00:00 2001
From: klarkxy <278370456@qq.com>
Date: Thu, 9 Jul 2026 12:03:12 +0800
Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(submit):=20=E9=87=8D=E6=9E=84?=
=?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=B5=81=E7=A8=8B=E5=B9=B6=E5=8A=A0=E5=BC=BA?=
=?UTF-8?q?=E5=88=A4=E9=A2=98=E7=AB=AF=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- judge_client 在 solution/problem/source 查询失败时记录系统错误并以 OJ_RE 安全退出,避免判题机崩溃或挂起
- submit.php 抽取 submit_error 助手,AJAX 请求返回纯文本错误,提交页改为 AJAX 流程并增强错误提示
- 修复 reinfo 自动刷新脚本在标签页切回前台后未恢复轮询的 bug
---
.codegraph/.gitignore | 5 +
DEBUG.md => README.md | 12 ++-
core/judge_client/judge_client.cc | 161 ++++++++++++++++++++++++------
web/submit.php | 108 ++++++++++----------
web/template/syzoj/reinfo.php | 5 +-
web/template/syzoj/submitpage.php | 133 ++++++++++++++++--------
6 files changed, 292 insertions(+), 132 deletions(-)
create mode 100644 .codegraph/.gitignore
rename DEBUG.md => README.md (53%)
diff --git a/.codegraph/.gitignore b/.codegraph/.gitignore
new file mode 100644
index 0000000..d20c0fe
--- /dev/null
+++ b/.codegraph/.gitignore
@@ -0,0 +1,5 @@
+# CodeGraph data files — local to each machine, not for committing.
+# Ignore everything in .codegraph/ except this file itself, so transient
+# files (the database, daemon.pid, sockets, logs) never show up in git.
+*
+!.gitignore
diff --git a/DEBUG.md b/README.md
similarity index 53%
rename from DEBUG.md
rename to README.md
index 156c10d..691a5a8 100644
--- a/DEBUG.md
+++ b/README.md
@@ -1,5 +1,7 @@
# 调试说明
+该项目为局域网本地项目。不需要考虑安全问题。
+
## 调试环境
- 目标网址:http://192.168.0.96/
@@ -14,4 +16,12 @@
2. 将提交 push 到服务器端对应仓库。
3. 打开网页端提供的 git pull API 触发更新,使服务器拉取最新代码。
-如需验证调试环境,优先使用上述账号登录目标网址,并通过网页端 git pull API 完成代码同步。
\ No newline at end of file
+如需验证调试环境,优先使用上述账号登录目标网址,并通过网页端 git pull API 完成代码同步。
+
+## 数据库
+```
+static $DB_HOST="localhost"; //数据库服务器ip或域名
+static $DB_NAME="jol"; //数据库名
+static $DB_USER="debian-sys-maint"; //数据库账户
+static $DB_PASS="GJfFMuAmScKHHa32"; //数据库密码
+```
\ No newline at end of file
diff --git a/core/judge_client/judge_client.cc b/core/judge_client/judge_client.cc
index aa77bcd..10a9f99 100644
--- a/core/judge_client/judge_client.cc
+++ b/core/judge_client/judge_client.cc
@@ -1220,6 +1220,17 @@ void addreinfo(int solution_id)
}
}
+void add_system_error_info(int solution_id, const char *message)
+{
+ FILE *fp = fopen("error.out", "a");
+ if (fp != NULL)
+ {
+ fprintf(fp, "system:%s\n", message);
+ fclose(fp);
+ }
+ addreinfo(solution_id);
+}
+
void adddiffinfo(int solution_id)
{
@@ -1670,7 +1681,7 @@ int check_mysql_conn(){
#endif
#ifdef _mysql_h
-void _get_solution_mysql(int solution_id, char *work_dir, int lang)
+bool _get_solution_mysql(int solution_id, char *work_dir, int lang)
{
char sql[BUFFER_SIZE], src_pth[BUFFER_SIZE];
// get the source code
@@ -1678,7 +1689,8 @@ void _get_solution_mysql(int solution_id, char *work_dir, int lang)
MYSQL_ROW row;
sprintf(sql, "SELECT source FROM source_code WHERE solution_id=%d",
solution_id);
- mysql_real_query(conn, sql, strlen(sql));
+ if (mysql_real_query(conn, sql, strlen(sql)))
+ return false;
res = mysql_store_result(conn);
// create the src file
@@ -1691,16 +1703,23 @@ void _get_solution_mysql(int solution_id, char *work_dir, int lang)
if (DEBUG)
printf("Main=%s", src_pth);
FILE *fp_src = fopen(src_pth, "we");
+ if (fp_src == NULL) {
+ mysql_free_result(res);
+ return false;
+ }
fprintf(fp_src, "%s", row[0]);
mysql_free_result(res); // free the memory
res = NULL;
row = NULL;
fclose(fp_src);
+ return true;
}
+ mysql_free_result(res);
}
+ return false;
}
#endif
-void _get_solution_http(int solution_id, char *work_dir, int lang)
+bool _get_solution_http(int solution_id, char *work_dir, int lang)
{
char src_pth[BUFFER_SIZE];
@@ -1716,22 +1735,26 @@ void _get_solution_http(int solution_id, char *work_dir, int lang)
FILE *pout = read_cmd_output(cmd2, solution_id, src_pth, http_baseurl, http_apipath);
pclose(pout);
+ return access(src_pth, R_OK) == 0;
}
-void get_solution(int solution_id, char *work_dir, int lang,int p_id)
+bool get_solution(int solution_id, char *work_dir, int lang,int p_id)
{
char src_pth[BUFFER_SIZE];
+ bool ret = false;
sprintf(src_pth, "Main.%s", lang_ext[lang]);
if (http_judge)
{
- _get_solution_http(solution_id, work_dir, lang);
+ ret = _get_solution_http(solution_id, work_dir, lang);
}
else
{
#ifdef _mysql_h
- _get_solution_mysql(solution_id, work_dir, lang);
+ ret = _get_solution_mysql(solution_id, work_dir, lang);
#endif
}
+ if (!ret)
+ return false;
if(lang == LANG_PYTHON ){ // 从源码中搜索python2字样,失败的结果非零默认python3,成功的结果为0是python2
py2 = execute_cmd("/bin/grep 'python2' %s/Main.py > /dev/null", work_dir);
execute_cmd("sed -i 's/import.*os//g' %s/%s", work_dir, src_pth);
@@ -1740,6 +1763,7 @@ void get_solution(int solution_id, char *work_dir, int lang,int p_id)
execute_cmd("cp %s/../data/%d/sb3/%d.sb3 %s", work_dir,p_id,solution_id, src_pth);
}
execute_cmd("chown judge %s/%s", work_dir, src_pth);
+ return access(src_pth, R_OK) == 0;
}
#ifdef _mysql_h
@@ -1804,7 +1828,7 @@ void get_custominput(int solution_id, char *work_dir)
}
#ifdef _mysql_h
-void _get_solution_info_mysql(int solution_id, int & p_id, char * user_id,
+bool _get_solution_info_mysql(int solution_id, int & p_id, char * user_id,
int & lang,int &cid) {
MYSQL_RES *res;
@@ -1818,7 +1842,8 @@ void _get_solution_info_mysql(int solution_id, int & p_id, char * user_id,
"insert into solution2 select * FROM solution where solution_id=%d",
solution_id);
//printf("%s\n",sql);
- mysql_real_query(conn, sql, strlen(sql));
+ if (mysql_real_query(conn, sql, strlen(sql)))
+ return false;
sprintf(sql,
"SELECT problem_id, user_id, language,contest_id FROM solution2 where solution_id=%d",
solution_id);
@@ -1831,9 +1856,16 @@ void _get_solution_info_mysql(int solution_id, int & p_id, char * user_id,
solution_id);
}
//printf("%s\n",sql);
- mysql_real_query(conn, sql, strlen(sql));
+ if (mysql_real_query(conn, sql, strlen(sql)))
+ return false;
res = mysql_store_result(conn);
+ if (res == NULL)
+ return false;
row = mysql_fetch_row(res);
+ if (row == NULL) {
+ mysql_free_result(res);
+ return false;
+ }
p_id = atoi(row[0]);
strcpy(user_id, row[1]);
lang = atoi(row[2]);
@@ -1844,9 +1876,10 @@ void _get_solution_info_mysql(int solution_id, int & p_id, char * user_id,
mysql_free_result(res); // free the memory
res=NULL;
}
+ return true;
}
#endif
-void _get_solution_info_http(int solution_id, int & p_id, char * user_id,
+bool _get_solution_info_http(int solution_id, int & p_id, char * user_id,
int & lang,int & cid) {
login();
@@ -1854,26 +1887,29 @@ void _get_solution_info_http(int solution_id, int & p_id, char * user_id,
const char *cmd =
"wget --post-data=\"getsolutioninfo=1&sid=%d\" --load-cookies=cookie --save-cookies=cookie --keep-session-cookies -q -O - \"%s%s\"";
FILE *pout = read_cmd_output(cmd, solution_id, http_baseurl, http_apipath);
- if(1!=fscanf(pout, "%d", &p_id)) printf("http problem_id read fail...\n");
- if(1!=fscanf(pout, "%s", user_id)) printf("http user_id read fail ... \n") ;
- if(1!=fscanf(pout, "%d", &lang)) printf("http language read fail ... \n") ;
- if(1!=fscanf(pout, "%d", &cid)) printf("http contest_id read fail ... \n") ;
+ bool ret = true;
+ if(1!=fscanf(pout, "%d", &p_id)) { printf("http problem_id read fail...\n"); ret = false; }
+ if(1!=fscanf(pout, "%s", user_id)) { printf("http user_id read fail ... \n") ; ret = false; }
+ if(1!=fscanf(pout, "%d", &lang)) { printf("http language read fail ... \n") ; ret = false; }
+ if(1!=fscanf(pout, "%d", &cid)) { printf("http contest_id read fail ... \n") ; ret = false; }
pclose(pout);
+ return ret;
}
-void get_solution_info(int solution_id, int & p_id, char * user_id,
+bool get_solution_info(int solution_id, int & p_id, char * user_id,
int & lang,int & cid) {
if (http_judge) {
- _get_solution_info_http(solution_id, p_id, user_id, lang,cid);
+ return _get_solution_info_http(solution_id, p_id, user_id, lang,cid);
} else {
#ifdef _mysql_h
- _get_solution_info_mysql(solution_id, p_id, user_id, lang,cid);
+ return _get_solution_info_mysql(solution_id, p_id, user_id, lang,cid);
#endif
}
+ return false;
}
#ifdef _mysql_h
-void _get_problem_info_mysql(int p_id, double &time_lmt, int &mem_lmt,
+bool _get_problem_info_mysql(int p_id, double &time_lmt, int &mem_lmt,
int &spj)
{
// get the problem info from Table:problem
@@ -1883,9 +1919,16 @@ void _get_problem_info_mysql(int p_id, double &time_lmt, int &mem_lmt,
sprintf(sql,
"SELECT time_limit,memory_limit,spj FROM problem where problem_id=%d",
p_id);
- mysql_real_query(conn, sql, strlen(sql));
+ if (mysql_real_query(conn, sql, strlen(sql)))
+ return false;
res = mysql_store_result(conn);
+ if (res == NULL)
+ return false;
row = mysql_fetch_row(res);
+ if (row == NULL) {
+ mysql_free_result(res);
+ return false;
+ }
time_lmt = atof(row[0]);
mem_lmt = atoi(row[1]);
spj = atoi(row[2]);
@@ -1894,9 +1937,10 @@ void _get_problem_info_mysql(int p_id, double &time_lmt, int &mem_lmt,
mysql_free_result(res); // free the memory
res = NULL;
}
+ return true;
}
#endif
-void _get_problem_info_http(int p_id, double &time_lmt, int &mem_lmt,
+bool _get_problem_info_http(int p_id, double &time_lmt, int &mem_lmt,
int &spj)
{
//login();
@@ -1904,27 +1948,32 @@ void _get_problem_info_http(int p_id, double &time_lmt, int &mem_lmt,
const char *cmd =
"wget --post-data=\"getprobleminfo=1&pid=%d\" --load-cookies=cookie --save-cookies=cookie --keep-session-cookies -q -O - \"%s%s\"";
FILE *pout = read_cmd_output(cmd, p_id, http_baseurl, http_apipath);
- if(1!=fscanf(pout, "%lf", &time_lmt)) printf("http read time_limit fail...\n");
- if(1!=fscanf(pout, "%d", &mem_lmt) ) printf("http read memory_limit fail...\n");
- if(1!=fscanf(pout, "%d", &spj) ) printf("http read special judge fail...\n");
+ bool ret = true;
+ if(1!=fscanf(pout, "%lf", &time_lmt)) { printf("http read time_limit fail...\n"); ret = false; }
+ if(1!=fscanf(pout, "%d", &mem_lmt) ) { printf("http read memory_limit fail...\n"); ret = false; }
+ if(1!=fscanf(pout, "%d", &spj) ) { printf("http read special judge fail...\n"); ret = false; }
pclose(pout);
if(DEBUG) printf("time_lmt:%g\n",time_lmt);
+ return ret;
}
-void get_problem_info(int p_id, double &time_lmt, int &mem_lmt, int &spj)
+bool get_problem_info(int p_id, double &time_lmt, int &mem_lmt, int &spj)
{
if (http_judge)
{
- _get_problem_info_http(p_id, time_lmt, mem_lmt, spj);
+ if (!_get_problem_info_http(p_id, time_lmt, mem_lmt, spj))
+ return false;
}
else
{
#ifdef _mysql_h
- _get_problem_info_mysql(p_id, time_lmt, mem_lmt, spj);
+ if (!_get_problem_info_mysql(p_id, time_lmt, mem_lmt, spj))
+ return false;
#endif
}
if (time_lmt <= 0)
time_lmt = 1;
+ return true;
}
char *escape(char s[], char t[])
{
@@ -3455,6 +3504,8 @@ int main(int argc, char **argv)
double time_lmt;
char time_space_table[BUFFER_SIZE*100];
int time_space_index=0;
+ time_space_table[0]=0;
+ user_id[0]=0;
umask(0077);
init_parameters(argc, argv, solution_id, runner_id);
@@ -3489,7 +3540,27 @@ int main(int argc, char **argv)
if (http_judge)
if(!system("/bin/ln -s ../cookie ./")) printf("cookie link fail \n");
- get_solution_info(solution_id, p_id, user_id, lang,cid);
+ if (!get_solution_info(solution_id, p_id, user_id, lang,cid)) {
+ add_system_error_info(solution_id, "solution info not found");
+ update_solution(solution_id, OJ_RE, 0, 0, 0, 0, 0.0);
+#ifdef _mysql_h
+ if (!http_judge)
+ mysql_close(conn);
+#endif
+ clean_workdir(work_dir);
+ exit(0);
+ }
+ if (lang < 0 || lang >= (int)(sizeof(lang_ext) / sizeof(lang_ext[0]))) {
+ add_system_error_info(solution_id, "invalid language id");
+ update_solution(solution_id, OJ_RE, 0, 0, 0, 0, 0.0);
+ if(!turbo_mode)update_user(user_id);
+#ifdef _mysql_h
+ if (!http_judge)
+ mysql_close(conn);
+#endif
+ clean_workdir(work_dir);
+ exit(0);
+ }
//get the limit
if (p_id == 0)
@@ -3500,11 +3571,33 @@ int main(int argc, char **argv)
}
else
{
- get_problem_info(p_id, time_lmt, mem_lmt, spj);
+ if (!get_problem_info(p_id, time_lmt, mem_lmt, spj)) {
+ add_system_error_info(solution_id, "problem info not found");
+ update_solution(solution_id, OJ_RE, 0, 0, 0, 0, 0.0);
+ if(!turbo_mode)update_user(user_id);
+ if(!turbo_mode)update_problem(p_id,cid);
+#ifdef _mysql_h
+ if (!http_judge)
+ mysql_close(conn);
+#endif
+ clean_workdir(work_dir);
+ exit(0);
+ }
}
//copy source file
- get_solution(solution_id, work_dir, lang,p_id);
+ if (!get_solution(solution_id, work_dir, lang,p_id)) {
+ add_system_error_info(solution_id, "source code not found");
+ update_solution(solution_id, OJ_RE, 0, 0, 0, 0, 0.0);
+ if(!turbo_mode)update_user(user_id);
+ if(!turbo_mode)update_problem(p_id,cid);
+#ifdef _mysql_h
+ if (!http_judge)
+ mysql_close(conn);
+#endif
+ clean_workdir(work_dir);
+ exit(0);
+ }
//java and other VM language are lucky to have the global bonus in judge.conf
if (lang >= LANG_JAVA && lang != LANG_OBJC && lang != LANG_CLANG && lang != LANG_CLANGPP && lang != LANG_GO )
@@ -3581,11 +3674,18 @@ int main(int argc, char **argv)
if(p_id > 0 && namelist_len == -1 ){
write_log("No such dir:%s!\n", fullpath);
+ char error[BUFFER_SIZE];
+ snprintf(error, BUFFER_SIZE - 1, "test data directory not found: %s", fullpath);
+ add_system_error_info(solution_id, error);
+ update_solution(solution_id, OJ_RE, 0, 0, 0, 0, 0.0);
+ if(!turbo_mode)update_user(user_id);
+ if(!turbo_mode)update_problem(p_id,cid);
#ifdef _mysql_h
if (!http_judge)
mysql_close(conn);
#endif
- exit(-1);
+ clean_workdir(work_dir);
+ exit(0);
}else{
if(DEBUG){
@@ -3702,6 +3802,7 @@ int main(int argc, char **argv)
}
char last_name[BUFFER_SIZE];
+ last_name[0]=0;
int minus_mark=0;
char path_buf[BUFFER_SIZE];
sprintf(path_buf,"%s/data/%d/",oj_home,p_id);
diff --git a/web/submit.php b/web/submit.php
index 605e15f..07b017d 100644
--- a/web/submit.php
+++ b/web/submit.php
@@ -3,19 +3,37 @@ 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";
+require_once "include/const.inc.php";
+
+$is_ajax_submit = isset($_GET['ajax']) || isset($_POST['ajax']);
+
+function submit_error($message) {
+ global $OJ_TEMPLATE, $is_ajax_submit, $view_errors;
+
+ if ($is_ajax_submit) {
+ header("Content-Type: text/plain; charset=UTF-8");
+ $text = trim(html_entity_decode(strip_tags($message), ENT_QUOTES, "UTF-8"));
+ if ($text === "") {
+ $text = "Submit failed.";
+ }
+ echo $text;
+ exit(0);
+ }
+
+ $view_errors = $message;
+ require "template/".$OJ_TEMPLATE."/error.php";
+ exit(0);
+}
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 = "$MSG_Login";
- require("template/".$OJ_TEMPLATE."/error.php");
- exit(0);
+ submit_error("$MSG_Login");
}
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'];
@@ -41,10 +59,8 @@ if (!$OJ_BENCHMARK_MODE) {
$_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);
+ submit_error($err_str);
}else{
$_SESSION[ $OJ_NAME . '_' . "vfail" ]=false;
}
@@ -74,24 +90,13 @@ else {
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."
";
- require "template/".$OJ_TEMPLATE."/error.php";
- exit(0);
+ submit_error($MSG_LINK_ERROR."
");
}
}
-if ($res[0][1]!='N' && !($test_run||isset($_SESSION[$OJ_NAME.'_'.'administrator']))) {
+if (!$test_run && isset($res[0]) && $res[0][1]!='N' && !isset($_SESSION[$OJ_NAME.'_'.'administrator'])) {
// echo "res:$res,count:".count($res);
// echo "$sql";
- $view_errors = $MSG_PROBLEM_RESERVED."
";
-
- if (isset($_POST['ajax'])) {
- echo $view_errors.$res[0][1];
- exit(0);
- }
- else {
- require "template/".$OJ_TEMPLATE."/error.php";
- }
- exit(0);
+ submit_error($MSG_PROBLEM_RESERVED."
".$res[0][1]);
}
$title = "";
@@ -118,10 +123,7 @@ else if (isset($_POST['pid']) && isset($_POST['cid']) && $_POST['cid']!=0) {
$rows_cnt = count($result);
if ($rows_cnt != 1) {
- $view_errors .= $MSG_NOT_IN_CONTEST;
-
- require "template/" . $OJ_TEMPLATE . "/error.php";
- exit(0);
+ submit_error($MSG_NOT_IN_CONTEST);
}
else {
$row = $result[0];
@@ -137,9 +139,7 @@ else if (isset($_POST['pid']) && isset($_POST['cid']) && $_POST['cid']!=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);
+ submit_error($MSG_NOT_INVITED."\n");
}
}
}
@@ -150,9 +150,7 @@ else if (isset($_POST['pid']) && isset($_POST['cid']) && $_POST['cid']!=0) {
$rows_cnt = count($result);
if ($rows_cnt != 1) {
- $view_errors = $MSG_NO_PROBLEM."\n";
- require "template/".$OJ_TEMPLATE."/error.php";
- exit(0);
+ submit_error($MSG_NO_PROBLEM."\n");
}
else {
$row = $result[0];
@@ -182,12 +180,10 @@ if ($language > count($language_name) || $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);
+ submit_error($MSG_NO_PLS."\n[$language][$langmask][".($langmask&(1<<$language))."]");
}
-$source = $_POST['source'];
+$source = isset($_POST['source']) ? $_POST['source'] : "";
$input_text = "";
if (isset($_POST['input_text'])) {
@@ -206,7 +202,7 @@ if ($test_run) {
$id = -$id;
}
-$tempfile = $_FILES ["answer"] ["tmp_name"];
+$tempfile = (isset($_FILES["answer"]) && isset($_FILES["answer"]["tmp_name"])) ? $_FILES["answer"]["tmp_name"] : "";
if($tempfile!=""){
if($language!=23){
@@ -217,7 +213,7 @@ if($tempfile!=""){
$source="Main.sb3";
}
}
-$origin_name=trim($_FILES ["answer"]['name']);
+$origin_name=(isset($_FILES["answer"]) && isset($_FILES["answer"]['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));
@@ -255,7 +251,7 @@ if ($test_run) {
$id = 0;
}
-if($language!=23) $len = strlen($source);else $len = $_FILES['answer']['size'];
+if($language!=23) $len = strlen($source);else $len = (isset($_FILES['answer']) ? intval($_FILES['answer']['size']) : 0);
//echo $source;
setcookie('lastlang', $language, time()+360000);
@@ -270,15 +266,11 @@ if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
if ($len < 2) {
- $view_errors = $MSG_TOO_SHORT.$tempfile."
";
- require "template/".$OJ_TEMPLATE."/error.php";
- exit(0);
+ submit_error($MSG_TOO_SHORT.$tempfile."
");
}
if ($len > 65536) {
- $view_errors = $MSG_TOO_LONG."
";
- require "template/" . $OJ_TEMPLATE . "/error.php";
- exit(0);
+ submit_error($MSG_TOO_LONG."
");
}
if (!$OJ_BENCHMARK_MODE) {
@@ -295,8 +287,8 @@ if (!$OJ_BENCHMARK_MODE) {
exit(0);
// 预防WAF抽风
*/
- if(isset($_GET['ajax'])){
- echo -1;
+ if($is_ajax_submit){
+ submit_error(str_replace("10",$OJ_SUBMIT_COOLDOWN_TIME,$MSG_BREAK_TIME));
}else{
$statusURI = "status.php?user_id=".$_SESSION[$OJ_NAME.'_'.'user_id'];
if (isset($cid)) {
@@ -373,15 +365,17 @@ if (~$OJ_LANGMASK&(1<<$language)) {
////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);
- }
+ if (!$test_run && isset($OJ_REMOTE_JUDGE) && $OJ_REMOTE_JUDGE) {
+ $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
@@ -501,11 +495,11 @@ if (isset($cid)) {
$statusURI .= "&cid=$cid&fixed=";
}
-if (!$test_run&&!isset($_GET['ajax'])) {
+if (!$test_run&&!$is_ajax_submit) {
header("Location: $statusURI");
}
else {
- if (isset($_GET['ajax'])) {
+ if ($is_ajax_submit) {
echo $insert_id;
}
else {
diff --git a/web/template/syzoj/reinfo.php b/web/template/syzoj/reinfo.php
index f804940..4651ed1 100644
--- a/web/template/syzoj/reinfo.php
+++ b/web/template/syzoj/reinfo.php
@@ -650,6 +650,7 @@ i.icon.spinning {
var maxInterval = 8000; // 最长 8s
var countdown = 0;
var stopped = false;
+ var completed = false;
function showStatus(text){
var el = document.getElementById('auto-refresh-status');
@@ -688,6 +689,7 @@ i.icon.spinning {
// 判题完成,刷新页面拿到完整错误信息
showStatus('判题完成,正在刷新...');
setTimeout(function(){ location.reload(); }, 400);
+ completed = true;
stopped = true;
return;
}
@@ -712,7 +714,8 @@ i.icon.spinning {
if (document.hidden) {
stopped = true;
hideStatus();
- } else if (!stopped) {
+ } else if (!completed) {
+ stopped = false;
countdown = 0;
tick();
}
diff --git a/web/template/syzoj/submitpage.php b/web/template/syzoj/submitpage.php
index 1c0d9cf..045a71d 100644
--- a/web/template/syzoj/submitpage.php
+++ b/web/template/syzoj/submitpage.php
@@ -215,6 +215,15 @@
border-top: 1px solid rgba(0,0,5,0.08);
}
+.submit-top-actions {
+ justify-content: flex-end;
+ padding-top: 0;
+ padding-bottom: 16px;
+ margin-bottom: 16px;
+ border-top: 0;
+ border-bottom: 1px solid rgba(0,0,5,0.08);
+}
+
.submit-actions .actions-left {
display: flex;
gap: 8px;
@@ -388,7 +397,15 @@
-