Skip to content

fix(oauth): open Windows browser without shell-string URL - #242

Merged
steipete merged 6 commits into
openclaw:mainfrom
SebTardif:fix/mcporter-audit-2291
Aug 2, 2026
Merged

fix(oauth): open Windows browser without shell-string URL#242
steipete merged 6 commits into
openclaw:mainfrom
SebTardif:fix/mcporter-audit-2291

Conversation

@SebTardif

@SebTardif SebTardif commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

On Windows, OAuth browser open used cmd.exe with the authorization URL inside a shell command string. A quote-bearing URL (from OAuth metadata or a malicious authorization server) can break out of quoting and run additional cmd side effects when mcporter auth launches the browser.

Evidence

Production launch argv (this branch: rundll32, not cmd)

$ node --import tsx -e '
import { __oauthInternals } from "./src/oauth.ts";
const calls = [];
const launch = (cmd, args, opts) => { calls.push({ cmd, args, opts }); return { on(){}, unref(){} }; };
const url = "https://login.example/oauth?q=\"evil\"&x=1&y=2";
__oauthInternals.openExternal(url, "win32", launch);
console.log(JSON.stringify(calls, null, 2));
'
[
  {
    "cmd": "rundll32",
    "args": [
      "url.dll,FileProtocolHandler",
      "https://login.example/oauth?q=\"evil\"&x=1&y=2"
    ],
    "opts": {
      "stdio": "ignore",
      "detached": true,
      "windowsHide": true
    }
  }
]

Focused tests

$ pnpm exec vitest run tests/oauth-open-external.test.ts
 ✓ tests/oauth-open-external.test.ts (3 tests) 3ms

Asserted:

  • win32 uses rundll32 + url.dll,FileProtocolHandler + URL as separate argv
  • quote/ampersand OAuth URL stays one argv element
  • exe is never cmd; no /c / start tokens

Before (main): cmd /s /c start "" "${url}" with windowsVerbatimArguments: true (URL in one shell string).

Real behavior proof

  • Behavior or issue addressed: Windows OAuth browser launch must not place the authorization URL inside a cmd.exe shell-quoted command string.
  • Real environment tested: macOS arm64; Windows launch path exercised via injectable spawn for platform win32 on branch fix/mcporter-audit-2291 head 05655b0.
  • Exact steps or command run after this patch: node --import tsx spawn spy above; pnpm exec vitest run tests/oauth-open-external.test.ts.
  • Evidence after fix: terminal JSON and vitest PASS above.
  • Observed result after fix: launch is rundll32 with URL as a distinct argument; no command interpreter boundary.
  • What was not tested: interactive browser open on a real Windows desktop (this change is the process argv boundary; desktop only confirms OS association for FileProtocolHandler).

Summary

  • Windows openExternal uses rundll32 FileProtocolHandler
  • Regression tests for normal and quote-bearing OAuth URLs
  • CHANGELOG under Unreleased OAuth

Related

Refs #135 — prior Windows OAuth openExternal failure (URL truncated at & under cmd.exe). That path was mitigated by quoting in #136; this PR removes the cmd.exe shell boundary entirely.

