import { default as PrettyText, buildOptions } from 'pretty-text/pretty-text'; import { hrefAllowed } from 'pretty-text/sanitizer'; module("lib:sanitizer"); test("sanitize", function() { const pt = new PrettyText(buildOptions({ siteSettings: {} })); const cooked = (input, expected, text) => equal(pt.cook(input), expected.replace(/\/>/g, ">"), text); equal(pt.sanitize("bug"), "bug"); equal(pt.sanitize("
"), "
"); equal(pt.sanitize("

hello

"), "

hello

"); equal(pt.sanitize("<3 <3"), "<3 <3"); equal(pt.sanitize("<_<"), "<_<"); cooked("hello", "

hello

", "it sanitizes while cooking"); cooked("disney reddit", "

disney reddit

", "we can embed proper links"); cooked("
hello
", "

hello

", "it does not allow centering"); cooked("
hello
\nafter", "

after

", "it does not allow tables"); cooked("
a\n
\n", "
a\n\n
\n\n
", "it does not double sanitize"); cooked("", "", "it does not allow most iframes"); cooked("", "", "it allows iframe to google maps"); cooked("", "", "it allows iframe to OpenStreetMap"); equal(pt.sanitize(""), "hullo"); equal(pt.sanitize(""), "press me!"); equal(pt.sanitize("draw me!"), "draw me!"); equal(pt.sanitize("hello"), "hello"); equal(pt.sanitize("highlight"), "highlight"); cooked("[the answer](javascript:alert(42))", "

the answer

", "it prevents XSS"); cooked("\n", "


", "it doesn't circumvent XSS with comments"); cooked("a", "

a

", "it sanitizes spans"); cooked("a", "

a

", "it sanitizes spans"); cooked("a", "

a

", "it sanitizes spans"); }); test("urlAllowed", function() { const allowed = (url, msg) => equal(hrefAllowed(url), url, msg); allowed("/foo/bar.html", "allows relative urls"); allowed("http://eviltrout.com/evil/trout", "allows full urls"); allowed("https://eviltrout.com/evil/trout", "allows https urls"); allowed("//eviltrout.com/evil/trout", "allows protocol relative urls"); equal(hrefAllowed("http://google.com/test'onmouseover=alert('XSS!');//.swf"), "http://google.com/test%27onmouseover=alert(%27XSS!%27);//.swf", "escape single quotes"); });