Skip to content

fix(gateway): require admin for device role approvals#87146

Merged
eleqtrizit merged 3 commits into
openclaw:mainfrom
eleqtrizit:688
May 27, 2026
Merged

fix(gateway): require admin for device role approvals#87146
eleqtrizit merged 3 commits into
openclaw:mainfrom
eleqtrizit:688

Conversation

@eleqtrizit

@eleqtrizit eleqtrizit commented May 27, 2026

Copy link
Copy Markdown
Contributor

Summary

Require non-admin device.pair.approve callers to pass the non-operator device-role gate regardless of whether the session was authenticated with a device token or shared auth.

Changes

  • Load the pending pairing request for every non-admin approval attempt.
  • Keep the existing cross-device ownership check limited to sessions with a device-token-derived caller device id.
  • Add regressions for shared-auth/trusted-proxy-shaped sessions: operator-role approvals still succeed, and node-role approvals are denied before approveDevicePairing runs.
  • Document that approving node or other non-operator device roles requires operator.admin.

Validation

Real behavior proof

Behavior addressed: Non-admin pairing-only trusted-proxy/shared-auth callers can no longer approve non-operator device roles through device.pair.approve; trusted-proxy callers with operator.admin still can.

Real environment tested: Local source checkout on branch 688 at 8b131d444975fd2a01e40894aee49e7ce33df680, Node v22.22.2, pnpm 11.2.2. The proof started a local Gateway configured with gateway.auth.mode: "trusted-proxy", gateway.trustedProxies: ["127.0.0.1"], allowLoopback: true, and WebSocket headers x-forwarded-user plus x-forwarded-proto.

Exact steps or command run after this patch: node scripts/run-vitest.mjs run src/gateway/trusted-proxy-proof.tmp.test.ts --reporter=verbose. The temporary proof test opened real Gateway WebSocket sessions with trusted-proxy headers, signed paired device identities, omitted auth.deviceToken, submitted device.pair.approve, printed the RPC responses below, and was removed after the run so it is not part of the PR diff.

Evidence after fix:

stdout | ../../src/gateway/trusted-proxy-proof.tmp.test.ts > temporary trusted-proxy behavior proof > prints real Gateway WS approval responses
[proof] pairing-only trusted-proxy approve ok=false error=device pairing approval denied paired=no

stdout | ../../src/gateway/trusted-proxy-proof.tmp.test.ts > temporary trusted-proxy behavior proof > prints real Gateway WS approval responses
[proof] admin trusted-proxy approve ok=true payloadRole=node pairedRole=node

Test Files  3 passed (3)
Tests  3 passed (3)
Duration  16.55s

Observed result after fix: The pairing-only trusted-proxy session reached the real WS device.pair.approve path and was denied with device pairing approval denied; the pending node device stayed unpaired. The admin trusted-proxy session reached the same path and approved the node device with role=node.

What was not tested: I did not run a packaged install, cross-OS lane, or external production reverse proxy. The proof uses the repository Gateway test harness with a local loopback trusted-proxy configuration and real WebSocket/RPC traffic.

Proof limitations or environment constraints: The proof output is copied terminal output, not a screenshot or video. It redacts private paths and uses synthetic device identities, local ports, and test headers.

Focused regression proof

node scripts/run-vitest.mjs run src/gateway/server.device-pair-approve-authz.test.ts --reporter=verbose -t "trusted-proxy" passed and showed both committed trusted-proxy WS regressions:

✓ ... rejects trusted-proxy non-admin approval for node device roles
✓ ... allows trusted-proxy admin approval for node device roles
Test Files  1 passed (1)
Tests  2 passed | 3 skipped (5)

Additional validation already run for this branch:

  • node scripts/run-vitest.mjs src/gateway/server-methods/devices.test.ts src/gateway/server.device-pair-approve-authz.test.ts
  • corepack pnpm exec oxfmt --check --threads=1 docs/cli/devices.md docs/gateway/operator-scopes.md src/gateway/device-authz.test-helpers.ts src/gateway/server-methods/devices.ts src/gateway/server-methods/devices.test.ts src/gateway/server.device-pair-approve-authz.test.ts
  • node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.core.json src/gateway/device-authz.test-helpers.ts src/gateway/server-methods/devices.ts src/gateway/server-methods/devices.test.ts src/gateway/server.device-pair-approve-authz.test.ts
  • corepack pnpm docs:list
  • git diff --check

Notes

  • AI-assisted by Codex.
  • CHANGELOG.md was not updated.
  • USER.md is a local worklog only and is intentionally not part of this PR.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime size: S maintainer Maintainer-authored PR labels May 27, 2026
@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed May 27, 2026, 10:57 AM ET / 14:57 UTC.