Pass the OAuth authorization URL as a separate argv element to
`cmd /c start` and drop windowsVerbatimArguments so quote-bearing
URLs cannot break out of shell quoting on Windows.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0383e7bb7e

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/oauth.ts Outdated
// Pass the URL as a separate argv element so Node quotes it.
// Never use windowsVerbatimArguments with a single shell string —
// quote-bearing OAuth URLs could break out of `start` quoting.
const child = launch('cmd', ['/c', 'start', '""', url], {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Escape cmd metacharacters before passing the OAuth URL

For ordinary authorization URLs with multiple query parameters, such as ...?client_id=x&redirect_uri=..., Node's Windows argv serializer does not add quotes merely because an argument contains &, so cmd /c interprets the suffix as another command. The Microsoft cmd documentation explicitly requires metacharacters including & to be quoted or escaped. Thus this branch opens a truncated URL and may execute a server-controlled suffix; the new test only inspects the JavaScript argv rather than the command line parsed by cmd.exe. Use cmd-aware escaping or avoid the command shell.

AGENTS.md reference: AGENTS.md:L132-L132

Useful? React with 👍 / 👎.

Comment thread CHANGELOG.md Outdated

### OAuth

- Launch Windows OAuth browser open via separate `cmd /c start` argv elements so quote-bearing authorization URLs cannot break out of shell quoting. (thanks @SebTardif)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Remove the fix from historical release sections

This new entry is added not only under Unreleased but also under the already released 0.12.1, 0.12.0, and 0.11.0 sections (lines 57, 68, and 131). Those releases still contained the previous Windows launch implementation, so the changelog now incorrectly tells users that they include this fix; keep the entry only in the release that first contains the change.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 6eb5322. The Windows openExternal entry is only under `[0.12.4] - Unreleased` now; removed the same line from the historical 0.12.1, 0.12.0, and 0.11.0 sections.

…ed only

Remove the same entry from historical 0.12.1, 0.12.0, and 0.11.0 sections.
Those releases still shipped the previous Windows launch path.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
@SebTardif

Copy link
Copy Markdown
Contributor Author

Addressed the Codex CHANGELOG note in 6eb5322: the Windows OAuth browser-open entry is only under Unreleased now (removed from 0.12.1 / 0.12.0 / 0.11.0).

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 Urgent regression or broken agent/channel workflow affecting real users now. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. labels Jul 27, 2026
@clawsweeper

clawsweeper Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed August 2, 2026, 12:41 PM ET / 16:41 UTC.

ClawSweeper review

What this changes

The PR changes the Windows OAuth browser opener from a cmd.exe start command string to rundll32 url.dll,FileProtocolHandler with the authorization URL as a separate argument, and updates regression tests.

Merge readiness

⚠️ Ready for maintainer review - 2 items remain

This PR remains necessary: current main still sends Windows OAuth URLs through cmd.exe, while this branch removes that command-interpreter boundary. Native Windows callback proof on the exact head and collaborator review support landing; no actionable patch defect was found.

Likely related people: steipete is the recent area contributor and reviewed the hosted Windows proof; cosminilie authored the earlier merged Windows OAuth repair for the same path.

Priority: P1
Reviewed head: e3b25fc65e568c62a3d284ecd11673f65d8c9fb2

Review scores

Measure Result What it means
Overall readiness 🦞 diamond lobster (5/6) A focused shell-boundary repair with native Windows callback proof, targeted tests, and no outstanding correctness finding.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (live_output): A collaborator supplied native hosted-Windows proof on the exact head: the production launcher opened the default browser and a real local callback retained the complete quoted URL.
Patch quality 🦞 diamond lobster (5/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Verified Sufficient (live_output): A collaborator supplied native hosted-Windows proof on the exact head: the production launcher opened the default browser and a real local callback retained the complete quoted URL.
Evidence reviewed 5 items Current-main behavior: Current main still invokes cmd with /s /c start "" "${url}" and windowsVerbatimArguments, so the shell-free change is not already implemented.
Branch implementation and tests: The PR replaces that branch with rundll32 plus url.dll,FileProtocolHandler and checks that quote- and ampersand-bearing URLs remain a distinct argument without cmd tokens.
Current-code provenance: git blame ties the current Windows launcher and its test to the v0.12.3 release-tree commit; the related merged Windows OAuth repair is #136.
Findings None None.
Security None None.

How this fits together

mcporter auth obtains an OAuth authorization URL and opens it in the platform browser before receiving a local callback. On Windows, this launcher sits between authorization metadata and the operating system’s default-browser handler, so its argument boundary affects both login reliability and command-injection exposure.

flowchart LR
  A[OAuth provider metadata] --> B[Authorization URL]
  B --> C[mcporter auth]
  C --> D[Windows browser launcher]
  D --> E[Default browser handler]
  E --> F[OAuth sign-in]
  F --> G[Local callback]
  G --> H[Saved OAuth session]
Loading

Before merge

  • Resolve merge risk (P1) - Merging changes the Windows default-browser association mechanism from cmd.exe start to url.dll,FileProtocolHandler; the hosted Windows proof covers the ordinary default-browser path, but locked-down endpoints or unusual protocol-handler policies can still vary by machine.
  • Complete next step (P2) - No repair is needed: the patch is ready for ordinary maintainer landing review, with a collaborator already recommending LAND.
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Patch scope 2 files affected; 25 added, 5 removed The implementation is limited to the Windows launcher and its focused regression coverage.
Windows proof 1 hosted native callback run The collaborator’s exact-head evidence validates the production browser-launch path beyond mocked spawn assertions.

Root-cause cluster

Relationship: fixed_by_candidate
Canonical: #135
Summary: This PR is a stronger candidate fix for the earlier Windows OAuth URL truncation and command-shell parsing problem than the previously merged quoted-cmd.exe repair.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge-risk options

Maintainer options:

  1. Land the proven shell-free launcher (recommended)
    Accept the narrow Windows association-mechanism change because the exact head has hosted native Windows callback proof and a collaborator recommends landing.
  2. Pause for managed-device confirmation
    Keep this PR open only if maintainers require evidence from a policy-managed Windows endpoint beyond the hosted default-browser path.

Technical review

Best possible solution:

Land the shell-free launcher with its focused regression tests, retaining the hosted Windows callback evidence as the compatibility record for the browser-association change.

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

Yes. Hosted windows-latest evidence on the exact head exercised production openExternal, opened the default browser, and received the complete quoted callback URL; current main still has the cmd.exe route that the PR removes.

Is this the best way to solve the issue?

Yes. Removing cmd.exe rather than attempting additional command-shell escaping is the narrowest maintainable fix, and the branch supports it with focused assertions plus a native Windows callback.

AGENTS.md: found and applied where relevant.

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

Labels

Label justifications:

  • P1: The current Windows OAuth launcher handles authorization URLs, and unsafe parsing or launch failure can block authentication for Windows users.
  • merge-risk: 🚨 compatibility: The patch changes the Windows default-browser launch mechanism, which can vary under endpoint policy or nonstandard protocol handlers.
  • merge-risk: 🚨 auth-provider: The changed process boundary carries OAuth authorization URLs and directly affects the provider login and callback flow.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): A collaborator supplied native hosted-Windows proof on the exact head: the production launcher opened the default browser and a real local callback retained the complete quoted URL.
  • proof: sufficient: Contributor real behavior proof is sufficient. A collaborator supplied native hosted-Windows proof on the exact head: the production launcher opened the default browser and a real local callback retained the complete quoted URL.

Evidence

What I checked:

Likely related people:

  • steipete: Current-source blame associates the launcher and test with the v0.12.3 release-tree commit, and this collaborator reviewed the native Windows proof and recommended landing. (role: recent area contributor and collaborator reviewer; confidence: high; commits: f20febe322b6; files: src/oauth.ts, tests/oauth-open-external.test.ts)
  • cosminilie: The related merged PR fix: quote OAuth URL for cmd.exe on Windows #136 introduced the current Windows cmd.exe quoting approach that this PR supersedes. (role: original Windows OAuth repair author; confidence: medium; commits: d70f98fcd31e; files: src/oauth.ts, tests/oauth-open-external.test.ts)

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
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.

Workflow

  • 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.

History

Review history (23 earlier review cycles; latest 8 shown)
  • reviewed 2026-08-01T05:09:14.670Z sha 6167a70 :: needs real behavior proof before merge. :: [P2] Remove the release-owned changelog entry
  • reviewed 2026-08-01T19:16:48.841Z sha 6167a70 :: needs real behavior proof before merge. :: none
  • reviewed 2026-08-01T20:35:42.633Z sha 6167a70 :: needs real behavior proof before merge. :: none
  • reviewed 2026-08-01T22:59:20.467Z sha 6167a70 :: needs real behavior proof before merge. :: [P2] Remove the release-owned changelog entry
  • reviewed 2026-08-02T03:01:19.068Z sha e3b25fc :: needs real behavior proof before merge. :: none
  • reviewed 2026-08-02T09:39:33.851Z sha e3b25fc :: needs maintainer review before merge. :: none
  • reviewed 2026-08-02T11:53:41.812Z sha e3b25fc :: needs maintainer review before merge. :: none
  • reviewed 2026-08-02T14:30:22.558Z sha e3b25fc :: needs maintainer review before merge. :: none

@SebTardif

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Clarified Real behavior proof: production argv shape and vitest spawn capture (quote-bearing URL stays one argv element; no windowsVerbatimArguments).

@clawsweeper

clawsweeper Bot commented Jul 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: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

ClawSweeper P1: argv-split cmd /c start still passes the OAuth URL through
cmd.exe, which parses & and other metacharacters as command syntax.

Use rundll32 url.dll,FileProtocolHandler so the URL is a document path.
Update focused openExternal tests for the shell-free launch shape.
@SebTardif

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Addressed the remaining P1 (cmd.exe command-interpreter boundary):

  1. Windows openExternal no longer uses cmd /c start.
  2. Uses shell-free rundll32 url.dll,FileProtocolHandler <url> so OAuth query & / quotes are not cmd metacharacters.
  3. Focused tests assert argv is rundll32 + FileProtocolHandler + URL (no /c / start).

Live Windows browser open still not available in this environment; spawn shape is proven from production code on the updated head.

@clawsweeper

clawsweeper Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

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

@SebTardif

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Proof body updated to match the shipped fix: Windows openExternal uses rundll32 FileProtocolHandler (not cmd.exe). Live spawn-spy JSON + vitest oauth-open-external (3 tests) included in the PR body.

@clawsweeper

clawsweeper Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

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

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 28, 2026
ClawSweeper flagged the Unreleased note as still describing cmd /c start
after the shell-free rundll32 launcher landed.
@SebTardif

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Addressed the P2 changelog accuracy finding: Unreleased OAuth note now describes rundll32 url.dll,FileProtocolHandler (not cmd /c start).

Windows desktop browser launch proof is still not available on this machine (macOS-only contributor environment). Spawn-argv boundary tests and live spawn-spy JSON remain in the PR body. Happy to add Windows terminal/browser evidence if a maintainer can run one smoke open, or accept mock spawn as source-boundary proof under merge option 2.

@clawsweeper

clawsweeper Bot commented Jul 29, 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: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. merge-risk: 🚨 auth-provider 🚨 Merging this PR could break OAuth, tokens, provider routing, model choice, or credentials. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 30, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 31, 2026
Leave release notes to the release process per ClawSweeper review.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
@SebTardif

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Aug 2, 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: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

Re-review progress:

@SebTardif

Copy link
Copy Markdown
Contributor Author

Removed the release-owned Unreleased OAuth CHANGELOG line for this Windows launcher change.

Native Windows desktop OAuth browser smoke is still not available on this machine; argv-level proof remains in the PR body (rundll32 + separate URL arg).

@steipete

steipete commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

Native Windows proof is now green against exact PR head e3b25fc65e568c62a3d284ecd11673f65d8c9fb2.

The hosted windows-latest runner invoked the production openExternal path, opened the system default browser, and received a real local callback with the complete URL intact:

{"platform":"win32","pathname":"/callback","quoted":"\"value\"","first":"one","second":"two"}

Proof run: https://github.com/openclaw/mcporter/actions/runs/30734361638

I also reviewed the implementation and tests. With this native end-to-end proof, I recommend LAND.

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. 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. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. 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. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Aug 2, 2026
@steipete
steipete merged commit e1b12c0 into openclaw:main Aug 2, 2026
9 checks passed
@steipete

steipete commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

Landed as e1b12c0.

Verification at exact head e3b25fc before merge:

  • pnpm exec vitest run tests/oauth-open-external.test.ts — 3 passed.
  • Full suite: 130 files passed / 1 skipped, 838 tests passed / 3 skipped (Node 24.18.0, pnpm 10.33.2, macOS).
  • Live spawn-spy against production __oauthInternals.openExternal(url, "win32", ...): argv is rundll32 + url.dll,FileProtocolHandler + the quote/ampersand-bearing URL as a single element — no cmd, no /c, no start.
  • Native Windows end-to-end callback proof on this exact head: https://github.com/openclaw/mcporter/actions/runs/30734361638

Changelog entry (maintainer-owned) follows on main. Thanks @SebTardif for the careful iteration through the review rounds!

steipete added a commit that referenced this pull request Aug 2, 2026
…ifier 401 fix (#248)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 auth-provider 🚨 Merging this PR could break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P1 Urgent regression or broken agent/channel workflow affecting real users now. proof: sufficient Contributor real behavior proof is sufficient. 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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants