···44import { redirect } from "next/navigation";
55import { getOAuthClient, getSession } from "./index";
6677+function isSameOrigin(url: string): boolean {
88+ try {
99+ // Use a dummy base - we only care that the URL doesn't escape to a different origin
1010+ const base = "https://self";
1111+ return new URL(url, base).origin === base;
1212+ } catch {
1313+ return false;
1414+ }
1515+}
1616+717export async function login(formData: FormData) {
818 const rawHandle = formData.get("loginHint") as string;
919 let returnUrl = (formData.get("returnUrl") as string) || "/";
1010- if (!returnUrl.startsWith("/")) {
2020+ if (!isSameOrigin(returnUrl)) {
1121 returnUrl = "/";
1222 }
1323