diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index c7dc045a6..e30fa38b6 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.39.2", + "version": "2.39.3", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index 95b596a49..fe76b497d 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -107,7 +107,9 @@ class RecordDetailHandler extends Handler { this.response.template = 'record_detail.html'; const rdoc = await record.get(domainId, rid); if (!rdoc) throw new RecordNotFoundError(rid); - if (rdoc.contest) { + if (rdoc.contest.toHexString() === '000000000000000000000000') { + if (rdoc.uid !== this.user._id) throw new PermissionError(PERM.PERM_READ_RECORD_CODE); + } else if (rdoc.contest) { const tdoc = await contest.get(domainId, rdoc.contest); let canView = this.user.own(tdoc); canView ||= contest.canShowRecord.call(this, tdoc); diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 5b9be34fc..7abbe0005 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -535,7 +535,7 @@ const scripts: UpgradeScript[] = [ return true; }, null, - async function _46_47() { + async function _47_48() { const _FRESH_INSTALL_IGNORE = 1; await document.coll.updateMany({ docType: document.TYPE_HOMEWORK }, { $set: { docType: document.TYPE_CONTEST } }); await document.collStatus.updateMany({ docType: document.TYPE_HOMEWORK }, { $set: { docType: document.TYPE_CONTEST } }); @@ -546,6 +546,11 @@ const scripts: UpgradeScript[] = [ await RecordModel.coll.updateMany({ contest: null }, { $unset: { contest: '' } }); return true; }, + async function _48_49() { + const _FRESH_INSTALL_IGNORE = 1; + await RecordModel.coll.updateMany({ input: { $exists: true } }, { $set: { contest: new ObjectID('000000000000000000000000') } }); + return true; + }, ]; export default scripts; diff --git a/packages/ui-default/components/scratchpad/ScratchpadRecordsRowContainer.jsx b/packages/ui-default/components/scratchpad/ScratchpadRecordsRowContainer.jsx index 5a78e1142..15b6db21b 100644 --- a/packages/ui-default/components/scratchpad/ScratchpadRecordsRowContainer.jsx +++ b/packages/ui-default/components/scratchpad/ScratchpadRecordsRowContainer.jsx @@ -52,7 +52,7 @@ export default connect(mapStateToProps, null, mergeProps)(class ScratchpadRecord handleRowClick(ev, id) { const url = substitute( decodeURIComponent(UiContext.getRecordDetailUrl), - { rid: id } + { rid: id }, ); emulateAnchorClick(ev, url, true); } @@ -60,7 +60,8 @@ export default connect(mapStateToProps, null, mergeProps)(class ScratchpadRecord render() { const { data } = this.props; const submitAt = parseMongoId(data._id).timestamp * 1000; - return data.hidden ? null : ( + // Is pretest + return data.contest?.toString() === '000000000000000000000000' ? null : ( this.handleRowClick(ev, data._id)}> diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 0fe6f0567..ababff820 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.22.5", + "version": "4.22.6", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js",