2020-06-19 10:31:37 +02:00
|
|
|
import { DefaultAllowlist, sanitizeHtml } from '../../../src/util/sanitizer'
|
2019-03-13 15:23:50 +01:00
|
|
|
|
|
|
|
describe('Sanitizer', () => {
|
|
|
|
describe('sanitizeHtml', () => {
|
|
|
|
it('should return the same on empty string', () => {
|
|
|
|
const empty = ''
|
|
|
|
|
2020-06-19 10:31:37 +02:00
|
|
|
const result = sanitizeHtml(empty, DefaultAllowlist, null)
|
2019-03-13 15:23:50 +01:00
|
|
|
|
|
|
|
expect(result).toEqual(empty)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('should sanitize template by removing tags with XSS', () => {
|
|
|
|
const template = [
|
|
|
|
'<div>',
|
|
|
|
' <a href="javascript:alert(7)">Click me</a>',
|
|
|
|
' <span>Some content</span>',
|
|
|
|
'</div>'
|
|
|
|
].join('')
|
|
|
|
|
2020-06-19 10:31:37 +02:00
|
|
|
const result = sanitizeHtml(template, DefaultAllowlist, null)
|
2019-03-13 15:23:50 +01:00
|
|
|
|
2020-11-02 13:49:56 +01:00
|
|
|
expect(result).not.toContain('href="javascript:alert(7)')
|
2019-03-13 15:23:50 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
it('should allow aria attributes and safe attributes', () => {
|
|
|
|
const template = [
|
|
|
|
'<div aria-pressed="true">',
|
|
|
|
' <span class="test">Some content</span>',
|
|
|
|
'</div>'
|
|
|
|
].join('')
|
|
|
|
|
2020-06-19 10:31:37 +02:00
|
|
|
const result = sanitizeHtml(template, DefaultAllowlist, null)
|
2019-03-13 15:23:50 +01:00
|
|
|
|
2020-11-02 13:42:40 +01:00
|
|
|
expect(result).toContain('aria-pressed')
|
|
|
|
expect(result).toContain('class="test"')
|
2019-03-13 15:23:50 +01:00
|
|
|
})
|
|
|
|
|
2020-06-19 10:31:37 +02:00
|
|
|
it('should remove tags not in allowlist', () => {
|
2019-03-13 15:23:50 +01:00
|
|
|
const template = [
|
|
|
|
'<div>',
|
|
|
|
' <script>alert(7)</script>',
|
|
|
|
'</div>'
|
|
|
|
].join('')
|
|
|
|
|
2020-06-19 10:31:37 +02:00
|
|
|
const result = sanitizeHtml(template, DefaultAllowlist, null)
|
2019-03-13 15:23:50 +01:00
|
|
|
|
2020-11-02 13:42:40 +01:00
|
|
|
expect(result).not.toContain('<script>')
|
2019-03-13 15:23:50 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
it('should not use native api to sanitize if a custom function passed', () => {
|
|
|
|
const template = [
|
|
|
|
'<div>',
|
|
|
|
' <span>Some content</span>',
|
|
|
|
'</div>'
|
|
|
|
].join('')
|
|
|
|
|
|
|
|
function mySanitize(htmlUnsafe) {
|
|
|
|
return htmlUnsafe
|
|
|
|
}
|
|
|
|
|
|
|
|
spyOn(DOMParser.prototype, 'parseFromString')
|
|
|
|
|
2020-06-19 10:31:37 +02:00
|
|
|
const result = sanitizeHtml(template, DefaultAllowlist, mySanitize)
|
2019-03-13 15:23:50 +01:00
|
|
|
|
|
|
|
expect(result).toEqual(template)
|
|
|
|
expect(DOMParser.prototype.parseFromString).not.toHaveBeenCalled()
|
|
|
|
})
|
2021-02-19 09:24:53 +01:00
|
|
|
|
|
|
|
it('should allow multiple sanitation passes of the same template', () => {
|
|
|
|
const template = '<img src="test.jpg">'
|
|
|
|
|
|
|
|
const firstResult = sanitizeHtml(template, DefaultAllowlist, null)
|
|
|
|
const secondResult = sanitizeHtml(template, DefaultAllowlist, null)
|
|
|
|
|
|
|
|
expect(firstResult).toContain('src')
|
|
|
|
expect(secondResult).toContain('src')
|
|
|
|
})
|
2019-03-13 15:23:50 +01:00
|
|
|
})
|
|
|
|
})
|