Skip to content

v0.24.6

Choose a tag to compare

@github-actions github-actions released this 05 Nov 14:41
· 44 commits to main since this release

What's Changed

Added

  • SSH keys RustConn adds to the agent itself expire after 12 hours and are removed on exit — when a multi-hop ProxyJump connect or an SFTP / Midnight Commander launch needs a key the agent lacks, RustConn runs ssh-add -t 43200 without prompting (30-second limit), records the key (and its certificate), and removes exactly those keys on exit over the agent socket. Keys already in the agent before RustConn's add, or added in Settings → SSH Agent, are never touched; a key you re-add with ssh-add in a terminal after RustConn added it is still removed on lock, suspend or exit. Legacy PEM/PKCS#8 keys are added only to an empty agent and rely on the 12-hour lifetime, as do keys added by rustconn-cli sftp when it cannot clean up. (rustconn-core/src/ssh_agent/own_keys.rs, rustconn-core/src/ssh_agent/wire.rs, rustconn-core/src/ssh_agent/keyfile.rs, rustconn-core/src/sftp.rs, rustconn/src/window/protocols_ssh.rs, rustconn/src/app.rs, rustconn-cli/src/commands/sftp.rs, docs/USER_GUIDE.md, and others)
  • The same keys are also removed on screen lock and suspend (Linux) — a new D-Bus listener (lock_events, non-default lock-events feature, always on in the GUI) watches login1 PrepareForSleep and the freedesktop/GNOME screensaver ActiveChanged, holding a sleep delay inhibitor so the removal finishes before suspend. Unreachable sources are logged and skipped. Flatpak and Snap get no new permissions: in the Flatpak lock/suspend removal is an opt-in flatpak override (docs/INSTALL.md); in the Snap screen lock works, suspend is not detected. (rustconn-core/src/lock_events/, rustconn-core/Cargo.toml, rustconn/src/app.rs, docs/INSTALL.md, docs/SNAP.md, docs/USER_GUIDE.md, and others)
  • The same keys are also removed on screen lock and sleep (macOS) — a new isolated FFI crate, rustconn-lock-sys, observes com.apple.screenIsLocked and NSWorkspaceWillSleepNotification and feeds them into the same lock_events subscribers through lock_events::notify. Sleep is not delayed for the removal; an unfinished removal completes on wake. (rustconn-lock-sys/, rustconn-core/src/lock_events/mod.rs, rustconn/src/app.rs, .github/workflows/ci.yml, scripts/verify.sh, docs/ARCHITECTURE.md, and others)
  • Encrypted SSH keys are unlocked once per session in RustConn's own dialog — a connect, reconnect, first jump host, or SFTP / mc launch with a passphrase-protected OpenSSH key the agent lacks now opens an Unlock SSH Key dialog (three attempts); the key goes into the agent for 12 hours and is removed on exit, lock and suspend like the other keys RustConn adds. The passphrase is never stored or read from a vault. Cancel, a refusing agent (e.g. 1Password) or a held certificate fall back to ssh's own terminal prompt; a Cancel is remembered for that key and agent socket until RustConn quits, and legacy PEM/PKCS#8 keys or an agent that does not answer get no dialog. Concurrent connects share one dialog, and the SSH editor warns that Agent Forwarding exposes unlocked keys. (rustconn-core/src/ssh_agent/unlock.rs, rustconn-core/src/ssh_agent/own_keys.rs, rustconn/src/dialogs/key_unlock.rs, rustconn/src/window/key_unlock.rs, rustconn/src/window/protocols_ssh.rs, rustconn/src/dialogs/connection/ssh.rs, po/, docs/USER_GUIDE.md, and others)
  • Vietnamese (vi) added — PR #408, contributed by dinhkarate — a full catalogue brought up to this release's strings, selectable in Settings → Interface → Language, with the translator credited in the About dialog. (po/vi.po, po/LINGUAS, rustconn/src/i18n.rs, rustconn/src/app.rs)

