Fix json filename generation (#2887)

This commit is contained in:
WithoutPants
2022-09-06 13:10:24 +10:00
parent 0c513a604d
commit 13bdba5b24
9 changed files with 63 additions and 7 deletions

View File

@@ -5,6 +5,7 @@ import (
"io" "io"
"os" "os"
"path/filepath" "path/filepath"
"regexp"
"strings" "strings"
) )
@@ -116,3 +117,25 @@ func Touch(path string) error {
} }
return nil return nil
} }
var (
replaceCharsRE = regexp.MustCompile(`[&=\\/:*"?_ ]`)
removeCharsRE = regexp.MustCompile(`[^[:alnum:]-.]`)
multiHyphenRE = regexp.MustCompile(`\-+`)
)
// SanitiseBasename returns a file basename removing any characters that are illegal or problematic to use in the filesystem.
func SanitiseBasename(v string) string {
v = strings.TrimSpace(v)
// replace illegal filename characters with -
v = replaceCharsRE.ReplaceAllString(v, "-")
// remove other characters
v = removeCharsRE.ReplaceAllString(v, "")
// remove multiple hyphens
v = multiHyphenRE.ReplaceAllString(v, "-")
return strings.TrimSpace(v)
}

26
pkg/fsutil/file_test.go Normal file
View File

@@ -0,0 +1,26 @@
package fsutil
import "testing"
func TestSanitiseBasename(t *testing.T) {
tests := []struct {
name string
v string
want string
}{
{"basic", "basic", "basic"},
{"spaces", `spaced name`, "spaced-name"},
{"leading/trailing spaces", ` spaced name `, "spaced-name"},
{"hyphen name", `hyphened-name`, "hyphened-name"},
{"multi-hyphen", `hyphened--name`, "hyphened-name"},
{"replaced characters", `a&b=c\d/:e*"f?_ g`, "a-b-c-d-e-f-g"},
{"removed characters", `foo!!bar@@and, more`, "foobarand-more"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := SanitiseBasename(tt.v); got != tt.want {
t.Errorf("SanitiseBasename() = %v, want %v", got, tt.want)
}
})
}
}

View File

@@ -6,6 +6,7 @@ import (
"strings" "strings"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/stashapp/stash/pkg/fsutil"
"github.com/stashapp/stash/pkg/models/json" "github.com/stashapp/stash/pkg/models/json"
) )
@@ -26,7 +27,7 @@ type Gallery struct {
} }
func (s Gallery) Filename(basename string, hash string) string { func (s Gallery) Filename(basename string, hash string) string {
ret := basename ret := fsutil.SanitiseBasename(basename)
if ret != "" { if ret != "" {
ret += "." ret += "."

View File

@@ -5,6 +5,7 @@ import (
"os" "os"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/stashapp/stash/pkg/fsutil"
"github.com/stashapp/stash/pkg/models/json" "github.com/stashapp/stash/pkg/models/json"
) )
@@ -23,7 +24,7 @@ type Image struct {
} }
func (s Image) Filename(basename string, hash string) string { func (s Image) Filename(basename string, hash string) string {
ret := s.Title ret := fsutil.SanitiseBasename(s.Title)
if ret == "" { if ret == "" {
ret = basename ret = basename
} }

View File

@@ -6,6 +6,7 @@ import (
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/stashapp/stash/pkg/fsutil"
"github.com/stashapp/stash/pkg/logger" "github.com/stashapp/stash/pkg/logger"
"github.com/stashapp/stash/pkg/models/json" "github.com/stashapp/stash/pkg/models/json"
) )
@@ -27,7 +28,7 @@ type Movie struct {
} }
func (s Movie) Filename() string { func (s Movie) Filename() string {
return s.Name + ".json" return fsutil.SanitiseBasename(s.Name) + ".json"
} }
// Backwards Compatible synopsis for the movie // Backwards Compatible synopsis for the movie

View File

@@ -5,6 +5,7 @@ import (
"os" "os"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/stashapp/stash/pkg/fsutil"
"github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/models/json" "github.com/stashapp/stash/pkg/models/json"
) )
@@ -41,7 +42,7 @@ type Performer struct {
} }
func (s Performer) Filename() string { func (s Performer) Filename() string {
return s.Name + ".json" return fsutil.SanitiseBasename(s.Name) + ".json"
} }
func LoadPerformerFile(filePath string) (*Performer, error) { func LoadPerformerFile(filePath string) (*Performer, error) {

View File

@@ -5,6 +5,7 @@ import (
"os" "os"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/stashapp/stash/pkg/fsutil"
"github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/models/json" "github.com/stashapp/stash/pkg/models/json"
) )
@@ -58,7 +59,7 @@ type Scene struct {
} }
func (s Scene) Filename(basename string, hash string) string { func (s Scene) Filename(basename string, hash string) string {
ret := s.Title ret := fsutil.SanitiseBasename(s.Title)
if ret == "" { if ret == "" {
ret = basename ret = basename
} }

View File

@@ -5,6 +5,7 @@ import (
"os" "os"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/stashapp/stash/pkg/fsutil"
"github.com/stashapp/stash/pkg/models" "github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/models/json" "github.com/stashapp/stash/pkg/models/json"
) )
@@ -24,7 +25,7 @@ type Studio struct {
} }
func (s Studio) Filename() string { func (s Studio) Filename() string {
return s.Name + ".json" return fsutil.SanitiseBasename(s.Name) + ".json"
} }
func LoadStudioFile(filePath string) (*Studio, error) { func LoadStudioFile(filePath string) (*Studio, error) {

View File

@@ -5,6 +5,7 @@ import (
"os" "os"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/stashapp/stash/pkg/fsutil"
"github.com/stashapp/stash/pkg/models/json" "github.com/stashapp/stash/pkg/models/json"
) )
@@ -19,7 +20,7 @@ type Tag struct {
} }
func (s Tag) Filename() string { func (s Tag) Filename() string {
return s.Name + ".json" return fsutil.SanitiseBasename(s.Name) + ".json"
} }
func LoadTagFile(filePath string) (*Tag, error) { func LoadTagFile(filePath string) (*Tag, error) {