mirror of
https://github.com/drakkan/sftpgo.git
synced 2026-03-14 14:25:52 +01:00
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 <nicola.murino@gmail.com>
This commit is contained in:
parent
fd0444c8ff
commit
34f50c5a06
6 changed files with 11 additions and 15 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue