fix: validate login redirect target by role
Some checks failed
CI - Production Readiness / Verify (push) Has been cancelled
Some checks failed
CI - Production Readiness / Verify (push) Has been cancelled
This commit is contained in:
@ -1,6 +1,13 @@
|
|||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
|
|
||||||
import { SESSION_COOKIE, UserRole, authenticateUser, getDefaultPathForRole, serializeSession } from "@/lib/auth";
|
import {
|
||||||
|
SESSION_COOKIE,
|
||||||
|
UserRole,
|
||||||
|
canAccessPath,
|
||||||
|
authenticateUser,
|
||||||
|
getDefaultPathForRole,
|
||||||
|
serializeSession
|
||||||
|
} from "@/lib/auth";
|
||||||
import { getRequestAuditContext, writeAuditTrail } from "@/lib/audit";
|
import { getRequestAuditContext, writeAuditTrail } from "@/lib/audit";
|
||||||
import { consumeRateLimit, getRateLimitHeaders } from "@/lib/rate-limit";
|
import { consumeRateLimit, getRateLimitHeaders } from "@/lib/rate-limit";
|
||||||
import { prisma } from "@/lib/prisma";
|
import { prisma } from "@/lib/prisma";
|
||||||
@ -15,6 +22,10 @@ function getSafePath(value: string | null) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (value.startsWith("//")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,7 +129,11 @@ export async function POST(request: NextRequest) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const destination = next ?? getDefaultPathForRole(session.role as UserRole);
|
const destination = next ?? getDefaultPathForRole(session.role as UserRole);
|
||||||
const response = NextResponse.redirect(new URL(destination, baseUrl));
|
const safeDestination =
|
||||||
|
destination && canAccessPath(session.role as UserRole, destination)
|
||||||
|
? destination
|
||||||
|
: getDefaultPathForRole(session.role as UserRole);
|
||||||
|
const response = NextResponse.redirect(new URL(safeDestination, baseUrl));
|
||||||
response.cookies.set(SESSION_COOKIE, await serializeSession(session), {
|
response.cookies.set(SESSION_COOKIE, await serializeSession(session), {
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
sameSite: "lax",
|
sameSite: "lax",
|
||||||
|
|||||||
Reference in New Issue
Block a user