Fix HTML entities displaying incorrectly in PDF exports

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-10-24 09:13:51 +02:00
parent 5902ef512d
commit 4768410d10
3 changed files with 11 additions and 15 deletions

View File

@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
## Unreleased ## Unreleased
### Fixed
- Fix HTML entities displaying incorrectly in PDF exports (e.g., "&" showing as "&amp;")
## [0.78.0] - 2025-10-23 ## [0.78.0] - 2025-10-23
### Added ### Added

View File

@@ -92,14 +92,6 @@ const (
) )
func RenderHTML(data DocumentData) ([]byte, error) { func RenderHTML(data DocumentData) ([]byte, error) {
data.Title = html.EscapeString(data.Title)
data.Approver = html.EscapeString(data.Approver)
data.Description = html.EscapeString(data.Description)
for i := range data.Signatures {
data.Signatures[i].SignedBy = html.EscapeString(data.Signatures[i].SignedBy)
}
var buf bytes.Buffer var buf bytes.Buffer
if err := documentTemplate.Execute(&buf, data); err != nil { if err := documentTemplate.Execute(&buf, data); err != nil {
return nil, fmt.Errorf("failed to execute template: %w", err) return nil, fmt.Errorf("failed to execute template: %w", err)

View File

@@ -77,9 +77,9 @@ func TestRenderHTML(t *testing.T) {
}, },
}, },
wantContains: []string{ wantContains: []string{
"Test &amp;amp; &amp;lt;Script&amp;gt; Title", "Test &amp; &lt;Script&gt; Title",
"John &amp;lt;script&amp;gt;alert(&amp;#39;xss&amp;#39;)&amp;lt;/script&amp;gt; Doe", "John &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt; Doe",
"Alice &amp;amp; &amp;lt;Bob&amp;gt;", "Alice &amp; &lt;Bob&gt;",
}, },
wantNotContains: []string{ wantNotContains: []string{
"<script>alert('xss')</script>", "<script>alert('xss')</script>",
@@ -269,9 +269,9 @@ func TestHTMLEscaping(t *testing.T) {
// Verify dangerous content is escaped // Verify dangerous content is escaped
assert.NotContains(t, resultStr, "<script>alert('xss')</script>") assert.NotContains(t, resultStr, "<script>alert('xss')</script>")
assert.NotContains(t, resultStr, "<malicious>tag") assert.NotContains(t, resultStr, "<malicious>tag")
assert.Contains(t, resultStr, "&amp;lt;script&amp;gt;") assert.Contains(t, resultStr, "&lt;script&gt;")
assert.Contains(t, resultStr, "&amp;amp;") assert.Contains(t, resultStr, "&amp;")
assert.Contains(t, resultStr, "&amp;#39;") assert.Contains(t, resultStr, "&#39;")
} }
func TestMarkdownRendering(t *testing.T) { func TestMarkdownRendering(t *testing.T) {