Skip to content

Commit 2076ca1

Browse files
authored
fix: protect admin routes (#1941)
1 parent f427203 commit 2076ca1

File tree

4 files changed

+26
-23
lines changed

4 files changed

+26
-23
lines changed

server/api/auth/github.get.ts

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,8 @@
1-
interface TeamMember {
2-
login: string
3-
}
4-
5-
const getCoreMembers = cachedFunction(async () => {
6-
return await $fetch<TeamMember[]>('https://api.nuxt.com/teams/core')
7-
}, {
8-
maxAge: 60 * 60, // 1 hour
9-
getKey: () => 'core-members'
10-
})
11-
121
export default defineOAuthGitHubEventHandler({
132
async onSuccess(event, { user }) {
14-
const coreMembers = await getCoreMembers()
15-
if (!coreMembers) {
16-
throw createError({
17-
statusCode: 500,
18-
statusMessage: 'Failed to fetch core team members.'
19-
})
20-
}
21-
22-
const userLogin = user.login.toLowerCase()
23-
const coreTeamHasUser = coreMembers.some(member => member.login.toLowerCase() === userLogin)
3+
const adminMember = await isCoreTeamMember(user.login.toLowerCase())
244

25-
if (!coreTeamHasUser) {
5+
if (!adminMember) {
266
return sendRedirect(event, '/admin/login?error=access-denied')
277
}
288

server/api/feedback/[id].delete.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const deleteParamsSchema = z.object({
66
})
77

88
export default defineEventHandler(async (event) => {
9+
await requireUserSession(event)
10+
911
const { id } = await getValidatedRouterParams(event, deleteParamsSchema.parse)
1012

1113
const drizzle = useDrizzle()

server/api/feedback/index.get.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
export default defineEventHandler(async () => {
1+
export default defineEventHandler(async (event) => {
2+
await requireUserSession(event)
3+
24
const drizzle = useDrizzle()
35

46
return await drizzle.query.feedback.findMany()

server/utils/team.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export const getCoreMembers = cachedFunction(async () => {
2+
return await $fetch<{
3+
login: string
4+
}[]>('https://api.nuxt.com/teams/core')
5+
}, {
6+
maxAge: 60 * 60, // 1 hour
7+
getKey: () => 'core-members'
8+
})
9+
10+
export async function isCoreTeamMember(login: string) {
11+
const coreMembers = await getCoreMembers()
12+
if (!coreMembers) {
13+
throw createError({
14+
statusCode: 500,
15+
statusMessage: 'Failed to fetch core team members.'
16+
})
17+
}
18+
return coreMembers.some(member => member.login.toLowerCase() === login)
19+
}

0 commit comments

Comments
 (0)