siftp

Protocols

All protocols share users, roots, permissions, quotas, rate limits, bans, and the audit log. Paths are virtual: / is the user's root, and .. past it is refused with invalid_path everywhere.

FTP and FTPS

GroupCommands
SessionUSER PASS ACCT QUIT SYST NOOP HELP FEAT OPTS SITE HELP HOST
NavigationPWD CWD CDUP (and X variants)
Transfer setupTYPE A/I MODE S STRU F PASV EPSV EPSV ALL PORT EPRT REST ABOR
TransfersRETR STOR STOU APPE LIST NLST MLSD
FilesDELE MKD RMD RNFR RNTO SIZE MDTM MFMT MLST
TLSAUTH TLS PBSZ 0 PROT P/C (CCC refused)

SFTP

SFTP version 3 over SSH-2, OpenSSH wire numbering.

ItemValue
RequestsOPEN CLOSE READ WRITE STAT LSTAT FSTAT SETSTAT FSETSTAT OPENDIR READDIR REMOVE MKDIR RMDIR RENAME READLINK SYMLINK REALPATH
Extensionsposix-rename statvfs fstatvfs expand-path limits fsync (all @openssh.com)
Key exchangemlkem768x25519-sha256 (post-quantum hybrid), curve25519-sha256, ecdh-sha2-nistp256; strict KEX
Ciphersaes256-gcm@openssh.com, aes128-gcm@openssh.com; chacha20-poly1305@openssh.com first only on CPUs without AES instructions. [sftp].ciphers sets the list
Host keysEd25519 (generated) or ECDSA; RSA host keys are refused
Client authPassword, or public key: Ed25519, ECDSA, RSA (SHA-2)
Limits256 KiB packets, 255 KiB reads/writes, 256 open handles

WebDAV/HTTP (read-only)

Set [webdav].bind (and tls = true for HTTPS with the FTPS certificate). Clients: Finder, Windows Explorer, rclone, cadaver, browsers, curl.

MethodBehaviour
OPTIONSDAV: 1, allowed methods
PROPFINDDepth 0 or 1 (infinity is treated as 1); needs l
GET, HEADFiles with single Range (needs r); directories as HTML, or JSON with Accept: application/json (needs l)
Anything else403 permission_denied
curl -u alice:password http://127.0.0.1:8081/docs/report.pdf -o report.pdf
curl -u alice:password -X PROPFIND -H 'Depth: 1' http://127.0.0.1:8081/docs/

Authentication is HTTP Basic against the same users (bans and LDAP apply); verified credentials are cached for 60 seconds.