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')) { %> + + + + + <% } %><%- syzoj.utils.ansiToHTML(judge.result.spj_compiler_output) %>