# FTP y WebDAV

> Diseño previsto; aún no implementado. Ambos sirven **el mismo árbol de shares** que la web,
> con las mismas *locations*, permisos y usuarios ([SHARES-Y-RUTAS.md](SHARES-Y-RUTAS.md)).

## FTP

Para los clientes con los que la web se queda corta: en Mac clásico los clientes FTP gráficos
eran la forma habitual de mover ficheros, y Windows 95 trae `ftp.exe`.

### Conexión

- **Puerto de control:** 2121 por defecto (el 21 requiere privilegios en Linux/macOS),
  configurable.
- **Modo pasivo** (`PASV`, `EPSV`): rango de puertos configurable (`FtpPassivePorts`). Se anuncia
  la IP local de la conexión de control; `FtpPublicAddress` opcional para equipos tras NAT.
- **Modo activo** (`PORT`, `EPRT`): lo usan por defecto clientes antiguos como `ftp.exe`. El
  servidor solo conecta a la **misma IP** que abrió el control (contra el "FTP bounce") y nunca a
  puertos por debajo de 1024. El puerto de origen no es el 20 (no requiere privilegios); los
  clientes lo aceptan.
- **IPv4 e IPv6** (`EPSV`/`EPRT`).
- **Sin cifrado** (ni FTPS): en claro, como la web.

### Autenticación

- **Usuario `anonymous`** (o `ftp`), con cualquier contraseña: ve los shares públicos.
- **Usuario y contraseña de `[User …]`:** ve además los shares cuyo `Users` lo incluye.
- **Contraseñas fallidas:** retardo creciente y límite de intentos por IP.

### Comandos

| Grupo | Comandos |
|---|---|
| Sesión | `USER` `PASS` `QUIT` `NOOP` `SYST` (`UNIX Type: L8`) `FEAT` `OPTS UTF8` `HELP` `STAT` |
| Navegación | `PWD` `CWD` `CDUP` |
| Listados | `LIST` (formato `ls -l`, el que entienden los clientes antiguos) `NLST` `MLSD` `MLST` |
| Transferencia | `TYPE` (`A`/`I`) `MODE S` `STRU F` `RETR` `STOR` `APPE` `REST` (reanudar) `ABOR` |
| Información | `SIZE` `MDTM` |
| Cambios | `MKD` `RMD` `DELE` `RNFR`/`RNTO` |

- `TYPE A` convierte los saltos de línea a `CRLF` al enviar; `TYPE I` (binario) es el habitual.
- Los permisos del share se aplican igual que en la web: `STOR` sobre un fichero existente
  necesita `Overwrite`, `DELE` necesita `Delete`, etc. Las subidas también van a un temporal y se
  renombran al terminar.
- Los directorios virtuales de las *locations* aparecen en `LIST` como carpetas.

### Juego de caracteres de los nombres

- Si el cliente activa `OPTS UTF8 ON` (o usa `MLSD`), UTF-8.
- Si no, el juego configurado en `FtpCharset`: `iso-8859-1` (por defecto), `macroman`, `cp437`,
  `cp850` o `windows-1252`. **Pendiente:** elegirlo por cliente; por ahora es global.

### Mac clásico por FTP

Con `Mac = true` en el share, un `STOR` de un fichero `.bin` con cabecera MacBinary II/III válida
(CRC correcto) se decodifica igual que en la web. Ver [MAC-CLASICO.md](MAC-CLASICO.md).
**Pendiente:** ofrecer al listar entradas virtuales `.bin` para descargar con *resource fork*.

## WebDAV

Sobre el mismo puerto HTTP, activable por share (`WebDav = true`), para montar los shares como
una carpeta desde sistemas modernos (y algunos antiguos).

### Alcance

- **Clase 1:** `OPTIONS`, `PROPFIND` (profundidad 0 y 1; `infinity` se rechaza), `PROPPATCH`
  (se acepta y se ignora lo que no se aplica), `MKCOL`, `GET`, `PUT`, `DELETE`, `COPY` y `MOVE`
  dentro del mismo share.
- **`LOCK`/`UNLOCK` simulados** (se anuncia clase 2): Finder de macOS y el redirector de Windows
  los exigen para escribir. Se devuelven *tokens* válidos, pero no impiden accesos de otros
  clientes.
- **Propiedades:** `displayname`, `resourcetype`, `getcontentlength`, `getcontenttype`,
  `getlastmodified`, `creationdate`, `getetag`.
- **Cabeceras:** `DAV: 1, 2` y `MS-Author-Via: DAV` (la piden las "Carpetas web" de Windows
  98/2000).
- **XML:** se lee con `XmlReader` con `DtdProcessing.Prohibit` (sin entidades externas).
- **Permisos:** los mismos del share; `Listing` controla `PROPFIND` de profundidad 1.

### Clientes y limitaciones conocidas

| Cliente | Notas |
|---|---|
| Explorador de Windows 10/11 (WebClient) | Por defecto **no envía Basic sin HTTPS**: solo funcionan los shares públicos, salvo cambiando `BasicAuthLevel` en el registro. Límite de fichero de ~50 MB por defecto (`FileSizeLimitInBytes`) |
| Finder de macOS | Necesita `LOCK`; crea ficheros `._*` y `.DS_Store` (con `Mac = true` se tratan como AppleDouble) |
| GVfs / gestores de Linux | `dav://host:puerto/location` |
| Carpetas web de Windows 98/2000 | A probar |
| Clientes WebDAV de Mac OS 9 | A probar |
