change all thresholds to 15 minutes for verification + add email changing option for existing users

This commit is contained in:
2026-01-08 16:28:12 -06:00
parent 2aa4c083a3
commit 1c6ffcf218
3 changed files with 266 additions and 9 deletions

108
mailer.js
View File

@@ -94,7 +94,7 @@ async function sendVerificationEmail(toEmail, token, name, localHour = new Date(
<tr>
<td style="padding: 30px 40px; text-align: center;">
<p style="margin: 0 0 10px 0; color: #999999; font-size: 13px; line-height: 1.5;">
This verification link will expire in <strong style="color: #666666;">24 hours</strong>.
This verification link will expire in <strong style="color: #666666;">15 minutes</strong>.
</p>
<p style="margin: 0; color: #999999; font-size: 13px; line-height: 1.5;">
If you didn't create a BlindMaster account, please ignore this email!!!
@@ -225,4 +225,108 @@ async function sendPasswordResetEmail(toEmail, code, name, localHour = new Date(
}
}
module.exports = { sendVerificationEmail, sendPasswordResetEmail };
module.exports = { sendVerificationEmail, sendPasswordResetEmail, sendEmailChangeVerification };
// Helper function to send email change verification email
async function sendEmailChangeVerification(newEmail, token, name, oldEmail, localHour = new Date().getHours()) {
const primaryColor = getColorForTime(localHour);
const verificationLink = `https://wahwa.com/verify-email-change?token=${token}`;
try {
const info = await transporter.sendMail({
from: `"BlindMaster" <${process.env.EMAIL_FROM}>`,
to: newEmail,
subject: "Verify your new BlindMaster email address",
html: `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=ABeeZee:ital@0;1&display=swap" rel="stylesheet">
</head>
<body style="margin: 0; padding: 0; background-color: #f5f5f5; font-family: 'ABeeZee', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;">
<table width="100%" cellpadding="0" cellspacing="0" style="background-color: #f5f5f5; padding: 40px 0;">
<tr>
<td align="center">
<table width="600" cellpadding="0" cellspacing="0" style="background-color: #ffffff; border-radius: 12px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); overflow: hidden; max-width: 600px;">
<!-- Header with brand color -->
<tr>
<td align="center" style="background-color: ${primaryColor}; padding: 40px 20px;">
<h1 style="margin: 0; color: #ffffff; font-size: 32px; font-weight: bold; letter-spacing: 0.5px;">BlindMaster</h1>
<p style="margin: 10px 0 0 0; color: #ffffff; font-size: 14px; opacity: 0.95;">Smart Home Automation</p>
</td>
</tr>
<!-- Message -->
<tr>
<td style="padding: 50px 40px 30px 40px; text-align: center;">
<h2 style="margin: 0 0 20px 0; color: #333333; font-size: 28px; font-weight: normal;">
Verify Your New Email
</h2>
<p style="margin: 0 0 15px 0; color: #666666; font-size: 16px; line-height: 1.6;">
${name && name.trim() ? `Hi ${name.trim()}, you` : 'You'} requested to change your email address from:
</p>
<p style="margin: 0 0 15px 0; color: #999999; font-size: 14px;">
<strong>${oldEmail}</strong>
</p>
<p style="margin: 0 0 30px 0; color: #666666; font-size: 16px; line-height: 1.6;">
Click the button below to confirm this change:
</p>
</td>
</tr>
<!-- CTA Button -->
<tr>
<td align="center" style="padding: 0 40px 40px 40px;">
<a href="${verificationLink}"
style="display: inline-block; padding: 16px 48px; background-color: ${primaryColor}; color: #ffffff; text-decoration: none; border-radius: 8px; font-size: 16px; font-weight: bold; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); transition: all 0.3s ease;">
Verify New Email
</a>
</td>
</tr>
<!-- Divider -->
<tr>
<td style="padding: 0 40px;">
<div style="border-top: 1px solid #e0e0e0;"></div>
</td>
</tr>
<!-- Footer info -->
<tr>
<td style="padding: 30px 40px; text-align: center;">
<p style="margin: 0 0 10px 0; color: #999999; font-size: 13px; line-height: 1.5;">
This verification link will expire in <strong style="color: #666666;">15 minutes</strong>.
</p>
<p style="margin: 0; color: #999999; font-size: 13px; line-height: 1.5;">
If you didn't request this email change, please ignore this email.
</p>
</td>
</tr>
<!-- Footer bar -->
<tr>
<td align="center" style="background-color: #f9f9f9; padding: 25px 40px;">
<p style="margin: 0; color: #999999; font-size: 12px;">
© 2026 BlindMaster. All rights reserved.
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
`,
});
console.log("Email change verification sent successfully:", info.messageId);
return true;
} catch (error) {
console.error("Error sending email change verification:", error);
return false;
}
}