Repository navigation
Releases
v2.2.8
[v2.2.8] - 2026-11-07
Esta versión introduce una optimización mayor en el flujo de subida de archivos grandes (> 32 MB) hacia Movistar / O2 Cloud y resuelve problemas críticos de compatibilidad con el cliente WebDAV de Windows (WebClient / Mini-Redirector).
⚡ Novedades y Mejoras
- Subida en Flujo Directo Concurrente (Concurrent Spool + Stream):
- Para archivos grandes, el proxy ya no espera a guardar todo el archivo en el almacenamiento temporal antes de empezar la subida a Movistar Cloud. Ahora transmite concurrentemente los datos hacia Telefónica SAPI en tiempo real según van llegando desde el cliente (guardando en paralelo en disco temporal por si fuera necesario reintentar).
- Reduce drásticamente la latencia de respuesta final al terminar el último byte de subida (de ~60-100 segundos a < 1 segundo), evitando que Windows WebClient aborte la operación por timeout (SendReceiveTimeoutInSec = 60).
- Soporte PROPPATCH sin truncado (DeadPropsHolder):
- Corrige un error crítico donde peticiones PROPPATCH enviadas por Windows Explorer tras completar un PUT (para guardar metadatos NTFS/Win32) abrían el archivo con os.O_RDWR y sobrescribían accidentalmente el archivo recién subido con 0 bytes.
- Se implementa DeadPropsHolder en todos los manejadores WebDAV para responder adecuadamente a los atributos Win32 sin tocar el archivo en la nube.
- Liberación de Bloqueos Huérfanos (
esilientLockSystem):- Sistema de bloqueos WebDAV resiliente que rastrea tokens y rutas para limpiar de forma automática los bloqueos colgados (webdav: locked) tras cancelaciones de cliente o desconexiones.
- Documentación:
- Se actualizan las instrucciones de configuración del registro de Windows (SendReceiveTimeoutInSec = 3600) en README.md y docs/network-drive.md.
v2.2.7
[v2.2.7] - 2026-11-06
Esta versión incorpora la documentación y solución oficial definitiva para el problema de reconexión persistente y bloqueo de credenciales en Windows 10 y Windows 11 (#18).
🪟 Novedades y Mejoras
- Resolución del problema de reconexión persistente en Windows WebClient:
- Diagnóstico exhaustivo del comportamiento por diseño de Microsoft (KB 2673544), por el cual el cliente nativo de Windows envía contraseñas vacías al reconectar tras reiniciar, provocando bucles de autenticación y bloqueos por límite de tasa (HTTP 429).
- Guía oficial paso a paso y script PowerShell para montaje silencioso al inicio de sesión con clave protegida mediante Windows DPAPI (ConvertTo-SecureString) y parámetro /persistent:no.
- Opciones de despliegue mediante Tarea Programada (schtasks) o carpeta de Inicio (shell:startup) sin ventanas emergentes.
- Actualización de README.md, docs/network-drive.md y actualización del cuadro de honor en CONTRIBUTORS.md.
👥 Agradecimientos
Muchas gracias a @aarizaga90 por el diagnóstico técnico y el diseño de la solución en #18.
v2.2.6
[v2.2.6] - 2026-11-06
Esta versión incorpora mejoras críticas de integridad de datos en operaciones de renombrado/movimiento de archivos y protección de respuestas vacías de Movistar / O2 Cloud SAPI, gracias a la contribución de @aarizaga90 en #20.
🛡️ Novedades y Mejoras
- Confirmación estricta de destino antes de borrar el origen (moveByReupload):
- En renombrados con cambio de extensión que requieren re-subida, el archivo original en la nube ya no se elimina inmediatamente tras el POST inicial.
- Se verifica que el archivo de destino exista en SAPI (GetMediaByID), tenga un ID nuevo válido y que su tamaño coincida exactamente con el original.
- Para archivos transmitidos en flujo (no cacheados en memoria), se re-descarga el archivo subido calculando y comparando su hash SHA-256 contra el origen. Si no coincide o se agota el tiempo de espera, la operación aborta y el archivo de origen se conserva intacto.
- Protección frente a lecturas con cuerpo vacío de SAPI (getBodyGuard):
- Si Movistar/O2 Cloud responde a peticiones GET/HEAD con código 200/206 y Content-Length > 0 pero no entrega ningún byte (sucede ocasionalmente con archivos recién subidos que aún no han sido indexados por el backend), el proxy intercepta la respuesta y devuelve un error 503 Service Unavailable completo con mensaje descriptivo, evitando que clientes WebDAV (Duplicati, Synology, GVFS, etc.) acepten archivos truncados de 0 bytes como válidos.
- Bloqueo ordenado por ruta (�cquireFolderLock):
- Serialización de operaciones MOVE, PUT y DELETE sobre el mismo fichero mediante ordenación lexicográfica de bloqueos para prevenir condiciones de carrera e interbloqueos (deadlocks).
👥 Agradecimientos
Muchísimas gracias a @aarizaga90 por el reporte, análisis detallado e implementación en #20.
v2.2.5
🔒 Actualización de Seguridad Crítica en v2.2.5
Esta versión solventa la vulnerabilidad de seguridad reportada responsablemente por @aarizaga90 en el aviso de seguridad GHSA-fpxr-64gm-wxvf (CVSS 7.4 - Alta).
🛡️ Cambios y Correcciones
- Ligar sesiones NTLM a la conexión TCP real (
net.Conn):- Se sustituye el indexado de sesiones autenticadas por
r.RemoteAddr(par IP:puerto) por un identificador unívoco de conexión mediantehttp.Server.ConnContext. - Evita que clientes no autenticados puedan heredar la sesión NTLM de otro usuario cuando un proxy inverso (Nginx, Traefik, Caddy, etc.) agrupa y reutiliza conexiones TCP upstream.
- Se sustituye el indexado de sesiones autenticadas por
- Invalidación inmediata en cierre de conexión (
ConnState):- Implementación de
http.Server.ConnStatepara llamar automáticamente aInvalidateConn(id)al pasar la conexión aStateClosedoStateHijacked.
- Implementación de
- Desactivación de herencia de sesión NTLM tras proxies de confianza (
RemoteIsTrustedProxy):- Ante peticiones provenientes de
TRUSTED_PROXIES, la autenticación se exige de forma estricta por petición sin confiar en la autenticación por conexión TCP upstream.
- Ante peticiones provenientes de
- Suite de tests exhaustiva: Cobertura con 7 tests unitarios en
internal/webdav/ntlm_connreuse_test.go.
Agradecemos a @aarizaga90 por el reporte responsable y la colaboración en la resolución del problema.
v2.2.4
🚀 Novedades en v2.2.4
🛡️ Permisos y Resiliencia en Almacenamiento Temporal (WEBDAV_TMPDIR)
- Auto-asignación de permisos en
docker-entrypoint.sh:- Inicialización automática para directorios temporales personalizados (
WEBDAV_TMPDIR, ej./app/tmpmapeado desde el host). - Al arrancar como root, el contenedor crea y asigna la propiedad a
app:app(UID10001) con permisos700. - Si el volumen montado desde el host restringe permisos a nivel de sistema de ficheros e impide el acceso al usuario
app, el contenedor conmuta de forma segura y transparente a ejecución root sin provocar errores405 Method Not Allowed/permission denieden runtime.
- Inicialización automática para directorios temporales personalizados (
- Telemetría y Diagnóstico de Archivos Temporales:
- En caso de fallo al crear el archivo temporal en disco previo a la subida a Movistar/O2 Cloud (
os.CreateTemp), se emite un log explícito indicando la ruta y el motivo exacto (permisos o falta de espacio libre en disco).
- En caso de fallo al crear el archivo temporal en disco previo a la subida a Movistar/O2 Cloud (
v2.2.3
🚀 Novedades y Correcciones en v2.2.3
🐧 Compatibilidad con Desktops Linux y Reverse Proxies (Fix #15)
- Desafío NTLM Adaptativo: La cabecera
WWW-Authenticate: NTLMahora solo se emite para clientes Windows nativos (Microsoft-WebDAV-MiniRedir,davclnt,winhttp) o peticiones que ya incluyan cabeceras NTLM. - Para clientes Linux desktop (GNOME Nautilus/GVFS, KDE Dolphin/KIO, rclone, curl) se emite únicamente
WWW-Authenticate: Basic realm="WebDAV". - Soluciona el error
Intento de acceso NTLM fallidoal acceder desde Linux a través de reverse proxies (Nginx Proxy Manager, Traefik, Caddy), donde libsoup priorizaba NTLM sobre Basic Auth y el proxy no mantenía la afinidad de conexión requerida por NTLM. - Se añade la variable de entorno
WEBDAV_NTLM(auto[por defecto],true/always,false/disabled).
🛡️ Absorción en Memoria de Sondas de Duplicati (Fix #13, PR #14)
- Soporte transparente para el botón "Test connection" de Duplicati: Telefónica SAPI rechaza de forma estricta los archivos con extensión
.tmpcon errorMED-1000. Duplicati prueba obligatoriamente la conexión creando y borrandoduplicati-access-privileges-test.tmp. - Se incorpora
DuplicatiProbeStore, un almacén volátil en memoria RAM (TTL 5 min, límite 10MB) que intercepta y responde a nivel WebDAV (PUT-> 201,GET-> 200,PROPFIND-> 207,DELETE-> 204) sin contactar con Telefónica.
⚡ Optimizaciones y Consistencia en Renombrado (moveByReupload, PR #12)
- Re-subida directa desde memoria RAM si el archivo está en
uploadCacheo mide$\le$ 256 KB. - Sondeo activo (
waitForDownloadURL) para archivos recién subidos de mayor tamaño hasta asegurar que SAPI ha publicado la URL de descarga. - Registro inmediato en la caché en memoria con su nuevo SAPI ID para lecturas consistentes inmediatas.
- Verificación estricta de bytes descargados antes de eliminar el archivo origen.
v2.2.2
🐛 Correcciones y Mejoras en v2.2.2
Esta versión resuelve un falso positivo en la descarga de archivos que impedía completar las copias de seguridad nativas en Home Assistant (#11).
🔍 ¿Qué se ha corregido?
- Descarga transparente de archivos JSON / JS legítimos:
- El motor de descarga descartaba incondicionalmente cualquier respuesta HTTP con
Content-Type: application/jsonotext/javascript, asumiendo que se trataba de un error devuelto por la nube de Movistar. - Esto causaba que archivos de metadatos legítimos como
<backup_id>.metadata.json(generados por el agente de copias de seguridad de Home Assistant /aiowebdav2) cortaran la conexión inmediatamente tras enviar las cabeceras HTTP, provocando el falloClientPayloadError: Response payload is not completed (received 0 of 1017 bytes). - Ahora se realiza una inspección no destructiva de los primeros bytes (
bufio.Reader.Peek): solo se descartan las respuestas que contengan estructuras de error reales de la API SAPI de Movistar Cloud ({"error": {"code": ...}},error_code,status: "error") o cuando el archivo solicitado sea un binario conocido (.tar,.zip,.iso,.png, etc.) que no deba devolver JSON. - Los archivos
.json,.js, scripts y ficheros de configuración se descargan de extremo a extremo al 100% sin cortes ni pérdidas de datos.
- El motor de descarga descartaba incondicionalmente cualquier respuesta HTTP con
- Suite de Pruebas Automatizadas:
- Cobertura exhaustiva en
internal/sapi/download_json_test.goverificando casos reales de Home Assistant, descargas legítimas y discriminación de errores de SAPI.
- Cobertura exhaustiva en
🐳 Actualización en Docker
Para actualizar a esta versión en tu servidor o NAS:
docker pull uniextra/movistar-webdav-proxy:latest
docker compose up -dO bien fijando la etiqueta de versión:
image: uniextra/movistar-webdav-proxy:v2.2.2v2.2.1
Release v2.2.1: Reconexión Automática Persistente en Windows 10/11 (Soporte NTLMv2 + Basic Auth)
Esta versión resuelve la limitación de WinHTTP / WebClient en Windows 10 y Windows 11 por la cual las unidades de red WebDAV mapeadas con /persistent:yes perdían la autenticación o solicitaban credenciales manualmente tras reiniciar el sistema.
🚀 Novedades y Mejoras
-
Autenticación Dual NTLMv2 + HTTP Basic en Paralelo:
- El servidor WebDAV anuncia ahora
WWW-Authenticate: Basic realm="WebDAV"yWWW-Authenticate: NTLMsimultáneamente, validando el handshake criptográfico NTLMv2 (MS-NLMP) sobre la misma contraseña configurada enWEBDAV_PASSWORD. - Permite que el servicio
WebClientde Windows 10/11 utilice el Administrador de Credenciales de Windows (cmdkey) de forma silenciosa y automática al iniciar sesión (DeferFlags = 4), sin diálogos de confirmación ni scripts con contraseñas en texto plano. - 100% Retrocompatible: Los clientes Linux, macOS (Finder), Duplicati, rclone y Synology HyperBackup continúan utilizando
Basic Authsin ningún cambio.
- El servidor WebDAV anuncia ahora
-
Diagnóstico Seguro de Autenticación:
- Añadida telemetría no sensible (
DescribeCredentialShape) en los registros de intentos fallidos de acceso WebDAV sin exponer contraseñas en los logs.
- Añadida telemetría no sensible (
-
Documentación de Montaje Persistente en Windows:
- Actualizados
README.mdydocs/network-drive.mdcon la configuración deAuthForwardServerList, inicio automático del servicioWebClienty registro de credenciales encmdkey.
- Actualizados
📦 Imágenes Docker
uniextra/movistar-webdav-proxy:2.2.1uniextra/movistar-webdav-proxy:latest
v2.2.0
Release v2.2.0: Concurrencia Desacoplada, Compatibilidad Windows WebClient y Soporte Multimedia Completo
Esta versión introduce mejoras críticas de rendimiento en transferencias simultáneas, resuelve la compatibilidad con el explorador de archivos de Windows y añade soporte completo para el movimiento y renombrado de todo tipo de archivos en Movistar / O2 Cloud.
🚀 Novedades y Mejoras
-
Concurrencia Desacoplada 4/4 con Techo Global de 5:
- Semáforos independientes para subidas (hasta 4) y descargas (hasta 4), con un techo global conjunto de 5 conexiones simultáneas para no saturar la cuota por token de la API SAPI.
- Reutilización optimizada de sockets HTTP (
MaxIdleConnsPerHost: 20) y retroceso exponencial con jitter ante códigos HTTP 429 (Too Many Requests) o 503. - Optimizado nativamente para Duplicati (4 hilos por defecto), Synology HyperBackup y rclone.
-
Compatibilidad Total con Windows WebClient (Unidad de Red):
- Normalización transparente de credenciales HTTP Basic Auth (
EQUIPO\usuarioo\usuarioausuario). - Emisión estricta de desafíos RFC 4918 (
401 UnauthorizedconWWW-Authenticate: Basic realm="WebDAV") requeridos por el servicio WebClient del explorador de Windows. - Resolución segura de IP de cliente y exclusión por defecto de subredes Docker bridge (
172.16.0.0/12) en el protector anti-fuerza bruta para evitar bloqueos del gateway de Docker.
- Normalización transparente de credenciales HTTP Basic Auth (
-
Renombrado y Movimiento Completo de Multimedia (#8):
- Integrado el soporte para mover y renombrar imágenes, audios y vídeos utilizando sus operaciones dedicadas en SAPI (
save-metadatatipado). - Gestión de reintentos ante desincronización de cuotas (
MED-1017). Agradecimientos a @aarizaga90 por el PR #8.
- Integrado el soporte para mover y renombrar imágenes, audios y vídeos utilizando sus operaciones dedicadas en SAPI (
-
Cambio de Extensión de Archivos vía
moveByReupload(#9):- Permite cambiar la extensión de archivos vía WebDAV mediante streaming inteligente (
stream download -> upload new -> delete old on success), solventando la limitación de SAPI que prohíbe mutar extensiones en caliente.
- Permite cambiar la extensión de archivos vía WebDAV mediante streaming inteligente (
-
Alertas de Telegram (#10):
- Fallback automático al teléfono de la cuenta activa al guardar la configuración de Telegram si el campo del navegador no está precargado.
📦 Imágenes Docker
uniextra/movistar-webdav-proxy:2.2.0uniextra/movistar-webdav-proxy:latestuniextra/movistar-webdav-proxy:test
v2.1.2
🐛 Correcciones en la v2.1.2
📁 Borrado de Carpetas en la Nube (Issue #7)
- Corrección de borrado en Movistar / O2 Cloud: Solucionado el problema por el cual al eliminar una carpeta a través de WebDAV, esta desaparecía de la vista del cliente pero seguía existiendo en la web de la nube.
- Causa raíz en SAPI: El endpoint
POST /media/folder?action=softdeletede Movistar exige obligatoriamente recibir el parámetro&id=<folder_id>en la URL query string. Al faltar, el servidor de Movistar devolvíaHTTP 200con un código internoCOM-1011: Missing required parametersin llegar a borrar la carpeta. - Validación de errores: Añadido el parámetro
&id=a la petición y verificación explícita de errores devueltos por la API para asegurar que los borrados se reflejen de inmediato en la nube real.