]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Remove erroneously permalink validation
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 16 Oct 2024 06:53:45 +0000 (08:53 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 16 Oct 2024 08:14:48 +0000 (10:14 +0200)
Fixes #12948

resources/page/permalinks.go
resources/page/permalinks_integration_test.go

index fe9d9f78d8b5fdb7f105a84c1c6dc436ea168e5f..ece10bb40e50de2f0d16d475d184c20a192c78f3 100644 (file)
@@ -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
index 2b9e878b168d383ad648b8d1feaaa4e8c6afe8c3..4188c70ca0cd576d7ff00e8bfbb3a0366a51484f 100644 (file)
@@ -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)
+}