Skip to content

v0.23.4

Choose a tag to compare

@github-actions github-actions released this 07 Oct 22:32
· 31 commits to main since this release

What's Changed

Added

  • A connection can request an Admin/console RDP session (/admin) — a new Admin/console session (/admin) switch in the RDP options of the connection editor. An RDS-licensing host fails the embedded IronRDP licence exchange (upstream IronRDP #1629: a SERVER_NEW_LICENSE securityHeaderFlags decode error), and even after the external-client hand-off a plain FreeRDP connect can hit the same wall. A console/admin session (mstsc /admin, FreeRDP /admin) connects to the server's console/administrative session, which does not consume an RDS CAL, so the licence exchange never happens — the trick the reporter suggested on #366. The flag is a per-connection admin_session: bool (#[serde(default)], so profiles written before this load unchanged) threaded from the persisted model through the embedded config into the external FreeRdpConfig, which emits /admin only when the switch is on. External FreeRDP only for now — the embedded IronRDP path has no admin-session flag yet (IronRDP #1629), noted in a code comment. (#366)
  • A pinned tab stays pinned across a restart — pinning is live state of the tab's page in the AdwTabView ("Pin Tab" / "Unpin Tab" in the tab context menu calls set_page_pinned on the page and nothing else), so the session-restore snapshot had no way to carry it and every pinned tab came back ordinary after a restart — closable again, and closing it lost the session the user had deliberately kept. SessionRestoreData gains a pinned: bool alongside the tab group it already carried, written from a new TerminalNotebook::is_session_pinned (which reads the page, the same place the menu writes it) and reapplied through a matching set_session_pinned. A local shell restores synchronously, so its pin is set straight after the tab opens; an asynchronous connection start re-applies it through the same SessionStartObserver that already reapplies the tab group, rather than a second observer racing the first for one completion. #[serde(default)] keeps snapshots written before this field loadable — they restore unpinned. The pin travels with session restore, so it needs Settings → Interface → "Restore sessions on startup" enabled. (#367)

Fixed

  • Vault root-search now matches a connection's name and host, not only its UUID — the "search the vault from root" option widened where it looked (the whole vault) but still only matched an entry whose title equalled the RustConn connection's internal UUID. A user whose existing KeePass/Bitwarden entries are titled by hostname or display name never matched, so the feature read as "doesn't work with keepass/bitwarden" (reported by @EddieSteele73 on #353). Root-search now also matches by the connection's name and host: a shared LookupIdentity { key, name, host } carries the candidates, matched case-insensitively and whitespace-trimmed as an exact token (never a substring, so a short name can't surface an unrelated credential), tried in priority order — UUID first for back-compat, then host (more specific than a hand-entered name), then name. All five root-search backends (Bitwarden, KeePass/kdbx, 1Password, pass, Passbolt) honour the wider match through a retrieve_identity override; a backend that does not opt in, and any lookup with root-search disabled, is byte-for-byte unchanged (the default delegates to the UUID-keyed path). The RustConn/-scoped lookup stays UUID-only — only the whole-vault fallback widens. (#353)

Dependencies

  • Updated: async-recursion 1.1.1 → 1.2.0, cc 1.5.1 → 1.6.0, font-types 0.12.5 → 0.12.6, mio 1.2.3 → 1.2.4, objc2 0.6.4 → 0.6.5, powerfmt 0.2.0 → 0.2.1, tokio 1.53.1 → 1.53.2, uuid 1.26.1 → 1.27.0. All semver-compatible patch/minor bumps; no security advisories affected (cargo deny check advisories clean). picky-krb 0.12.5 remains held back for the same reason as 0.23.1–0.23.3: its GssApiMessageError variant breaks the pinned sspi 0.21.3, which does not match it exhaustively, so picky-krb stays at 0.12.4.

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.23.4_amd64.deb
sudo apt-get install -f  # Install dependencies if needed

Fedora (.rpm from this release)

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

AppImage

chmod +x RustConn-0.23.4-x86_64.AppImage
./RustConn-0.23.4-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.23.4-x86_64.AppImage --repo totoshko88/RustConn

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