Commit Graph
2 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.7 70ce6c270e fix untrusted-workspace RCE in dugite git resolution (T-98)
Drop the workspaceRoot parameter from resolveToolchainPaths /
Toolchain.resolvePaths entirely. The old code resolved
\`<workspaceRoot>/native/dugite/bin/git\` as the git binary before
falling back to PATH — a malicious repo could commit an executable
at that path and clide would run it on the first auto-fired
git.status (which fires automatically on workspace open).

Dugite now resolves against trusted locations only:
1. CLIDE_DUGITE_DIR env var (dev override).
2. <exe-parent>/dugite/bin/git (production bundle).
3. <exe-parent>/lib/dugite/bin/git (alternate bundle layout).

Test plants `native/dugite/bin/git` in a temp workspace and asserts
the resolved git path is NOT inside the workspace.

Callers updated (8 sites): main.dart, backend_entry.dart twice,
test_app.dart three times (compute now wraps a no-arg call), plus
five test fixtures. backend.dart's now-vestigial hintRoot left in
the struct for cleanup under T-99.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 20:56:02 +02:00
jpmschweitzerandClaude Opus 4.7 7ba0500f75 test sweep: cover kernel toolchain + medium services (T-91)
test / unit + widget + golden + a11y (push) Failing after 30s
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / integration_test (xvfb) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
test / dart doc (lib API) (push) Failing after 1m1s
Two test files chasing the bigger kernel residuals:

- test/kernel/src/toolchain_test.dart (10 tests): Toolchain defaults
  + missing list, applyResolved with full / partial paths,
  waitForResolution sync + async, Toolchain.resolvePaths against the
  current workspace + dugite detection + PATH fallback,
  resolveToolchainPaths top-level matches the static.
- test/kernel/src/services_bigger_test.dart (15 tests): DialogRouter
  show/dismiss/queue/notify, FileServices.pick* UnimplementedError
  trio + notifyDropped event, OsBridge openURL / reveal / fire,
  WindowControls setStyle idempotency + MissingPlugin-safe
  platform-channel methods + isMaximized success path,
  SchedulerTier intervals + SchedulerTick payload + start/dispose.

Coverage: kernel/src/toolchain.dart 37/95 -> 67/95 (71%);
dialog.dart 20/47 -> 27/47 (remaining is the DialogHost widget,
needs a real overlay tree); files.dart 1/16 -> 14/16 (88%);
os.dart 1/26 -> 19/26 (73%); window_controls.dart 2/25 -> 25/25
(100%); scheduler.dart 14/41 -> 18/41 (remaining is the isolate
ticker entry point, only fires after a real project-open event).

Total coverage 82.43% -> 83.57%; floor bumped to 83.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 08:00:23 +02:00