Skip to content

v0.19.17

Choose a tag to compare

@github-actions github-actions released this 08 Aug 18:34
· 8 commits to main since this release

What's Changed

Fixed

  • Opening Settings panel no longer wipes in-memory KeePassXC database password (issue #259) — closing the Settings dialog (even without making any changes) triggered a full settings save cycle. Because the password entry widget is intentionally left blank for security, collect_secret_settings() returned kdbx_password: None, and update_settings() unconditionally overwrote the in-memory settings struct — losing the runtime-only password that was loaded at startup from the encrypted file or system keyring. Subsequent credential lookups saw has_password=false and failed to open the KeePass database until restart. The fix preserves all six runtime-only SecretString fields (kdbx_password, bitwarden_password, bitwarden_client_id, bitwarden_client_secret, onepassword_service_account_token, passbolt_passphrase) from the previous settings when the incoming settings don't provide them — protecting all vault backends, not just KeePassXC.

  • OCI CLI version detection no longer shows Python tracebacks — when the OCI CLI installation is broken (e.g. missing oci_cli Python module), oci --version emits a traceback to stderr. The version parser now detects traceback output and returns no version instead of displaying the raw error text in the Preferences panel.

  • Encrypted-file backend no longer fails under parallel test execution — the machine-key derivation (get_machine_key) now uses a process-wide OnceLock cache. Previously, concurrent first-time callers could each generate a different random key file, with the last writer winning and earlier encryptions becoming undecryptable. This also protects production use when multiple async tasks trigger credential operations simultaneously at first startup.

Improved

  • Settings dialog no longer saves to disk when nothing changed — dirty-tracking compares collected settings against the original snapshot; closing the dialog without modifications skips the save entirely, eliminating unnecessary disk writes and reducing the surface for state-corruption bugs.

  • Bitwarden Unlock and KeePass Check buttons are now asynchronous — previously both ran blocking std::process::Command on the GTK main thread, freezing the UI while the CLI responded (potentially seconds for vault unlock or argon2 key derivation). They now run via gio::spawn_blocking with intermediate status feedback ("Unlocking…", "Checking…").

  • Keyring credential saves moved to background thread — writing passwords to the system keyring (D-Bus round-trip) previously happened synchronously inside the settings collect phase during dialog close. Saves now run asynchronously after update_settings() succeeds, and failures are reported via tracing::warn with a return value indicating success/failure.

  • SSH Agent add-key failures now show an error toast — previously the error was only logged; now users see a toast with the failure reason when ssh-add rejects a key (e.g. wrong passphrase, unsupported format).

  • Clearer warning when system keyring is unavailable — the status label now reads "System keyring unavailable — install libsecret (secret-tool)" instead of the previous terse message, giving users actionable guidance.

  • Import dialog no longer blocks the UI during file parsing — SSH config, Remmina, Asbru, Ansible, and libvirt imports (including virsh subprocess calls) now run on a background thread via spawn_blocking_with_callback. The progress bar pulses while the operation runs, and results appear asynchronously when complete.

  • Import dialog clearly reports failure when no connections are imported — previously a successful-looking "Successfully imported 0 connection(s)" appeared even when all entries failed. Now the result page explicitly states "Import failed with N error(s)" when the connections list is empty but errors were encountered.

  • Export "Open location" no longer blocks the main loopopen::that was replaced with open::that_in_background, preventing UI freezes when xdg-open is slow to respond.

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

Fedora (.rpm from this release)

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

AppImage

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