From 58faaab7f172bc7a6f2f52098a249d13df60f3a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Tu=E1=BA=A5n=20D=C5=A9ng?= Date: Thu, 7 Mar 2019 15:54:29 +0700 Subject: [PATCH 1/7] Add feature to read submission's source --- src/data/database.js | 27 +++++++++++++++++++++++++++ src/routes/subs.js | 18 +++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/data/database.js b/src/data/database.js index 3fd66c41..89ee8552 100644 --- a/src/data/database.js +++ b/src/data/database.js @@ -395,6 +395,32 @@ async function readUserSubmission(user_id, page, size, count) { }); } +/** + * Read Submission's source + * @param {String} sub_id Submission's ID + */ +function readSubmissionSrc(sub_id) { + return new Promise((resolve, reject) => { + db.submissions.findOne( + { _id: sub_id }, + { ext: 1, user_id: 1, prob_id: 1, source_code: 1 }, + (err, docs) => { + if (err) reject(err); + else if (docs === null) + reject(new Error(`Invalid Submission's ID: ${sub_id}`)); + else + readUserByID(docs.user_id) + .then((res) => { + docs.username = res.username; + }) + .finally(() => { + resolve(docs); + }); + } + ); + }); +} + /** * Add submission to database * @param {String} source_code Source Code @@ -557,6 +583,7 @@ module.exports = { readAllSubmissions, readSubmission, readUserSubmission, + readSubmissionSrc, newSubmission, updateSubmission, readLastSatisfy, diff --git a/src/routes/subs.js b/src/routes/subs.js index 5382f752..36f9bcf7 100644 --- a/src/routes/subs.js +++ b/src/routes/subs.js @@ -6,7 +6,8 @@ const { sendCode } = require("../controller/submitCode"); const { readSubmission, readAllSubmissions, - readUserSubmission + readUserSubmission, + readSubmissionSrc } = require("../data/database"); const auth = require("../middleware/auth"); const bruteForce = require("../middleware/bruteForce"); @@ -65,4 +66,19 @@ router.get("/:id", (req, res) => { ); }); +router.get("/:id/source", (req, res) => { + readSubmissionSrc(req.params.id) + .then((docs) => { + if (docs.user_id === req.user._id || req.user.isAdmin) + res.download( + docs.source_code, + "".concat(docs.prob_id, docs.ext) + ); + else res.sendStatus(401); + }) + .catch((err) => { + res.status(400).json(err.message); + }); +}); + module.exports = router; From bcf22fbd5b4915a9293997e6ec703ec0b3ec8e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Tu=E1=BA=A5n=20D=C5=A9ng?= Date: Thu, 7 Mar 2019 15:57:53 +0700 Subject: [PATCH 2/7] Use submission's id instead of problem id --- src/data/database.js | 2 +- src/routes/subs.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/database.js b/src/data/database.js index 89ee8552..b14609a4 100644 --- a/src/data/database.js +++ b/src/data/database.js @@ -403,7 +403,7 @@ function readSubmissionSrc(sub_id) { return new Promise((resolve, reject) => { db.submissions.findOne( { _id: sub_id }, - { ext: 1, user_id: 1, prob_id: 1, source_code: 1 }, + { ext: 1, user_id: 1, source_code: 1 }, (err, docs) => { if (err) reject(err); else if (docs === null) diff --git a/src/routes/subs.js b/src/routes/subs.js index 36f9bcf7..701318a7 100644 --- a/src/routes/subs.js +++ b/src/routes/subs.js @@ -72,7 +72,7 @@ router.get("/:id/source", (req, res) => { if (docs.user_id === req.user._id || req.user.isAdmin) res.download( docs.source_code, - "".concat(docs.prob_id, docs.ext) + "".concat(docs.req.params.id, docs.ext) ); else res.sendStatus(401); }) From 09774c8ae2ea039c4711e9e2e2baf92d63c9741a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Tu=E1=BA=A5n=20D=C5=A9ng?= Date: Thu, 7 Mar 2019 16:00:31 +0700 Subject: [PATCH 3/7] Does not allow space in prob_id and ext_id --- src/util/config/contestConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/config/contestConfig.js b/src/util/config/contestConfig.js index 7aa425d4..e84b3b6a 100644 --- a/src/util/config/contestConfig.js +++ b/src/util/config/contestConfig.js @@ -23,7 +23,7 @@ function parseContainer(container) { if (!Array.isArray(container)) throw new Error("Invalid Container"); let parsedContainer = container .filter((x) => typeof x === "string") - .map((x) => x.trim().toUpperCase()) + .map((x) => x.toUpperCase().replace(" ", "")) .sort((a, b) => a.localeCompare(b)); return [...new Set(parsedContainer)]; } From ea46bb0aee60afff2fad243d40b38aaf82f35d58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Tu=E1=BA=A5n=20D=C5=A9ng?= Date: Fri, 8 Mar 2019 14:17:49 +0700 Subject: [PATCH 4/7] Fix problem where file is not returned --- src/routes/subs.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/routes/subs.js b/src/routes/subs.js index d4a3a314..21b4fbbb 100644 --- a/src/routes/subs.js +++ b/src/routes/subs.js @@ -71,10 +71,7 @@ router.get("/:id/source", (req, res) => { readSubmissionSrc(req.params.id) .then((docs) => { if (docs.user_id === req.user._id || req.user.isAdmin) - res.download( - docs.source_code, - "".concat(docs.req.params.id, docs.ext) - ); + res.download(docs.source_code, "".concat(docs._id, docs.ext)); else res.sendStatus(401); }) .catch((err) => { From 9f1283c5db02de309514379cd3e97ce604897ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Tu=E1=BA=A5n=20D=C5=A9ng?= Date: Fri, 8 Mar 2019 14:29:37 +0700 Subject: [PATCH 5/7] Hide ENOENT error with 404 --- src/routes/subs.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/routes/subs.js b/src/routes/subs.js index 21b4fbbb..4dcd2f48 100644 --- a/src/routes/subs.js +++ b/src/routes/subs.js @@ -1,6 +1,7 @@ "use strict"; const express = require("express"); +const { existsSync } = require("fs"); const { sendCode } = require("../controller/submitCode"); const { @@ -70,9 +71,14 @@ router.get("/:id", (req, res) => { router.get("/:id/source", (req, res) => { readSubmissionSrc(req.params.id) .then((docs) => { - if (docs.user_id === req.user._id || req.user.isAdmin) - res.download(docs.source_code, "".concat(docs._id, docs.ext)); - else res.sendStatus(401); + if (docs.user_id === req.user._id || req.user.isAdmin) { + if (!existsSync(docs.source_code)) res.sendStatus(404); + else + res.download( + docs.source_code, + "".concat(docs._id, docs.ext) + ); + } else res.sendStatus(401); }) .catch((err) => { res.status(400).json(err.message); From 762211197d5b40e4183ab30f35ac0fa87213106b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Tu=E1=BA=A5n=20D=C5=A9ng?= Date: Fri, 8 Mar 2019 14:34:55 +0700 Subject: [PATCH 6/7] convert to lowercase extension --- src/routes/subs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/subs.js b/src/routes/subs.js index 4dcd2f48..6efcb5c1 100644 --- a/src/routes/subs.js +++ b/src/routes/subs.js @@ -76,7 +76,7 @@ router.get("/:id/source", (req, res) => { else res.download( docs.source_code, - "".concat(docs._id, docs.ext) + "".concat(docs._id, docs.ext.toLowerCase()) ); } else res.sendStatus(401); }) From a33ef07490c1c41b10ab1860238ca4b0037d24e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Tu=E1=BA=A5n=20D=C5=A9ng?= Date: Fri, 8 Mar 2019 19:44:51 +0700 Subject: [PATCH 7/7] Fix replace function --- src/util/config/contestConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/config/contestConfig.js b/src/util/config/contestConfig.js index e84b3b6a..b66301ff 100644 --- a/src/util/config/contestConfig.js +++ b/src/util/config/contestConfig.js @@ -23,7 +23,7 @@ function parseContainer(container) { if (!Array.isArray(container)) throw new Error("Invalid Container"); let parsedContainer = container .filter((x) => typeof x === "string") - .map((x) => x.toUpperCase().replace(" ", "")) + .map((x) => x.replace(/\s/g, "").toUpperCase()) .sort((a, b) => a.localeCompare(b)); return [...new Set(parsedContainer)]; }