Skip to content

fix(mattermost): bound successful REST JSON/text response reads#96033

Merged
sallyom merged 3 commits into
openclaw:mainfrom
Alix-007:fix/bound-mattermost-client-response
Jun 28, 2026
Merged

fix(mattermost): bound successful REST JSON/text response reads#96033
sallyom merged 3 commits into
openclaw:mainfrom
Alix-007:fix/bound-mattermost-client-response

Conversation

@Alix-007

@Alix-007 Alix-007 commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

The Mattermost REST success path buffered untrusted server JSON/text responses without a size cap. extensions/mattermost/src/mattermost/client.ts talks to Mattermost servers the plugin does not control: self-hosted instances, LAN deployments, or compromised/malfunctioning hosts. The client already hardened two of its three read paths:

  • error bodies are bounded via readResponseTextLimited (8 KiB), and
  • guarded responses are streamed through responseWithRelease instead of arrayBuffer(),

but the successful response path was still unbounded. request() called await res.json() / await res.text(), and uploadMattermostFile() called await res.json() on the file-info result. Each of those buffers the entire body into memory before parsing.

A Mattermost server can return a response with no Content-Length and an arbitrarily large — or never-terminating — JSON/text body (every REST call goes through request(): users, channels, posts, file uploads). Because nothing capped the success path, the plugin would buffer the whole stream, applying unbounded memory pressure / hang to the plugin and the surrounding agent runtime. This is not generic cleanup: it closes the one remaining unbounded ingest point on an untrusted-server boundary.

Changes

  • Bound request() JSON success bodies with shared readProviderJsonResponse (16 MiB cap; cancels the stream and throws a bounded … exceeds 16777216 bytes error on overflow, then wraps malformed JSON), matching the provider HTTP path used elsewhere in the repo.
  • Bound request() non-JSON success bodies at 64 KiB and reject on overflow instead of returning a silently truncated prefix (non-JSON success bodies are a rare fallback; the API is JSON-first).
  • Bound uploadMattermostFile() file-info JSON the same way through readProviderJsonResponse.
  • Reused existing helpers only (readProviderJsonResponse, readResponseTextLimited from openclaw/plugin-sdk/provider-http) with no new abstraction and no second buffering layer added to the guarded fetch adapter or the error path.
  • Added regression tests proving oversized guarded success JSON and oversized text/plain success bodies throw bounded errors and cancel the upstream stream early.

