fix: add temp email rate limit (#2879)

This commit is contained in:
David Nguyen
2026-05-28 17:09:09 +10:00
committed by GitHub
parent 9da2db2e67
commit d304d8720c
5 changed files with 105 additions and 16 deletions
@@ -16,6 +16,7 @@ import { createElement } from 'react';
import { getI18nInstance } from '../../../client-only/providers/i18n-server';
import { NEXT_PUBLIC_WEBAPP_URL } from '../../../constants/app';
import { RECIPIENT_ROLE_TO_EMAIL_TYPE, RECIPIENT_ROLES_DESCRIPTION } from '../../../constants/recipient-roles';
import { assertOrgEmailSendAllowed } from '../../../server-only/email/assert-org-email-send-allowed';
import { getEmailContext } from '../../../server-only/email/get-email-context';
import { updateRecipientNextReminder } from '../../../server-only/recipient/update-recipient-next-reminder';
import { DOCUMENT_AUDIT_LOG_TYPE } from '../../../types/document-audit-logs';
@@ -83,14 +84,15 @@ export const run = async ({ payload, io }: { payload: TSendSigningEmailJobDefini
return;
}
const { branding, emailLanguage, settings, organisationType, senderEmail, replyToEmail } = await getEmailContext({
emailType: 'RECIPIENT',
source: {
type: 'team',
teamId: envelope.teamId,
},
meta: envelope.documentMeta,
});
const { branding, emailLanguage, settings, organisationType, senderEmail, replyToEmail, organisationId } =
await getEmailContext({
emailType: 'RECIPIENT',
source: {
type: 'team',
teamId: envelope.teamId,
},
meta: envelope.documentMeta,
});
const customEmail = envelope?.documentMeta;
const isDirectTemplate = envelope.source === DocumentSource.TEMPLATE_DIRECT_LINK;
@@ -162,6 +164,22 @@ export const run = async ({ payload, io }: { payload: TSendSigningEmailJobDefini
});
if (isRecipientEmailValidForSending(recipient)) {
const sendCheck = await assertOrgEmailSendAllowed({ organisationId });
if (!sendCheck.allowed) {
// TEMPORARY: silent drop on rate-limit hit. Job is consumed and NOT retried.
io.logger.warn({
msg: 'Recipient signing email dropped: org rate limit exceeded',
organisationId,
recipientId: recipient.id,
envelopeId: envelope.id,
reason: sendCheck.reason,
resetsAt: sendCheck.resetsAt,
});
return;
}
await io.runTask('send-signing-email', async () => {
const [html, text] = await Promise.all([
renderEmailWithI18N(template, { lang: emailLanguage, branding }),