fix: v0.5.0 security and robustness fixes from the 2026-10-07 review
build-deb / Lint, test, package (push) Successful in 1m49s
build-deb / Deploy to CT 126 (push) Skipped
build-deb / Notify on failure (push) Skipped

- Ask Claude: strip control characters, send as bracketed paste (closes #2)
- end: forget before kill, so ending from inside a session leaves no ghost (closes #3)
- reconnects use `attach --existing` and never resurrect ended/renamed sessions (closes #4)
- repo: git --no-optional-locks, no safe.directory override, refresh on connect/bell/60s (closes #5)
- uploads: unique names via mktemp, cleanup trap on hangup (closes #6)
- clipboard: write-only OSC 52 provider, tmux allow-passthrough off (closes #7)
- uploads: size check up front, streamed slices, idle timeout (closes #9)
- --list: path last in TSV rows, tolerant numbers (closes #10)
- tokens via curl config on stdin; userinfo stripped from remote URLs (closes #11)
- ttyd max clients 32 and at most 2 concurrent side-channel calls (#8; BroadcastChannel polling still open)
- tmux: fixed terminal-features index (no duplicates on re-source), no status-right clock

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-07 20:15:47 -04:00
co-authored by Claude Opus 5.5
parent 364bd9b66f
commit 7aa624bc13
9 changed files with 192 additions and 50 deletions
+52
View File
@@ -295,6 +295,58 @@ claude_args() {
[ "$status" -ne 0 ]
}
@test "end run from inside the session leaves no ghost registry entry (#3)" {
start_server
devdesk new alpha
tmux -S "$DEVDESK_SOCKET" send-keys -t =alpha:shell "$REPO/bin/devdesk end alpha" Enter
for _ in $(seq 1 50); do
tmux -S "$DEVDESK_SOCKET" has-session -t =alpha 2>/dev/null || break
sleep 0.1
done
run tmux -S "$DEVDESK_SOCKET" has-session -t =alpha
[ "$status" -ne 0 ]
[ "$(jq -r '.sessions | has("alpha")' "$DEVDESK_STATE_DIR/registry.json")" = false ]
}
@test "attach --existing refuses sessions that were ended or renamed (#4)" {
start_server
run devdesk attach --existing ghost
[ "$status" -ne 0 ]
[[ $output == *"no longer exists"* ]]
run devdesk attach --existing ../x
[ "$status" -ne 0 ]
}
@test "same-second uploads of the same name get distinct files (#6)" {
printf 'one' | base64 -w0 >"$TMP/a.b64"
printf 'two' | base64 -w0 >"$TMP/b.b64"
p1=$(devdesk attach --upload alpha image.png 3 <"$TMP/a.b64" | tail -n1 | jq -r .path)
p2=$(devdesk attach --upload alpha image.png 3 <"$TMP/b.b64" | tail -n1 | jq -r .path)
[ "$p1" != "$p2" ]
[ "$(cat "$p1")" = one ]
[ "$(cat "$p2")" = two ]
[[ $p1 == *-image.png ]]
}
@test "a tab in a project path does not break --list (#10)" {
mkdir -p "$DEVDESK_PROJECTS_ROOT/odd name"
start_server
run devdesk attach --list
[ "$status" -eq 0 ]
jq -e '.projects | map(.dir) | any(endswith("odd\tname"))' <<<"$output" >/dev/null
}
@test "repo hides credentials embedded in the remote URL (#11)" {
export DEVDESK_GITEA_URL=http://127.0.0.1:9
repo="$DEVDESK_PROJECTS_ROOT/alpha"
git -C "$repo" init -q -b main
git -C "$repo" remote add origin https://jared:hunter2@example.com/x/y.git
run devdesk repo alpha
[ "$status" -eq 0 ]
[ "$(jq -r .remote <<<"$output")" = https://example.com/x/y.git ]
[[ $output != *hunter2* ]]
}
@test "web actions run through attach and answer with JSON" {
start_server
run devdesk attach --new web1 alpha