Skip to content

Commit 6b9e649

Browse files
committed
route fixes
1 parent 4e2af06 commit 6b9e649

4 files changed

Lines changed: 34 additions & 6 deletions

File tree

src/app/api/admin/system/all/route.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
import { NextResponse } from "next/server";
22
import { prisma } from "@/lib/prisma";
33
import { requireAdmin, adminGuardResponse } from "@/lib/adminAuth";
4+
import { getAdminUtorids } from "@/lib/adminWhitelist";
45

56
export async function DELETE() {
67
try {
78
const user = await requireAdmin();
89
const guard = adminGuardResponse(user);
910
if (guard) return guard;
1011

12+
const adminUtorids = getAdminUtorids();
13+
const protectedUsers = await prisma.user.findMany({
14+
where: { OR: [{ utorid: { in: adminUtorids } }, { role: "PROFESSOR" }] },
15+
select: { id: true },
16+
});
17+
const protectedIds = protectedUsers.map((u) => u.id);
18+
1119
await prisma.$transaction([
1220
prisma.answerUpvote.deleteMany(),
1321
prisma.questionUpvote.deleteMany(),
@@ -17,7 +25,9 @@ export async function DELETE() {
1725
prisma.session.deleteMany(),
1826
prisma.courseEnrollment.deleteMany(),
1927
prisma.course.deleteMany(),
20-
prisma.user.deleteMany(),
28+
prisma.user.deleteMany(
29+
protectedIds.length > 0 ? { where: { id: { notIn: protectedIds } } } : undefined
30+
),
2131
]);
2232

2333
return NextResponse.json({ success: true });

src/app/api/admin/users/all/route.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
import { NextResponse } from "next/server";
22
import { prisma } from "@/lib/prisma";
33
import { requireAdmin, adminGuardResponse } from "@/lib/adminAuth";
4+
import { getAdminUtorids } from "@/lib/adminWhitelist";
45

56
export async function DELETE() {
67
try {
78
const user = await requireAdmin();
89
const guard = adminGuardResponse(user);
910
if (guard) return guard;
1011

12+
const adminUtorids = getAdminUtorids();
13+
const protectedUsers = await prisma.user.findMany({
14+
where: { OR: [{ utorid: { in: adminUtorids } }, { role: "PROFESSOR" }] },
15+
select: { id: true },
16+
});
17+
const protectedIds = protectedUsers.map((u) => u.id);
18+
1119
await prisma.$transaction([
1220
prisma.answerUpvote.deleteMany(),
1321
prisma.questionUpvote.deleteMany(),
@@ -17,7 +25,9 @@ export async function DELETE() {
1725
prisma.session.deleteMany(),
1826
prisma.courseEnrollment.deleteMany(),
1927
prisma.course.deleteMany(),
20-
prisma.user.deleteMany(),
28+
prisma.user.deleteMany(
29+
protectedIds.length > 0 ? { where: { id: { notIn: protectedIds } } } : undefined
30+
),
2131
]);
2232

2333
return NextResponse.json({ success: true });

src/app/api/auth/session/route.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@ export async function GET(request: NextRequest) {
3838
// The server strips them from external connections (see server.ts), so
3939
// they can be trusted here.
4040
utorid = request.headers.get("utorid");
41-
name =
42-
request.headers.get("cn") ??
43-
request.headers.get("displayname") ??
44-
request.headers.get("utorid");
41+
const rawCn = request.headers.get("cn");
42+
// Strip double-quotes and collapse whitespace to handle LDAP-formatted
43+
// names like `"First Middle" "Last"` → `First Middle Last`
44+
const sanitizedCn = rawCn ? rawCn.replace(/"/g, "").replace(/\s+/g, " ").trim() : null;
45+
name = sanitizedCn || request.headers.get("displayname") || request.headers.get("utorid");
4546
email = request.headers.get("mail") ?? request.headers.get("email");
4647
}
4748

src/lib/adminWhitelist.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,10 @@ const ADMIN_WHITELIST: Set<string> = loadAdminWhitelist();
4949
export function isAdmin(utorid: string): boolean {
5050
return ADMIN_WHITELIST.has(utorid.toLowerCase());
5151
}
52+
53+
/**
54+
* Returns all admin UTORids as an array.
55+
*/
56+
export function getAdminUtorids(): string[] {
57+
return Array.from(ADMIN_WHITELIST);
58+
}

0 commit comments

Comments
 (0)