Skip to content

Commit a596ca1

Browse files
shushushvsteipete
andauthored
fix(openai): allow fake-IP Realtime requests (#86526)
Co-authored-by: Peter Steinberger <[email protected]>
1 parent e5798e5 commit a596ca1

3 files changed

Lines changed: 21 additions & 3 deletions

File tree

extensions/openai/realtime-provider-shared.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,20 @@ import {
66
resolveProviderRequestHeaders,
77
} from "openclaw/plugin-sdk/provider-http";
88
import { captureWsEvent } from "openclaw/plugin-sdk/proxy-capture";
9-
import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
9+
import { fetchWithSsrFGuard, type SsrFPolicy } from "openclaw/plugin-sdk/ssrf-runtime";
1010
import {
1111
asFiniteNumber,
1212
asOptionalRecord as asObjectRecord,
1313
normalizeOptionalString,
1414
} from "openclaw/plugin-sdk/string-coerce-runtime";
1515

16+
const OPENAI_REALTIME_API_BASE_URL = "https://api.openai.com/v1";
17+
const OPENAI_REALTIME_SSRF_POLICY = {
18+
allowRfc2544BenchmarkRange: true,
19+
allowIpv6UniqueLocalRange: true,
20+
hostnameAllowlist: [new URL(OPENAI_REALTIME_API_BASE_URL).hostname],
21+
} satisfies SsrFPolicy;
22+
1623
export const trimToUndefined = normalizeOptionalString;
1724
export { asFiniteNumber, asObjectRecord };
1825

@@ -104,6 +111,7 @@ async function createOpenAIRealtimeSecret(
104111
},
105112
body: JSON.stringify(params.body),
106113
},
114+
policy: OPENAI_REALTIME_SSRF_POLICY,
107115
auditContext: params.auditContext,
108116
});
109117
const payload = await (async () => {
@@ -140,7 +148,7 @@ export async function createOpenAIRealtimeClientSecret(params: {
140148
auditContext: string;
141149
session: Record<string, unknown>;
142150
}): Promise<OpenAIRealtimeClientSecretResult> {
143-
const url = "https://api.openai.com/v1/realtime/client_secrets";
151+
const url = `${OPENAI_REALTIME_API_BASE_URL}/realtime/client_secrets`;
144152
return createOpenAIRealtimeSecret({
145153
...params,
146154
url,
@@ -155,7 +163,7 @@ export async function createOpenAIRealtimeTranscriptionClientSecret(params: {
155163
auditContext: string;
156164
session: Record<string, unknown>;
157165
}): Promise<OpenAIRealtimeClientSecretResult> {
158-
const url = "https://api.openai.com/v1/realtime/transcription_sessions";
166+
const url = `${OPENAI_REALTIME_API_BASE_URL}/realtime/transcription_sessions`;
159167
return createOpenAIRealtimeSecret({
160168
...params,
161169
url,

extensions/openai/realtime-transcription-provider.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ describe("buildOpenAIRealtimeTranscriptionProvider", () => {
240240
const request = mockCallArg(ssrfMocks.fetchWithSsrFGuard);
241241
expect(request.auditContext).toBe("openai-realtime-transcription-session");
242242
expect(request.url).toBe("https://api.openai.com/v1/realtime/transcription_sessions");
243+
expect(request.policy).toEqual({
244+
allowRfc2544BenchmarkRange: true,
245+
allowIpv6UniqueLocalRange: true,
246+
hostnameAllowlist: ["api.openai.com"],
247+
});
243248
const init = request.init as {
244249
method?: string;
245250
headers?: Record<string, string>;

extensions/openai/realtime-voice-provider.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,11 @@ describe("buildOpenAIRealtimeVoiceProvider", () => {
525525

526526
expectRecordFields(requireFetchRequest(), "fetch request", {
527527
url: "https://api.openai.com/v1/realtime/client_secrets",
528+
policy: {
529+
allowRfc2544BenchmarkRange: true,
530+
allowIpv6UniqueLocalRange: true,
531+
hostnameAllowlist: ["api.openai.com"],
532+
},
528533
});
529534
expectRecordFields(requireFetchInit(), "fetch init", { method: "POST" });
530535
expectRecordFields(requireFetchHeaders(), "fetch headers", {

0 commit comments

Comments
 (0)