github totoshko88/RustConn v0.8.4

latest releases: v0.10.8, v0.10.7, v0.10.6...
one month ago

What's Changed

Added

  • FIDO2/SecurityKey SSH authentication — New SshAuthMethod::SecurityKey variant for FIDO2 hardware key authentication; "Security Key (FIDO2)" option in connection dialog and template dialog SSH auth dropdowns; key file row shown directly without key source dropdown; validation requires key path like PublicKey; exports map SecurityKey to publickey (Asbru) or ssh_auth=2 (Remmina); all property test strategies updated with SecurityKey coverage
  • CLI auth-method support — Added --auth-method flag to add and update commands (accepts password, publickey, keyboard-interactive, agent, security-key/fido2); show command now displays SSH auth method; ConnectionOutput JSON includes auth_method field for SSH connections; update command supports --key for SSH key path changes

Fixed

  • CLI version check timeout — Increased VERSION_CHECK_TIMEOUT from 3 to 6 seconds in both detection.rs and clients_tab.rs; Azure CLI (az --version) loads Python runtime and takes ~3.3 s, causing false "installed (timeout)" status at the previous limit
  • Settings dialog startup delay — Dialog took 3–5 s to appear because load_secret_settings() programmatically set 4 "save to keyring" checkboxes, each triggering a connect_toggled callback that called is_secret_tool_available_sync()block_on(which secret-tool) on the main thread; replaced with a shared Rc<RefCell<Option<bool>>> cache populated by the existing background detection thread; removed the blocking is_secret_tool_available_sync() wrapper entirely
  • WoL MAC Entry Disabled on Edit — Fixed WoL settings fields (MAC address, broadcast, port, wait time) remaining disabled when editing an existing connection and enabling WoL; set_wol_config() was setting set_sensitive(false) on individual widgets which conflicted with the group-level sensitivity controlled by the "Enable WOL" checkbox connect_toggled handler; removed per-widget sensitivity calls since wol_settings_group already manages this
  • secret-tool detectionis_secret_tool_available() was using secret-tool --version which is not a valid argument; secret-tool prints usage and exits with non-zero code, causing the check to always return false; replaced with which secret-tool for reliable binary detection
  • Settings version label race condition — Backend version showed "Not installed" when reopening Settings with a non-default backend (e.g. Bitwarden) because load_secret_settings() triggers the dropdown callback before async CLI detection completes; added detection_complete flag so the version label shows "Detecting..." until detection finishes
  • Unequal split panel sizes — Splitting vertically then horizontally (before selecting a panel) produced unequal panels because the empty placeholder adw::StatusPage had a large minimum size that prevented gtk::Paned from honouring the 50/50 position; set size_request(0, 0) on panel containers and overflow: hidden on the placeholder overlay so panels can shrink freely

Refactored

  • ConnectionManager watch channels — Replaced 3× Arc<Mutex<Option<Vec<T>>>> + Arc<Notify> debounced persistence pattern with tokio::sync::watch channels; extracted generic debounce_worker() async function eliminating 3 duplicated debounce loops; flush_persistence() uses send_replace(None) for atomic take-and-save; removed std::sync::{Arc, Mutex} and PendingTrash type alias; struct fields reduced from 8 persistence-related to 3 (conn_tx, group_tx, trash_tx)
  • EmbeddingError thiserror derive — Replaced manual Display/Error impls with #[derive(Debug, Clone, Error)] in embedded.rs
  • FreeRDP mutex consolidation — Combined 3 separate Arc<Mutex<T>> (process, state, fallback_triggered) into single Arc<Mutex<FreeRdpSharedState>> struct; frame_buffer remains separate for independent rendering access
  • Embedded RDP module directory — Reorganized 7 flat embedded_rdp_*.rs files into embedded_rdp/ module directory with mod.rs, buffer.rs, detect.rs, launcher.rs, thread.rs, types.rs, ui.rs; updated all internal imports to use super:: and crate::embedded_rdp:: paths
  • ConnectionDialog LoggingTab extraction — Extracted 5 logging widget fields from ConnectionDialog into LoggingTab struct in logging_tab.rs with new()/set()/build() methods; ConnectionDialogData::build_log_config() and set_log_config() now delegate to LoggingTab; deleted legacy create_logging_tab() and dead create_wol_tab() methods (~310 lines removed)
  • OverlaySplitView sidebar — Replaced gtk::Paned with adw::OverlaySplitView for main window sidebar; added sidebar toggle button (sidebar-show-symbolic) in header bar with F9 keyboard shortcut; sidebar supports show/hide gestures and saves width on close
  • Responsive sidebar breakpoint — Added adw::Breakpoint (max-width: 400sp) that collapses sidebar to overlay mode on narrow windows; sidebar unpins automatically and can be toggled via F9 or swipe gestures; uses sp units for GNOME Large Text accessibility
  • Window module directory — Reorganized 14 flat window_*.rs files into window/ module directory with mod.rs; submodules use super:: imports for MainWindow and sibling references; removed 14 mod window_* declarations from main.rs
  • State access error thiserror — Replaced manual Display/Error impls for StateAccessError in state.rs with #[derive(Debug, Clone, thiserror::Error)]; audited all #[allow(dead_code)] annotations — safe state access API (with_state, try_with_state, with_state_mut, try_with_state_mut) retained with justification comments
  • Workspace clippy suppression audit — Removed ~80 redundant per-item and per-module #[allow(clippy::*)] annotations that duplicate workspace-level allows in Cargo.toml (cast_precision_loss, cast_possible_truncation, missing_const_for_fn, needless_pass_by_value, unused_self, doc_markdown); cleaned up blanket module-level suppressions in performance/mod.rs (10→7), search/mod.rs (6→3), rdp_client/ (3 files), embedded_rdp/mod.rs, embedded_vnc.rs, wayland_surface.rs, audio.rs, testing/mod.rs; removed stale needless_collect from freerdp.rs; fixed exposed let_and_return in password_generator.rs and needless_collect in freerdp.rs tests; trimmed 8 redundant lints from property_tests.rs and properties/mod.rs test harnesses
  • Protocol trait capabilities and command builder — Extended Protocol trait with capabilities() returning ProtocolCapabilities struct (7 flags: embedded, external_fallback, file_transfer, audio, clipboard, split_view, terminal_based) and build_command() returning Option<Vec<String>> for CLI command generation; implemented capabilities() for all 5 protocols (SSH/Telnet: terminal, RDP: graphical with file/audio/clipboard, VNC: graphical with clipboard, SPICE: external-only with clipboard); implemented build_command() for SSH (delegates to SshConfig::build_command_args()) and Telnet (host + port + custom args); both new methods have default impls so existing Protocol implementors are unaffected

Changed

  • Dependencies — Updated resvg 0.46→0.47 (also updates usvg 0.46→0.47, tiny-skia 0.11→0.12, tiny-skia-path 0.11→0.12)

Installation

Debian/Ubuntu

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

Fedora

sudo dnf install rustconn-0.8.4-1.fc41.x86_64.rpm

AppImage

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

openSUSE (OBS)

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

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

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

Don't miss a new RustConn release

NewReleases is sending notifications on new releases.