From 8c78da3f6959417081c98c8a80425a8cab43bb1e Mon Sep 17 00:00:00 2001 From: Mukhtar Akere Date: Thu, 17 Apr 2025 16:31:39 +0100 Subject: [PATCH] fix escape --- internal/utils/file.go | 10 ++++++++++ pkg/debrid/debrid/refresh.go | 5 +++-- pkg/webdav/file_info.go | 5 +++-- pkg/webdav/handler.go | 7 ------- pkg/webdav/templates.go | 4 ++-- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/internal/utils/file.go b/internal/utils/file.go index 9008f48..90ade8e 100644 --- a/internal/utils/file.go +++ b/internal/utils/file.go @@ -1,2 +1,12 @@ package utils +import "strings" + +func EscapePath(path string) string { + // escape % + escapedPath := strings.ReplaceAll(path, "%", "%25") + + // add others + + return escapedPath +} diff --git a/pkg/debrid/debrid/refresh.go b/pkg/debrid/debrid/refresh.go index 566844b..fa9cf39 100644 --- a/pkg/debrid/debrid/refresh.go +++ b/pkg/debrid/debrid/refresh.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/sirrobot01/decypharr/internal/config" "github.com/sirrobot01/decypharr/internal/request" + "github.com/sirrobot01/decypharr/internal/utils" "github.com/sirrobot01/decypharr/pkg/debrid/types" "io" "net/http" @@ -23,8 +24,8 @@ type fileInfo struct { isDir bool } -func (fi *fileInfo) Name() string { return url.PathEscape(fi.name) } -func (fi *fileInfo) RawName() string { return fi.name } +func (fi *fileInfo) Name() string { return utils.EscapePath(fi.name) } +func (fi *fileInfo) RawName() string { return url.PathEscape(fi.name) } func (fi *fileInfo) Size() int64 { return fi.size } func (fi *fileInfo) Mode() os.FileMode { return fi.mode } func (fi *fileInfo) ModTime() time.Time { return fi.modTime } diff --git a/pkg/webdav/file_info.go b/pkg/webdav/file_info.go index 7e575ab..04316bb 100644 --- a/pkg/webdav/file_info.go +++ b/pkg/webdav/file_info.go @@ -1,6 +1,7 @@ package webdav import ( + "github.com/sirrobot01/decypharr/internal/utils" "net/url" "os" "time" @@ -15,8 +16,8 @@ type FileInfo struct { isDir bool } -func (fi *FileInfo) Name() string { return url.PathEscape(fi.name) } -func (fi *FileInfo) RawName() string { return fi.name } +func (fi *FileInfo) Name() string { return utils.EscapePath(fi.name) } // uses minimal escaping +func (fi *FileInfo) RawName() string { return url.PathEscape(fi.name) } // uses full escaping func (fi *FileInfo) Size() int64 { return fi.size } func (fi *FileInfo) Mode() os.FileMode { return fi.mode } func (fi *FileInfo) ModTime() time.Time { return fi.modTime } diff --git a/pkg/webdav/handler.go b/pkg/webdav/handler.go index 0742d49..9256f73 100644 --- a/pkg/webdav/handler.go +++ b/pkg/webdav/handler.go @@ -14,7 +14,6 @@ import ( "io" "net/http" "net/http/httptest" - "net/url" "os" path "path/filepath" "slices" @@ -104,12 +103,6 @@ func (h *Handler) getParentFiles() []os.FileInfo { func (h *Handler) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (webdav.File, error) { name = path.Clean("/" + name) - // unescape the path - name, err := url.PathUnescape(name) - if err != nil { - h.logger.Error().Err(err).Msg("Failed to unescape path") - return nil, err - } rootDir := h.getRootPath() metadataOnly := ctx.Value("metadataOnly") != nil diff --git a/pkg/webdav/templates.go b/pkg/webdav/templates.go index 5bb4b14..4007c8f 100644 --- a/pkg/webdav/templates.go +++ b/pkg/webdav/templates.go @@ -113,9 +113,9 @@ const directoryTemplate = ` {{end}} {{range $index, $file := .Children}}
  • - + {{add $index 1}}. - {{$file.RawName}}{{if $file.IsDir}}/{{end}} + {{$file.Name}}{{if $file.IsDir}}/{{end}} {{if not $file.IsDir}} {{formatSize $file.Size}}