48 lines
1.5 KiB
Go
48 lines
1.5 KiB
Go
package music
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
type DatasetConfig struct {
|
|
Source string `json:"source" yaml:"source"`
|
|
Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"`
|
|
StageRoot string `json:"stage_root,omitempty" yaml:"stage_root,omitempty"`
|
|
CreditsRoot string `json:"credits_root,omitempty" yaml:"credits_root,omitempty"`
|
|
}
|
|
|
|
type DefaultsConfig struct {
|
|
StageRoot string `json:"stage_root,omitempty" yaml:"stage_root,omitempty"`
|
|
CreditsRoot string `json:"credits_root,omitempty" yaml:"credits_root,omitempty"`
|
|
CreditsOverlay string `json:"credits_overlay,omitempty" yaml:"credits_overlay,omitempty"`
|
|
MaxStemLength *int `json:"max_stem_length,omitempty" yaml:"max_stem_length,omitempty"`
|
|
}
|
|
|
|
func ValidateDatasetSource(field, source string) error {
|
|
trimmed := strings.TrimSpace(source)
|
|
if trimmed == "" {
|
|
return fmt.Errorf("%s.source is required", field)
|
|
}
|
|
if strings.Contains(trimmed, "\x00") {
|
|
return fmt.Errorf("%s.source must not contain NUL bytes", field)
|
|
}
|
|
clean := filepath.Clean(filepath.FromSlash(trimmed))
|
|
if clean == ".." || strings.HasPrefix(clean, ".."+string(filepath.Separator)) {
|
|
return fmt.Errorf("%s.source must not escape project root", field)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ValidateDatasetID(id string) error {
|
|
trimmed := strings.TrimSpace(id)
|
|
if trimmed == "" {
|
|
return fmt.Errorf("dataset id must not be empty")
|
|
}
|
|
if strings.Contains(trimmed, "/") || strings.Contains(trimmed, "\\") {
|
|
return fmt.Errorf("dataset id %q must not contain path separators", trimmed)
|
|
}
|
|
return nil
|
|
}
|