From 34f50c5a0618df088a844b4ff76b4378eda1ac02 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Sun, 7 Dec 2025 18:21:43 +0100 Subject: [PATCH] refactor: minor improvements to ResolvePath Make ResolvePath more robust by avoiding implicit reliance on path normalization performed by external libraries such as pkg/sftp and ftpserverlib Signed-off-by: Nicola Murino --- internal/vfs/azblobfs.go | 5 ++--- internal/vfs/gcsfs.go | 5 ++--- internal/vfs/httpfs.go | 5 ++--- internal/vfs/osfs.go | 1 + internal/vfs/s3fs.go | 5 ++--- internal/vfs/sftpfs.go | 5 ++--- 6 files changed, 11 insertions(+), 15 deletions(-) diff --git a/internal/vfs/azblobfs.go b/internal/vfs/azblobfs.go index 83f55b52..ac25d392 100644 --- a/internal/vfs/azblobfs.go +++ b/internal/vfs/azblobfs.go @@ -668,12 +668,11 @@ func (*AzureBlobFs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified sftp path func (fs *AzureBlobFs) ResolvePath(virtualPath string) (string, error) { + virtualPath = strings.ReplaceAll(virtualPath, "\\", "/") if fs.mountPath != "" { virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) - } + virtualPath = path.Clean("/" + virtualPath) return fs.Join(fs.config.KeyPrefix, strings.TrimPrefix(virtualPath, "/")), nil } diff --git a/internal/vfs/gcsfs.go b/internal/vfs/gcsfs.go index 895eacb0..9e6cd3fa 100644 --- a/internal/vfs/gcsfs.go +++ b/internal/vfs/gcsfs.go @@ -637,12 +637,11 @@ func (*GCSFs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified virtual path func (fs *GCSFs) ResolvePath(virtualPath string) (string, error) { + virtualPath = strings.ReplaceAll(virtualPath, "\\", "/") if fs.mountPath != "" { virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) - } + virtualPath = path.Clean("/" + virtualPath) return fs.Join(fs.config.KeyPrefix, strings.TrimPrefix(virtualPath, "/")), nil } diff --git a/internal/vfs/httpfs.go b/internal/vfs/httpfs.go index f9550924..2d800b4a 100644 --- a/internal/vfs/httpfs.go +++ b/internal/vfs/httpfs.go @@ -637,12 +637,11 @@ func (*HTTPFs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified virtual path func (fs *HTTPFs) ResolvePath(virtualPath string) (string, error) { + virtualPath = strings.ReplaceAll(virtualPath, "\\", "/") if fs.mountPath != "" { virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) - } + virtualPath = path.Clean("/" + virtualPath) return virtualPath, nil } diff --git a/internal/vfs/osfs.go b/internal/vfs/osfs.go index 3746a443..26aab2d4 100644 --- a/internal/vfs/osfs.go +++ b/internal/vfs/osfs.go @@ -378,6 +378,7 @@ func (*OsFs) Join(elem ...string) string { // ResolvePath returns the matching filesystem path for the specified sftp path func (fs *OsFs) ResolvePath(virtualPath string) (string, error) { + virtualPath = strings.ReplaceAll(virtualPath, "\\", "/") if !filepath.IsAbs(fs.rootDir) { return "", fmt.Errorf("invalid root path %q", fs.rootDir) } diff --git a/internal/vfs/s3fs.go b/internal/vfs/s3fs.go index d330133a..fd7cc28e 100644 --- a/internal/vfs/s3fs.go +++ b/internal/vfs/s3fs.go @@ -635,12 +635,11 @@ func (*S3Fs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified virtual path func (fs *S3Fs) ResolvePath(virtualPath string) (string, error) { + virtualPath = strings.ReplaceAll(virtualPath, "\\", "/") if fs.mountPath != "" { virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) - } + virtualPath = path.Clean("/" + virtualPath) return fs.Join(fs.config.KeyPrefix, strings.TrimPrefix(virtualPath, "/")), nil } diff --git a/internal/vfs/sftpfs.go b/internal/vfs/sftpfs.go index 13e182cd..6b1a897a 100644 --- a/internal/vfs/sftpfs.go +++ b/internal/vfs/sftpfs.go @@ -730,12 +730,11 @@ func (*SFTPFs) HasVirtualFolders() bool { // ResolvePath returns the matching filesystem path for the specified virtual path func (fs *SFTPFs) ResolvePath(virtualPath string) (string, error) { + virtualPath = strings.ReplaceAll(virtualPath, "\\", "/") if fs.mountPath != "" { virtualPath = strings.TrimPrefix(virtualPath, fs.mountPath) } - if !path.IsAbs(virtualPath) { - virtualPath = path.Clean("/" + virtualPath) - } + virtualPath = path.Clean("/" + virtualPath) fsPath := fs.Join(fs.config.Prefix, virtualPath) if fs.config.Prefix != "/" && fsPath != "/" { // we need to check if this path is a symlink outside the given prefix