email_html_escape_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //go:build unit
  2. package service
  3. import (
  4. "strings"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func TestBuildVerifyCodeEmailBody_EscapesSiteName(t *testing.T) {
  9. svc := &EmailService{}
  10. t.Run("escapes_script_injection", func(t *testing.T) {
  11. body := svc.buildVerifyCodeEmailBody("123456", `</h1><script>alert(1)</script><h1>`)
  12. assert.NotContains(t, body, "<script>")
  13. assert.Contains(t, body, "&lt;script&gt;")
  14. })
  15. t.Run("escapes_html_entities", func(t *testing.T) {
  16. body := svc.buildVerifyCodeEmailBody("123456", `A&B<C>"D`)
  17. assert.Contains(t, body, "A&amp;B&lt;C&gt;&#34;D")
  18. })
  19. t.Run("normal_site_name_unchanged", func(t *testing.T) {
  20. body := svc.buildVerifyCodeEmailBody("654321", "My Site")
  21. assert.Contains(t, body, "<h1>My Site</h1>")
  22. assert.Contains(t, body, "654321")
  23. })
  24. }
  25. func TestBuildPasswordResetEmailBody_EscapesSiteName(t *testing.T) {
  26. svc := &EmailService{}
  27. t.Run("escapes_html_tags_in_site_name", func(t *testing.T) {
  28. body := svc.buildPasswordResetEmailBody("https://example.com/reset?token=abc", `</h1><img src=x onerror=alert(1)>`)
  29. assert.NotContains(t, body, "<img src=x")
  30. assert.True(t, strings.Contains(body, "&lt;img"))
  31. })
  32. t.Run("escapes_html_entities", func(t *testing.T) {
  33. body := svc.buildPasswordResetEmailBody("https://example.com/reset", `A&B<C>`)
  34. assert.Contains(t, body, "A&amp;B&lt;C&gt;")
  35. })
  36. t.Run("normal_site_name_and_url_unchanged", func(t *testing.T) {
  37. resetURL := "https://example.com/reset?token=xyz"
  38. body := svc.buildPasswordResetEmailBody(resetURL, "Sub2API")
  39. assert.Contains(t, body, "<h1>Sub2API</h1>")
  40. assert.Contains(t, body, resetURL)
  41. })
  42. t.Run("escapes_ampersand_in_reset_url", func(t *testing.T) {
  43. resetURL := "https://example.com/reset?a=1&b=2"
  44. body := svc.buildPasswordResetEmailBody(resetURL, "Site")
  45. assert.NotContains(t, body, `href="https://example.com/reset?a=1&b=2"`)
  46. assert.Contains(t, body, `href="https://example.com/reset?a=1&amp;b=2"`)
  47. })
  48. }