diff options
| author | Adam Soltys <[email protected]> | 2023-12-06 13:54:01 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-12-06 13:54:01 -0800 |
| commit | 00b8317b7040d235fef127eeec3abeb24bfa1af3 (patch) | |
| tree | 9fea9511c3fb49cb7ea39efb87527c700929feec | |
| parent | db37eb1610db48b1773fb685e198466b6d54fcb5 (diff) | |
| download | coinos-server-00b8317b7040d235fef127eeec3abeb24bfa1af3.tar.gz coinos-server-00b8317b7040d235fef127eeec3abeb24bfa1af3.zip | |
email verification
| -rw-r--r-- | index.js | 4 | ||||
| -rw-r--r-- | lib/mail.js | 11 | ||||
| -rw-r--r-- | routes/users.js | 45 | ||||
| -rw-r--r-- | templates/payments/verify.html | 27 |
4 files changed, 73 insertions, 14 deletions
@@ -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: "[email protected]" }, "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 @@ +<style> + @import url("https://fonts.googleapis.com/css2?family=Public+Sans:wght@400;700&display=swap"); + + body { + font-family: "Public Sans", sans-serif; + } +</style> + +<html> + <body> + <div style="display: flex; width: 100%;"> + <a href="https://coinos.io" style="margin: auto"> + <img src="https://coinos.io/images/logo.jpg"> + </a> + </div> + + <div style="margin-bottom: 10px">Hello {{username}},</div> + + <div style="margin-bottom: 10px"> + Please visit <a href="{{link}}">{{link}}</a> to verify your email. + </div> + + <div style="margin-bottom: 10px">Thanks!</div> + + <div>The Coinos Team</div> + </body> +</html> |