Real behavior proof

  • Behavior addressed: a successful Mattermost REST JSON/text response with no Content-Length and a body larger than the cap is no longer buffered unbounded; the stream is cancelled at the cap and a bounded error is thrown. Normal small responses still parse intact.
  • Real environment tested: local node:http server bound to 127.0.0.1 (no Content-Length), driving the real exported createMattermostClient(...).request(...) and uploadMattermostFile(...) through the production guarded fetch path (fetchWithSsrFGuard + allowPrivateNetwork), under node --import tsx.
  • Exact steps:
    1. Server streams 1 MiB {-chunks forever with content-type: application/json and no Content-Length.
    2. client.request("/flood-json") is awaited; the server counts chunks actually written and tracks socket close.
    3. uploadMattermostFile(...) is pointed at the same flood endpoint.
    4. Negative control: a finite-but-oversized 40 MiB body is read once via the old unbounded await res.text() and once via the new bounded request().
    5. Normal small JSON and small text responses are requested to confirm they still parse intact.
  • Evidence after fix (proof harness, 7/7 PASS):
    PASS normal-json-intact {"id":"post-1","message":"hello"}
    PASS normal-text-intact "plain-ok-body"
    PASS oversized-json-throws-bounded Mattermost API /flood-json: JSON response exceeds 16777216 bytes
    PASS oversized-json-cancelled-early chunksWrittenAtThrow=19
    PASS oversized-json-socket-released socketClosed=true
    PASS upload-oversized-throws-bounded Mattermost API /files: JSON response exceeds 16777216 bytes
    PASS negative-control-unbounded-buffers-all unboundedBytes=42991618 serverWroteMiB=41 (bounded path cancelled at 19 MiB)
    SUMMARY pass=7 fail=0
    
  • Observed result: bounded path throws JSON response exceeds 16777216 bytes, the server stops after writing ~17-19 MiB (reader cancelled just past the 16 MiB cap), and the socket is released. The negative control proves the cap is load-bearing: the old await res.text() drained and buffered the entire 41 MiB body (42,991,618 bytes) — i.e. it would have OOM'd on a truly unbounded body — while the new path cancelled at ~19 MiB.
  • What was not tested: I did not run against a real production Mattermost server (used a local untrusted-server simulator), and did not change the websocket / media binary download paths or the readMattermostError !res.body in-memory fallback branch (already bounded / not an unbounded network read).

Evidence

  • Proof harness: node --import ./node_modules/tsx/dist/loader.mjs proof.mtsSUMMARY pass=7 fail=0 (output above; harness not committed).
  • node scripts/run-vitest.mjs extensions/mattermost/src/mattermost/client.test.ts --run23 passed (includes the new "bounds and cancels oversized guarded Mattermost success JSON bodies" regression test).
  • oxlint extensions/mattermost/src/mattermost/client.ts → clean.
  • tsgo:extensions (tsconfig.extensions.json, the CI extensions typecheck) → no mattermost/client.ts errors.
  • check-extension-plugin-sdk-boundary.mjs --mode=plugin-sdk-internal → no violations (imports are public plugin-sdk entrypoints).

This is the symmetric follow-up to the #95103 / #95108 response-limit campaign, applying the same bounded-stream discipline to the last unbounded read point in the Mattermost REST client's success path.

Refreshed current-head focused validation after fixing text overflow semantics:

$ node scripts/run-vitest.mjs extensions/mattermost/src/mattermost/client.test.ts extensions/mattermost/src/mattermost/probe.test.ts -- --run

 Test Files  2 passed (2)
      Tests  32 passed (32)
$ git diff --check
# no output

Known validation note: node scripts/run-tsgo.mjs -p extensions/mattermost/tsconfig.json --incremental false runs in this worktree now, but fails on existing Mattermost SDK/API drift outside the touched client.ts/client.test.ts surface (for example extensions/mattermost/src/channel.ts and monitor/reaction imports from plugin-sdk).

Label: security

AI-assisted.

The Mattermost REST client already bounds error bodies
(readResponseTextLimited) and streams guarded responses without buffering,
but the success path still called `await res.json()` / `await res.text()`,
reading the whole body into memory before parsing. A self-hosted or
compromised Mattermost server can return an arbitrarily large (or
never-terminating, content-length-less) JSON/text body and force the plugin
to buffer it unbounded.

Read successful JSON through the shared readProviderJsonResponse (16 MiB cap,
cancels the stream and throws a bounded error on overflow, same as the
provider HTTP path) and cap non-JSON success bodies with readResponseTextLimited.
uploadMattermostFile's file-info JSON is bounded the same way.

Symmetric follow-up to the openclaw#95103 / openclaw#95108 response-limit campaign.

AI-assisted.
@openclaw-barnacle openclaw-barnacle Bot added channel: mattermost Channel integration: mattermost size: S labels Jun 23, 2026
@Alix-007

Copy link
Copy Markdown
Contributor Author

@clawsweeper review

@clawsweeper

clawsweeper Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper

clawsweeper Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 26, 2026, 2:22 AM ET / 06:22 UTC.

Summary
The branch replaces Mattermost REST success JSON reads in client, upload, and probe paths with shared bounded parsing, adds a throwing 64 KiB text fallback, and covers oversized stream cancellation in tests.

PR surface: Source +23, Tests +93. Total +116 across 4 files.

Reproducibility: yes. source-level. Current main and v2026.6.10 use unbounded res.json()/res.text() in Mattermost success paths, and the PR body provides terminal proof with a no-Content-Length streaming server; I did not run tests in this read-only review.

Review metrics: 1 noteworthy metric.

  • Bounded Mattermost success reads: 3 JSON paths and 1 text fallback changed. These hard caps are the compatibility-sensitive behavior change maintainers should consciously accept before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P2] Have a maintainer explicitly accept or tune the response-size caps before merge.

