Skip to content

v0.19.7

Choose a tag to compare

@github-actions github-actions released this 29 Jul 21:49
· 62 commits to main since this release

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 named password when 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 the RUSTCONN_PASSWORD environment variable, which keeps the secret out of /proc/<pid>/cmdline and ps. Quoting is supplied by RustConn, so ${password} and "${password}" behave identically. In Flatpak, where the command runs on the host through flatpak-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_DIR that the spawned shell unlinks before exec.
  • mDNS .local hosts resolve in Flatpak (issue #241) — the GNOME runtime carries no nss-mdns and exposes no Avahi socket, so a .local name that ssh myhost.local resolves on the host could not be resolved inside the sandbox. RustConn now asks the host to resolve such a name (getent ahosts, falling back to avahi-resolve-host-name) and connects by address, caching the outcome — negative results included — for a minute. SSH and SFTP keep the original name as HostKeyAlias, so known_hosts entries 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_exit is 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 the ListView needs to emit activate. 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 to session_restore.json when 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_sessions field and SavedSession struct — 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 a PortCheckResult::Unresolved outcome instead of an error.

Documentation

  • ${password} documented (issue #151)docs/ZERO_TRUST.md gained 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 update locks 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) and picky 7.0.0-rc.25 come in through ironrdpsspi/picky, and the toml 0.8 / toml_edit 0.20 chain is a second, transitive copy unrelated to the workspace's own toml 1.1.4. None can move without an upstream release.
  • Security clean: cargo deny check advisories reports advisories ok; cargo audit finds 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 unsound glib 0.18 iterator — all transitive). RUSTSEC-2023-0071 (rsa, via ironrdppicky/sspi) remains accepted in deny.toml and .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-*-2604 platform 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.RustConn

Snap

sudo snap install rustconn

Debian/Ubuntu (.deb from this release)

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

Fedora (.rpm from this release)

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

AppImage

chmod +x RustConn-0.19.7-x86_64.AppImage
./RustConn-0.19.7-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