diff --git a/backend/src/db/migrations/20250903191434_audit-log-stream-v2.ts b/backend/src/db/migrations/20250903191434_audit-log-stream-v2.ts index 21d652c86..c3705046c 100644 --- a/backend/src/db/migrations/20250903191434_audit-log-stream-v2.ts +++ b/backend/src/db/migrations/20250903191434_audit-log-stream-v2.ts @@ -198,7 +198,11 @@ export async function down(knex: Knex): Promise { .merge(); } - await knex(TableName.AuditLogStream).whereNot("provider", "custom").orWhereNull("url").del(); + await knex(TableName.AuditLogStream) + .where((qb) => { + void qb.whereNot("provider", "custom").orWhereNull("url"); + }) + .del(); await knex.schema.alterTable(TableName.AuditLogStream, (t) => { t.string("url").notNullable().alter(); diff --git a/backend/src/ee/routes/v1/index.ts b/backend/src/ee/routes/v1/index.ts index 35179c845..8bf066013 100644 --- a/backend/src/ee/routes/v1/index.ts +++ b/backend/src/ee/routes/v1/index.ts @@ -120,9 +120,11 @@ export const registerV1EERoutes = async (server: FastifyZodProvider) => { await auditLogStreamRouter.register(registerAuditLogStreamRouter); // Provider-specific endpoints - for await (const [provider, router] of Object.entries(AUDIT_LOG_STREAM_REGISTER_ROUTER_MAP)) { - await auditLogStreamRouter.register(router, { prefix: `/${provider}` }); - } + await Promise.all( + Object.entries(AUDIT_LOG_STREAM_REGISTER_ROUTER_MAP).map(([provider, router]) => + auditLogStreamRouter.register(router, { prefix: `/${provider}` }) + ) + ); }, { prefix: "/audit-log-streams" } ); diff --git a/backend/src/ee/services/audit-log-stream/custom/custom-provider-schemas.ts b/backend/src/ee/services/audit-log-stream/custom/custom-provider-schemas.ts index 032f81be8..dbb4e5d59 100644 --- a/backend/src/ee/services/audit-log-stream/custom/custom-provider-schemas.ts +++ b/backend/src/ee/services/audit-log-stream/custom/custom-provider-schemas.ts @@ -1,3 +1,4 @@ +import RE2 from "re2"; import { z } from "zod"; import { LogProvider } from "../audit-log-stream-enums"; @@ -7,8 +8,14 @@ export const CustomProviderCredentialsSchema = z.object({ url: z.string().url().trim().min(1).max(255), headers: z .object({ - key: z.string().min(1), - value: z.string().min(1) + key: z + .string() + .min(1) + .refine((val) => new RE2(/^[^\n\r]+$/).test(val), "Header keys cannot contain newlines or carriage returns"), + value: z + .string() + .min(1) + .refine((val) => new RE2(/^[^\n\r]+$/).test(val), "Header values cannot contain newlines or carriage returns") }) .array() }); diff --git a/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-factory.ts b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-factory.ts index 5481c44eb..72fc90ce2 100644 --- a/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-factory.ts +++ b/backend/src/ee/services/audit-log-stream/splunk/splunk-provider-factory.ts @@ -14,7 +14,7 @@ function createPayload(event: Record) { return { time: Math.floor(Date.now() / 1000), - host: new URL(appCfg.SITE_URL || "http://infisical").host, + ...(appCfg.SITE_URL && { host: new URL(appCfg.SITE_URL).host }), source: "infisical", sourcetype: "_json", event @@ -29,7 +29,7 @@ async function createSplunkUrl(hostname: string) { throw new BadRequestError({ message: `Invalid Splunk hostname provided: ${(error as Error).message}` }); } - await blockLocalAndPrivateIpAddresses(`https://${hostname}`); + await blockLocalAndPrivateIpAddresses(`https://${parsedHostname}`); return `https://${parsedHostname}:8088/services/collector/event`; } diff --git a/frontend/src/helpers/auditLogStreams.ts b/frontend/src/helpers/auditLogStreams.ts index c3d36a512..2fd4e0858 100644 --- a/frontend/src/helpers/auditLogStreams.ts +++ b/frontend/src/helpers/auditLogStreams.ts @@ -13,6 +13,7 @@ export const AUDIT_LOG_STREAM_PROVIDER_MAP: Record< [LogProvider.Splunk]: { name: "Splunk", image: "Splunk.png", size: 65 } }; +// Strictly for showing to the client in the front-end export function getProviderUrl( logStream: DiscriminativePick ) { diff --git a/frontend/src/hooks/api/auditLogStreams/mutations.tsx b/frontend/src/hooks/api/auditLogStreams/mutations.tsx index 67246baa0..24253ca63 100644 --- a/frontend/src/hooks/api/auditLogStreams/mutations.tsx +++ b/frontend/src/hooks/api/auditLogStreams/mutations.tsx @@ -16,7 +16,7 @@ export const useCreateAuditLogStream = () => { mutationFn: async ({ provider, ...params }: TCreateAuditLogStreamDTO) => { const { data } = await apiRequest.post<{ auditLogStream: TAuditLogStream }>( `/api/v1/audit-log-streams/${provider}`, - { ...params, provider } + params ); return data.auditLogStream; diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamTable.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamTable.tsx index a9f739acc..152f1d1c7 100644 --- a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamTable.tsx +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/AuditLogStreamTable.tsx @@ -255,7 +255,7 @@ export const AuditLogStreamTable = () => { {isPending && ( )} diff --git a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/LogStreamProviderSelect.tsx b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/LogStreamProviderSelect.tsx index af81cb9ca..26708e17b 100644 --- a/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/LogStreamProviderSelect.tsx +++ b/frontend/src/pages/organization/SettingsPage/components/AuditLogStreamTab/components/LogStreamProviderSelect.tsx @@ -92,7 +92,7 @@ export const LogStreamProviderSelect = ({ onSelect }: Props) => { ); })} - {!filteredOptions?.length && ( + {!filteredOptions.length && (