Fixed

  • A connection's key sequence is now sent when the connect first waits for the port check — the Automation key sequence and split-view drag-and-drop registration were skipped for SSH, Telnet and Mosh connects that ran the (default) pre-connect port check. Both now run whenever the session is created, including after the SSH key unlock dialog. (rustconn/src/window/mod.rs, rustconn/src/window/key_unlock.rs, rustconn-core/src/ssh_agent/unlock.rs)
  • A wedged ssh-agent can no longer freeze RustConn or rustconn-cli — ssh-agent -s, ssh-add -l/-d/-L and ssh-keygen -lf calls are now killed after 5 seconds, and the agent socket connect gives up after 3 seconds. Key removal and fingerprint lookup talk to the agent socket directly instead of spawning processes. (rustconn-core/src/ssh_agent/mod.rs, rustconn-core/src/ssh_agent/wire.rs, rustconn-core/src/ssh_agent/keyfile.rs, rustconn-core/src/sftp.rs)
  • An embedded RDP session no longer ends when the server refuses a shared folder (issue #407) — with ironrdp-rdpdr 0.9, a Windows Server 2025 refusal of a shared folder ended the session with [payload error] PDU error, because RustConn's backend did not implement remove_drive. The folder is now released, a toast reports the refusal once per tab, and the session continues; session-ending RDP errors now log their full cause chain. (rustconn-core/src/rdp_client/rdpdr.rs, rustconn-core/src/rdp_client/client/session.rs, rustconn-core/src/rdp_client/failure.rs, rustconn/src/embedded_rdp/connection.rs, po/, and others)
  • Embedded RDP resize against a Linux server (xrdp) now follows the window — the resize layout now always reports a Landscape primary monitor (IronRDP reported Portrait for tall windows), and because xrdp never reactivates after a resize, Server OS → Linux now resizes by reconnecting. On Auto, RustConn waits 3 seconds for the server to apply a layout and otherwise switches that session to reconnect-on-resize; Windows keeps the seamless path. (rustconn-core/src/rdp_client/client/commands.rs, rustconn-core/src/rdp_client/client/resize_watch.rs, rustconn/src/embedded_rdp/resize.rs, rustconn/src/dialogs/connection/rdp.rs, docs/USER_GUIDE.md, and others)
  • Terminal connection status is now accurate after connects and reconnects — a reconnected AWS SSM (or other Zero Trust) session no longer stays yellow, a failed reconnect no longer turns green, and a first connect no longer turns green on RustConn's own banner. All status detectors now read only the client's output after the banner and use one rule (shell prompt, including ❯/➜, or a full line of output that is not a password prompt, progress line or known failure), and they disarm on reconnect; reconnects now also restart session recording. (rustconn/src/terminal/output_start.rs, rustconn/src/terminal/mod.rs, rustconn/src/terminal/session_lifecycle.rs, rustconn/src/window/protocols.rs, rustconn/src/window/protocols_ssh.rs, rustconn/src/window/mod.rs)
  • Toasts and banners show names with &, < or > as typed — names like R&D used to break a toast because libadwaita parsed the text as Pango markup. All toasts and banners now go through toast::plain_toast / toast::plain_banner with markup off, enforced by a clippy disallowed-methods rule; the pass status now shows <gpg-id> instead of &lt;gpg-id&gt;. (rustconn/src/toast.rs, rustconn/src/window/mod.rs, rustconn/src/detached_window.rs, .clippy.toml, po/, and others)
  • Georgian and Uzbek can now be chosen in Settings → Interface → Language — both catalogues shipped but were missing from the language list and the locale mapping. They are added along with Vietnamese, and a test now checks every code in po/LINGUAS. (rustconn/src/i18n.rs)

Security

  • SSH monitoring can no longer accept a host key before you answer the host-key question — the status detector did not recognise OpenSSH's (yes/no/[fingerprint])? prompt, so the monitoring probe could start with StrictHostKeyChecking=accept-new and write the key to known_hosts while you were still deciding. The prompt now holds the session on "connecting", a changed-key warning counts as a failure, and all background ssh runs (monitoring probe and its jump hosts, SFTP probe, recording copy over scp) now use StrictHostKeyChecking=yes. accept-new remains only on connects you start yourself where the question cannot be shown: a connect whose stored password goes through askpass (and its password jump hops, issue #203) and Midnight Commander's sh:// link in the Flatpak; a changed key is still refused there. In rustconn-core, ssh_tunnel::build_nested_proxy_command now takes a HopHostKeys value instead of a bool flag. (rustconn/src/window/protocols.rs, rustconn-core/src/monitoring/ssh_exec.rs, rustconn-core/src/ssh_tunnel.rs, rustconn-core/src/sftp.rs, rustconn/src/terminal/recording.rs, rustconn/src/window/protocols_ssh.rs, docs/USER_GUIDE.md)

Changed

  • SSH key passphrases are no longer stored in or read from a secret backend — the unused key_passphrase field is gone from Credentials, so no backend writes or returns it and SSH login no longer depends on a vault. Passphrases saved by earlier releases are ignored, not deleted; remove them with secret-tool clear application rustconn key key_passphrase, pass rm rustconn/<connection id>/key_passphrase, or security delete-generic-password -s rustconn -a '<connection id>/key_passphrase' on macOS. Encrypted-file entries drop it on their next rewrite. (rustconn-core/src/models/credentials.rs, rustconn-core/src/secret/libsecret.rs, rustconn-core/src/secret/pass.rs, rustconn-core/src/secret/macos_keychain.rs, rustconn-core/src/secret/encrypted_file.rs, rustconn/src/vault_ops.rs, and others)

Dependencies

  • Updated (semver-compatible): lzma-rust2 0.23.0→0.24.0, svgtypes 0.16.1→0.16.2, toml 1.1.8→1.2.0, toml_edit 0.25.17→0.25.18, toml_writer 1.1.3→1.2.0, winnow 1.0.4→1.0.5, zip 9.2.2→9.3.0. cargo deny check advisories is clean; cargo-sources.json regenerated for the Flatpak/Flathub manifests.
  • Flatpak/Flathub — FreeRDP 3.32.2→3.33.0 — the bundled FreeRDP used for the external RDP client. (packaging/flatpak/io.github.totoshko88.RustConn.yml, packaging/flatpak/io.github.totoshko88.RustConn.local.yml, packaging/flathub/io.github.totoshko88.RustConn.yml)

Installation

Flatpak (Recommended)

flatpak install flathub io.github.totoshko88.RustConn

Snap

sudo snap install rustconn

Debian/Ubuntu (.deb from this release)

sudo dpkg -i rustconn_0.24.6_amd64.deb
sudo apt-get install -f  # Install dependencies if needed

Fedora (.rpm from this release)

sudo dnf install rustconn-0.24.6-1.fc44.x86_64.rpm

AppImage

chmod +x RustConn-0.24.6-x86_64.AppImage
./RustConn-0.24.6-x86_64.AppImage

macOS (Homebrew)

brew tap totoshko88/rustconn
brew install rustconn
open $(brew --prefix)/opt/rustconn/RustConn.app

All dependencies (GTK4, libadwaita, VTE, Adwaita icons) are installed automatically.
Requires macOS 13 (Ventura) or later.

OBS Repositories

Packages available at: https://build.opensuse.org/package/show/home:totoshko88:rustconn/rustconn

# Debian 13 (Trixie)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Debian_13/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Debian_13/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Ubuntu 24.04 LTS (Noble)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_24.04/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_24.04/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Ubuntu 26.04 LTS (Resolute)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_26.04/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_26.04/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Fedora 44
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Fedora_44/home:totoshko88:rustconn.repo
sudo dnf install rustconn

# Fedora 43
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Fedora_43/home:totoshko88:rustconn.repo
sudo dnf install rustconn

# openSUSE Tumbleweed
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Tumbleweed/ rustconn
sudo zypper ref && sudo zypper in rustconn

# openSUSE Leap 16.0
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Leap_16.0/ rustconn
sudo zypper ref && sudo zypper in rustconn

Arch Linux (AUR)

yay -S rustconn

FreeBSD (Ports)

pkg install rustconn

Full installation guide: https://github.com/totoshko88/RustConn/blob/main/docs/INSTALL.md

Verifying your download

Every binary on this release (deb, rpm, AppImage, Flatpak) is covered two ways.

Plain checksums — download SHA256SUMS alongside the asset, then:

sha256sum -c SHA256SUMS

Signed build provenance (SLSA, via Sigstore) — proves the file was built by this
workflow from this commit:

gh attestation verify RustConn-0.24.6-x86_64.AppImage --repo totoshko88/RustConn

(The snap is signed by the Snap Store; the macOS build is delivered via the Homebrew tap.)