Ghost FTP v0.95.39 — Fail-closed WebDAV/HTTP directory listing (development preview)
Published predecessor: v0.95.38.
Changes in this pull request
- Reject truncated, malformed or incomplete WebDAV PROPFIND multistatus XML. A partial remote directory cannot silently become a successful inventory used for destructive synchronization.
- Require HTTP 207 Multi-Status for depth-one WebDAV listings and reject missing response hrefs, invalid XML roots and invalid response bodies.
- Propagate nginx HTTP JSON autoindex parse failures instead of interpreting malformed JSON as an empty directory. A valid empty array remains supported.
- Add regression tests for malformed input and preserve valid Nextcloud, Apache and nginx listing fixtures.
- Advance preview build metadata from the published immutable v0.95.38 tag without changing existing release assets or tags.
Acceptance before merge / release
- Exact-head version and documentation alignment, Rustfmt, workspace tests, Clippy, frontend checks.
- Real FTP, explicit FTPS and SFTP test-server E2E.
- Windows/Linux native packaging and installation lifecycle tests.
- Android build/emulator acceptance, Windows hardening, macOS Preview compatibility.
- Manual WebDAV failure-injection E2E (truncated multistatus and invalid nginx autoindex).
This remains a preview source candidate. It is not proof of production Android signing, macOS notarization, live cloud vendor-account E2E, or 75-screen pixel-parity certification.