mirror of
https://github.com/spacebarchat/server.git
synced 2026-10-22 17:32:30 +00:00
send email verification
This commit is contained in:
1 parent
ed6c1cbd15
commit
256c7ed8fe
5 files changed
+97
-3
No files matched your search
@@ -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) {
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
export interface VerifyEmailSchema {
|
||||
captcha_key: string | null;
|
||||
token: string;
|
||||
}
|
||||
+23
-2
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user