Risk before merge

  • [P1] Merging this intentionally makes oversized Mattermost success responses fail at the shared 16 MiB JSON cap or 64 KiB text cap, so maintainers need to accept or tune that compatibility tradeoff for unusual self-hosted servers.

Maintainer options:

  1. Accept the bounded-reader hardening (recommended)
    Merge after maintainer acceptance that oversized Mattermost success responses should fail at the new caps rather than buffer unbounded.
  2. Tune caps before merge
    If legitimate self-hosted Mattermost control-plane responses can exceed these budgets, adjust the JSON or text limits while keeping bounded cancellation tests.
  3. Pause for owner decision
    If maintainers are not ready to change this response behavior, leave the PR paused until a channel/security owner chooses the permanent cap policy.

Next step before merge

  • No automated repair remains; a maintainer should accept or tune the compatibility-sensitive response caps before merge.

Security
Cleared: No supply-chain regression was found; the diff hardens untrusted Mattermost REST response reads using existing public SDK helpers.

Review details

Best possible solution:

Land the bounded readers and regression tests if maintainers accept the Mattermost response-size caps; otherwise tune the caps before merge while preserving bounded cancellation.

Do we have a high-confidence way to reproduce the issue?

Yes, source-level. Current main and v2026.6.10 use unbounded res.json()/res.text() in Mattermost success paths, and the PR body provides terminal proof with a no-Content-Length streaming server; I did not run tests in this read-only review.

Is this the best way to solve the issue?

Yes, pending maintainer acceptance of the caps. The patch uses shared bounded readers in the client, upload, and probe paths and now rejects oversized text instead of truncating.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 4fc504d321b6.

Label changes

Label justifications:

  • P2: This is normal-priority Mattermost security hardening with limited blast radius to one bundled channel plugin.
  • merge-risk: 🚨 compatibility: The PR changes existing oversized Mattermost success-response behavior from unbounded buffering to hard failure at new caps.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body includes terminal proof from a local no-Content-Length server exercising the exported Mattermost client and upload paths after the fix, plus focused validation output.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes terminal proof from a local no-Content-Length server exercising the exported Mattermost client and upload paths after the fix, plus focused validation output.
Evidence reviewed

PR surface:

Source +23, Tests +93. Total +116 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 2 28 5 +23
Tests 2 93 0 +93
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 4 121 5 +116

What I checked:

