feat: restrict integrations management to integration-full-all permission (#6509)

This commit is contained in:
Thomas authored and GitHub committed 2026-08-03 17:04:35 +02:00
1 parent f1b7a5146a
commit 2f6b96e5ba
8 files changed
+25 -8

No files matched your search

@@ -1,5 +1,7 @@
import { notFound } from "next/navigation";
import { Container, Fieldset, Group, Stack, Title } from "@mantine/core";
import { auth } from "@homarr/auth/next";
import { api } from "@homarr/api/server";
import { getIntegrationName } from "@homarr/definitions";
import { getI18n, getScopedI18n } from "@homarr/translation/server";
@@ -16,6 +18,11 @@ interface EditIntegrationPageProps {
export default async function EditIntegrationPage(props: EditIntegrationPageProps) {
const params = await props.params;
const session = await auth();
if (!session?.user.permissions.includes("integration-full-all")) {
notFound();
}
const editT = await getScopedI18n("integration.page.edit");
const t = await getI18n();
const integration = await api.integration.byId({ id: params.id }).catch(catchTrpcNotFound);
@@ -23,7 +23,10 @@ interface NewIntegrationPageProps {
export default async function IntegrationsNewPage(props: NewIntegrationPageProps) {
const searchParams = await props.searchParams;
const session = await auth();
if (!session?.user.permissions.includes("integration-create")) {
if (
!session?.user.permissions.includes("integration-full-all") ||
!session?.user.permissions.includes("integration-create")
) {
notFound();
}
@@ -1,5 +1,5 @@
import { Fragment } from "react";
import { redirect } from "next/navigation";
import { notFound, redirect } from "next/navigation";
import {
AccordionControl,
AccordionItem,
@@ -50,6 +50,9 @@ export default async function IntegrationsPage(props: IntegrationsPageProps) {
if (!session) {
redirect("/auth/login");
}
if (!session.user.permissions.includes("integration-full-all")) {
notFound();
}
const integrations = await api.integration.all();
const t = await getScopedI18n("integration");
@@ -71,7 +71,7 @@ export default async function ManageLayout({ children }: PropsWithChildren) {
icon: IconAffiliateFilled,
href: "/manage/integrations",
label: t("items.integrations"),
hidden: !session?.user.permissions.includes("integration-create"),
hidden: !session?.user.permissions.includes("integration-full-all"),
"data-onboarding-tour-id": "manage-integrations",
},
{