What's Changed
Added
- FIDO2/SecurityKey SSH authentication — New
SshAuthMethod::SecurityKeyvariant 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 likePublicKey; exports map SecurityKey topublickey(Asbru) orssh_auth=2(Remmina); all property test strategies updated with SecurityKey coverage - CLI auth-method support — Added
--auth-methodflag toaddandupdatecommands (acceptspassword,publickey,keyboard-interactive,agent,security-key/fido2);showcommand now displays SSH auth method;ConnectionOutputJSON includesauth_methodfield for SSH connections;updatecommand supports--keyfor SSH key path changes
Fixed
- CLI version check timeout — Increased
VERSION_CHECK_TIMEOUTfrom 3 to 6 seconds in bothdetection.rsandclients_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 aconnect_toggledcallback that calledis_secret_tool_available_sync()→block_on(which secret-tool)on the main thread; replaced with a sharedRc<RefCell<Option<bool>>>cache populated by the existing background detection thread; removed the blockingis_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 settingset_sensitive(false)on individual widgets which conflicted with the group-level sensitivity controlled by the "Enable WOL" checkboxconnect_toggledhandler; removed per-widget sensitivity calls sincewol_settings_groupalready manages this - secret-tool detection —
is_secret_tool_available()was usingsecret-tool --versionwhich is not a valid argument;secret-toolprints usage and exits with non-zero code, causing the check to always returnfalse; replaced withwhich secret-toolfor 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; addeddetection_completeflag 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::StatusPagehad a large minimum size that preventedgtk::Panedfrom honouring the 50/50 position; setsize_request(0, 0)on panel containers andoverflow: hiddenon the placeholder overlay so panels can shrink freely
Refactored
- ConnectionManager watch channels — Replaced 3×
Arc<Mutex<Option<Vec<T>>>>+Arc<Notify>debounced persistence pattern withtokio::sync::watchchannels; extracted genericdebounce_worker()async function eliminating 3 duplicated debounce loops;flush_persistence()usessend_replace(None)for atomic take-and-save; removedstd::sync::{Arc, Mutex}andPendingTrashtype alias; struct fields reduced from 8 persistence-related to 3 (conn_tx,group_tx,trash_tx) - EmbeddingError thiserror derive — Replaced manual
Display/Errorimpls with#[derive(Debug, Clone, Error)]inembedded.rs - FreeRDP mutex consolidation — Combined 3 separate
Arc<Mutex<T>>(process, state, fallback_triggered) into singleArc<Mutex<FreeRdpSharedState>>struct;frame_bufferremains separate for independent rendering access - Embedded RDP module directory — Reorganized 7 flat
embedded_rdp_*.rsfiles intoembedded_rdp/module directory withmod.rs,buffer.rs,detect.rs,launcher.rs,thread.rs,types.rs,ui.rs; updated all internal imports to usesuper::andcrate::embedded_rdp::paths - ConnectionDialog LoggingTab extraction — Extracted 5 logging widget fields from
ConnectionDialogintoLoggingTabstruct inlogging_tab.rswithnew()/set()/build()methods;ConnectionDialogData::build_log_config()andset_log_config()now delegate toLoggingTab; deleted legacycreate_logging_tab()and deadcreate_wol_tab()methods (~310 lines removed) - OverlaySplitView sidebar — Replaced
gtk::Panedwithadw::OverlaySplitViewfor 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; usesspunits for GNOME Large Text accessibility - Window module directory — Reorganized 14 flat
window_*.rsfiles intowindow/module directory withmod.rs; submodules usesuper::imports forMainWindowand sibling references; removed 14mod window_*declarations frommain.rs - State access error thiserror — Replaced manual
Display/Errorimpls forStateAccessErrorinstate.rswith#[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 inCargo.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 inperformance/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 staleneedless_collectfromfreerdp.rs; fixed exposedlet_and_returninpassword_generator.rsandneedless_collectinfreerdp.rstests; trimmed 8 redundant lints fromproperty_tests.rsandproperties/mod.rstest harnesses - Protocol trait capabilities and command builder — Extended
Protocoltrait withcapabilities()returningProtocolCapabilitiesstruct (7 flags:embedded,external_fallback,file_transfer,audio,clipboard,split_view,terminal_based) andbuild_command()returningOption<Vec<String>>for CLI command generation; implementedcapabilities()for all 5 protocols (SSH/Telnet: terminal, RDP: graphical with file/audio/clipboard, VNC: graphical with clipboard, SPICE: external-only with clipboard); implementedbuild_command()for SSH (delegates toSshConfig::build_command_args()) and Telnet (host + port + custom args); both new methods have default impls so existingProtocolimplementors are unaffected
Changed
- Dependencies — Updated
resvg0.46→0.47 (also updatesusvg0.46→0.47,tiny-skia0.11→0.12,tiny-skia-path0.11→0.12)
Installation
Debian/Ubuntu
sudo dpkg -i rustconn_0.8.4_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora
sudo dnf install rustconn-0.8.4-1.fc41.x86_64.rpmAppImage
chmod +x RustConn-0.8.4-x86_64.AppImage
./RustConn-0.8.4-x86_64.AppImageopenSUSE (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