AeroFTP v3.6.7
[3.6.7] - 2026-04-27
Share-link reliability and UX paper cuts
A focused patch release. The headline is a silent regression on MEGA Native share-link generation that surfaced during an interoperability test session against MEGA's own infrastructure: the URL we built used the internal node handle instead of the public handle returned by the API, so links opened on mega.nz with "File cannot be accessed". Same encryption key, wrong path component, no error from our side. The fix lands together with a CLI verification flag and a few small UX wins voted up on the v3.6.7 wishlist.
Fixed
- MEGA Native share link —
aeroftp-cli link --profile <mega-native>was buildingmega.nz/file/<internal-node-handle>#<key>instead ofmega.nz/file/<public-handle>#<key>. The encryption key portion was always correct, only the 8-character handle in the path was wrong, so generated links opened on a "File cannot be accessed" page onmega.nz. Fix: capture the public handle returned by the MEGA APIl(export) command and use that in the URL.mega_native.rs::create_share_link. - S3 explicit endpoint precedence — when a saved server profile has both a configured S3 endpoint and a host populated by the GUI, the explicit endpoint now wins. Also detects bucket-addressing errors and reports them as
ProviderError::Configurationso they are actionable on the CLI side. (commit27d2ccc8, originally merged via #132 into the local tree, formally rolled into this release.) - Edit Server form, S3 Path-Style toggle — the Path-Style URLs checkbox was wired into QuickConnect via
ProtocolSelectorbut never plumbed into Settings > Servers > Edit Server, so users could not flip the toggle on a saved profile after creation. Now exposed in the S3 section of Edit Server, sharing the existingprotocol.pathStylei18n key. Surfaced by @voland-key on #132. - Edit Server form, Public URL Base scope — the "Public URL Base" field was rendered in Edit Server for every protocol including S3 / Azure / MEGA / Filen / GitHub / OAuth providers, with a caption that explicitly reads "Enter the HTTP URL that maps to your FTP root folder". The field is only meaningful for filesystem-mounted protocols whose tree maps to a plain HTTP service. Now gated to FTP / SFTP / WebDAV; other providers build their share links via native APIs and do not consume this field.
Changed (FTP layer — suppaftp 8.0.1 to 8.0.3)
- suppaftp upgraded from 8.0.1 to 8.0.3 after a fresh upstream review (analysis archived in
docs/dev/reports/2026-04-27-suppaftp-upgrade-analysis.md). The pin held since 8.0.2 introduced an ungatedstd::os::fd::AsFdcall that broke Windows builds. Upstream still ships that code in 8.0.3, but it is feature-gated behindtokio-async-native-tls, which AeroFTP does not enable (we usetokio-rustls-aws-lc-rs). Verified by readingtokio_ftp/tls/native_tls.rsin the upstream 8.0.3 source. The legacyFTP_CLIENTcrate stays pinned at 8.0.1 because it uses the broken feature. - The upgrade brings 14 upstream fixes that affect AeroFTP's hot path: undefined behavior in the tokio TLS
tcp_stream()borrow chain (PR 135); replacedunwrap()panics on server-controlled EPSV / SIZE / MDTM responses with proper error handling (PR 146); infinite loop in asyncfeat()on mid-response disconnect (PR 137) and the same fix forread_response_in()on multiline + disconnect (PR 138);data_connection_openflag now set only after successful open, removing a class of falseDataConnectionAlreadyOpenerrors (PR 136); MLSX parser acceptscdir/pdirper RFC 3659 (PR 139) and 4-digitunix.modelike0755(PR 140); DOS LIST parser handles sizes with commas like1,234,567(PR 142);parse_lstimeadjusts year for future dates the way GNUlsdoes (PR 143); DOS time parser handles a space before AM/PM (PR 144);abort()no longer appends when the server sends a direct 226 (PR 141); active mode uses EPRT for IPv6 (PR 145);cwd()accepts200 Command OKin addition to250for non-RFC-959 servers (PR 153). Allcargo check/cargo clippy --all-targets -- -D warningsclean.
Added
aeroftp-cli link --verify— optional reachability probe. After the share link is generated, the CLI runs an HTTP GET against the URL with a 15-second timeout, follows up to 5 redirects, and reports the resulting status code. Exits with code 4 on a non-2xx/3xx status. JSON output gains averified: { http_status, ok }block. Useful in CI smoke tests and post-release validation to catch silent regressions like the MEGA one above. Uses GET, not HEAD: SigV4-presigned URLs across S3-compatible providers reject HEAD when onlyhostis inSignedHeaders.- CLI smoke step for
--verifyflag —cli-smoke.ymlnow asserts thataeroftp-cli link --helpadvertises--verify, so removing the flag accidentally fails CI on every supported OS (Linux / macOS / Windows). Live reachability probes against credentialed profiles stay an operator-side check; the smoke verifies surface, not transport. - BLAKE3 in the File Properties Checksum tab — fifth row alongside MD5 / SHA-1 / SHA-256 / SHA-512. The
blake3crate was already vendored for the Hash Forge Cyber tool, so this is purely surface plumbing: backendcalculate_checksumaccepts"blake3"(alias"b3"), the dialog renders a new row, the props type widens accordingly. Output is the standard hex-encoded digest. - Esc clears narrowing on My Servers — pressing Escape while focused on the My Servers grid (no input selected, no modal open) clears the search query and resets the active filter chip back to "All". Mirrors the v3.6.6 Esc gesture that clears file selections in AeroFile panels and answers a wishlist follow-up.
Changed
- File Properties dialog widened from 420 px to 560 px (capped at 92 vw), and the Checksum row no longer truncates the digest. SHA-512 (128 hex characters) and BLAKE3 (64 hex characters) are now readable on a single line where the viewport allows, wrapping cleanly otherwise. The
(label / value / copy)row usesbreak-allanditems-startso long hashes do not overflow the column or push the copy button off-screen.
Downloads:
- Windows:
.msiinstaller,.exe, or.zipportable (no installation required) - macOS:
.dmgdisk image - Linux:
.deb,.rpm,.snap, or.AppImage