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 @@ -
" method="post" onsubmit="do_submit()" enctype="multipart/form-data"> + " method="post" onsubmit="do_submit();return false;" enctype="multipart/form-data"> + +
+
+ +
+
@@ -485,11 +502,9 @@

📎

+
-
- +
+
- + @@ -618,6 +634,69 @@ return ret+""; } var count=0; +function htmlEscape(text){ + return $("
").text(text).html(); +} + +function cleanSubmitMessage(data){ + var text=$("
").html(String(data)).text(); + text=$.trim(text.replace(/\s+/g," ")); + if(text=="") text="Submit failed."; + return text; +} + +function showSubmitMessage(data){ + var tb=window.document.getElementById('result'); + var text=cleanSubmitMessage(data); + if(tb!=null){ + tb.innerHTML=""+htmlEscape(text)+""; + }else{ + alert(text); + } + if($("#vcode-img")!=null) $("#vcode-img").click(); +} + +function setSubmitDisabled(disabled){ + $("#Submit").prop('disabled', disabled); + $("#TestRun").prop('disabled', disabled); +} + +function startSubmitCooldown(){ + count= * 2 ; + handler_interval= window.setTimeout("resume();",1000); +} + +function submitSolutionAjax(isTestRun){ + var form=document.getElementById("frmSolution"); + var formData=new FormData(form); + $.ajax({ + url:"submit.php?ajax", + type:"POST", + data:formData, + processData:false, + contentType:false, + success:function(data){ + var text=$.trim(String(data)); + var sid=/^\d+$/.test(text)?parseInt(text,10):0; + if(sid>0){ + if(isTestRun){ + fresh_result(sid); + startSubmitCooldown(); + }else{ + window.location.href="reinfo.php?sid="+sid; + } + }else{ + showSubmitMessage(text); + setSubmitDisabled(false); + } + }, + error:function(xhr){ + showSubmitMessage(xhr.responseText || "Submit failed."); + setSubmitDisabled(false); + } + }); +} + function encoded_submit(){ var mark=""; @@ -643,7 +722,7 @@ function encoded_submit(){ } function do_submit(){ - $("#Submit").attr("disabled","true"); + setSubmitDisabled(true); if(using_blockly) translate(); if(typeof(editor) != "undefined"){ @@ -656,37 +735,8 @@ function do_submit(){ else problem_id.value=''; document.getElementById("frmSolution").target="_self"; - - - document.getElementById("frmSolution").submit(); - $.post("submit.php?ajax",$("#frmSolution").serialize(),function(data){ - var sid=parseInt(data); - if(sid>0){ - window.location.href="reinfo.php?sid="+sid; - }else{ - fresh_result(data); - } - }); - $("#Submit").prop('disabled', true); - $("#TestRun").prop('disabled', true); - count= * 2 ; - handler_interval= window.setTimeout("resume();",1000); - $("#sk").attr("src","remote.php"); - - $.post("submit.php?ajax",$("#frmSolution").serialize(),function(data){ - var sid=parseInt(data); - if(sid>0){ - window.location.href="reinfo.php?sid="+sid; - }else{ - fresh_result(data); - } - }); - $("#Submit").prop('disabled', true); - $("#TestRun").prop('disabled', true); - count= * 2 ; - handler_interval= window.setTimeout("resume();",1000); - - + submitSolutionAjax(false); + $("#sk").attr("src","remote.php"); } var handler_interval; function do_test_run(){ @@ -705,12 +755,9 @@ function do_test_run(){ var problem_id=document.getElementById(mark); problem_id.value=-problem_id.value; document.getElementById("frmSolution").target="testRun"; - $.post("submit.php?ajax",$("#frmSolution").serialize(),function(data){fresh_result(data);}); - $("#Submit").prop('disabled', true); - $("#TestRun").prop('disabled', true); + setSubmitDisabled(true); + submitSolutionAjax(true); problem_id.value=-problem_id.value; - count= * 2 ; - handler_interval= window.setTimeout("resume();",1000); } function resume(){ count--;