Skip to content

Releases: Cloudinvoke/libunftp

unftp-sbe-gcs v0.3.1

Choose a tag to compare

@hannesdejager hannesdejager released this 30 Oct 03:19

Changes in this release:

  • #592 Require patched rustls-webpki 0.103.16 or later to reject compromised eMudhra intermediate CA keys (RUSTSEC-2026-0382).
  • #601 Upgrade base64 to 0.23.1 and other dependencies.

Published to crates.io: https://crates.io/crates/unftp-sbe-gcs/0.3.1

unftp-auth-rest v0.3.1

Choose a tag to compare

Changes in this release:

  • #592 Require patched rustls-webpki 0.103.16 or later to reject compromised eMudhra intermediate CA keys (RUSTSEC-2026-0382).
  • Upgrade dependencies, including regex 1.13.1.

libunftp 0.24.0

Choose a tag to compare

@hannesdejager hannesdejager released this 28 Oct 08:35

Changes in this release:

  • #583 Document custom SITE commands in the README,
    list unftp-site-hash as an extension, and recommend the unftp-site-* prefix for extension crates.
  • #592 Require patched rustls-webpki 0.103.16 or later in
    libunftp to reject compromised eMudhra intermediate CA keys
    (RUSTSEC-2026-0382).
  • #582 End a PROXY protocol header read with an
    unexpected EOF error when the peer closes before sending a complete header, avoiding an endless
    read loop.
  • BREAKING: #569 Include the FTP working directory in
    DataEvent::Got (RETR) and DataEvent::Put (STOR and APPE) paths. For example, uploading
    photo.jpg in /uploads now reports /uploads/photo.jpg instead of photo.jpg; at the FTP root
    it reports /photo.jpg. Listeners that compare paths or construct storage keys from them must
    handle paths rooted at the user's FTP root rather than raw command arguments. These paths are
    not backend filesystem paths or object URLs, and are not canonicalized. Delete, rename, and
    directory events already use this convention.
  • #578 and
    #594 Preserve leading, embedded, and trailing
    whitespace in LIST pathnames, including after options and --.
  • #601 Upgrade nix to 0.31.3.

libunftp 0.23.1

Choose a tag to compare

@hannesdejager hannesdejager released this 26 Sep 14:59

libunftp 0.23.1

This release adds application-defined FTP SITE subcommands and fixes control-channel reply handling and pooled listener address handling.

New functionality

#571: Register custom subcommands with ServerBuilder::site_command and implement libunftp::options::SiteCommandHandler. Handlers receive arguments, authenticated user details, the storage backend, and the session logger through SiteCommandContext, and return a Reply.

#576: Subcommand names are case-insensitive. Invalid or duplicate registrations and attempts to override built-in SITE MD5 are rejected by build(). When using user_detail_provider, call it before registering SITE handlers.

Fixes and maintenance

  • #573: Prevent a panic on blank lines in multiline FTP replies.
  • #568: Use the accepted control connection's local address in pooled listener mode, including wildcard bindings.
  • Update dependencies, including #567 and #574, and improve tests and documentation (#571).

Compatibility notes

The unftp-core API is unchanged and remains at 0.1.0. Unknown SITE subcommands now return 502 instead of 500.

Consumers pinning async-trait below 0.1.92 must update that pin to resolve dependencies. The unFTP smoke test used an updated pin and the filesystem backend with anonymous authentication.

Full changes: libunftp-0.23.0...libunftp-0.23.1

libunftp v0.23.0, unftp-auth-jsonfile v0.4.0, unftp-auth-pam v0.3.0, unftp-auth-rest v0.3.0, unftp-sbe-fs v0.4.0, unftp-sbe-gcs v0.3.0

Choose a tag to compare

@hannesdejager hannesdejager released this 16 Feb 21:06

