Skip to content

Add browser-owned SSH keys and faster warm starts - #13

Merged
askac merged 3 commits into
mainfrom
feature/ssh-key-auth
Aug 26, 2026
Merged

Add browser-owned SSH keys and faster warm starts#13
askac merged 3 commits into
mainfrom
feature/ssh-key-auth

Conversation

@askac

@askac askac commented Aug 26, 2026

Copy link
Copy Markdown
Owner

Why

SSH profiles retain connection targets, but authentication still depends on passwords or host-side keys. Sending a browser private key through Python would expand credential exposure. Separately, launcher warm starts import all optional dependencies before consulting a valid install stamp, and disconnected pages have no explicit immediate retry control.

What changed

  • Keep non-extractable Ed25519 keys in browser IndexedDB and send only bounded, SID-scoped SSH challenge signatures to Python.
  • Gate key use to exact saved profiles on loopback or authorized HTTPS, while preserving password and host-key paths when Use key is off.
  • Export and merge browser preferences, SSH sessions, history, and UI layout through a versioned Base64 ZIP envelope without keys or credentials.
  • Add Retry Now to the existing Socket.IO reconnect manager, skip dependency imports for valid warm-start stamps, and fold the WSL screen check into the launch command.

Testing

Covered backend key policy, signature verification, stale signer and background-start rejection, browser key lifecycle, OpenSSH public-key formatting, settings merge and exclusions, reconnect recovery, shell syntax, dependency verification, and the complete backend and browser regression suites.

askac added 3 commits August 26, 2026 23:21
## Why
SSH profiles currently retain targets but authentication still depends on passwords or host-side keys. Moving a browser private key through Python would expand credential exposure, while reconnect backoff also leaves no explicit immediate retry control.

## What changed
- Keep non-extractable Ed25519 keys in browser IndexedDB and return only bounded, SID-scoped SSH challenge signatures.
- Gate key use to exact saved profiles on loopback or authorized HTTPS, preserving password and host-key fallbacks when Use key is off.
- Export and merge browser-owned settings through a versioned Base64 ZIP envelope while excluding keys, credentials, identity, and runtime state.
- Add Retry Now to the existing Socket.IO reconnect manager without resending terminal credentials.

## Testing
Covered backend payload policy, signature verification, stale signer and background-start rejection, browser key lifecycle, OpenSSH public-key formatting, settings merge and exclusion rules, immediate reconnect, and the existing backend and browser regression suites.
## Why
Warm launcher starts import every optional runtime dependency before consulting an install stamp that already records the platform, Python version, and requirements hash. On mounted or network filesystems those imports add several seconds even when the environment is unchanged.

## What changed
- Skip dependency imports when the existing install stamp matches the current runtime and requirements.
- Preserve install and verification when --force is used or the stamp is missing or stale.
- Keep manual recovery through --force or removing the .installed stamp when an environment is modified outside the launcher.

## Testing
Covered shell syntax, the current dependency checker, stamp and force branches by inspection, and Windows batch control-flow parity.
@askac
askac merged commit 9dd89b1 into main Aug 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant