diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/entities/User.ts | 26 | ||||
-rw-r--r-- | src/util/schemas/VerifyEmailSchema.ts | 4 | ||||
-rw-r--r-- | src/util/util/Token.ts | 25 |
3 files changed, 52 insertions, 3 deletions
diff --git a/src/util/entities/User.ts b/src/util/entities/User.ts index 7b67c2ac..f39fc19b 100644 --- a/src/util/entities/User.ts +++ b/src/util/entities/User.ts @@ -31,7 +31,7 @@ import { ConnectedAccount } from "./ConnectedAccount"; import { Member } from "./Member"; import { UserSettings } from "./UserSettings"; import { Session } from "./Session"; -import { Config, FieldErrors, Snowflake, trimSpecial, adjustEmail } from ".."; +import { Config, FieldErrors, Snowflake, trimSpecial, adjustEmail, Email, generateToken } from ".."; import { Request } from "express"; import { SecurityKey } from "./SecurityKey"; @@ -383,6 +383,30 @@ export class User extends BaseClass { user.validate(); await Promise.all([user.save(), settings.save()]); + // send verification email + if (Email.transporter && email) { + const token = (await generateToken(user.id, email)) as string; + const link = `http://localhost:3001/verify#token=${token}`; + const message = { + from: + Config.get().general.correspondenceEmail || + "noreply@localhost", + to: email, + subject: `Verify Email Address for ${ + Config.get().general.instanceName + }`, + html: `Please verify your email address by clicking the following link: <a href="${link}">Verify Email</a>`, + }; + + await Email.transporter + .sendMail(message) + .then((info) => { + console.log("Message sent: %s", info.messageId); + }) + .catch((e) => { + console.error(`Failed to send email to ${email}: ${e}`); + }); + } setImmediate(async () => { if (Config.get().guild.autoJoin.enabled) { diff --git a/src/util/schemas/VerifyEmailSchema.ts b/src/util/schemas/VerifyEmailSchema.ts new file mode 100644 index 00000000..ad170e84 --- /dev/null +++ b/src/util/schemas/VerifyEmailSchema.ts @@ -0,0 +1,4 @@ +export interface VerifyEmailSchema { + captcha_key: string | null; + token: string; +} diff --git a/src/util/util/Token.ts b/src/util/util/Token.ts index ca81eaaa..b3ebcc07 100644 --- a/src/util/util/Token.ts +++ b/src/util/util/Token.ts @@ -72,13 +72,34 @@ export function checkToken( }); } -export async function generateToken(id: string) { +export function verifyToken( + token: string, + jwtSecret: string, +): Promise<{ decoded: any; user: User }> { + return new Promise((res, rej) => { + jwt.verify(token, jwtSecret, JWTOptions, async (err, decoded: any) => { + if (err || !decoded) return rej("Invalid Token"); + + const user = await User.findOne({ + where: { id: decoded.id }, + select: ["data", "bot", "disabled", "deleted", "rights"], + }); + if (!user) return rej("Invalid Token"); + if (user.disabled) return rej("User disabled"); + if (user.deleted) return rej("User not found"); + + return res({ decoded, user }); + }); + }); +} + +export async function generateToken(id: string, email?: string) { const iat = Math.floor(Date.now() / 1000); const algorithm = "HS256"; return new Promise((res, rej) => { jwt.sign( - { id: id, iat }, + { id: id, email: email, iat }, Config.get().security.jwtSecret, { algorithm, |