diff --git a/backend/src/server/routes/v3/secret-router.ts b/backend/src/server/routes/v3/secret-router.ts index 4e00cfe09..33878f1e7 100644 --- a/backend/src/server/routes/v3/secret-router.ts +++ b/backend/src/server/routes/v3/secret-router.ts @@ -4,7 +4,7 @@ import { z } from "zod"; import { SecretApprovalRequestsSchema, SecretsSchema, SecretType, ServiceTokenScopes } from "@app/db/schemas"; import { EventType, UserAgentType } from "@app/ee/services/audit-log/audit-log-types"; import { ApiDocsTags, RAW_SECRETS, SECRETS } from "@app/lib/api-docs"; -import { BadRequestError, NotFoundError } from "@app/lib/errors"; +import { BadRequestError } from "@app/lib/errors"; import { removeTrailingSlash } from "@app/lib/fn"; import { secretsLimit, writeLimit } from "@app/server/config/rateLimiter"; import { BaseSecretNameSchema, SecretNameSchema } from "@app/server/lib/schemas"; @@ -12,7 +12,6 @@ import { getTelemetryDistinctId } from "@app/server/lib/telemetry"; import { getUserAgentType } from "@app/server/plugins/audit-log"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { ActorType, AuthMode } from "@app/services/auth/auth-type"; -import { ProjectFilterType } from "@app/services/project/project-types"; import { ResourceMetadataSchema } from "@app/services/resource-metadata/resource-metadata-schema"; import { SecretOperations, SecretProtectionType } from "@app/services/secret/secret-types"; import { SecretUpdateMode } from "@app/services/secret-v2-bridge/secret-v2-bridge-types"; @@ -286,22 +285,17 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { environment = scope[0].environment; workspaceId = req.auth.serviceToken.projectId; } - } else if (req.permission.type === ActorType.IDENTITY && req.query.workspaceSlug && !workspaceId) { - const workspace = await server.services.project.getAProject({ - filter: { - type: ProjectFilterType.SLUG, - orgId: req.permission.orgId, - slug: req.query.workspaceSlug - }, + } else { + const projectId = await server.services.project.extractProjectIdFromSlug({ + projectSlug: req.query.workspaceSlug, + projectId: workspaceId, actorId: req.permission.id, actorAuthMethod: req.permission.authMethod, actor: req.permission.type, actorOrgId: req.permission.orgId }); - if (!workspace) throw new NotFoundError({ message: `No project found with slug ${req.query.workspaceSlug}` }); - - workspaceId = workspace.id; + workspaceId = projectId; } if (!workspaceId || !environment) throw new BadRequestError({ message: "Missing workspace id or environment" }); @@ -442,11 +436,23 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { environment = scope[0].environment; workspaceId = req.auth.serviceToken.projectId; } + } else { + const projectId = await server.services.project.extractProjectIdFromSlug({ + projectSlug: workspaceSlug, + projectId: workspaceId, + actorId: req.permission.id, + actorAuthMethod: req.permission.authMethod, + actor: req.permission.type, + actorOrgId: req.permission.orgId + }); + + workspaceId = projectId; } if (!environment) throw new BadRequestError({ message: "Missing environment" }); - if (!workspaceId && !workspaceSlug) + if (!workspaceId) { throw new BadRequestError({ message: "You must provide workspaceSlug or workspaceId" }); + } const secret = await server.services.secret.getSecretByNameRaw({ actorId: req.permission.id, @@ -457,7 +463,6 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { environment, projectId: workspaceId, viewSecretValue: req.query.viewSecretValue, - projectSlug: workspaceSlug, path: secretPath, secretName: req.params.secretName, type: req.query.type, @@ -559,7 +564,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.API_KEY, AuthMode.SERVICE_TOKEN, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { - const workspaceId = await server.services.project.extractProjectIdFromSlug({ + const projectId = await server.services.project.extractProjectIdFromSlug({ projectSlug: req.body.projectSlug, projectId: req.body.workspaceId, actorId: req.permission.id, @@ -574,7 +579,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { actorOrgId: req.permission.orgId, environment: req.body.environment, actorAuthMethod: req.permission.authMethod, - projectId: workspaceId, + projectId, secretPath: req.body.secretPath, secretName: req.params.secretName, type: req.body.type, @@ -592,7 +597,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { const { secret } = secretOperation; await server.services.auditLog.createAuditLog({ - projectId: workspaceId, + projectId, ...req.auditLogInfo, event: { type: EventType.CREATE_SECRET, @@ -612,7 +617,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { distinctId: getTelemetryDistinctId(req), properties: { numberOfSecrets: 1, - workspaceId, + workspaceId: projectId, environment: req.body.environment, secretPath: req.body.secretPath, channel: getUserAgentType(req.headers["user-agent"]), @@ -690,7 +695,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.API_KEY, AuthMode.SERVICE_TOKEN, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { - const workspaceId = await server.services.project.extractProjectIdFromSlug({ + const projectId = await server.services.project.extractProjectIdFromSlug({ projectSlug: req.body.projectSlug, projectId: req.body.workspaceId, actorId: req.permission.id, @@ -705,7 +710,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { actorOrgId: req.permission.orgId, actorAuthMethod: req.permission.authMethod, environment: req.body.environment, - projectId: workspaceId, + projectId, secretPath: req.body.secretPath, secretName: req.params.secretName, type: req.body.type, @@ -727,7 +732,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { const { secret } = secretOperation; await server.services.auditLog.createAuditLog({ - projectId: workspaceId, + projectId, ...req.auditLogInfo, event: { type: EventType.UPDATE_SECRET, @@ -747,7 +752,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { distinctId: getTelemetryDistinctId(req), properties: { numberOfSecrets: 1, - workspaceId, + workspaceId: projectId, environment: req.body.environment, secretPath: req.body.secretPath, channel: getUserAgentType(req.headers["user-agent"]), @@ -801,7 +806,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.API_KEY, AuthMode.SERVICE_TOKEN, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { - const workspaceId = await server.services.project.extractProjectIdFromSlug({ + const projectId = await server.services.project.extractProjectIdFromSlug({ projectSlug: req.body.projectSlug, projectId: req.body.workspaceId, actorId: req.permission.id, @@ -816,7 +821,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { actorAuthMethod: req.permission.authMethod, actorOrgId: req.permission.orgId, environment: req.body.environment, - projectId: workspaceId, + projectId, secretPath: req.body.secretPath, secretName: req.params.secretName, type: req.body.type @@ -828,7 +833,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { const { secret } = secretOperation; await server.services.auditLog.createAuditLog({ - projectId: workspaceId, + projectId, ...req.auditLogInfo, event: { type: EventType.DELETE_SECRET, @@ -847,7 +852,7 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => { distinctId: getTelemetryDistinctId(req), properties: { numberOfSecrets: 1, - workspaceId, + workspaceId: projectId, environment: req.body.environment, secretPath: req.body.secretPath, channel: getUserAgentType(req.headers["user-agent"]), diff --git a/backend/src/services/secret/secret-service.ts b/backend/src/services/secret/secret-service.ts index d5c836ff7..159bee8e3 100644 --- a/backend/src/services/secret/secret-service.ts +++ b/backend/src/services/secret/secret-service.ts @@ -1543,9 +1543,8 @@ export const secretServiceFactory = ({ actor, environment, viewSecretValue, - projectId: workspaceId, + projectId, expandSecretReferences, - projectSlug, actorId, actorOrgId, actorAuthMethod, @@ -1553,7 +1552,6 @@ export const secretServiceFactory = ({ includeImports, version }: TGetASecretRawDTO) => { - const projectId = workspaceId || (await projectDAL.findProjectBySlug(projectSlug as string, actorOrgId)).id; const { botKey, shouldUseSecretV2Bridge } = await projectBotService.getBotKey(projectId); if (shouldUseSecretV2Bridge) { const secret = await secretV2BridgeService.getSecretByName({ diff --git a/backend/src/services/secret/secret-types.ts b/backend/src/services/secret/secret-types.ts index 91fc2eb6a..12b8e7175 100644 --- a/backend/src/services/secret/secret-types.ts +++ b/backend/src/services/secret/secret-types.ts @@ -229,8 +229,7 @@ export type TGetASecretRawDTO = { type: "shared" | "personal"; includeImports?: boolean; version?: number; - projectSlug?: string; - projectId?: string; + projectId: string; } & Omit; export type TGetASecretByIdRawDTO = {