diff --git a/ghost/admin/app/utils/format-markdown.js b/ghost/admin/app/utils/format-markdown.js index 9383fd507c..949941b352 100644 --- a/ghost/admin/app/utils/format-markdown.js +++ b/ghost/admin/app/utils/format-markdown.js @@ -1,9 +1,8 @@ -/* global html_sanitize */ -import cajaSanitizers from './caja-sanitizers'; import markdownit from 'npm:markdown-it'; import markdownitFootnote from 'npm:markdown-it-footnote'; import markdownitLazyHeaders from 'npm:markdown-it-lazy-headers'; import markdownitMark from 'npm:markdown-it-mark'; +import {sanitizeHtml} from 'koenig-editor/helpers/sanitize-html'; let slugify = function slugify(inputString, usedHeaders) { let slug = inputString.replace(/[^\w]/g, '').toLowerCase(); @@ -62,16 +61,5 @@ export default function formatMarkdown(_markdown, replaceJS = true) { // convert markdown to HTML escapedhtml = md.render(markdown); - // replace script and iFrame - if (replaceJS) { - escapedhtml = escapedhtml.replace(/)<[^<]*)*<\/script>/gi, - '
Embedded JavaScript
'); - escapedhtml = escapedhtml.replace(/)<[^<]*)*<\/iframe>/gi, - '
Embedded iFrame
'); - } - - // sanitize html - escapedhtml = html_sanitize(escapedhtml, cajaSanitizers.url, cajaSanitizers.id); - - return escapedhtml; + return sanitizeHtml(escapedhtml, {replaceJS}); } diff --git a/ghost/admin/lib/koenig-editor/addon/helpers/sanitize-html.js b/ghost/admin/lib/koenig-editor/addon/helpers/sanitize-html.js new file mode 100644 index 0000000000..0e107d283b --- /dev/null +++ b/ghost/admin/lib/koenig-editor/addon/helpers/sanitize-html.js @@ -0,0 +1,27 @@ +/* global html_sanitize */ +import cajaSanitizers from 'ghost-admin/utils/caja-sanitizers'; +import {assign} from '@ember/polyfills'; +import {helper} from '@ember/component/helper'; +import {htmlSafe} from '@ember/string'; +import {isArray} from '@ember/array'; + +export function sanitizeHtml(params, options = {}) { + let html = isArray(params) ? params[0] : params; + + options = assign({replaceJS: true}, options); + + // replace script and iFrame + if (options.replaceJS) { + html = html.replace(/)<[^<]*)*<\/script>/gi, + '
Embedded JavaScript
'); + html = html.replace(/)<[^<]*)*<\/iframe>/gi, + '
Embedded iFrame
'); + } + + // sanitize html + html = html_sanitize(html, cajaSanitizers.url, cajaSanitizers.id); + + return htmlSafe(html); +} + +export default helper(sanitizeHtml); diff --git a/ghost/admin/lib/koenig-editor/addon/templates/components/koenig-card-html.hbs b/ghost/admin/lib/koenig-editor/addon/templates/components/koenig-card-html.hbs index cdfc13e1f7..e88867c155 100644 --- a/ghost/admin/lib/koenig-editor/addon/templates/components/koenig-card-html.hbs +++ b/ghost/admin/lib/koenig-editor/addon/templates/components/koenig-card-html.hbs @@ -19,7 +19,7 @@ update=(action "updateHtml") }} {{else}} -
{{{payload.html}}}
+
{{sanitize-html payload.html}}
{{/if}} {{/koenig-card}} \ No newline at end of file diff --git a/ghost/admin/lib/koenig-editor/app/helpers/sanitize-html.js b/ghost/admin/lib/koenig-editor/app/helpers/sanitize-html.js new file mode 100644 index 0000000000..4dbeeafd41 --- /dev/null +++ b/ghost/admin/lib/koenig-editor/app/helpers/sanitize-html.js @@ -0,0 +1 @@ +export {default, sanitizeHtml} from 'koenig-editor/helpers/sanitize-html'; diff --git a/ghost/admin/tests/integration/helpers/sanitize-html-test.js b/ghost/admin/tests/integration/helpers/sanitize-html-test.js new file mode 100644 index 0000000000..a47aecb7be --- /dev/null +++ b/ghost/admin/tests/integration/helpers/sanitize-html-test.js @@ -0,0 +1,27 @@ +import hbs from 'htmlbars-inline-precompile'; +import {describe, it} from 'mocha'; +import {expect} from 'chai'; +import {setupComponentTest} from 'ember-mocha'; + +describe('Integration: Helper: sanitize-html', function () { + setupComponentTest('sanitize-html', { + integration: true + }); + + it('renders html', function () { + this.set('inputValue', 'bold'); + + this.render(hbs`{{sanitize-html inputValue}}`); + + expect(this.$().html().trim()).to.equal('bold'); + }); + + it('replaces scripts', function () { + this.set('inputValue', ''); + + this.render(hbs`{{sanitize-html inputValue}}`); + + expect(this.$().html().trim()).to.equal('
Embedded JavaScript
'); + }); +}); +