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