diff --git a/.server-changes/magic-link-email-validation.md b/.server-changes/magic-link-email-validation.md new file mode 100644 index 00000000000..f91ad60e94a --- /dev/null +++ b/.server-changes/magic-link-email-validation.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: fix +--- + +Validate email format on the magic link login form. diff --git a/apps/webapp/app/routes/login.magic/route.tsx b/apps/webapp/app/routes/login.magic/route.tsx index 3ddbd47a4d0..06523b3d8c5 100644 --- a/apps/webapp/app/routes/login.magic/route.tsx +++ b/apps/webapp/app/routes/login.magic/route.tsx @@ -101,17 +101,32 @@ export async function action({ request }: ActionFunctionArgs) { const payload = Object.fromEntries(await clonedRequest.formData()); - const data = z + const result = z .discriminatedUnion("action", [ z.object({ action: z.literal("send"), - email: z.string().trim().toLowerCase(), + email: z.string().trim().toLowerCase().email(), }), z.object({ action: z.literal("reset"), }), ]) - .parse(payload); + .safeParse(payload); + + if (!result.success) { + const session = await getUserSession(request); + session.set("auth:error", { + message: "Please enter a valid email address.", + }); + + return redirect("/login/magic", { + headers: { + "Set-Cookie": await commitSession(session), + }, + }); + } + + const data = result.data; switch (data.action) { case "send": {