feat(ssh): native SSH support — PTY terminal + SFTP filesystem#276
Open
dcieslak19973 wants to merge 26 commits into
Open
feat(ssh): native SSH support — PTY terminal + SFTP filesystem#276dcieslak19973 wants to merge 26 commits into
dcieslak19973 wants to merge 26 commits into
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…RUD, search, grep Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ands Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…de tests Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… mod, profile cmd paths Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix russh API paths for Windows (keys::key::PublicKey, keys::load_secret_key) - Fix profile_id serde rename to camelCase for frontend compat - Fix pty flush: use interval timer so output isn't stuck in pending buffer - Add ssh_home command to fetch remote home dir via exec - Auto-reconnect last SSH profile on app startup, persisted via lastSshProfileId pref - Connect SSH before fetching home dir in switchWorkspace Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… fix) Credentials were previously transmitted before the user confirmed the host fingerprint, enabling a MITM attacker to capture them on first connect. Fix: after connecting, check whether this is a first-time host connection. If the fingerprint is unknown, immediately disconnect and return TOFU_REQUIRED:<fingerprint> — no credentials are sent. The frontend shows the confirmation dialog; once the user accepts, ssh_fingerprint_save persists the fingerprint and the caller retries ssh_connect. Also adds ssh_fingerprint_save as a proper Tauri command (previously fingerprint persistence was done silently server-side with no user consent).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
russh+russh-sftp(pure Rust, no OpenSSH dependency)WorkspaceEnvSelectorshows SSH profiles alongside WSL distros, works cross-platformNew dependencies
russh = "0.45"— SSH clientrussh-sftp = "2"— SFTP over russh sessionsuuid = "1"— profile IDsshellexpand = "3"—~expansion in key pathsArchitecture
A new
WorkspaceEnv::Ssh { profile_id }variant flows through all PTY and FS commands. Each command branches early on SSH, delegating to SFTP wrappers or an SSH exec channel. Local paths use the existingspawn_blockingpath unchanged.Test plan
🤖 Generated with Claude Code