diff --git a/packages/server/modules/core/graph/resolvers/userEmails.ts b/packages/server/modules/core/graph/resolvers/userEmails.ts index 62d28cb17..0172016ba 100644 --- a/packages/server/modules/core/graph/resolvers/userEmails.ts +++ b/packages/server/modules/core/graph/resolvers/userEmails.ts @@ -31,6 +31,7 @@ import { } from '@/modules/core/services/users/emailVerification' import { commandFactory } from '@/modules/shared/command' import { withOperationLogging } from '@/observability/domain/businessLogging' +import { emailVerificationTimeoutMinutes } from '@/modules/shared/helpers/envHelper' const getUser = getUserFactory({ db }) const requestNewEmailVerification = requestNewEmailVerificationFactory({ @@ -144,7 +145,10 @@ export default { db, operationFactory: ({ db }) => verifyUserEmailFactory({ - getPendingVerificationByEmail: getPendingVerificationByEmailFactory({ db }), + getPendingVerificationByEmail: getPendingVerificationByEmailFactory({ + db, + verificationTimeoutMinutes: emailVerificationTimeoutMinutes() + }), markUserEmailAsVerified: markUserEmailAsVerifiedFactory({ updateUserEmail: updateUserEmailFactory({ db }) }), diff --git a/packages/server/modules/emails/repositories/index.ts b/packages/server/modules/emails/repositories/index.ts index 95a96abc0..e9a862727 100644 --- a/packages/server/modules/emails/repositories/index.ts +++ b/packages/server/modules/emails/repositories/index.ts @@ -90,7 +90,13 @@ export const deleteOldAndInsertNewVerificationFactory = } export const getPendingVerificationByEmailFactory = - ({ db }: { db: Knex }): GetPendingVerificationByEmail => + ({ + db, + verificationTimeoutMinutes + }: { + db: Knex + verificationTimeoutMinutes: number + }): GetPendingVerificationByEmail => async ({ email }) => { return await tables .emailVerifications(db) @@ -98,7 +104,7 @@ export const getPendingVerificationByEmailFactory = .where( EmailVerifications.col.createdAt, '>', - dayjs().subtract(5, 'minutes').toISOString() + dayjs().subtract(verificationTimeoutMinutes, 'minutes').toISOString() ) .orderBy(EmailVerifications.col.createdAt, 'desc') .first() diff --git a/packages/server/modules/shared/helpers/envHelper.ts b/packages/server/modules/shared/helpers/envHelper.ts index 783a8bf00..12f0f4dd8 100644 --- a/packages/server/modules/shared/helpers/envHelper.ts +++ b/packages/server/modules/shared/helpers/envHelper.ts @@ -512,3 +512,7 @@ export const getFileUploadUrlExpiryMinutes = (): number => { export const getPreviewServiceTimeoutMilliseconds = (): number => { return getIntFromEnv('PREVIEW_SERVICE_TIMEOUT_MILLISECONDS', '3600000') // 1 hour } + +export const emailVerificationTimeoutMinutes = (): number => { + return getIntFromEnv('EMAIL_VERIFICATION_TIMEOUT_MINUTES', '5') +} diff --git a/utils/helm/speckle-server/templates/_helpers.tpl b/utils/helm/speckle-server/templates/_helpers.tpl index f5ecffce2..2ba10470c 100644 --- a/utils/helm/speckle-server/templates/_helpers.tpl +++ b/utils/helm/speckle-server/templates/_helpers.tpl @@ -967,6 +967,8 @@ Generate the environment variables for Speckle server and Speckle objects deploy key: {{ default "email_password" .Values.server.email.password.secretKey }} - name: EMAIL_FROM value: "{{ .Values.server.email.from }}" +- name: EMAIL_VERIFICATION_TIMEOUT_MINUTES + value: {{ .Values.server.email.verificationTimeoutMinutes | quote }} {{- end }} # *** Newsletter *** diff --git a/utils/helm/speckle-server/values.schema.json b/utils/helm/speckle-server/values.schema.json index 218fb6cd0..c0f9a68ed 100644 --- a/utils/helm/speckle-server/values.schema.json +++ b/utils/helm/speckle-server/values.schema.json @@ -1282,6 +1282,11 @@ "description": "If enabled, Speckle can send email to users - for example, email verification for account registration.", "default": false }, + "verificationTimeoutMinutes": { + "type": "number", + "description": "The number of minutes after which an email verification link will expire. Defaults to 5 minutes.", + "default": 5 + }, "host": { "type": "string", "description": "The domain name or IP address of the server hosting the email service.", diff --git a/utils/helm/speckle-server/values.yaml b/utils/helm/speckle-server/values.yaml index 9d532d233..3cc87d7c9 100644 --- a/utils/helm/speckle-server/values.yaml +++ b/utils/helm/speckle-server/values.yaml @@ -778,6 +778,9 @@ server: ## @param server.email.enabled If enabled, Speckle can send email to users - for example, email verification for account registration. ## enabled: false + ## @param server.email.verificationTimeoutMinutes The number of minutes after which an email verification link will expire. Defaults to 5 minutes. + ## + verificationTimeoutMinutes: 5 ## @param server.email.host The domain name or IP address of the server hosting the email service. ## host: ''