|
1 | 1 | import { Type } from "typebox"; |
2 | 2 | import type { OpenClawConfig } from "../../config/types.openclaw.js"; |
3 | | -import { SsrFBlockedError, type LookupFn } from "../../infra/net/ssrf.js"; |
| 3 | +import { SsrFBlockedError, type LookupFn, type SsrFPolicy } from "../../infra/net/ssrf.js"; |
4 | 4 | import { logDebug } from "../../logger.js"; |
5 | 5 | import type { RuntimeWebFetchMetadata } from "../../secrets/runtime-web-tools.types.js"; |
6 | 6 | import { wrapExternalContent, wrapWebContent } from "../../security/external-content.js"; |
@@ -274,6 +274,7 @@ type WebFetchRuntimeParams = { |
274 | 274 | config?: OpenClawConfig; |
275 | 275 | ssrfPolicy?: { |
276 | 276 | allowRfc2544BenchmarkRange?: boolean; |
| 277 | + allowIpv6UniqueLocalRange?: boolean; |
277 | 278 | }; |
278 | 279 | lookupFn?: LookupFn; |
279 | 280 | resolveProviderFallback: () => Promise<WebFetchProviderFallback>; |
@@ -389,8 +390,16 @@ async function maybeFetchProviderWebFetchPayload( |
389 | 390 |
|
390 | 391 | async function runWebFetch(params: WebFetchRuntimeParams): Promise<Record<string, unknown>> { |
391 | 392 | const allowRfc2544BenchmarkRange = params.ssrfPolicy?.allowRfc2544BenchmarkRange === true; |
| 393 | + const allowIpv6UniqueLocalRange = params.ssrfPolicy?.allowIpv6UniqueLocalRange === true; |
| 394 | + const ssrfPolicy: SsrFPolicy | undefined = |
| 395 | + allowRfc2544BenchmarkRange || allowIpv6UniqueLocalRange |
| 396 | + ? { |
| 397 | + ...(allowRfc2544BenchmarkRange ? { allowRfc2544BenchmarkRange } : {}), |
| 398 | + ...(allowIpv6UniqueLocalRange ? { allowIpv6UniqueLocalRange } : {}), |
| 399 | + } |
| 400 | + : undefined; |
392 | 401 | const cacheKey = normalizeCacheKey( |
393 | | - `fetch:${params.url}:${params.extractMode}:${params.maxChars}${allowRfc2544BenchmarkRange ? ":allow-rfc2544" : ""}`, |
| 402 | + `fetch:${params.url}:${params.extractMode}:${params.maxChars}${allowRfc2544BenchmarkRange ? ":allow-rfc2544" : ""}${allowIpv6UniqueLocalRange ? ":allow-ipv6-ula" : ""}`, |
394 | 403 | ); |
395 | 404 | const cached = readCache(FETCH_CACHE, cacheKey); |
396 | 405 | if (cached) { |
@@ -418,7 +427,7 @@ async function runWebFetch(params: WebFetchRuntimeParams): Promise<Record<string |
418 | 427 | maxRedirects: params.maxRedirects, |
419 | 428 | timeoutSeconds: params.timeoutSeconds, |
420 | 429 | lookupFn: params.lookupFn, |
421 | | - policy: allowRfc2544BenchmarkRange ? { allowRfc2544BenchmarkRange } : undefined, |
| 430 | + policy: ssrfPolicy, |
422 | 431 | init: { |
423 | 432 | headers: { |
424 | 433 | Accept: "text/markdown, text/html;q=0.9, */*;q=0.1", |
|
0 commit comments