Summary
The PR tightens Gateway device.pair.approve so non-admin callers cannot approve node or other non-operator device roles, adds shared-auth/trusted-proxy regressions, updates Gateway docs, and adds an unreleased changelog entry.

PR surface: Source +3, Tests +203, Docs +20. Total +226 across 7 files.

Reproducibility: yes. for the original bug shape from source and PR proof, but not as a current-main failure because current main already contains the fix. The PR body also includes after-fix real Gateway WebSocket output for trusted-proxy denial and admin approval.

Review metrics: 2 noteworthy metrics.

  • Authorization policy changes: 1 Gateway approval path tightened. device.pair.approve changes an upgrade-visible authorization decision, so maintainers should explicitly own the compatibility impact before merge or close.
  • Release-owned files: 1 changelog entry added. Normal PRs should not edit CHANGELOG.md; release-note context belongs in the PR body or commit message for release generation.

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:

  • Remove the CHANGELOG.md edit if this branch is refreshed.
  • Have the assigned maintainer decide whether to close this PR as superseded by current main or keep only a missing useful delta.

Risk before merge

  • The PR intentionally fails closed for an upgrade-visible trusted-proxy/shared-auth pairing workflow: existing non-admin pairing-only setups that approved node-role devices would start receiving device pairing approval denied.
  • The branch is dirty and current main already carries the central runtime/test/doc behavior, so landing this PR as-is requires maintainer conflict resolution or closure as superseded.

Maintainer options:

  1. Accept the hardening as intentional (recommended)
    A maintainer can own the fail-closed upgrade impact and document that non-admin pairing-only shared-auth/trusted-proxy approvals for node and other non-operator roles are no longer accepted.
  2. Refresh or close the branch
    Because current main already has the central fix and the PR is dirty, the branch should be rebased with only useful remaining deltas or closed as superseded.
  3. Choose a transition path first
    If pairing-only node approvals are considered supported, pause this PR until maintainers choose a migration, compatibility option, or documented upgrade path.

Next step before merge
The protected maintainer label, dirty merge state, current-main supersession, and intentional compatibility break make this a maintainer decision rather than an automated repair lane.

Security
Cleared: The diff tightens Gateway authorization and does not introduce new dependencies, workflow changes, secret handling, or supply-chain code execution paths.

Review findings

  • [P3] Remove the changelog entry from this normal PR — CHANGELOG.md:5-10
Review details

Best possible solution:

Keep the current-main hardening and have the assigned maintainer either close this superseded dirty PR or refresh it to remove release-owned changelog churn and carry only any missing useful delta.

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

Yes for the original bug shape from source and PR proof, but not as a current-main failure because current main already contains the fix. The PR body also includes after-fix real Gateway WebSocket output for trusted-proxy denial and admin approval.

Is this the best way to solve the issue?

Mostly yes for the hardening itself: the handler-level pending-request check is narrow and preserves operator-role approvals. The remaining solution question is maintainer ownership of the compatibility break and whether this dirty PR should be closed as superseded by current main.

Full review comments:

  • [P3] Remove the changelog entry from this normal PR — CHANGELOG.md:5-10
    CHANGELOG.md is release-owned in this repo, and normal PRs should carry release-note context in the PR body or commit message instead of editing the changelog directly. Please drop this file from the branch; the PR body already has the needed release-note context.
    Confidence: 0.93

Overall correctness: patch is correct
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 0d565833e15e.

Label changes

Label justifications:

  • P1: The PR hardens a Gateway authorization path that can affect real shared-auth/trusted-proxy pairing workflows.
  • merge-risk: 🚨 compatibility: Merging the PR can intentionally reject node or other non-operator device-role approvals that existing non-admin pairing-only setups previously accepted.
  • 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 (live_output): The PR body includes copied live Gateway WebSocket output showing pairing-only trusted-proxy node approval denied and admin trusted-proxy node approval succeeding after the patch.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes copied live Gateway WebSocket output showing pairing-only trusted-proxy node approval denied and admin trusted-proxy node approval succeeding after the patch.
Evidence reviewed

PR surface:

Source +3, Tests +203, Docs +20. Total +226 across 7 files.

View PR surface stats
Area Files Added Removed Net
Source 2 7 4 +3
Tests 2 204 1 +203
Docs 3 22 2 +20
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 7 233 7 +226

