mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-03 22:26:07 +00:00
Add jitter and increase window to 12 m
This commit is contained in:
@@ -3,7 +3,7 @@ import { Knex } from "knex";
|
|||||||
|
|
||||||
import { chunkArray } from "@app/lib/fn";
|
import { chunkArray } from "@app/lib/fn";
|
||||||
import { selectAllTableCols } from "@app/lib/knex";
|
import { selectAllTableCols } from "@app/lib/knex";
|
||||||
import { logger, initLogger } from "@app/lib/logger";
|
import { initLogger, logger } from "@app/lib/logger";
|
||||||
|
|
||||||
import { SecretType, TableName } from "../schemas";
|
import { SecretType, TableName } from "../schemas";
|
||||||
|
|
||||||
|
|||||||
@@ -108,16 +108,16 @@ export const orgMembershipDALFactory = (db: TDbClient) => {
|
|||||||
const now = new Date();
|
const now = new Date();
|
||||||
const oneWeekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
const oneWeekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
||||||
const oneMonthAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
|
const oneMonthAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
|
||||||
const threeMonthsAgo = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);
|
const twelveMonthsAgo = new Date(now.getTime() - 360 * 24 * 60 * 60 * 1000);
|
||||||
|
|
||||||
const memberships = await db
|
const memberships = await db
|
||||||
.replicaNode()(TableName.OrgMembership)
|
.replicaNode()(TableName.OrgMembership)
|
||||||
.where("status", "invited")
|
.where("status", "invited")
|
||||||
.where((qb) => {
|
.where((qb) => {
|
||||||
// lastInvitedAt is null AND createdAt is between 1 week and 3 months ago
|
// lastInvitedAt is null AND createdAt is between 1 week and 12 months ago
|
||||||
void qb
|
void qb
|
||||||
.whereNull(`${TableName.OrgMembership}.lastInvitedAt`)
|
.whereNull(`${TableName.OrgMembership}.lastInvitedAt`)
|
||||||
.whereBetween(`${TableName.OrgMembership}.createdAt`, [threeMonthsAgo, oneWeekAgo]);
|
.whereBetween(`${TableName.OrgMembership}.createdAt`, [twelveMonthsAgo, oneWeekAgo]);
|
||||||
})
|
})
|
||||||
.orWhere((qb) => {
|
.orWhere((qb) => {
|
||||||
// lastInvitedAt is older than 1 week ago AND createdAt is younger than 1 month ago
|
// lastInvitedAt is older than 1 week ago AND createdAt is younger than 1 month ago
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ import { getConfig } from "@app/lib/config/env";
|
|||||||
import { generateAsymmetricKeyPair } from "@app/lib/crypto";
|
import { generateAsymmetricKeyPair } from "@app/lib/crypto";
|
||||||
import { generateSymmetricKey, infisicalSymmetricDecrypt, infisicalSymmetricEncypt } from "@app/lib/crypto/encryption";
|
import { generateSymmetricKey, infisicalSymmetricDecrypt, infisicalSymmetricEncypt } from "@app/lib/crypto/encryption";
|
||||||
import { generateUserSrpKeys } from "@app/lib/crypto/srp";
|
import { generateUserSrpKeys } from "@app/lib/crypto/srp";
|
||||||
|
import { applyJitter } from "@app/lib/dates";
|
||||||
|
import { delay as delayMs } from "@app/lib/delay";
|
||||||
import {
|
import {
|
||||||
BadRequestError,
|
BadRequestError,
|
||||||
ForbiddenRequestError,
|
ForbiddenRequestError,
|
||||||
@@ -44,9 +46,10 @@ import {
|
|||||||
UnauthorizedError
|
UnauthorizedError
|
||||||
} from "@app/lib/errors";
|
} from "@app/lib/errors";
|
||||||
import { groupBy } from "@app/lib/fn";
|
import { groupBy } from "@app/lib/fn";
|
||||||
|
import { logger } from "@app/lib/logger";
|
||||||
import { alphaNumericNanoId } from "@app/lib/nanoid";
|
import { alphaNumericNanoId } from "@app/lib/nanoid";
|
||||||
import { isDisposableEmail } from "@app/lib/validator";
|
import { isDisposableEmail } from "@app/lib/validator";
|
||||||
import { TQueueServiceFactory } from "@app/queue";
|
import { QueueName, TQueueServiceFactory } from "@app/queue";
|
||||||
import { getDefaultOrgMembershipRoleForUpdateOrg } from "@app/services/org/org-role-fns";
|
import { getDefaultOrgMembershipRoleForUpdateOrg } from "@app/services/org/org-role-fns";
|
||||||
import { TOrgMembershipDALFactory } from "@app/services/org-membership/org-membership-dal";
|
import { TOrgMembershipDALFactory } from "@app/services/org-membership/org-membership-dal";
|
||||||
import { TUserAliasDALFactory } from "@app/services/user-alias/user-alias-dal";
|
import { TUserAliasDALFactory } from "@app/services/user-alias/user-alias-dal";
|
||||||
@@ -1438,6 +1441,8 @@ export const orgServiceFactory = ({
|
|||||||
* Re-send emails to users who haven't accepted an invite yet
|
* Re-send emails to users who haven't accepted an invite yet
|
||||||
*/
|
*/
|
||||||
const notifyInvitedUsers = async () => {
|
const notifyInvitedUsers = async () => {
|
||||||
|
logger.info(`${QueueName.DailyResourceCleanUp}: notify invited users started`);
|
||||||
|
|
||||||
const invitedUsers = await orgMembershipDAL.findRecentInvitedMemberships();
|
const invitedUsers = await orgMembershipDAL.findRecentInvitedMemberships();
|
||||||
const appCfg = getConfig();
|
const appCfg = getConfig();
|
||||||
|
|
||||||
@@ -1461,24 +1466,32 @@ export const orgServiceFactory = ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (invitedUser.inviteEmail) {
|
if (invitedUser.inviteEmail) {
|
||||||
await smtpService.sendMail({
|
await delayMs(Math.max(0, applyJitter(0, 2000)));
|
||||||
template: SmtpTemplates.OrgInvite,
|
|
||||||
subjectLine: `Reminder: You have been invited to ${org.name} on Infisical`,
|
try {
|
||||||
recipients: [invitedUser.inviteEmail],
|
await smtpService.sendMail({
|
||||||
substitutions: {
|
template: SmtpTemplates.OrgInvite,
|
||||||
organizationName: org.name,
|
subjectLine: `Reminder: You have been invited to ${org.name} on Infisical`,
|
||||||
email: invitedUser.inviteEmail,
|
recipients: [invitedUser.inviteEmail],
|
||||||
organizationId: org.id.toString(),
|
substitutions: {
|
||||||
token,
|
organizationName: org.name,
|
||||||
callback_url: `${appCfg.SITE_URL}/signupinvite`
|
email: invitedUser.inviteEmail,
|
||||||
}
|
organizationId: org.id.toString(),
|
||||||
});
|
token,
|
||||||
notifiedUsers.push(invitedUser.id);
|
callback_url: `${appCfg.SITE_URL}/signupinvite`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
notifiedUsers.push(invitedUser.id);
|
||||||
|
} catch (err) {
|
||||||
|
logger.error(err, `${QueueName.DailyResourceCleanUp}: notify invited users failed to send email`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
await orgMembershipDAL.updateLastInvitedAtByIds(notifiedUsers);
|
await orgMembershipDAL.updateLastInvitedAtByIds(notifiedUsers);
|
||||||
|
|
||||||
|
logger.info(`${QueueName.DailyResourceCleanUp}: notify invited users completed`);
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user