Skip to content

Commit 04c3601

Browse files
committed
prevent sending magic link if email not allowed
1 parent cd7a308 commit 04c3601

File tree

3 files changed

+19
-8
lines changed

3 files changed

+19
-8
lines changed

apps/webapp/app/models/user.server.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
getDashboardPreferences,
88
} from "~/services/dashboardPreferences.server";
99
export type { User } from "@trigger.dev/database";
10-
10+
import { assertEmailAllowed } from "~/utils/email";
1111
type FindOrCreateMagicLink = {
1212
authenticationMethod: "MAGIC_LINK";
1313
email: string;
@@ -41,9 +41,7 @@ export async function findOrCreateUser(input: FindOrCreateUser): Promise<LoggedI
4141
export async function findOrCreateMagicLinkUser({
4242
email,
4343
}: FindOrCreateMagicLink): Promise<LoggedInUser> {
44-
if (env.WHITELISTED_EMAILS && !new RegExp(env.WHITELISTED_EMAILS).test(email)) {
45-
throw new Error("This email is unauthorized");
46-
}
44+
assertEmailAllowed(email);
4745

4846
const existingUser = await prisma.user.findFirst({
4947
where: {
@@ -79,9 +77,7 @@ export async function findOrCreateGithubUser({
7977
authenticationProfile,
8078
authenticationExtraParams,
8179
}: FindOrCreateGithub): Promise<LoggedInUser> {
82-
if (env.WHITELISTED_EMAILS && !new RegExp(env.WHITELISTED_EMAILS).test(email)) {
83-
throw new Error("This email is unauthorized");
84-
}
80+
assertEmailAllowed(email);
8581

8682
const name = authenticationProfile._json.name;
8783
let avatarUrl: string | undefined = undefined;

apps/webapp/app/services/email.server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { EmailClient, MailTransportOptions } from "emails";
33
import type { SendEmailOptions } from "remix-auth-email-link";
44
import { redirect } from "remix-typedjson";
55
import { env } from "~/env.server";
6-
import type { User } from "~/models/user.server";
76
import type { AuthUser } from "./authUser";
87
import { workerQueue } from "./worker.server";
98
import { logger } from "./logger.server";
109
import { singleton } from "~/utils/singleton";
10+
import { assertEmailAllowed } from "~/utils/email";
1111

1212
const client = singleton(
1313
"email-client",
@@ -66,6 +66,8 @@ function buildTransportOptions(alerts?: boolean): MailTransportOptions {
6666
}
6767

6868
export async function sendMagicLinkEmail(options: SendEmailOptions<AuthUser>): Promise<void> {
69+
assertEmailAllowed(options.emailAddress);
70+
6971
// Auto redirect when in development mode
7072
if (env.NODE_ENV === "development") {
7173
throw redirect(options.magicLink);

apps/webapp/app/utils/email.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { env } from "~/env.server";
2+
3+
export function assertEmailAllowed(email: string) {
4+
if (!env.WHITELISTED_EMAILS) {
5+
return;
6+
}
7+
8+
const regexp = new RegExp(env.WHITELISTED_EMAILS);
9+
10+
if (!regexp.test(email)) {
11+
throw new Error("This email is unauthorized");
12+
}
13+
}

0 commit comments

Comments
 (0)