diff --git a/models/judge_state.js b/models/judge_state.js index 69bd936..f8d317e 100644 --- a/models/judge_state.js +++ b/models/judge_state.js @@ -129,6 +129,21 @@ class JudgeState extends Model { } else if (this.type === 2) return false; } + async isAllowedSeeCaseBy(user) { + await this.loadRelationships(); + + if (user && (await user.hasPrivilege('manage_problem') || user.id === this.problem.user_id)) return true; + else if (this.type === 0) return this.problem.is_public; + else if (this.type === 1) { + let contest = await Contest.fromID(this.type_info); + if (await contest.isRunning()) { + return contest.type === 'ioi'; + } else { + return true; + } + } else if (this.type === 2) return true; + } + async isAllowedSeeDataBy(user) { await this.loadRelationships(); diff --git a/modules/contest.js b/modules/contest.js index 3baadf1..0e31d3d 100644 --- a/modules/contest.js +++ b/modules/contest.js @@ -242,17 +242,19 @@ app.get('/contest/:id/submissions', async (req, res) => { where.type_info = contest_id; if (contest.ended || contest.type !== 'noi' || (res.locals.user && res.locals.user.is_admin)) { - let minScore = parseInt(req.query.min_score); - if (isNaN(minScore)) minScore = 0; - let maxScore = parseInt(req.query.max_score); - if (isNaN(maxScore)) maxScore = 100; - - where.score = { - $and: { - $gte: parseInt(minScore), - $lte: parseInt(maxScore) - } - }; + if (!((!res.locals.user || !res.locals.user.is_admin) && !contest.ended && contest.type === 'acm')) { + let minScore = parseInt(req.query.min_score); + if (isNaN(minScore)) minScore = 0; + let maxScore = parseInt(req.query.max_score); + if (isNaN(maxScore)) maxScore = 100; + + where.score = { + $and: { + $gte: parseInt(minScore), + $lte: parseInt(maxScore) + } + }; + } if (req.query.language) where.language = req.query.language; if (req.query.status) where.status = req.query.status; diff --git a/modules/submission.js b/modules/submission.js index 81799d7..caae9c6 100644 --- a/modules/submission.js +++ b/modules/submission.js @@ -80,7 +80,11 @@ app.get('/submissions/:id/ajax', async (req, res) => { judge_state.allowedSeeCode = await judge_state.isAllowedSeeCodeBy(res.locals.user); judge_state.allowedSeeData = await judge_state.isAllowedSeeDataBy(res.locals.user); + let contest; + if (judge_state.type === 1) contest = await Contest.fromID(judge_state.type_info); + res.render('submissions_item', { + contest: contest, judge: judge_state }); } catch (e) { @@ -105,6 +109,7 @@ app.get('/submission/:id', async (req, res) => { judge.code = await syzoj.utils.highlight(judge.code, syzoj.config.languages[judge.language].highlight); judge.allowedSeeResult = await judge.isAllowedSeeResultBy(res.locals.user); judge.allowedSeeCode = await judge.isAllowedSeeCodeBy(res.locals.user); + judge.allowedSeeCase = await judge.isAllowedSeeCaseBy(res.locals.user); judge.allowedSeeData = await judge.isAllowedSeeDataBy(res.locals.user); judge.allowedRejudge = await judge.problem.isAllowedEditBy(res.locals.user); @@ -140,6 +145,7 @@ app.get('/submission/:id/ajax', async (req, res) => { judge.code = await syzoj.utils.highlight(judge.code, syzoj.config.languages[judge.language].highlight); judge.allowedSeeResult = await judge.isAllowedSeeResultBy(res.locals.user); judge.allowedSeeCode = await judge.isAllowedSeeCodeBy(res.locals.user); + judge.allowedSeeCase = await judge.isAllowedSeeCaseBy(res.locals.user); judge.allowedSeeData = await judge.isAllowedSeeDataBy(res.locals.user); judge.allowedRejudge = await judge.problem.isAllowedEditBy(res.locals.user); diff --git a/views/contest_submissions.ejs b/views/contest_submissions.ejs index 55e5d83..2826f54 100644 --- a/views/contest_submissions.ejs +++ b/views/contest_submissions.ejs @@ -8,11 +8,13 @@
- <% if (contest.ended || contest.type !== 'noi' || (user && user.is_admin)) { %> - -
- -
+ <% if ((typeof contest === 'undefined' || !contest) || contest.ended || contest.type !== 'noi' || (user && user.is_admin)) { %> + <% if ((typeof contest === 'undefined' || !contest) || !((!user || !user.is_admin) && !contest.ended && contest.type === 'acm')) { %> + +
+ +
+ <% } %>
+ <% include footer %> diff --git a/views/submission_content.ejs b/views/submission_content.ejs index 44a3973..f59b009 100644 --- a/views/submission_content.ejs +++ b/views/submission_content.ejs @@ -35,7 +35,9 @@ else problemUrl = syzoj.utils.makeUrl(['problem', judge.problem_id]); 编号 题目名称 状态 - 分数 + <% if ((typeof contest === 'undefined' || !contest) || !((!user || !user.is_admin) && !contest.ended && contest.type === 'acm')) { %> + 分数 + <% } %> 总时间 内存 代码 @@ -52,7 +54,9 @@ else problemUrl = syzoj.utils.makeUrl(['problem', judge.problem_id]); <%= judge.result.status %> - <%= judge.result.score %> + <% if ((typeof contest === 'undefined' || !contest) || !((!user || !user.is_admin) && !contest.ended && contest.type === 'acm')) { %> + <%= judge.result.score %> + <% } %> <%= judge.result.total_time %> ms <%= parseInt(judge.result.max_memory) || 0 %> K <% if (judge.allowedSeeCode) { %> @@ -106,7 +110,7 @@ else problemUrl = syzoj.utils.makeUrl(['problem', judge.problem_id]); <% } else if (judge.result.spj_compiler_output) { %>

Special Judge 编译信息

<%- syzoj.utils.ansiToHTML(judge.result.spj_compiler_output) %>
-<% } else if (judge.allowedSeeResult && judge.result.subtasks && (judge.result.subtasks.length !== 1 || judge.result.subtasks[0].case_num)) { %> +<% } else if (judge.allowedSeeResult && judge.allowedSeeCase && judge.result.subtasks && (judge.result.subtasks.length !== 1 || judge.result.subtasks[0].case_num)) { %>
<% let subtask_count = 0; %> <% for (let subtask_cases of (judge.result.subtasks || [])) { %> diff --git a/views/submissions_item.ejs b/views/submissions_item.ejs index b089981..a08eba5 100644 --- a/views/submissions_item.ejs +++ b/views/submissions_item.ejs @@ -17,7 +17,9 @@ textFit(e, { maxFontSize: 14 }); <%= judge.status %> -<%= judge.result.score %> +<% if ((typeof contest === 'undefined' || !contest) || !((!user || !user.is_admin) && !contest.ended && contest.type === 'acm')) { %> + <%= judge.result.score %> +<% } %> <%= judge.result.total_time %> ms <%= parseInt(judge.result.max_memory) || 0 %> K <% if (judge.allowedSeeCode) { %> @@ -27,7 +29,9 @@ textFit(e, { maxFontSize: 14 }); <% } %> <% } else { %> 隐藏 - 隐藏 + <% if ((typeof contest === 'undefined' || !contest) || !((!user || !user.is_admin) && !contest.ended && contest.type === 'acm')) { %> + 隐藏 + <% } %> 隐藏 隐藏 隐藏 @@ -39,9 +43,7 @@ textFit(e, { maxFontSize: 14 }); function update_judge_<%= judge.id %>() { setTimeout(function () { <% -let url; -if (typeof contest !== 'undefined' && contest) url = syzoj.utils.makeUrl(['contest', contest.id, 'submissions', judge.id, 'ajax']); -else url = syzoj.utils.makeUrl(['submissions', judge.id, 'ajax']); +let url = syzoj.utils.makeUrl(['submissions', judge.id, 'ajax']); %> $.get('<%= url %>', function (data) { var e = $('#submissions_<%= judge.id %>');