From 9c02fde994a248b9d4b6197d8258472641627fe1 Mon Sep 17 00:00:00 2001 From: Dominik Hebeler <dominik@hebeler.club> Date: Wed, 5 Jul 2023 20:51:01 +0200 Subject: [PATCH] added login via payment id --- pass/lang/de/admin.json | 3 ++ pass/routes/admin/index.js | 94 ++++++++++++++++++++++++---------- pass/views/admin/key/index.ejs | 34 ++++++++++-- 3 files changed, 100 insertions(+), 31 deletions(-) diff --git a/pass/lang/de/admin.json b/pass/lang/de/admin.json index b9dc265..733c206 100644 --- a/pass/lang/de/admin.json +++ b/pass/lang/de/admin.json @@ -57,6 +57,9 @@ "label": "Schlüssel eingeben", "submit": "Abschicken" }, + "payment-id-input": { + "label": "Zahlungs-ID eingeben" + }, "key-overview": { "charge": "Guthaben: {{token}}", "charge-success": "Aufladung erfolgreich", diff --git a/pass/routes/admin/index.js b/pass/routes/admin/index.js index a89a4d7..61f3750 100644 --- a/pass/routes/admin/index.js +++ b/pass/routes/admin/index.js @@ -8,7 +8,7 @@ const { matchedData, body, query, - oneOf + oneOf, } = require("express-validator"); const OrderReceipt = require("../../app/pdf/OrderReceipt"); const crypto = require("crypto"); @@ -19,7 +19,10 @@ const Cash = require("../../app/payment_processor/Cash"); const Key = require("../../app/Key"); router.use((req, res, next) => { - let cookie_path = new URL(res.locals.baseDir).pathname.replace(/(\/)?$/, "/admin"); + let cookie_path = new URL(res.locals.baseDir).pathname.replace( + /(\/)?$/, + "/admin" + ); auth({ issuerBaseURL: `${config.get("app.openid_auth.url")}`, baseURL: res.locals.baseDir + "/admin", @@ -124,9 +127,9 @@ router.get( let hasher = crypto.createHash("sha256"); hasher.update( reqData.company + - res.locals.name + - res.locals.email + - res.locals.address + res.locals.name + + res.locals.email + + res.locals.address ); res.locals.datahash = hasher.digest("hex"); res.render("admin/payments/receipt"); @@ -309,7 +312,7 @@ router.post( payment_processor: Cash.NAME, }) .then(() => { - return payment_reference.getKey(false).then(key => { + return payment_reference.getKey(false).then((key) => { return res.redirect(`${res.baseDir}/admin/key/${key.get_key()}`); }); }) @@ -328,16 +331,29 @@ router.get("/key", (req, res) => { }); router.post("/key", (req, res) => { - Key.GET_KEY(req.body.key, false).then(key => { - return res.redirect(`${res.baseDir}/admin/key/${key.get_key()}`); - }); -}) + if (req.body.payment_id.length > 0) { + return PaymentReference.LOAD_FROM_PUBLIC_ID(req.body.payment_id) + .then((payment_reference) => { + return res.redirect( + `${res.baseDir}/admin/key/${payment_reference.key.get_key()}` + ); + }) + .catch((reason) => { + console.error(reason); + return res.redirect(`${res.baseDir}/admin/key`); + }); + } else { + return Key.GET_KEY(req.body.key, false).then((key) => { + return res.redirect(`${res.baseDir}/admin/key/${key.get_key()}`); + }); + } +}); router.use("/key/:key", (req, res, next) => { if (req.query.charge_success) { res.locals.success = true; } - Key.GET_KEY(req.params.key, false).then(key => { + Key.GET_KEY(req.params.key, false).then((key) => { res.locals.key = key; next(); }); @@ -346,10 +362,11 @@ router.use("/key/:key", (req, res, next) => { router.get("/key/:key", (req, res) => { res.render("admin/key/overview"); }); -router.post("/key/:key", +router.post( + "/key/:key", oneOf([ body("amount").isInt({ gt: 0 }), - body("price").isCurrency({ allow_negatives: false, allow_decimal: true }) + body("price").isCurrency({ allow_negatives: false, allow_decimal: true }), ]), (req, res) => { let queryData = matchedData(req, { location: ["body"] }); @@ -368,31 +385,56 @@ router.post("/key/:key", res.render("admin/key/overview"); return; } - return PaymentReference.CREATE_NEW_REQUEST(amount, res.locals.key.get_key(), undefined, true) - .then(payment_reference => payment_reference.chargeKey()) + return PaymentReference.CREATE_NEW_REQUEST( + amount, + res.locals.key.get_key(), + undefined, + true + ) + .then((payment_reference) => payment_reference.chargeKey()) .then(() => { - res.redirect(`${res.baseDir}/admin/key/${res.locals.key.get_key()}?charge_success=true`); + res.redirect( + `${ + res.baseDir + }/admin/key/${res.locals.key.get_key()}?charge_success=true` + ); }); - }); + } +); -router.post("/key/:key/remove-charge", +router.post( + "/key/:key/remove-charge", body("payment_reference").notEmpty().isInt().toInt(), (req, res) => { let queryData = matchedData(req, { location: ["body"] }); const errors = validationResult(req); if (!errors.isEmpty()) { - return res.redirect(`${res.baseDir}/admin/key/${res.locals.key.get_key()}?charge_success=true`); + return res.redirect( + `${ + res.baseDir + }/admin/key/${res.locals.key.get_key()}?charge_success=true` + ); } let payment_reference_id = queryData.payment_reference; /** @type {Key} */ let key = res.locals.key; let payment_reference_charge = key.get_charge(payment_reference_id); - return Key.GET_KEY(key.get_key(), true).then(writable_key => { - writable_key.discharge_key(payment_reference_charge, payment_reference_id); - return writable_key.save(); - }).then(() => { - res.redirect(`${res.baseDir}/admin/key/${res.locals.key.get_key()}?charge_success=true`); - }); - }); + return Key.GET_KEY(key.get_key(), true) + .then((writable_key) => { + writable_key.discharge_key( + payment_reference_charge, + payment_reference_id + ); + return writable_key.save(); + }) + .then(() => { + res.redirect( + `${ + res.baseDir + }/admin/key/${res.locals.key.get_key()}?charge_success=true` + ); + }); + } +); module.exports = router; diff --git a/pass/views/admin/key/index.ejs b/pass/views/admin/key/index.ejs index d716519..046bc8b 100644 --- a/pass/views/admin/key/index.ejs +++ b/pass/views/admin/key/index.ejs @@ -1,4 +1,6 @@ -<%- include('../../templates/page_header', {css: [`${baseDir}/styles/admin/base.css`, `${baseDir}/styles/admin/key-management.css`], js: []}); %> +<%- include('../../templates/page_header', {css: +[`${baseDir}/styles/admin/base.css`, +`${baseDir}/styles/admin/key-management.css`], js: []}); %> <div id="admin-container"> <ul class="breadcrumps"> <li> @@ -10,10 +12,32 @@ </ul> <form method="POST"> <div class="input-group"> - <label for="key"><%= req.t("key.key-input.label", {ns: "admin"}) _%></label> - <input type="text" name="key" id="key" size="36" placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"> + <label for="key" + ><%= req.t("key.key-input.label", {ns: "admin"}) _%></label + > + <input + type="text" + name="key" + id="key" + size="36" + placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" + /> </div> - <button class="button"><%= req.t("key.key-input.submit", {ns: "admin"}) _%></button> + <div class="input-group"> + <label for="payment_id" + ><%= req.t("key.payment-id-input.label", {ns: "admin"}) _%></label + > + <input + type="text" + name="payment_id" + id="payment_id" + size="36" + placeholder="ZXXXXXXX" + /> + </div> + <button class="button"> + <%= req.t("key.key-input.submit", {ns: "admin"}) _%> + </button> </form> </div> -<%- include('../../templates/page_footer'); -%> \ No newline at end of file +<%- include('../../templates/page_footer'); -%> -- GitLab