1
0
Fork 0
mirror of https://github.com/Chocobozzz/PeerTube.git synced 2025-10-03 09:49:20 +02:00
Peertube/server/core/controllers/api/users/email-verification.ts
Chocobozzz 986e71a1f7
Better ask email verification flow
Allow user to resend the email verification link when changing the
current email
Fix success messages when validating a new email
2025-04-15 10:36:12 +02:00

85 lines
2.7 KiB
TypeScript

import { HttpStatusCode } from '@peertube/peertube-models'
import express from 'express'
import { CONFIG } from '../../../initializers/config.js'
import { sendVerifyRegistrationEmail, sendVerifyRegistrationRequestEmail, sendVerifyUserChangeEmail } from '../../../lib/user.js'
import { asyncMiddleware, buildRateLimiter } from '../../../middlewares/index.js'
import {
registrationVerifyEmailValidator,
usersAskSendRegistrationVerifyEmailValidator,
usersAskSendUserVerifyEmailValidator,
usersVerifyEmailValidator
} from '../../../middlewares/validators/index.js'
const askSendEmailLimiter = buildRateLimiter({
windowMs: CONFIG.RATES_LIMIT.ASK_SEND_EMAIL.WINDOW_MS,
max: CONFIG.RATES_LIMIT.ASK_SEND_EMAIL.MAX
})
const emailVerificationRouter = express.Router()
emailVerificationRouter.post(
'/ask-send-verify-email',
askSendEmailLimiter,
asyncMiddleware(usersAskSendUserVerifyEmailValidator),
asyncMiddleware(reSendUserVerifyUserEmail)
)
emailVerificationRouter.post(
'/registrations/ask-send-verify-email',
askSendEmailLimiter,
asyncMiddleware(usersAskSendRegistrationVerifyEmailValidator),
asyncMiddleware(reSendRegistrationVerifyUserEmail)
)
emailVerificationRouter.post('/:id/verify-email', asyncMiddleware(usersVerifyEmailValidator), asyncMiddleware(verifyUserEmail))
emailVerificationRouter.post(
'/registrations/:registrationId/verify-email',
asyncMiddleware(registrationVerifyEmailValidator),
asyncMiddleware(verifyRegistrationEmail)
)
// ---------------------------------------------------------------------------
export {
emailVerificationRouter
}
async function reSendUserVerifyUserEmail (req: express.Request, res: express.Response) {
if (res.locals.userPendingEmail) { // User wants to change its current email
await sendVerifyUserChangeEmail(res.locals.userPendingEmail)
} else { // After an account creation
await sendVerifyRegistrationEmail(res.locals.userEmail)
}
return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
}
async function reSendRegistrationVerifyUserEmail (req: express.Request, res: express.Response) {
await sendVerifyRegistrationRequestEmail(res.locals.userRegistration)
return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
}
async function verifyUserEmail (req: express.Request, res: express.Response) {
const user = res.locals.user
user.emailVerified = true
if (req.body.isPendingEmail === true) {
user.email = user.pendingEmail
user.pendingEmail = null
}
await user.save()
return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
}
async function verifyRegistrationEmail (req: express.Request, res: express.Response) {
const registration = res.locals.userRegistration
registration.emailVerified = true
await registration.save()
return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
}