From 343514d4ebccb5e27c1a31aa9a603be9589cb9a7 Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sun, 5 Apr 2026 18:12:13 -0600 Subject: [PATCH] fix: allow members to use SSH keys for deployments without full SSH key access Add allForApps endpoint that returns only sshKeyId and name using protectedProcedure instead of withPermission, so members can select SSH keys in the git provider dropdown without needing access to the SSH Keys management panel. closes #4069 --- .../general/generic/save-git-provider.tsx | 2 +- .../generic/save-git-provider-compose.tsx | 2 +- apps/dokploy/server/api/routers/ssh-key.ts | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/apps/dokploy/components/dashboard/application/general/generic/save-git-provider.tsx b/apps/dokploy/components/dashboard/application/general/generic/save-git-provider.tsx index 37a387bb5..cb3190e0b 100644 --- a/apps/dokploy/components/dashboard/application/general/generic/save-git-provider.tsx +++ b/apps/dokploy/components/dashboard/application/general/generic/save-git-provider.tsx @@ -55,7 +55,7 @@ interface Props { export const SaveGitProvider = ({ applicationId }: Props) => { const { data, refetch } = api.application.one.useQuery({ applicationId }); - const { data: sshKeys } = api.sshKey.all.useQuery(); + const { data: sshKeys } = api.sshKey.allForApps.useQuery(); const router = useRouter(); const { mutateAsync, isPending } = diff --git a/apps/dokploy/components/dashboard/compose/general/generic/save-git-provider-compose.tsx b/apps/dokploy/components/dashboard/compose/general/generic/save-git-provider-compose.tsx index c84a55bb3..7878225a9 100644 --- a/apps/dokploy/components/dashboard/compose/general/generic/save-git-provider-compose.tsx +++ b/apps/dokploy/components/dashboard/compose/general/generic/save-git-provider-compose.tsx @@ -55,7 +55,7 @@ interface Props { export const SaveGitProviderCompose = ({ composeId }: Props) => { const { data, refetch } = api.compose.one.useQuery({ composeId }); - const { data: sshKeys } = api.sshKey.all.useQuery(); + const { data: sshKeys } = api.sshKey.allForApps.useQuery(); const router = useRouter(); const { mutateAsync, isPending } = api.compose.update.useMutation(); diff --git a/apps/dokploy/server/api/routers/ssh-key.ts b/apps/dokploy/server/api/routers/ssh-key.ts index 68ab14616..aa758a0ea 100644 --- a/apps/dokploy/server/api/routers/ssh-key.ts +++ b/apps/dokploy/server/api/routers/ssh-key.ts @@ -8,7 +8,11 @@ import { import { db } from "@dokploy/server/db"; import { TRPCError } from "@trpc/server"; import { desc, eq } from "drizzle-orm"; -import { createTRPCRouter, withPermission } from "@/server/api/trpc"; +import { + createTRPCRouter, + protectedProcedure, + withPermission, +} from "@/server/api/trpc"; import { audit } from "@/server/api/utils/audit"; import { apiCreateSshKey, @@ -83,6 +87,16 @@ export const sshRouter = createTRPCRouter({ orderBy: desc(sshKeys.createdAt), }); }), + allForApps: protectedProcedure.query(async ({ ctx }) => { + return await db.query.sshKeys.findMany({ + columns: { + sshKeyId: true, + name: true, + }, + where: eq(sshKeys.organizationId, ctx.session.activeOrganizationId), + orderBy: desc(sshKeys.createdAt), + }); + }), generate: withPermission("sshKeys", "read") .input(apiGenerateSSHKey) .mutation(async ({ input }) => {