v0.19.7
What's Changed
Added
${password}in a Custom Command template (issue #151) — a Custom Command can now pass the connection's password to its launcher, e.g.rustdesk --connect ${id} --password ${password}. The value comes from a local variable namedpasswordwhen one exists, otherwise from the connection's password source. It is never written into a command line: the placeholder is replaced by a reference to theRUSTCONN_PASSWORDenvironment variable, which keeps the secret out of/proc/<pid>/cmdlineandps. Quoting is supplied by RustConn, so${password}and"${password}"behave identically. In Flatpak, where the command runs on the host throughflatpak-spawn(which does not forward the sandbox environment, and whose--env=would move the value back into an argv), the variable is handed over a file descriptor via--env-fd, backed by a mode-0600 file in$XDG_RUNTIME_DIRthat the spawned shell unlinks before exec.- mDNS
.localhosts resolve in Flatpak (issue #241) — the GNOME runtime carries nonss-mdnsand exposes no Avahi socket, so a.localname thatssh myhost.localresolves on the host could not be resolved inside the sandbox. RustConn now asks the host to resolve such a name (getent ahosts, falling back toavahi-resolve-host-name) and connects by address, caching the outcome — negative results included — for a minute. SSH and SFTP keep the original name asHostKeyAlias, soknown_hostsentries and host-key verification are unaffected. A no-op outside Flatpak and for every name that is not*.local.
Fixed
- Double-clicking a connection stopped opening it (issue #242) — the smart double-click added in 0.18.3 focuses an existing session instead of duplicating one, but it treated any session the notebook still knew about as live. A tab whose connection has ended keeps its transcript and Reconnect button (
close_on_clean_exitis off by default), so after the first disconnect every double-click merely re-focused that dead tab. Session liveness is now tracked explicitly and only a connected session is focused. The same applies to external viewers: a detaching viewer (remmina, krdc, vinagre) is tracked without a process handle and therefore never clears on its own, so "Already running in an external window" used to block the connection for the rest of the session — only viewers whose liveness RustConn can actually verify count now. - An unresolvable hostname aborted the connection (issue #241) — the pre-connect TCP probe reported a DNS failure as a hard error, vetoing the launch. The probe is a latency optimisation, not an authority on reachability: a name it cannot see may still be resolvable by the client that actually connects, and a genuinely wrong name produces that client's own, more accurate error a moment later. Such a probe is now reported as "unresolved" and the connection proceeds.
- Enter in the connection sidebar did nothing — the key handler returned
Propagation::Stop, swallowing the event theListViewneeds to emitactivate. This is the fix the 0.18.5 notes claimed; it had never actually been applied to the handler. - "Restore sessions on startup" did nothing (issue #243) — the setting and a complete, versioned, unit-tested persistence model (
rustconn_core::session::restore) both existed, but nothing ever wrote or read them, so the switch had no effect at all. The open sessions are now snapshotted tosession_restore.jsonwhen the window closes and reopened on the next start, honouring "Prompt before restoring" and the maximum-age limit. Sessions whose connection had already ended are not restored, and a connection deleted in the meantime is skipped with a warning instead of failing the whole restore. Split and detached layouts are out of scope — that is what Workspaces are for — so such a session comes back as an ordinary tab. - Host, Port, Username and password could not be edited for a Custom Command (issue #151) — these rows were hidden for the whole Zero Trust protocol group, yet 0.19.5 made the Custom Command template resolve
${host},${port},${username}and${name}from exactly those fields, leaving the placeholders unfillable. Custom Command now shows them (and the password source); the other Zero Trust providers, which authenticate through their own CLI, still hide them. The inline password row is recomputed rather than only hidden, so an existing password no longer stays invisible depending on the order in which the dialog was populated. - A password-only connection never cached its resolved credential — caching required a username to be present, so a connection that authenticates by password alone dropped the secret that had just been resolved.
Removed
- Dead
SessionRestoreSettings::saved_sessionsfield andSavedSessionstruct — never written and never read; the restore snapshot is a file, not a settings key. PortCheckError::ResolutionFailed— no longer produced now that a resolution failure is aPortCheckResult::Unresolvedoutcome instead of an error.
Documentation
${password}documented (issue #151) —docs/ZERO_TRUST.mdgained a "${password}and the command line" section covering the resolution order, the environment-variable indirection and its two limits (the launched program's own argv, and the Flatpak portal D-Bus call), plus a note that Host/Port/Username are editable for Custom Command.
Dependencies
- Audited, nothing to update:
cargo updatelocks 0 packages to newer compatible versions. The 16 transitive crates behind their latest release are held there by their own parents' requirements — the RustCrypto pre-releases (aes-gcm,curve25519-dalek,ecdsa,ed25519-dalek,p256/p384/p521,primeorder,rfc6979,x25519-dalek) andpicky 7.0.0-rc.25come in throughironrdp→sspi/picky, and thetoml 0.8/toml_edit 0.20chain is a second, transitive copy unrelated to the workspace's owntoml 1.1.4. None can move without an upstream release. - Security clean:
cargo deny check advisoriesreportsadvisories ok;cargo auditfinds no vulnerabilities across 730 dependencies, only the 12 already-accepted warnings (the unmaintained gtk-rs GTK3 bindings pulled in by the tray backend,atomic-polyfill,proc-macro-error,rustybuzz,ttf-parser, and the unsoundglib 0.18iterator — all transitive).RUSTSEC-2023-0071(rsa, viaironrdp→picky/sspi) remains accepted indeny.tomland.cargo/audit.toml. - CLI downloads current: auto-resolved kubectl 1.36.3, Tailscale 1.98.10, Teleport 18.10.0, Boundary 0.21.3, Hoop.dev 1.125.1, Bitwarden CLI 2026.7.0 and 1Password CLI 2.35.0 all resolve to the latest release; the one explicit pin, TigerVNC 1.16.2, is still current. All version endpoints reachable.
- Packaging sources current: GNOME runtime 50 is still the newest branch published on Flathub, and every bundled pinned source is at its latest upstream release — FreeRDP 3.30.0, cJSON 1.7.19, openh264 2.6.0, fast_float 8.2.10, waypipe 0.11.0, mc 4.8.33. The Flathub manifest matches the local one. VTE stays pinned below 0.81 by design.
- Snap still on core24: no
gnome-*-2604platform snap exists in the store, so the core24 + gnome-46-2404 combination remains the only option for a strictly-confined build (issue #174).
Installation
Flatpak (Recommended)
flatpak install flathub io.github.totoshko88.RustConnSnap
sudo snap install rustconnDebian/Ubuntu (.deb from this release)
sudo dpkg -i rustconn_0.19.7_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (.rpm from this release)
sudo dnf install rustconn-0.19.7-1.fc44.x86_64.rpmAppImage
chmod +x RustConn-0.19.7-x86_64.AppImage
./RustConn-0.19.7-x86_64.AppImagemacOS (Homebrew)
brew tap totoshko88/rustconn
brew install rustconn
open $(brew --prefix)/opt/rustconn/RustConn.appAll 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 rustconnArch Linux (AUR)
yay -S rustconnFreeBSD (Ports)
pkg install rustconnFull installation guide: https://github.com/totoshko88/RustConn/blob/main/docs/INSTALL.md