Likely related people:

  • jacobtomlinson: Merged PR fix(extensions): route fetch calls through fetchWithSsrFGuard #53929 added the Mattermost guarded fetch wrapper around the client response path now being bounded. (role: introduced guarded client response path; confidence: high; commits: f92c92515bd4, d4946f37f406; files: extensions/mattermost/src/mattermost/client.ts)
  • mappel-nv: The Mattermost probe guard work in PR Mattermost: guard probe fetches #58529 changed the probe path whose successful JSON read this PR now bounds. (role: probe guard contributor; confidence: medium; commits: 2eaf5a695eef, c21267d92b24; files: extensions/mattermost/src/mattermost/probe.ts, extensions/mattermost/src/mattermost/probe.test.ts)
  • damoahdominic: PR feat: add Mattermost channel support #1428 introduced the Mattermost plugin surface containing the client and probe modules. (role: original feature contributor; confidence: medium; commits: 495a39b5a989, bf6df6d6b72f; files: extensions/mattermost/src/mattermost/client.ts, extensions/mattermost/src/mattermost/probe.ts)
  • vincentkoc: The branch explicitly follows recent bounded response-limit work in gateway and agent transports authored and merged by this user. (role: adjacent response-limit contributor; confidence: medium; commits: b073d7cc11dc, d6cefe26f499; files: src/gateway/model-pricing-cache.ts, src/agents/anthropic-transport-stream.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. labels Jun 23, 2026
@Alix-007

Copy link
Copy Markdown
Contributor Author

Addressed the ClawSweeper finding by bounding the sibling Mattermost probe success JSON path too. probeMattermost() now uses the shared readProviderJsonResponse for /users/me, and probe.test.ts covers an oversized streamed no-Content-Length success body cancelling at the cap.\n\nVerified locally:\n- node scripts/run-vitest.mjs extensions/mattermost/src/mattermost/client.test.ts extensions/mattermost/src/mattermost/probe.test.ts --run\n- node scripts/run-tsgo.mjs -p extensions/mattermost/tsconfig.json --incremental false\n- direct oxlint on the changed Mattermost files\n\n@clawsweeper re-review

@Alix-007

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 24, 2026
@Alix-007

Copy link
Copy Markdown
Contributor Author

Addressed the ClawSweeper rank-up move for Mattermost text fallback: oversized non-JSON 2xx responses now reject with a bounded error instead of returning a truncated prefix, and client.test.ts has a focused cancellation regression.

Verified current head:

  • node scripts/run-vitest.mjs extensions/mattermost/src/mattermost/client.test.ts extensions/mattermost/src/mattermost/probe.test.ts -- --run
  • git diff --check

Validation note: node scripts/run-tsgo.mjs -p extensions/mattermost/tsconfig.json --incremental false now runs but fails on existing Mattermost SDK/API drift outside the touched client surface.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Jun 26, 2026
@clawsweeper clawsweeper Bot added status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 26, 2026
@sallyom sallyom self-assigned this Jun 28, 2026
@sallyom

sallyom commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Merge-ready for 3161c88.

Local and ClawSweeper review clean, current CI green, best narrow fix, and follows the established bounded provider-response-read pattern. The caps are acceptable because:

  • this path is Mattermost REST control-plane response handling, not file/media bytes:
    • users/channels/posts/commands are JSON metadata
    • file upload success returns file_infos metadata
    • actual file bytes live on separate file endpoints.
  • The shared 16 MiB JSON cap leaves broad headroom for the current paginated/list and object responses while preventing an untrusted or misbehaving self-hosted server from streaming an unbounded body into JSON parsing.
  • The 64 KiB text cap is also acceptable because successful Mattermost API responses are JSON-first; non-JSON success is only a fallback and should stay bounded rather than buffered wholesale.

@sallyom
sallyom merged commit 9241b97 into openclaw:main Jun 28, 2026
113 of 118 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 29, 2026
…claw#96033)

* fix(mattermost): bound successful REST JSON/text response reads

The Mattermost REST client already bounds error bodies
(readResponseTextLimited) and streams guarded responses without buffering,
but the success path still called `await res.json()` / `await res.text()`,
reading the whole body into memory before parsing. A self-hosted or
compromised Mattermost server can return an arbitrarily large (or
never-terminating, content-length-less) JSON/text body and force the plugin
to buffer it unbounded.

Read successful JSON through the shared readProviderJsonResponse (16 MiB cap,
cancels the stream and throws a bounded error on overflow, same as the
provider HTTP path) and cap non-JSON success bodies with readResponseTextLimited.
uploadMattermostFile's file-info JSON is bounded the same way.

Symmetric follow-up to the openclaw#95103 / openclaw#95108 response-limit campaign.

AI-assisted.

* fix(mattermost): bound probe success JSON reads

* fix(mattermost): reject oversized success text bodies
QiuYuang pushed a commit to QiuYuang/openclaw that referenced this pull request Jul 1, 2026
…claw#96033)

* fix(mattermost): bound successful REST JSON/text response reads

The Mattermost REST client already bounds error bodies
(readResponseTextLimited) and streams guarded responses without buffering,
but the success path still called `await res.json()` / `await res.text()`,
reading the whole body into memory before parsing. A self-hosted or
compromised Mattermost server can return an arbitrarily large (or
never-terminating, content-length-less) JSON/text body and force the plugin
to buffer it unbounded.

Read successful JSON through the shared readProviderJsonResponse (16 MiB cap,
cancels the stream and throws a bounded error on overflow, same as the
provider HTTP path) and cap non-JSON success bodies with readResponseTextLimited.
uploadMattermostFile's file-info JSON is bounded the same way.

Symmetric follow-up to the openclaw#95103 / openclaw#95108 response-limit campaign.

AI-assisted.

* fix(mattermost): bound probe success JSON reads

* fix(mattermost): reject oversized success text bodies
chenyangjun-xy pushed a commit to chenyangjun-xy/openclaw that referenced this pull request Jul 1, 2026
…claw#96033)

* fix(mattermost): bound successful REST JSON/text response reads

The Mattermost REST client already bounds error bodies
(readResponseTextLimited) and streams guarded responses without buffering,
but the success path still called `await res.json()` / `await res.text()`,
reading the whole body into memory before parsing. A self-hosted or
compromised Mattermost server can return an arbitrarily large (or
never-terminating, content-length-less) JSON/text body and force the plugin
to buffer it unbounded.

Read successful JSON through the shared readProviderJsonResponse (16 MiB cap,
cancels the stream and throws a bounded error on overflow, same as the
provider HTTP path) and cap non-JSON success bodies with readResponseTextLimited.
uploadMattermostFile's file-info JSON is bounded the same way.

Symmetric follow-up to the openclaw#95103 / openclaw#95108 response-limit campaign.

AI-assisted.

* fix(mattermost): bound probe success JSON reads

* fix(mattermost): reject oversized success text bodies
Rorqualx pushed a commit to Rorqualx/cortex that referenced this pull request Jul 2, 2026
…claw#96033)

* fix(mattermost): bound successful REST JSON/text response reads

The Mattermost REST client already bounds error bodies
(readResponseTextLimited) and streams guarded responses without buffering,
but the success path still called `await res.json()` / `await res.text()`,
reading the whole body into memory before parsing. A self-hosted or
compromised Mattermost server can return an arbitrarily large (or
never-terminating, content-length-less) JSON/text body and force the plugin
to buffer it unbounded.

Read successful JSON through the shared readProviderJsonResponse (16 MiB cap,
cancels the stream and throws a bounded error on overflow, same as the
provider HTTP path) and cap non-JSON success bodies with readResponseTextLimited.
uploadMattermostFile's file-info JSON is bounded the same way.

Symmetric follow-up to the openclaw#95103 / openclaw#95108 response-limit campaign.

AI-assisted.

* fix(mattermost): bound probe success JSON reads

* fix(mattermost): reject oversized success text bodies

(cherry picked from commit 9241b97)
chenyangjun-xy pushed a commit to chenyangjun-xy/openclaw that referenced this pull request Jul 3, 2026
…claw#96033)

* fix(mattermost): bound successful REST JSON/text response reads

The Mattermost REST client already bounds error bodies
(readResponseTextLimited) and streams guarded responses without buffering,
but the success path still called `await res.json()` / `await res.text()`,
reading the whole body into memory before parsing. A self-hosted or
compromised Mattermost server can return an arbitrarily large (or
never-terminating, content-length-less) JSON/text body and force the plugin
to buffer it unbounded.

Read successful JSON through the shared readProviderJsonResponse (16 MiB cap,
cancels the stream and throws a bounded error on overflow, same as the
provider HTTP path) and cap non-JSON success bodies with readResponseTextLimited.
uploadMattermostFile's file-info JSON is bounded the same way.

Symmetric follow-up to the openclaw#95103 / openclaw#95108 response-limit campaign.

AI-assisted.

* fix(mattermost): bound probe success JSON reads

* fix(mattermost): reject oversized success text bodies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: mattermost Channel integration: mattermost merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants