core: fix contest permission check

This commit is contained in:
undefined committed 2023-03-26 22:57:43 +08:00
1 parent 78b6c6b913
commit dde46c6e7f
4 files changed
+20 -21

No files matched your search

+2 -4
View File
@@ -331,10 +331,8 @@ export class ContestScoreboardHandler extends ContestDetailBaseHandler {
async exportScoreboard(domainId: string, tid: ObjectId, ext: string) {
await this.limitRate('scoreboard_download', 60, 3);
if (ext === 'ghost') {
if ((contest.isDone(this.tdoc) || contest.isLocked(this.tdoc)) && !this.tdoc.unlocked) {
if (!this.user.own(this.tdoc)) {
this.checkPerm(PERM.PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD);
}
if (contest.isLocked(this.tdoc) && !this.user.own(this.tdoc)) {
this.checkPerm(PERM.PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD);
}
await this.exportGhost(domainId, tid);
return;
+8 -7
View File
@@ -51,13 +51,14 @@ class RecordListHandler extends ContestDetailBaseHandler {
this.tdoc = tdoc;
if (!tdoc) throw new ContestNotFoundError(domainId, pid);
if (!contest.canShowScoreboard.call(this, tdoc, true)) throw new PermissionError(PERM.PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD);
if (!contest.canShowRecord.call(this, tdoc, true)) {
throw new PermissionError(PERM.PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD);
}
if (!(await contest.getStatus(domainId, tid, this.user._id))?.attend) {
if (contest.canShowRecord.call(this, tdoc, true)) {
const name = tdoc.rule === 'homework'
? "You haven't claimed this homework yet."
: "You haven't attended this contest yet.";
notification.push({ name, args: { type: 'note' }, checker: () => true });
} else throw new ContestNotAttendedError(domainId, tid);
const name = tdoc.rule === 'homework'
? "You haven't claimed this homework yet."
: "You haven't attended this contest yet.";
notification.push({ name, args: { type: 'note' }, checker: () => true });
}
}
if (uidOrName) {
@@ -250,7 +251,7 @@ class RecordMainConnectionHandler extends ConnectionHandler {
if (tid) {
this.tdoc = await contest.get(domainId, tid);
if (!this.tdoc) throw new ContestNotFoundError(domainId, tid);
if (pretest || contest.canShowScoreboard.call(this, this.tdoc, true)) this.tid = tid.toHexString();
if (pretest || contest.canShowScoreboard.call(this, this.tdoc, true, true)) this.tid = tid.toHexString();
else throw new PermissionError(PERM.PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD);
}
if (pretest) {