From a2f666b586b0df063ad240910b28a73dc3aa2673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 16 Oct 2024 08:53:45 +0200 Subject: [PATCH] Remove erroneously permalink validation Fixes #12948 --- resources/page/permalinks.go | 39 +------------------ resources/page/permalinks_integration_test.go | 36 +++++++++++++++++ 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/resources/page/permalinks.go b/resources/page/permalinks.go index fe9d9f78d..ece10bb40 100644 --- a/resources/page/permalinks.go +++ b/resources/page/permalinks.go @@ -156,9 +156,6 @@ func init() { func (l PermalinkExpander) getOrParsePattern(pattern string) (func(Page) (string, error), error) { return l.patternCache.GetOrCreate(pattern, func() (func(Page) (string, error), error) { - if !l.validate(pattern) { - return nil, &permalinkExpandError{pattern: pattern, err: errPermalinkIllFormed} - } var normalized bool pattern, normalized = l.normalizeEscapeSequencesIn(pattern) @@ -234,37 +231,6 @@ type pageToPermaAttribute func(Page, string) (string, error) var attributeRegexp = regexp.MustCompile(`:\w+(\[.+?\])?`) -// validate determines if a PathPattern is well-formed -func (l PermalinkExpander) validate(pp string) bool { - if len(pp) == 0 { - return false - } - fragments := strings.Split(pp[1:], "/") - bail := false - for i := range fragments { - if bail { - return false - } - if len(fragments[i]) == 0 { - bail = true - continue - } - - matches := attributeRegexp.FindAllStringSubmatch(fragments[i], -1) - if matches == nil { - continue - } - - for _, match := range matches { - k := match[0][1:] - if _, ok := l.callback(k); !ok { - return false - } - } - } - return true -} - type permalinkExpandError struct { pattern string err error @@ -274,10 +240,7 @@ func (pee *permalinkExpandError) Error() string { return fmt.Sprintf("error expanding %q: %s", pee.pattern, pee.err) } -var ( - errPermalinkIllFormed = errors.New("permalink ill-formed") - errPermalinkAttributeUnknown = errors.New("permalink attribute not recognised") -) +var errPermalinkAttributeUnknown = errors.New("permalink attribute not recognised") func (l PermalinkExpander) pageToPermalinkDate(p Page, dateField string) (string, error) { // a Page contains a Node which provides a field Date, time.Time diff --git a/resources/page/permalinks_integration_test.go b/resources/page/permalinks_integration_test.go index 2b9e878b1..4188c70ca 100644 --- a/resources/page/permalinks_integration_test.go +++ b/resources/page/permalinks_integration_test.go @@ -18,6 +18,7 @@ import ( "github.com/bep/logg" qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/htesting" "github.com/gohugoio/hugo/hugolib" ) @@ -232,3 +233,38 @@ slug: custom-recipe-2 b.AssertFileContent("public/delicious-recipe/recipe-1/index.html", "Single|page|/delicious-recipe/recipe-1/") b.AssertFileContent("public/delicious-recipe/custom-recipe-2/index.html", "Single|page|/delicious-recipe/custom-recipe-2/") } + +// Issue 12948. +func TestPermalinksWithEscapedColons(t *testing.T) { + t.Parallel() + + if htesting.IsWindows() { + t.Skip("Windows does not support colons in paths") + } + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','section','sitemap','taxonomy','term'] +[permalinks.page] +s2 = "/c\\:d/:slug/" +-- content/s1/p1.md -- +--- +title: p1 +url: "/a\\:b/:slug/" +--- +-- content/s2/p2.md -- +--- +title: p2 +--- +-- layouts/_default/single.html -- +{{ .Title }} +` + + b := hugolib.Test(t, files) + + b.AssertFileExists("public/a:b/p1/index.html", true) + + // The above URL comes from the URL front matter field where everything is allowed. + // We strip colons from paths constructed by Hugo (they are not supported on Windows). + b.AssertFileExists("public/cd/p2/index.html", true) +}