Intercept the WSL OpenBao browser launch.
All checks were successful
CCR intake gate / gate (push) Successful in 15s
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s

OpenBao opens the login with cmd.exe /c start, so the xdg-open launcher
never ran. The attended PATH now supplies cmd.exe for that one allowlisted
URL and opens it in the empty Playwright Chromium profile.

Assistant: grok
Assistant-Session: 01a198fa-fd27-7e41-a0a2-57355c3e4efd
This commit is contained in:
codex 2026-11-02 10:08:36 +01:00
parent 2aab7f6f2b
commit 8d4d285643
4 changed files with 69 additions and 13 deletions

View file

@ -139,13 +139,14 @@ python3 scripts/openbao-attended-exec.py -- /absolute/path/to/reviewed-silent-co
```
The wrapper keeps Warden's `openbao-platform-admin-login --exec` envelope and
puts the repository launcher ahead of the default `xdg-open`. The launcher
allows only the Keycloak HTTPS host and exact local OIDC callback. It opens
that page in a new empty profile of the headed Chromium pinned by
coulomb-social's Playwright install. It does not open Firefox or another
Windows default browser, and it does not record the address. The remote
headless rapp-playwright service is a different facility and cannot complete
this localhost callback.
puts `scripts/operator-browser` ahead of the default command path. On this
WSL host, OpenBao opens the page with `cmd.exe /c start`, which is the
Windows default browser. The directory supplies a `cmd.exe` for that one
shape. It allows only the Keycloak HTTPS host and exact local OIDC callback,
then opens that page in a new empty profile of the headed Chromium pinned by
coulomb-social's Playwright install. It does not record the address. The
remote headless rapp-playwright service is a different facility and cannot
complete this localhost callback.
No token helper or captured Warden output may be inspected. A receipt written
by the owner command proves handoff; session cleanup is assessed separately
from the final Warden exit status.

View file

@ -0,0 +1,31 @@
#!/usr/bin/env python3
"""Intercept OpenBao's WSL browser launch.
hashicorp/cap opens a WSL login with `cmd.exe /c start <url>`. That reaches
the Windows default browser. This command sits ahead of the real cmd.exe on
the attended-login PATH and opens the allowlisted URL in Playwright Chromium.
"""
import os
import runpy
import sys
from pathlib import Path
REAL_CMD = "/mnt/c/Windows/System32/cmd.exe"
launcher = runpy.run_path(str(Path(__file__).resolve().with_name("xdg-open")))
def main():
kind, url = launcher["classify_cmd"](sys.argv[1:])
if kind == "open":
launcher["stamp"]("called")
return launcher["open_url"](url)
if kind == "reject":
launcher["stamp"]("called")
launcher["stamp"]("rejected")
return 1
os.execv(REAL_CMD, [REAL_CMD, *sys.argv[1:]])
if __name__ == "__main__":
raise SystemExit(main())

View file

@ -78,6 +78,20 @@ def launch_argv(browser, profile_dir, url):
]
def classify_cmd(argv):
"""Classify OpenBao's WSL launch, `cmd.exe /c start <url>`.
hashicorp/cap replaces each & with ^& before calling the Windows
default browser. Other cmd.exe uses are left for the real binary.
"""
if list(argv[:2]) != ["/c", "start"] or len(argv) != 3:
return "delegate", ""
url = str(argv[2]).replace("^&", "&")
if allowed(url):
return "open", url
return "reject", ""
def stamp(result):
path = Path("/home/worsch/.local/state/railiance/receipts/operator-browser-last.txt")
try:
@ -88,11 +102,7 @@ def stamp(result):
return
def main():
stamp("called")
if len(sys.argv) != 2 or not allowed(sys.argv[1]):
stamp("rejected")
return 1
def open_url(url):
if not os.environ.get("DISPLAY") and not os.environ.get("WAYLAND_DISPLAY"):
stamp("no-display")
return 1
@ -102,7 +112,7 @@ def main():
return 1
profile = Path(tempfile.mkdtemp(prefix="operator-browser-"))
os.chmod(profile, 0o700)
command = launch_argv(browser, str(profile), sys.argv[1])
command = launch_argv(browser, str(profile), url)
try:
subprocess.Popen(
command,
@ -118,5 +128,13 @@ def main():
return 0
def main():
stamp("called")
if len(sys.argv) != 2 or not allowed(sys.argv[1]):
stamp("rejected")
return 1
return open_url(sys.argv[1])
if __name__ == "__main__":
raise SystemExit(main())

View file

@ -40,3 +40,9 @@ class BrowserBoundary(unittest.TestCase):
binary.chmod(0o755)
self.assertEqual(launcher['chromium_executable'](spec, root), str(binary))
self.assertEqual(launcher['chromium_executable'](root/'missing.json', root), '')
def test_wsl_cmd_start_is_the_login_opener(self):
url='https://kc.coulomb.social/authorize?'+urlencode({'redirect_uri':'http://127.0.0.1:8250/oidc/callback','state':'test'})
escaped=url.replace('&','^&')
self.assertEqual(launcher['classify_cmd'](['/c','start',escaped]), ('open', url))
self.assertEqual(launcher['classify_cmd'](['/c','start','https://evil.example/']), ('reject', ''))
self.assertEqual(launcher['classify_cmd'](['/c','dir']), ('delegate', ''))