url_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package sanitizer // import "miniflux.app/v2/internal/reader/sanitizer"
  4. import "testing"
  5. func TestHasValidURIScheme(t *testing.T) {
  6. scenarios := map[string]bool{
  7. // Allowed: web schemes.
  8. "http://example.org/article": true,
  9. "https://example.org/article": true,
  10. // Allowed: a sample of the broader feed-content schemes.
  11. "mailto:author@example.org": true,
  12. "magnet:?xt=urn:btih:abc": true,
  13. "tel:+15551234567": true,
  14. "ftp://example.org/file": true,
  15. "feed:https://example.org/": true,
  16. "webcal://example.org/cal": true,
  17. // Rejected: schemes that enable script execution or local resource access.
  18. "javascript:alert(1)": false,
  19. "data:text/html,<script>alert(1)</script>": false,
  20. "vbscript:msgbox(1)": false,
  21. "file:///etc/passwd": false,
  22. // Rejected: missing or malformed scheme.
  23. "": false,
  24. "example.org": false,
  25. "/relative/path": false,
  26. "//evil.example.org/path": false,
  27. // Allowed: scheme matching is case-insensitive (RFC 3986 §3.1).
  28. "HTTPS://example.org": true,
  29. "MailTo:author@host": true,
  30. "SVN+SSH://example.org": true,
  31. // Rejected: case-insensitive match still rejects disallowed schemes.
  32. "JavaScript:alert(1)": false,
  33. "VBScript:msgbox(1)": false,
  34. }
  35. for input, expected := range scenarios {
  36. t.Run(input, func(t *testing.T) {
  37. if actual := HasValidURIScheme(input); actual != expected {
  38. t.Errorf("HasValidURIScheme(%q) = %v, want %v", input, actual, expected)
  39. }
  40. })
  41. }
  42. }