What I checked:

  • Current main behavior: device.pair.approve now loads the pending request for every non-admin caller, keeps cross-device ownership conditional on a caller device id, and denies non-operator device-role approvals before calling approveDevicePairing. (src/gateway/server-methods/devices.ts:225, 0d565833e15e)
  • Current main regression coverage: Current main includes shared-auth and trusted-proxy tests covering non-admin node-role denial and admin trusted-proxy node-role approval. (src/gateway/server.device-pair-approve-authz.test.ts:193, 0d565833e15e)
  • History provenance: Blame ties the current-main guard changes to 517ce3df75a97a08bf5e1b8de15604bd574d8fc9, fix: require admin for node device approvals. (src/gateway/server-methods/devices.ts:225, 517ce3df75a9)
  • Main-only release check: No tag contains 517ce3df75a97a08bf5e1b8de15604bd574d8fc9, so the current-main hardening is not proven shipped in latest release v2026.5.26. (517ce3df75a9)
  • PR branch diff: The PR branch adds the same authorization guard shape plus docs/tests, but its latest diff also edits release-owned CHANGELOG.md. (CHANGELOG.md:5, d24c8c9d3ecb)
  • Repository policy: The root policy marks CHANGELOG.md as release-owned and directs normal user-visible fix context to the PR body, squash message, or direct commit instead. (AGENTS.md:178, 0d565833e15e)

