diff --git a/pass/routes/key.js b/pass/routes/key.js index 1ce42276b14efdc11c28764bdbb415fe485713e0..00586b1e5e305b93b10b6ef25b7ebffc63459013 100644 --- a/pass/routes/key.js +++ b/pass/routes/key.js @@ -46,7 +46,9 @@ router.post("/create", (req, res) => { let key = req.body.key; Key.GET_KEY(key, false).then((key) => { res.redirect( - `${res.locals.baseDir}/key/` + encodeURIComponent(key.get_key()) + "#charge" + `${res.locals.baseDir}/key/` + + encodeURIComponent(key.get_key()) + + "#charge" ); }); }); @@ -96,7 +98,11 @@ router.get("/enter", function (req, res, next) { if (typeof req.headers.referer === "undefined") { res.render("login/key"); } - let matches = req.header("referer").match(/\?.*key=([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/); + let matches = req + .header("referer") + .match( + /\?.*key=([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/ + ); if (matches) { let key_from_referer = matches[1]; Key.GET_KEY(key_from_referer, false).then((key) => { @@ -122,6 +128,7 @@ const upload = multer({ router.post("/enter", upload.single("file"), async (req, res, next) => { /** @type {Key} */ let key = null; + let error = null; if (typeof req.body.key === "string" && req.body.key.length > 0) { let input = req.body.key.trim(); // Login via Login code @@ -133,22 +140,58 @@ router.post("/enter", upload.single("file"), async (req, res, next) => { await __redis_client.del(prefix + key_from_code); input = key_from_code; } else { - res.render("login/key", { errors: "The login code is invalid. Please check your input." }); - return; + error = "invalid_login_code"; + } + } else { + if (input.match(/^[0-9A-F]{32}$/i)) { + input = [ + input.slice(0, 8), + input.slice(8, 12), + input.slice(12, 16), + input.slice(16, 20), + input.slice(20, 32), + ].join("-"); + } + if (Key.IS_VALID_UUID(input) || input.match(/^[0-9a-zA-Z]{6}$/)) { + key = await Key.GET_KEY(input).then((key) => key.get_key()); + } else { + error = "invalid_key"; } } - if (input.match(/^[0-9A-F]{32}$/i)) { - input = [input.slice(0, 8), input.slice(8, 12), input.slice(12, 16), input.slice(16, 20), input.slice(20, 32)].join("-"); - } - if (Key.IS_VALID_UUID(input) || input.match(/^[0-9a-zA-Z]{6}$/)) { - key = await Key.GET_KEY(input).then((key) => key.get_key()); + } + + if (error != null) { + try { + let redirect_url = new URL(req.body.redirect_error); + redirect_url.searchParams.set("key_error", error); + redirect_url.searchParams.set("invalid_key", req.body.key.trim()); + if (req.host == redirect_url.hostname) { + res.redirect(redirect_url.toString()); + return; + } + } catch (error) {} + if (error == "invalid_login_code") { + res.render("login/key", { + errors: "The login code is invalid. Please check your input.", + }); + return; } else { - res.render("login/key", { errors: "The entered key is invalid. Please check your input." }); + res.render("login/key", { + errors: "The entered key is invalid. Please check your input.", + }); return; } } if (key !== null) { + try { + let redirect_url = new URL(req.body.redirect_success); + redirect_url.searchParams.set("key", req.body.key.trim()); + if (req.host == redirect_url.hostname) { + res.redirect(redirect_url.toString()); + return; + } + } catch (error) {} res.redirect(`${res.locals.baseDir}/key/` + key); } else if (typeof req.file === "undefined") { res.render("login/key", { errors: "File not provided or invalid" }); @@ -250,15 +293,14 @@ router.get("/:key", async (req, res) => { if (req.data.admin) { res.redirect(`${res.locals.baseDir}/logout`); return; - } else if (( - !req.cookies.key || - req.cookies.key !== req.data.key.key.get_key()) && + } else if ( + (!req.cookies.key || req.cookies.key !== req.data.key.key.get_key()) && (!req.headers.key || req.headers.key !== req.data.key.key.get_key()) ) { res.cookie("key", req.data.key.key.get_key(), { sameSite: "lax", maxAge: 5 * 365 * 24 * 60 * 60 * 1000, // Store for 5 years - secure: true + secure: true, }); } res.render("key", req.data);