Skip to content

Releases

v2.2.8

Choose a tag to compare

@uniextra uniextra released this 07 Nov 11:28

[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

Choose a tag to compare

@uniextra uniextra released this 06 Nov 22:20

[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

Choose a tag to compare

@uniextra uniextra released this 06 Nov 08:48

[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

Choose a tag to compare

@uniextra uniextra released this 05 Nov 22:22

🔒 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 mediante http.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.
  • Invalidación inmediata en cierre de conexión (ConnState):
    • Implementación de http.Server.ConnState para llamar automáticamente a InvalidateConn(id) al pasar la conexión a StateClosed o StateHijacked.
  • 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.
  • 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

Choose a tag to compare

@uniextra uniextra released this 05 Nov 21:35

🚀 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/tmp mapeado desde el host).
    • Al arrancar como root, el contenedor crea y asigna la propiedad a app:app (UID 10001) con permisos 700.
    • 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 errores 405 Method Not Allowed / permission denied en runtime.
  • 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).

v2.2.3

Choose a tag to compare

@uniextra uniextra released this 05 Nov 17:16

🚀 Novedades y Correcciones en v2.2.3

🐧 Compatibilidad con Desktops Linux y Reverse Proxies (Fix #15)

  • Desafío NTLM Adaptativo: La cabecera WWW-Authenticate: NTLM ahora 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 fallido al 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 .tmp con error MED-1000. Duplicati prueba obligatoriamente la conexión creando y borrando duplicati-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 uploadCache o 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

Choose a tag to compare

@uniextra uniextra released this 05 Nov 08:05

🐛 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/json o text/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 fallo ClientPayloadError: 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.
  • Suite de Pruebas Automatizadas:
    • Cobertura exhaustiva en internal/sapi/download_json_test.go verificando casos reales de Home Assistant, descargas legítimas y discriminación de errores de SAPI.

🐳 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 -d

O bien fijando la etiqueta de versión:

image: uniextra/movistar-webdav-proxy:v2.2.2

v2.2.1

Choose a tag to compare

@uniextra uniextra released this 04 Nov 23:49

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" y WWW-Authenticate: NTLM simultáneamente, validando el handshake criptográfico NTLMv2 (MS-NLMP) sobre la misma contraseña configurada en WEBDAV_PASSWORD.
    • Permite que el servicio WebClient de 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 Auth sin ningún cambio.
  • 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.
  • Documentación de Montaje Persistente en Windows:

    • Actualizados README.md y docs/network-drive.md con la configuración de AuthForwardServerList, inicio automático del servicio WebClient y registro de credenciales en cmdkey.

📦 Imágenes Docker

  • uniextra/movistar-webdav-proxy:2.2.1
  • uniextra/movistar-webdav-proxy:latest

v2.2.0

Choose a tag to compare

@uniextra uniextra released this 04 Nov 21:18

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\usuario o \usuario a usuario).
    • Emisión estricta de desafíos RFC 4918 (401 Unauthorized con WWW-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.
  • 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-metadata tipado).
    • Gestión de reintentos ante desincronización de cuotas (MED-1017). Agradecimientos a @aarizaga90 por el PR #8.
  • 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.
  • 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.0
  • uniextra/movistar-webdav-proxy:latest
  • uniextra/movistar-webdav-proxy:test

v2.1.2

Choose a tag to compare

@uniextra uniextra released this 03 Nov 20:11

🐛 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=softdelete de Movistar exige obligatoriamente recibir el parámetro &id=<folder_id> en la URL query string. Al faltar, el servidor de Movistar devolvía HTTP 200 con un código interno COM-1011: Missing required parameter sin 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.