diff --git a/src/content/sanitizer/sanitizer.go b/src/content/sanitizer/sanitizer.go index b286a0a..ea29dd6 100644 --- a/src/content/sanitizer/sanitizer.go +++ b/src/content/sanitizer/sanitizer.go @@ -157,24 +157,13 @@ func getExtraAttributes(tagName string) ([]string, []string) { } func isValidTag(tagName string) bool { - for element := range getTagAllowList() { - if tagName == element { - return true - } - } - - return false + return allowedTags.has(tagName) } func isValidAttribute(tagName, attributeName string) bool { - for element, attributes := range getTagAllowList() { - if tagName == element { - if inList(attributeName, attributes) { - return true - } - } + if attrs, ok := allowedAttrs[tagName]; ok { + return attrs.has(attributeName) } - return false } @@ -213,52 +202,8 @@ func hasRequiredAttributes(tagName string, attributes []string) bool { // See https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml func hasValidURIScheme(src string) bool { - whitelist := []string{ - "apt:", - "bitcoin:", - "callto:", - "dav:", - "davs:", - "ed2k://", - "facetime://", - "feed:", - "ftp://", - "geo:", - "gopher://", - "git://", - "http://", - "https://", - "irc://", - "irc6://", - "ircs://", - "itms://", - "itms-apps://", - "magnet:", - "mailto:", - "news:", - "nntp:", - "rtmp://", - "sip:", - "sips:", - "skype:", - "spotify:", - "ssh://", - "sftp://", - "steam://", - "svn://", - "svn+ssh://", - "tel:", - "webcal://", - "xmpp:", - } - - for _, prefix := range whitelist { - if strings.HasPrefix(src, prefix) { - return true - } - } - - return false + scheme := strings.SplitN(src, ":", 2)[0] + return allowedURISchemes.has(scheme) } func isBlockedResource(src string) bool { diff --git a/src/content/sanitizer/sanitizer_test.go b/src/content/sanitizer/sanitizer_test.go index a1080ee..05c6989 100644 --- a/src/content/sanitizer/sanitizer_test.go +++ b/src/content/sanitizer/sanitizer_test.go @@ -114,7 +114,7 @@ func TestProtocolRelativeURL(t *testing.T) { } func TestInvalidTag(t *testing.T) { - input := `
My invalid tag.
` + input := `My invalid
My invalid tag.
` output := Sanitize("http://example.org/", input) @@ -154,7 +154,7 @@ func TestUnknownTag(t *testing.T) { } func TestInvalidNestedTag(t *testing.T) { - input := `My invalid tag with some valid tag.
` + input := `My invalid
My invalid tag with some valid tag.
` output := Sanitize("http://example.org/", input) @@ -193,92 +193,6 @@ func TestInvalidURLScheme(t *testing.T) { } } -func TestAPTURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestBitcoinURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestCallToURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestFeedURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } - - input = `This link is valid
` - expected = `This link is valid
` - output = Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestGeoURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestItunesURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } - - input = `This link is valid
` - expected = `This link is valid
` - output = Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestMagnetURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - func TestMailtoURIScheme(t *testing.T) { input := `This link is valid
` expected := `This link is valid
` @@ -289,108 +203,6 @@ func TestMailtoURIScheme(t *testing.T) { } } -func TestNewsURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } - - input = `This link is valid
` - expected = `This link is valid
` - output = Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } - - input = `This link is valid
` - expected = `This link is valid
` - output = Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestRTMPURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestSIPURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } - - input = `This link is valid
` - expected = `This link is valid
` - output = Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestSkypeURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestSpotifyURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestSteamURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - -func TestSubversionURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } - - input = `This link is valid
` - expected = `This link is valid
` - output = Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - func TestTelURIScheme(t *testing.T) { input := `This link is valid
` expected := `This link is valid
` @@ -401,16 +213,6 @@ func TestTelURIScheme(t *testing.T) { } } -func TestWebcalURIScheme(t *testing.T) { - input := `This link is valid
` - expected := `This link is valid
` - output := Sanitize("http://example.org/", input) - - if expected != output { - t.Errorf(`Wrong output: "%s" != "%s"`, expected, output) - } -} - func TestXMPPURIScheme(t *testing.T) { input := `This link is valid
` expected := `This link is valid
` diff --git a/src/content/sanitizer/whitelist.go b/src/content/sanitizer/whitelist.go index 8105c6c..4722c50 100644 --- a/src/content/sanitizer/whitelist.go +++ b/src/content/sanitizer/whitelist.go @@ -76,6 +76,7 @@ var allowedTags = sset([]string{ "hr", "html", "i", + "iframe", "img", "input", "ins", @@ -115,7 +116,6 @@ var allowedTags = sset([]string{ "span", "strike", "strong", - "style", "sub", "summary", "sup",