Skip to content

Commit a657723

Browse files
authored
fix: add session and permission checks to webhook settings page (calcom#28769)
1 parent 2911168 commit a657723

1 file changed

Lines changed: 28 additions & 0 deletions

File tree

  • apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/[id]

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/developer/webhooks/[id]/page.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import type { PageProps } from "app/_types";
22
import { _generateMetadata } from "app/_utils";
3+
import { cookies, headers } from "next/headers";
4+
import { notFound, redirect } from "next/navigation";
35

6+
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
7+
import { PermissionCheckService } from "@calcom/features/pbac/services/permission-check.service";
48
import { WebhookRepository } from "@calcom/features/webhooks/lib/repository/WebhookRepository";
59
import { APP_NAME } from "@calcom/lib/constants";
10+
import { MembershipRole } from "@calcom/prisma/enums";
11+
12+
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
613

714
import { EditWebhookView } from "~/webhooks/views/webhook-edit-view";
815

@@ -16,12 +23,33 @@ export const generateMetadata = async ({ params }: { params: Promise<{ id: strin
1623
);
1724

1825
const Page = async ({ params: _params }: PageProps) => {
26+
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
27+
if (!session?.user?.id) {
28+
return redirect("/auth/login");
29+
}
30+
1931
const params = await _params;
2032
const id = typeof params?.id === "string" ? params.id : undefined;
2133

2234
const webhookRepository = WebhookRepository.getInstance();
2335
const webhook = await webhookRepository.findByWebhookId(id);
2436

37+
// Ownership check: align with PBAC middleware in webhook/util.ts
38+
if (webhook.teamId) {
39+
const permissionService = new PermissionCheckService();
40+
const hasPermission = await permissionService.checkPermission({
41+
userId: session.user.id,
42+
teamId: webhook.teamId,
43+
permission: "webhook.read",
44+
fallbackRoles: [MembershipRole.ADMIN, MembershipRole.OWNER, MembershipRole.MEMBER],
45+
});
46+
if (!hasPermission) {
47+
notFound();
48+
}
49+
} else if (webhook.userId !== session.user.id) {
50+
notFound();
51+
}
52+
2553
return <EditWebhookView webhook={webhook} />;
2654
};
2755

0 commit comments

Comments
 (0)