From b5de0b3b8468c68c21c47416c1a8743345566a8a Mon Sep 17 00:00:00 2001 From: sentriz Date: Fri, 22 Dec 2023 19:48:14 +0000 Subject: [PATCH] centralise special path prefix check --- fileutil/fileutil.go | 5 +++++ scanner/scanner.go | 3 ++- server/ctrlsubsonic/specidpaths/specidpaths.go | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fileutil/fileutil.go b/fileutil/fileutil.go index 8ad23ff..28105be 100644 --- a/fileutil/fileutil.go +++ b/fileutil/fileutil.go @@ -54,3 +54,8 @@ func First(path ...string) (string, error) { } return "", err } + +// HasPrefix checks a path has a prefix, making sure to respect path boundaries. So that /aa & /a does not match, but /a/a & /a does. +func HasPrefix(p, prefix string) bool { + return p == prefix || strings.HasPrefix(p, filepath.Clean(prefix)+string(filepath.Separator)) +} diff --git a/scanner/scanner.go b/scanner/scanner.go index 1a32859..7296a5e 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -20,6 +20,7 @@ import ( "github.com/rainycape/unidecode" "go.senan.xyz/gonic/db" + "go.senan.xyz/gonic/fileutil" "go.senan.xyz/gonic/tags/tagcommon" ) @@ -721,7 +722,7 @@ func parseMulti(parser tagcommon.Info, setting MultiValueSetting, getMulti func( func musicDirRelative(musicDirs []string, absPath string) (musicDir, relPath string) { for _, musicDir := range musicDirs { - if absPath == musicDir || strings.HasPrefix(absPath, filepath.Clean(musicDir)+string(filepath.Separator)) { // ensure trailing slash for substring check + if fileutil.HasPrefix(absPath, musicDir) { relPath, _ = filepath.Rel(musicDir, absPath) return musicDir, relPath } diff --git a/server/ctrlsubsonic/specidpaths/specidpaths.go b/server/ctrlsubsonic/specidpaths/specidpaths.go index f39bd3d..4ff8ab9 100644 --- a/server/ctrlsubsonic/specidpaths/specidpaths.go +++ b/server/ctrlsubsonic/specidpaths/specidpaths.go @@ -6,6 +6,7 @@ import ( "strings" "go.senan.xyz/gonic/db" + "go.senan.xyz/gonic/fileutil" "go.senan.xyz/gonic/server/ctrlsubsonic/specid" ) @@ -54,7 +55,7 @@ func Lookup(dbc *db.DB, musicPaths []string, podcastsPath string, path string) ( var musicPath string for _, mp := range musicPaths { - if strings.HasPrefix(path, filepath.Clean(mp)+string(filepath.Separator) /* ensure trailing */) { + if fileutil.HasPrefix(path, mp) { musicPath = mp break }