package config import ( "strings" "github.com/gofiber/fiber/v2" ) // UploadsGuard decide si una petición puede leer archivos de /uploads. // Se inyecta desde main.go porque el paquete config no puede importar pkg/auth // (sería una dependencia circular vía app). Se consulta en cada petición, no al // registrar la ruta, así que puede definirse después de cargar la configuración. // // Mientras esté en nil, /uploads queda cerrado: es preferible que un archivo no // cargue a que quede expuesto sin autenticación. var UploadsGuard func(*fiber.Ctx) bool // uploadsProtegidos bloquea el acceso anónimo a los archivos subidos. // Antes /uploads se servía como estático público: sabiendo (o adivinando) la // ruta se podía descargar el RUT de un cliente, una factura o un entregable sin // iniciar sesión. Los clientes del portal siguen usando los endpoints de // descarga dedicados, que además validan que el archivo les pertenezca. func uploadsProtegidos(c *fiber.Ctx) error { // Los archivos de los espacios uMind NUNCA se sirven por el estático: son // de un cliente concreto y el guard genérico solo sabe si hay sesión de // panel, no de quién es el archivo. Salen por su endpoint, que sí valida // propiedad. Cerrado por construcción y no por acordarse. if strings.HasPrefix(c.Path(), "/uploads/umind/") { return c.Status(fiber.StatusNotFound).SendString("Not found") } if UploadsGuard != nil && UploadsGuard(c) { return c.Next() } // 404 en vez de 401 para no confirmar si el archivo existe. return c.Status(fiber.StatusNotFound).SendString("Not found") }