From 4115f20084f302f497be9cb12237564679ca54ec Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 20 Jan 2023 15:34:01 +0100 Subject: Add ability to not send an email for registration --- server/controllers/api/users/registrations.ts | 23 +++++++++++--- .../middlewares/validators/user-registrations.ts | 7 ++++- server/tests/api/users/registrations.ts | 36 ++++++++++++++++++++++ 3 files changed, 60 insertions(+), 6 deletions(-) (limited to 'server') diff --git a/server/controllers/api/users/registrations.ts b/server/controllers/api/users/registrations.ts index 3d4e0aa18..5e213d6cc 100644 --- a/server/controllers/api/users/registrations.ts +++ b/server/controllers/api/users/registrations.ts @@ -3,7 +3,14 @@ import { Emailer } from '@server/lib/emailer' import { Hooks } from '@server/lib/plugins/hooks' import { UserRegistrationModel } from '@server/models/user/user-registration' import { pick } from '@shared/core-utils' -import { HttpStatusCode, UserRegister, UserRegistrationRequest, UserRegistrationState, UserRight } from '@shared/models' +import { + HttpStatusCode, + UserRegister, + UserRegistrationRequest, + UserRegistrationState, + UserRegistrationUpdateState, + UserRight +} from '@shared/models' import { auditLoggerFactory, UserAuditView } from '../../../helpers/audit-logger' import { logger } from '../../../helpers/logger' import { CONFIG } from '../../../initializers/config' @@ -125,6 +132,7 @@ async function requestRegistration (req: express.Request, res: express.Response) async function acceptRegistration (req: express.Request, res: express.Response) { const registration = res.locals.userRegistration + const body: UserRegistrationUpdateState = req.body const userToCreate = buildUser({ username: registration.username, @@ -150,26 +158,31 @@ async function acceptRegistration (req: express.Request, res: express.Response) registration.userId = user.id registration.state = UserRegistrationState.ACCEPTED - registration.moderationResponse = req.body.moderationResponse + registration.moderationResponse = body.moderationResponse await registration.save() logger.info('Registration of %s accepted', registration.username) - Emailer.Instance.addUserRegistrationRequestProcessedJob(registration) + if (body.preventEmailDelivery !== true) { + Emailer.Instance.addUserRegistrationRequestProcessedJob(registration) + } return res.sendStatus(HttpStatusCode.NO_CONTENT_204) } async function rejectRegistration (req: express.Request, res: express.Response) { const registration = res.locals.userRegistration + const body: UserRegistrationUpdateState = req.body registration.state = UserRegistrationState.REJECTED - registration.moderationResponse = req.body.moderationResponse + registration.moderationResponse = body.moderationResponse await registration.save() - Emailer.Instance.addUserRegistrationRequestProcessedJob(registration) + if (body.preventEmailDelivery !== true) { + Emailer.Instance.addUserRegistrationRequestProcessedJob(registration) + } logger.info('Registration of %s rejected', registration.username) diff --git a/server/middlewares/validators/user-registrations.ts b/server/middlewares/validators/user-registrations.ts index e263c27c5..fcf655a2c 100644 --- a/server/middlewares/validators/user-registrations.ts +++ b/server/middlewares/validators/user-registrations.ts @@ -1,6 +1,6 @@ import express from 'express' import { body, param, query, ValidationChain } from 'express-validator' -import { exists, isIdValid } from '@server/helpers/custom-validators/misc' +import { exists, isBooleanValid, isIdValid, toBooleanOrNull } from '@server/helpers/custom-validators/misc' import { isRegistrationModerationResponseValid, isRegistrationReasonValid } from '@server/helpers/custom-validators/user-registration' import { CONFIG } from '@server/initializers/config' import { Hooks } from '@server/lib/plugins/hooks' @@ -91,6 +91,11 @@ const acceptOrRejectRegistrationValidator = [ body('moderationResponse') .custom(isRegistrationModerationResponseValid), + body('preventEmailDelivery') + .optional() + .customSanitizer(toBooleanOrNull) + .custom(isBooleanValid).withMessage('Should have preventEmailDelivery boolean'), + async (req: express.Request, res: express.Response, next: express.NextFunction) => { if (areValidationErrors(req, res)) return if (!await checkRegistrationIdExist(req.params.registrationId, res)) return diff --git a/server/tests/api/users/registrations.ts b/server/tests/api/users/registrations.ts index a9e1114e8..e6524f07d 100644 --- a/server/tests/api/users/registrations.ts +++ b/server/tests/api/users/registrations.ts @@ -329,6 +329,42 @@ describe('Test registrations', function () { } }) + it('Should be able to prevent email delivery on accept/reject', async function () { + this.timeout(50000) + + let id1: number + let id2: number + + { + const { id } = await server.registrations.requestRegistration({ + username: 'user7', + email: 'user7@example.com', + registrationReason: 'tt' + }) + id1 = id + } + { + const { id } = await server.registrations.requestRegistration({ + username: 'user8', + email: 'user8@example.com', + registrationReason: 'tt' + }) + id2 = id + } + + await server.registrations.accept({ id: id1, moderationResponse: 'tt', preventEmailDelivery: true }) + await server.registrations.reject({ id: id2, moderationResponse: 'tt', preventEmailDelivery: true }) + + await waitJobs([ server ]) + + const filtered = emails.filter(e => { + const address = e['to'][0]['address'] + return address === 'user7@example.com' || address === 'user8@example.com' + }) + + expect(filtered).to.have.lengthOf(0) + }) + it('Should request a registration without a channel, that will conflict with an already existing channel', async function () { let id1: number let id2: number -- cgit v1.2.3