Likely related people:

  • steipete: The current-main authorization guard lines blame to 517ce3df75a97a08bf5e1b8de15604bd574d8fc9, authored as fix: require admin for node device approvals. (role: recent area contributor; confidence: high; commits: 517ce3df75a9; files: src/gateway/server-methods/devices.ts, docs/cli/devices.md, docs/gateway/operator-scopes.md)
  • vincentkoc: Most surrounding current device.pair.approve handler lines blame to c18370574e59d6b27965a3171d641d142418f3b8, so this is relevant adjacent Gateway method context. (role: adjacent file contributor; confidence: medium; commits: c18370574e59; files: src/gateway/server-methods/devices.ts)
  • joshavant: Live PR metadata shows joshavant assigned after the ClawSweeper review, making them the current routing contact for the protected review state. (role: current assignee / reviewer; confidence: medium; files: src/gateway/server-methods/devices.ts, src/gateway/server.device-pair-approve-authz.test.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 rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels May 27, 2026
@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

✨ Hatched: 🥚 common Neon Patch Peep

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

Rarity: 🥚 common.
Trait: polishes edge cases.
Image traits: location release reef; accessory miniature diff map; palette coral, mint, and warm cream; mood curious; pose sitting proudly on a smooth stone; shell translucent glimmer shell; lighting calm overcast light; background gentle dashboard dots.
Share on X: post this hatch
Copy: My PR egg hatched a 🥚 common Neon Patch Peep in ClawSweeper.

What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@eleqtrizit eleqtrizit requested a review from a team as a code owner May 27, 2026 04:42
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation size: M and removed size: S labels May 27, 2026
@clawsweeper

clawsweeper Bot commented May 27, 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: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels May 27, 2026
@eleqtrizit

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels May 27, 2026
@eleqtrizit

Copy link
Copy Markdown
Contributor Author

Before this PR, some existing setups could approve a device role like node using only pairing/shared-auth/trusted-proxy trust.

After this PR, those approvals require operator.admin.

So an existing installation that upgrades may start rejecting approvals that used to work. That is the “compatibility break.”

The maintainer decision is:

  • If that old behavior was unintended or insecure, land it as hardening. Add release-note text like: “Approving non-operator device roles now requires operator.admin; pairing-
    only shared-auth/trusted-proxy approval is no longer accepted.”
  • If that old behavior was a supported workflow, the PR is not fully ready. It needs a migration path, config opt-in, or some maintainer-approved transition plan.

@joshavant joshavant self-assigned this May 27, 2026
@eleqtrizit eleqtrizit merged commit 0d0bddf into openclaw:main May 27, 2026
44 of 47 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 28, 2026
* fix(gateway): require admin for device role approvals

* fix(gateway): add trusted-proxy approval proof
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 28, 2026
…026.5.27) (#698)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.5.26` → `2026.5.27` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.5.27`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026527)

[Compare Source](openclaw/openclaw@v2026.5.26...v2026.5.27)

##### Highlights

- Safer local/runtime boundaries: OpenClaw now rejects unsafe command wrappers, malformed CLI numeric options, unsafe Node runtime env overrides, no-auth Tailscale exposure, and non-admin device-role pairing approvals before they can affect live runs. ([#&#8203;87308](openclaw/openclaw#87308), [#&#8203;87305](openclaw/openclaw#87305), [#&#8203;87292](openclaw/openclaw#87292), [#&#8203;87146](openclaw/openclaw#87146))
- Matrix and auto-reply delivery are steadier: mention previews stay inert, final mention replies deliver normally, shared-DM notices are awaited, MXID parsing ignores filenames, and reasoning-prefixed `NO_REPLY` responses stay suppressed.
- Provider and agent reliability improved across OpenAI-compatible embeddings, cached token usage, Anthropic/Codex/Claude runtime state, unsupported tool-schema quarantine, heartbeat templates, and session fallback errors. ([#&#8203;85269](openclaw/openclaw#85269), [#&#8203;82062](openclaw/openclaw#82062), [#&#8203;85416](openclaw/openclaw#85416), [#&#8203;86855](openclaw/openclaw#86855))
- Plugin and package release paths got tighter: Pixverse ships as an external video plugin with region selection, package exclusions and shrinkwrap inventory match the published npm shape, and release/package smoke commands fail bounded instead of hanging.
- Gateway hot paths do less rediscovery by reusing current plugin metadata fingerprints, stable plugin index fingerprints, read-only session metadata, active working stores, status fast paths, and auth/env snapshots. ([#&#8203;86439](openclaw/openclaw#86439))

##### Changes

- Memory: add a core OpenAI-compatible embedding provider for local and hosted OpenAI-style endpoints, with config, doctor, and docs support. ([#&#8203;85269](openclaw/openclaw#85269)) Thanks [@&#8203;dutifulbob](https://github.com/dutifulbob).
- Plugin SDK: mark memory-specific embedding provider registration as deprecated compatibility and surface non-bundled usage in plugin compatibility diagnostics. ([#&#8203;85072](openclaw/openclaw#85072)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky).
- Pixverse: add video generation provider support, API region selection, and external plugin publishing.
- Plugins: expose approval action metadata for plugin-driven approval surfaces.

##### Fixes

- Security/CLI/runtime: harden hostname normalization for repeated trailing dots, block side-effecting command wrappers, reject unsafe Node runtime env overrides, reject loose numeric CLI and gateway options, require admin approval for node device-role pairing, and reject no-auth Tailscale exposure. ([#&#8203;87305](openclaw/openclaw#87305), [#&#8203;87292](openclaw/openclaw#87292), [#&#8203;87308](openclaw/openclaw#87308), [#&#8203;87146](openclaw/openclaw#87146)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Doctor: validate runtime tool schemas for every configured embedded agent while skipping ACP-only profiles, so bad non-default plugin or MCP tools are reported before assistant turns.
- Telegram: route `sendMessage` action replies through durable outbound delivery so completed agent responses remain retryable when the gateway send path times out. ([#&#8203;87261](openclaw/openclaw#87261)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky).
- Matrix/auto-reply: keep draft previews mention-inert, preserve final mention delivery, send mention finals normally, await shared DM notices, ignore filename-embedded MXIDs, and suppress reasoning-prefixed `NO_REPLY` responses.
- Agents/providers: add OpenAI-compatible cache retention, forward cached token usage in chat completions, preserve runtime context before active user turns, strip stale Anthropic thinking, load Claude CLI OAuth for Pi auth profiles, avoid false Codex runtime live switches, and quarantine unsupported tool schemas. ([#&#8203;82062](openclaw/openclaw#82062), [#&#8203;87167](openclaw/openclaw#87167), [#&#8203;86855](openclaw/openclaw#86855))
- Gateway/performance: cache plugin metadata fingerprints and stable plugin index fingerprints, borrow read-only session metadata safely, keep the active session working store hot, keep status on a bounded fast path, and preserve model auth profile suffixes. ([#&#8203;86439](openclaw/openclaw#86439))
- Package/install/release: align npm package exclusions and inventory, omit unpacked test helpers, skip Homebrew until macOS packages need it, cap tsdown heap in containers, bound install/release smoke waits, and harden post-publish verification.
- Codex/Auth: bound ChatGPT OAuth token exchange and refresh requests, and honor cancellation across Codex and Anthropic OAuth login flows.
- QA/E2E/CI: bound Telegram, kitchen-sink, Open WebUI, ClawHub, MCP, Discord, realtime, labeler, and GitHub API waits; fail empty explicit test, live-media, gateway CPU, startup benchmark, plugin gauntlet, and beta-smoke runs instead of false-greening.
- Agents/Codex: keep spawned agent bootstrap files rooted in the agent workspace while running task commands, transcripts, and compaction from the requested cwd. ([#&#8203;87218](openclaw/openclaw#87218)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/698
@eleqtrizit eleqtrizit deleted the 688 branch May 28, 2026 20:20
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
* fix(gateway): require admin for device role approvals

* fix(gateway): add trusted-proxy approval proof
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
* fix(gateway): require admin for device role approvals

* fix(gateway): add trusted-proxy approval proof
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation gateway Gateway runtime maintainer Maintainer-authored PR merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P1 High-priority user-facing bug, regression, or broken workflow. 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