|
8 | 8 | "strings" |
9 | 9 | "testing" |
10 | 10 |
|
| 11 | + "code.gitea.io/gitea/modules/htmlutil" |
11 | 12 | "code.gitea.io/gitea/modules/util" |
12 | 13 |
|
13 | 14 | "github.com/stretchr/testify/assert" |
@@ -102,3 +103,37 @@ func TestTemplateTruthy(t *testing.T) { |
102 | 103 | } |
103 | 104 | assert.True(t, truthyCount != 0 && truthyCount != len(cases)) |
104 | 105 | } |
| 106 | + |
| 107 | +func TestTemplateEscape(t *testing.T) { |
| 108 | + execTmpl := func(code string) string { |
| 109 | + tmpl := template.New("test") |
| 110 | + tmpl.Funcs(template.FuncMap{"QueryBuild": queryBuild, "HTMLFormat": htmlutil.HTMLFormat}) |
| 111 | + template.Must(tmpl.Parse(code)) |
| 112 | + w := &strings.Builder{} |
| 113 | + assert.NoError(t, tmpl.Execute(w, nil)) |
| 114 | + return w.String() |
| 115 | + } |
| 116 | + |
| 117 | + t.Run("Golang URL Escape", func(t *testing.T) { |
| 118 | + // Golang template considers "href", "*src*", "*uri", "*url*" (and more) ... as contentTypeURL and does auto-escaping |
| 119 | + actual := execTmpl(`<a href="?a={{"%"}}"></a>`) |
| 120 | + assert.Equal(t, `<a href="?a=%25"></a>`, actual) |
| 121 | + actual = execTmpl(`<a data-xxx-url="?a={{"%"}}"></a>`) |
| 122 | + assert.Equal(t, `<a data-xxx-url="?a=%25"></a>`, actual) |
| 123 | + }) |
| 124 | + t.Run("Golang URL No-escape", func(t *testing.T) { |
| 125 | + // non-URL content isn't auto-escaped |
| 126 | + actual := execTmpl(`<a data-link="?a={{"%"}}"></a>`) |
| 127 | + assert.Equal(t, `<a data-link="?a=%"></a>`, actual) |
| 128 | + }) |
| 129 | + t.Run("QueryBuild", func(t *testing.T) { |
| 130 | + actual := execTmpl(`<a href="{{QueryBuild "?" "a" "%"}}"></a>`) |
| 131 | + assert.Equal(t, `<a href="?a=%25"></a>`, actual) |
| 132 | + actual = execTmpl(`<a href="?{{QueryBuild "a" "%"}}"></a>`) |
| 133 | + assert.Equal(t, `<a href="?a=%25"></a>`, actual) |
| 134 | + }) |
| 135 | + t.Run("HTMLFormat", func(t *testing.T) { |
| 136 | + actual := execTmpl("{{HTMLFormat `<a k=\"%s\">%s</a>` `\"` `<>`}}") |
| 137 | + assert.Equal(t, `<a k="""><></a>`, actual) |
| 138 | + }) |
| 139 | +} |
0 commit comments