fix(api): secure spotlight catalogs

This commit is contained in:
ajnart committed 2026-08-24 09:23:23 +02:00
1 parent 7acff56abb
commit 6316fa5407
2 files changed
+30 -21

No files matched your search

+10 -8
View File
@@ -181,13 +181,7 @@ const searchAccessibleBoardsAsync = async (
where: eq(boardUserPermissions.userId, ctx.session?.user.id ?? ""),
},
groupPermissions: {
where:
permissionsOfCurrentUserGroupsWhenPresent.length >= 1
? inArray(
boardGroupPermissions.groupId,
permissionsOfCurrentUserGroupsWhenPresent.map((groupMember) => groupMember.groupId),
)
: undefined,
where: getBoardGroupPermissionWhere(permissionsOfCurrentUserGroupsWhenPresent),
},
},
});
@@ -561,9 +555,17 @@ export const boardRouter = createTRPCRouter({
};
});
}),
catalog: publicProcedure.query(async ({ ctx }) => searchAccessibleBoardsAsync(ctx, "")),
catalog: publicProcedure
.meta({ mcp: { enabled: true, description: "List every board the current user can access." } })
.query(async ({ ctx }) => searchAccessibleBoardsAsync(ctx, "")),
search: publicProcedure
.input(z.object({ query: z.string(), limit: z.number().min(1).max(100).default(10) }))
.meta({
mcp: {
enabled: true,
description: "Search accessible boards by name. REQUIRED: query (string). OPTIONAL: limit (number).",
},
})
.query(async ({ ctx, input }) => searchAccessibleBoardsAsync(ctx, input.query, input.limit)),
createBoard: permissionRequiredProcedure
.requiresPermission("board-create")
@@ -130,21 +130,28 @@ export const searchEngineRouter = createTRPCRouter({
return null;
}),
catalog: publicProcedure.query(async ({ ctx }) => {
return await ctx.db.query.searchEngines.findMany({
where: ctx.session?.user ? undefined : eq(searchEngines.type, "generic"),
orderBy: asc(searchEngines.name),
with: {
integration: {
columns: {
kind: true,
url: true,
id: true,
catalog: publicProcedure
.meta({
mcp: {
enabled: true,
description: "List search engines available to the current user.",
},
})
.query(async ({ ctx }) => {
return await ctx.db.query.searchEngines.findMany({
where: ctx.session?.user ? undefined : eq(searchEngines.type, "generic"),
orderBy: asc(searchEngines.name),
with: {
integration: {
columns: {
kind: true,
url: true,
id: true,
},
},
},
},
});
}),
});
}),
search: publicProcedure.input(searchSchema).query(async ({ ctx, input }) => {
return await ctx.db.query.searchEngines.findMany({
// Public dashboards have no session: restrict anonymous users to generic