[3.4.9] - 2026-04-13
WinSCP bridge, macOS quit fix, security hardening, dependency updates
Added
- WinSCP import/export bridge: Import saved sessions from WinSCP configuration files (
.inior exported sessions). Supports SFTP, SCP, FTP, FTPS (implicit and explicit TLS), WebDAV (HTTP/HTTPS), and S3. Passwords are decoded from WinSCP's XOR obfuscation and upgraded to AES-256-GCM encrypted vault. Export to WinSCP.ini also available with compatible password obfuscation. GUI (Settings > Export/Import) and CLI (aeroftp import winscp). Closes #96 - CLI
import winscpsubcommand: Scan and preview WinSCP sessions from the command line with--jsonsupport for automation - Duplicate detection in import preview: rclone and WinSCP import screens now show an "Already exists" badge on servers that match existing profiles, with option to update credentials on re-import instead of silently skipping
- Server deletion confirmation: Deleting a saved server now shows a confirmation prompt to prevent accidental removal
- Media filter tab: New "Media" filter in My Servers for Immich, Google Photos, and future media-oriented providers
- WinSCP import guide: New documentation page at docs.aeroftp.app/features/winscp with protocol mapping, security comparison, and usage instructions
Fixed
- macOS menu bar Quit not working: "Quit AeroFTP" from the macOS menu bar and Cmd+Q now exit the application correctly even when AeroCloud hide-to-tray is active. Previously, the explicit quit was intercepted by the
CloseRequestedhandler and only hid the window. Fixes #98 - WebDAV 405 on root PROPFIND: Merged community fix from @saschabuehrle - servers returning 405 for
PROPFIND /now fall back toOPTIONS, allowing valid WebDAV endpoints to connect. Fixes #95, merged via #97 - My Servers counter not updating on delete: The server count badge in the "My Servers" tab now refreshes immediately when a server is removed
- Tray quit cleanup: Tray "Quit" now uses Tauri's
app.exit()for graceful shutdown instead ofstd::process::exit(0), ensuring Cloud Filter cleanup on Windows runs before termination
Security
- CLI credential redaction:
aeroftp import rclone --jsonandaeroftp import winscp --jsonnow returnhasCredential: true/falseinstead of plaintext passwords. Text mode already showed[credentials]only - Import path hardening: Both rclone and WinSCP import commands now reject path traversal (
..), resolve symlinks viacanonicalize(), and enforce a 10 MB file size cap - Export path hardening: rclone and WinSCP export commands now validate destination paths (no traversal, extension check, parent directory existence)
- Import duplicate rollback: localStorage mutations during import are now wrapped with backup/rollback - if
onImportfails, original data is restored - WinSCP password decoder hardening: Error messages no longer leak decoded password bytes, shift loop handles truncated input, v2 16-bit length format used for passwords exceeding 255 bytes
- INI injection prevention: Export to WinSCP.ini sanitizes all field values (strips newlines and bracket characters) to prevent INI section injection
- UUID generation: Removed entropy-reducing timestamp XOR from credential ID generation, using pure CSPRNG output
- Exit guard:
exit_app()usesAtomicBoolto ensure cleanup runs at most once even on rapid double-click - URL decode UTF-8: WinSCP session name decoder now correctly handles multi-byte UTF-8 percent-encoded sequences
Improved
- CLI banner redesign: New two-color ASCII art banner with "Aero" in green and "FTP" in blue, improved readability and alignment
- Windows uninstaller prompts: Three separate cleanup dialogs during uninstall let users choose what to remove (servers/credentials, AI history, cache) independently
Dependencies
similar2.7.0 to 3.1.0 (#100)postcss8.5.8 to 8.5.9 (#103)country-flag-icons1.6.15 to 1.6.16 (#104)toml0.9.12 to 1.1.0 (#105)rustls0.23.37 to 0.23.38 (#106)tauri-plugin-single-instance2.4.0 to 2.4.1 (#107)- Closed incompatible:
react-dom19 (#99),react19 (#101),cbc0.2 (#102)
Downloads:
- Windows:
.msiinstaller,.exe, or.zipportable (no installation required) - macOS:
.dmgdisk image - Linux:
.deb,.rpm,.snap, or.AppImage