From 00b8317b7040d235fef127eeec3abeb24bfa1af3 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 6 Dec 2023 13:54:01 -0800 Subject: email verification --- index.js | 4 ++-- lib/mail.js | 11 ++--------- routes/users.js | 45 +++++++++++++++++++++++++++++++++++++++--- templates/payments/verify.html | 27 +++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 14 deletions(-) create mode 100644 templates/payments/verify.html diff --git a/index.js b/index.js index 9888f7d2..112982ec 100644 --- a/index.js +++ b/index.js @@ -86,8 +86,8 @@ app.post("/upload/:type", users.upload); app.get("/users/delete/:username", users.del); app.post("/acl", users.acl); app.post("/superuser", users.superuser); -app.post("/verify", users.verify); - +app.get("/verify/:code", users.verify); +app.post("/request", auth, users.request); app.post("/login", users.login); app.post("/subscribe", auth, users.subscribe); diff --git a/lib/mail.js b/lib/mail.js index 47ef5eac..12580544 100644 --- a/lib/mail.js +++ b/lib/mail.js @@ -9,6 +9,7 @@ import path from "path"; let Charset = "UTF-8"; export let templates = { + verifyEmail: "templates/payments/verify.html", paymentSent: "templates/payments/sent.html" }; @@ -17,11 +18,10 @@ export let mail = async (user, subject, template, params) => { l("sending mail", user.username, subject); if (!user.email) return; - let source = fs.readFileSync(templates[template], "utf8"); + let source = fs.readFileSync(template, "utf8"); let html = handlebars.compile(source)(params); let client = new SESClient({ region: "us-east-2" }); - return; await client.send( new SendEmailCommand({ @@ -41,10 +41,3 @@ export let mail = async (user, subject, template, params) => { err(e.message); } }; - -/* -mail({ username: "bob", email: "asoltys@gmail.com" }, "Test", "paymentSent", { - username: "bob", - link: "https://coinos.io/api/verify/12345" -}); -*/ diff --git a/routes/users.js b/routes/users.js index d3dff28b..f666d75b 100644 --- a/routes/users.js +++ b/routes/users.js @@ -23,6 +23,7 @@ import { v4 } from "uuid"; import { parseISO } from "date-fns"; import { types } from "$lib/payments"; import { bech32 } from "bech32"; +import { mail, templates } from "$lib/mail"; import got from "got"; import upload from "$lib/upload"; @@ -433,8 +434,46 @@ export default { else bail(res, "unauthorized"); }, - async verify({ body: { test } }, res) { - console.log("test", test); - res.send(test); + async request({ body: { id, email }}, res) { + try { + let code = v4(); + let user = await g(`user:${id}`); + if (!user) fail("user not found"); + let { username } = user; + + if (email !== user.email) { + user.verified = false; + await s(`user:${id}`, user); + user.email = email; + } + + + await s(`verify:${code}`, id); + let link = `${process.env.URL}/${username}/verify/${code}`; + let subject = "Email Verification"; + + await mail(user, subject, templates.verifyEmail, { + username, + link + }); + + res.send({ ok: true }); + } catch (e) { + bail(res, e.message); + } + }, + + async verify({ params: { code } }, res) { + try { + let id = await g(`verify:${code}`); + if (!id) fail(res, "verification failed"); + let user = await g(`user:${id}`); + user.verified = true; + await s(`user:${id}`, user); + + res.send(pick(user, whitelist)); + } catch (e) { + bail(res, e.message); + } } }; diff --git a/templates/payments/verify.html b/templates/payments/verify.html new file mode 100644 index 00000000..8820f47b --- /dev/null +++ b/templates/payments/verify.html @@ -0,0 +1,27 @@ + + + + +
+ + + +
+ +
Hello {{username}},
+ +
+ Please visit {{link}} to verify your email. +
+ +
Thanks!
+ +
The Coinos Team
+ + -- cgit v1.2.3