aboutsummaryrefslogtreecommitdiffstats
path: root/routes/lnurl.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2020-06-23 14:39:41 -0700
committerAdam Soltys <[email protected]>2020-06-23 14:39:41 -0700
commitd6af21064d106e6179d76e0dddee049c5e7c0fc5 (patch)
treed6cf57a7659a6e60ad80992c8f93dcc59c11c770 /routes/lnurl.js
parent3c46dc86b753cdfd71da7b8bb86710032668b5eb (diff)
downloadcoinos-server-d6af21064d106e6179d76e0dddee049c5e7c0fc5.tar.gz
coinos-server-d6af21064d106e6179d76e0dddee049c5e7c0fc5.zip
lnurl auth
Diffstat (limited to 'routes/lnurl.js')
-rw-r--r--routes/lnurl.js75
1 files changed, 75 insertions, 0 deletions
diff --git a/routes/lnurl.js b/routes/lnurl.js
new file mode 100644
index 00000000..e9c1f930
--- /dev/null
+++ b/routes/lnurl.js
@@ -0,0 +1,75 @@
+const axios = require("axios");
+const lnurl = require("lnurl");
+const jwt = require("jsonwebtoken");
+
+logins = {};
+
+lnurlServer = lnurl.createServer(config.lnurl);
+
+app.get("/loginUrl", async (req, res) => {
+ try {
+ const result = await lnurlServer.generateNewUrl("login");
+ const { username } = req.query;
+
+ if (username !== "undefined") {
+ logins[result.secret] = username;
+ }
+
+ res.send(result);
+ } catch (e) {
+ l.error(e.message);
+ res.status(500).send(e.message);
+ }
+});
+
+app.get("/decode", async (req, res) => {
+ const { text } = req.query;
+
+ try {
+ const decoded = lnurl.decode(text);
+ let result = await axios.get(decoded);
+ res.send(result.data);
+ } catch (e) {
+ l.error(e.message);
+ res.status(500).send(e.message);
+ }
+});
+
+lnurlServer.bindToHook("login", async params => {
+ try {
+ const { k1, key } = params;
+
+ const exists = await db.Key.findOne({
+ where: { hex: key },
+ include: [{model: db.User, as: "user" }]
+ });
+
+ let user;
+ if (logins[k1]) {
+ const username = logins[k1];
+ user = await db.User.findOne({
+ where: { username }
+ });
+
+ const k = await db.Key.create({
+ user_id: user.id,
+ hex: key,
+ });
+
+ l.info("added key", username, k);
+ emit(username, 'key', k);
+ }
+ else if (exists) ({ user } = exists);
+ else return;
+
+ if (user && user.username) {
+ const payload = { username: user.username };
+ const token = jwt.sign(payload, config.jwt);
+ const ws = sessions[key];
+ if (ws && ws.send)
+ ws.send(JSON.stringify({ type: "token", data: token }));
+ }
+ } catch (e) {
+ l.error(e.message);
+ }
+});