From d41907a5cb2c02fcc88a2c914428fd4c8f541bf6 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 14 May 2026 15:08:16 +0800 Subject: [PATCH] fix(slack): ignore malformed media redirects --- CHANGELOG.md | 1 + extensions/slack/src/monitor/media.test.ts | 14 ++++++++++++++ extensions/slack/src/monitor/media.ts | 7 ++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce1b2e5cd15f..8feaadb4e7f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ Docs: https://docs.openclaw.ai - Media fetch: skip allocating and buffering the response body for bodyless media responses (HEAD probes and 204-style empty bodies), avoiding wasted heap on streams that carry no payload. Thanks @shakkernerd. - CLI/onboarding: forward provider-specific auth flags (e.g. `--openai-api-key`) through the onboarding wizard so they reach provider auth methods via `ctx.opts`, letting `--openai-api-key "$OPENAI_API_KEY"` skip the redundant "use existing env var?" prompt in non-interactive harnesses. (#81669) Thanks @sjf. - CLI/migrate: drop trailing periods from Codex migrate item messages and `REASON_CODE_MESSAGES` strings so plan/result rows read as labels instead of sentence fragments. (#81705) Thanks @sjf. +- Slack: treat malformed private-file redirect `Location` headers as unfollowable redirects instead of failing Slack media downloads. - Matrix: ignore malformed percent-encoding in optional location URI parameters instead of letting a bad `geo:` event abort inbound message handling. - Plugins: discover provider plugins from `setup.providers[].envVars` credentials during provider discovery while keeping the deprecated `providerAuthEnvVars` fallback. (#81542) Thanks @JARVIS-Glasses. - Docs/Codex harness: clarify that per-agent `CODEX_HOME` isolates `~/.codex` while inherited `HOME` intentionally keeps `.agents` discovery and subprocess user-home state available. diff --git a/extensions/slack/src/monitor/media.test.ts b/extensions/slack/src/monitor/media.test.ts index a9efb7e6a295..8d1d6317061d 100644 --- a/extensions/slack/src/monitor/media.test.ts +++ b/extensions/slack/src/monitor/media.test.ts @@ -359,6 +359,20 @@ describe("fetchWithSlackAuth", () => { expect(mockFetch).toHaveBeenCalledTimes(1); }); + it("returns redirect response when location header is malformed", async () => { + const redirectResponse = new Response(null, { + status: 302, + headers: { location: "http://[::1" }, + }); + + mockFetch.mockResolvedValueOnce(redirectResponse); + + const result = await fetchWithSlackAuth("https://files.slack.com/test.jpg", "xoxb-test-token"); + + expect(result).toBe(redirectResponse); + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + it("returns 4xx/5xx responses directly without following", async () => { const errorResponse = new Response("Not Found", { status: 404, diff --git a/extensions/slack/src/monitor/media.ts b/extensions/slack/src/monitor/media.ts index 069bde820033..195b90ef3e56 100644 --- a/extensions/slack/src/monitor/media.ts +++ b/extensions/slack/src/monitor/media.ts @@ -122,7 +122,12 @@ export async function fetchWithSlackAuth(url: string, token: string): Promise