Changes in this release:

  • BREAKING: Introduced unftp-core and moved backend-facing auth/storage traits and types there.
    Backends now depend on unftp-core directly and libunftp depends on this core crate. Backends
    depending on libunftp will no longer compile. For those, updating Cargo.toml to use unftp-core should be
    sufficient though, as no other code level breaking changes were introduced.
  • BREAKING: Updated backend crates in this repository to use unftp-core and removed the ServerExt
    helpers in the unftp-sbe-* crates. Examples now use ServerBuilder directly. This was needed to avoid
    these back-ends to depend on libunftp.
  • Bump versions for unftp-auth-* and unftp-sbe-* crates to reflect the API split.

unftp-core v0.1.0

Choose a tag to compare

@hannesdejager hannesdejager released this 14 Feb 08:56

This is a new crate that defines the interfaces for storage an authentication back-ends or extensions. Previously all back-ends would depend on libunftp causing all sorts of problems like release churn for back-ends even though nothing changed for back-ends but rather something in the server implementation. Thus, this is really a split of libunftp into the server implementation part and the back-end APIs.

See #562 for more details.

libunftp v0.22.0

Choose a tag to compare

@hannesdejager hannesdejager released this 08 Feb 18:37

Changes in this release:

  • #550 Split Authenticators from the Subject Resolving (UserDetail
    Providing) concern:
    • BREAKING: Refactored Authenticator trait to be non-generic and return Principal instead of a generic
      User
      type. This decouples authentication (verifying credentials) from user detail retrieval (obtaining full user
      information).
    • Introduced Principal struct representing an authenticated user's identity (username). This is the minimal
      information returned by authentication.
    • Introduced UserDetailProvider trait to convert a Principal into a full UserDetail implementation. This
      allows
      authentication and user detail lookup to be separated.
    • Introduced AuthenticationPipeline struct that combines an Authenticator and a UserDetailProvider to provide
      a
      complete authentication flow.
    • Added DefaultUserDetailProvider implementation that returns DefaultUser for convenience.
    • BREAKING: Updated all unftp-auth-* crates (unftp-auth-jsonfile, unftp-auth-pam, unftp-auth-rest) to
      use
      the new non-generic Authenticator trait.
    • Updated all examples and tests to use the new authentication pattern.
  • #551 Let authenticators know the FTP Command channel TLS state
  • #553 Introduced a new "pooled listener" mode
    (.pooled_listener_mode()) for high-traffic servers.
    • This mode improves passive connection performance and security by pre-binding all passive ports.
    • Fixed a memory leak in the passive port Switchboard (used by Pooled and Proxy modes). A new scavenger task now
      cleans up expired and orphaned port reservations.
    • Fixed the PORT command (Active Mode) so that it now works correctly in all listener modes.
    • Fixed that the EPSV command is now correctly disabled in Proxy Protocol mode where it is not (yet) supported.
  • BREAKING: Removed the deprecated Server::new and Server::with_authenticator methods. The ServerBuilder
    struct should be used instead.

libunftp v0.21.1

Choose a tag to compare

@hannesdejager hannesdejager released this 23 Dec 15:42

Changes in this release

  • Compile against Rust 1.92.0 in CI
  • #547 Put metrics and proxy-protocol functionality behind features (prometheus and proxy_protocol).
  • #548 Fix error message typos
  • #541 Initial MLSD (Machine List Directory) command implementation (RFC 3659)
  • #541 Fix MLST output formatting
  • #541 Fix MLSx facts must have a terminating semicolon according to RFC 3659 section 7.2
  • #541 Fix wrong use of metadata.uid() instead of metadata.gid()
  • #540 Fix build with "ring" instead of "aws_lc_rs" feature
  • Implement 550 error code for RNFR command
  • Bump dependencies

New Contributors

Full Changelog: libunftp-0.21.0...libunftp-0.21.1

unftp-sbe-gcs v0.2.9

Choose a tag to compare

@hannesdejager hannesdejager released this 26 Apr 12:43

Changes in this release:

  • Upgrade to libunftp v0.21.0
  • Upgrade dependencies

unftp-sbe-fs-0.3.0

Choose a tag to compare

@hannesdejager hannesdejager released this 26 Apr 12:36

Changes in this release

  • Upgrade to libunftp v0.21.0
  • Breaking: Don't panic during Filesystem::new
  • Upgrade dependencies