What's Changed
Added
- Password Caching TTL - Cached credentials now expire after configurable time (default 5 minutes):
CachedCredentialswithcached_attimestamp andis_expired()methodcleanup_expired_credentials()for automatic cleanuprefresh_cached_credentials()to extend TTL on use
- Connection Retry Logic - Automatic retry with exponential backoff for failed connections:
RetryConfigwith max_attempts, base_delay, max_delay, jitter settingsRetryStatefor tracking retry progress- Preset configurations:
aggressive(),conservative(),no_retry()
- Loading States - Visual feedback for long-running operations:
LoadingOverlaycomponent for inline loading indicatorsLoadingDialogfor modal operations with cancel supportwith_loading_dialog()helper for async operations
- Keyboard Navigation Helpers - Improved dialog keyboard support:
setup_dialog_shortcuts()for Escape/Ctrl+S/Ctrl+Wsetup_entry_activation()for Enter key handlingmake_default_button()andmake_destructive_button()styling helpers
- Session State Persistence - Split layouts preserved across restarts:
SessionRestoreDataandSplitLayoutRestoreDatastructs- JSON serialization for session state
- Automatic save/load from config directory
- Connection Health Check - Periodic monitoring of active sessions:
HealthStatusenum (Healthy, Unhealthy, Unknown, Terminated)HealthCheckConfigwith interval and auto_cleanup settingsperform_health_check()andget_session_health()methods
- Log Sanitization - Automatic removal of sensitive data from logs:
SanitizeConfigwith patterns for passwords, API keys, tokens- AWS credentials and private key detection
contains_sensitive_prompt()helper
- Async Architecture Helpers - Improved async handling in GUI:
spawn_async()for non-blocking operationsspawn_async_with_callback()for result handlingblock_on_async_with_timeout()for bounded blockingis_main_thread()andensure_main_thread()utilities
- RDP Backend Selector - Centralized RDP backend selection:
RdpBackendenum (IronRdp, WlFreeRdp, XFreeRdp3, XFreeRdp, FreeRdp)RdpBackendSelectorwith detection cachingselect_embedded(),select_external(),select_best()methods
- Import/Export Enhancement - Detailed import statistics:
SkippedFieldandSkippedFieldReasonfor tracking skipped dataImportStatisticswith detailed reportingdetailed_report()for human-readable summaries
- Bulk Credential Operations - Mass credential management:
store_bulk(),delete_bulk(),update_bulk()methodsupdate_credentials_for_group()for group-wide updatescopy_credentials()between connections
- 1Password as PasswordSource - 1Password can now be selected per-connection:
- Added
OnePasswordvariant toPasswordSourceenum - 1Password option in password source dropdown (index 4)
- Password save/load support for 1Password backend
- Default selection based on
preferred_backendsetting
- Added
- Credential Rename on Connection Rename - Credentials are now automatically renamed in secret backends when connection is renamed:
- KeePass: Entry path updated to match new connection name
- Keyring: Entry key updated from old to new name format
- Bitwarden: Entry name updated to match new connection name
- 1Password: Uses connection ID, no rename needed
Changed
- Safe State Access - New helpers to reduce RefCell borrow panics:
with_state()andtry_with_state()for read accesswith_state_mut()andtry_with_state_mut()for write access
- Toast Queue - Fixed toast message sequencing with
schedule_toast_hide()helper
Fixed
- KeePass Password Retrieval for Subgroups - Fixed password not being retrieved when connection is in nested groups:
- Save and read operations now both use hierarchical paths via
KeePassHierarchy::build_entry_path() - Paths like
RustConn/Group1/Group2/ConnectionName (protocol)are now consistent
- Save and read operations now both use hierarchical paths via
- Keyring Password Retrieval - Fixed password never found after saving:
- Save used
"{name} ({protocol})"format, read used UUID - Now both use
"{name} ({protocol})"with legacy UUID fallback
- Save used
- Bitwarden Password Retrieval - Fixed password never found after saving:
- Save used
"{name} ({protocol})"format, read used"rustconn/{name}" - Now both use
"{name} ({protocol})"with legacy format fallback
- Save used
- Status Icon on Tab Close - Status icons now clear when closing RDP/SSH tabs:
- Previously showed red/green status for closed connections
- Now clears status (empty string) instead of setting "failed"/"disconnected"
Tests
- Added 370+ new property tests (total: 1241 tests):
vnc_client_tests.rs- VNC client configuration and events (28 tests)terminal_theme_tests.rs- Terminal theme parsing (26 tests)error_tests.rs- Error type coverage (45 tests)retry_tests.rs- Retry logic (14 tests)session_restore_tests.rs- Session persistence (10 tests)rdp_backend_tests.rs- RDP backend selection (13 tests)log_sanitization_tests.rs- Log sanitization (19 tests)health_check_tests.rs- Health monitoring (13 tests)bulk_credential_tests.rs- Bulk operations (25 tests)import_statistics_tests.rs- Import statistics (28 tests)- And more...
Fixed
- Local Shell in Split View - Local Shell tabs can now be added to split view panels:
- Fixed protocol filter that excluded "local" protocol from available sessions
- Multiple Local Shell tabs now appear in "Select Tab" dialog for split panels
Installation
Debian/Ubuntu
sudo dpkg -i rustconn_0.6.9_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora
sudo dnf install rustconn-0.6.9-1.fc41.x86_64.rpmAppImage
chmod +x RustConn-0.6.9-x86_64.AppImage
./RustConn-0.6.9-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