package infra import ( "fmt" "os" "path/filepath" "strings" ) // FileDelete elimina un archivo del disco. Rechaza paths que contengan ".." para // evitar path traversal fuera del directorio esperado. // // Retorna error si el archivo no existe (os.ErrNotExist), si el path contiene "..", // o si la operacion de remove falla por permisos. func FileDelete(path string) error { if path == "" { return fmt.Errorf("file_delete: path vacio") } // Rechazar cualquier path traversal explicito en el input original // (filepath.Clean resuelve `..` y borraria la huella, asi que comprobamos antes) if containsParentRef(path) { return fmt.Errorf("file_delete: path traversal no permitido en %q", path) } clean := filepath.Clean(path) if _, err := os.Stat(clean); err != nil { return fmt.Errorf("file_delete: stat %s: %w", clean, err) } if err := os.Remove(clean); err != nil { return fmt.Errorf("file_delete: remove %s: %w", clean, err) } return nil } // containsParentRef detecta si el path tiene un segmento ".." entre separadores. // Acepta tanto "/" como "\" como separadores. No marca como malo nombres como "..bashrc". func containsParentRef(path string) bool { // Normalizar a slashes p := strings.ReplaceAll(path, "\\", "/") for _, seg := range strings.Split(p, "/") { if seg == ".." { return true } } return false }