diff --git a/public/app/core/utils/text.ts b/public/app/core/utils/text.ts index 6db844e736e..43193efde3d 100644 --- a/public/app/core/utils/text.ts +++ b/public/app/core/utils/text.ts @@ -101,3 +101,11 @@ export function sanitize(unsanitizedString: string): string { export function hasAnsiCodes(input: string): boolean { return /\u001b\[\d{1,2}m/.test(input); } + +export function escapeHtml(str: string): string { + return String(str) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} diff --git a/public/app/features/panel/panel_ctrl.ts b/public/app/features/panel/panel_ctrl.ts index 2eff65f13d8..ec28a08ccfb 100644 --- a/public/app/features/panel/panel_ctrl.ts +++ b/public/app/features/panel/panel_ctrl.ts @@ -1,5 +1,6 @@ import _ from 'lodash'; import Remarkable from 'remarkable'; +import { sanitize, escapeHtml } from 'app/core/utils/text'; import config from 'app/core/config'; import { profiler } from 'app/core/core'; @@ -254,30 +255,31 @@ export class PanelCtrl { } const linkSrv: LinkSrv = this.$injector.get('linkSrv'); - const sanitize: any = this.$injector.get('$sanitize'); const templateSrv: TemplateSrv = this.$injector.get('templateSrv'); const interpolatedMarkdown = templateSrv.replace(markdown, this.panel.scopedVars); let html = '
'; - html += new Remarkable().render(interpolatedMarkdown); + const md = new Remarkable().render(interpolatedMarkdown); + html += config.disableSanitizeHtml ? md : sanitize(md); if (this.panel.links && this.panel.links.length > 0) { html += ''; } html += '
'; - return sanitize(html); + return html; } } diff --git a/public/app/plugins/panel/text/module.ts b/public/app/plugins/panel/text/module.ts index abea5b39426..8916b813515 100644 --- a/public/app/plugins/panel/text/module.ts +++ b/public/app/plugins/panel/text/module.ts @@ -1,7 +1,7 @@ import _ from 'lodash'; import { PanelCtrl } from 'app/plugins/sdk'; import Remarkable from 'remarkable'; -import { sanitize } from 'app/core/utils/text'; +import { sanitize, escapeHtml } from 'app/core/utils/text'; import config from 'app/core/config'; import { auto, ISCEService } from 'angular'; import { TemplateSrv } from 'app/features/templating/template_srv'; @@ -77,12 +77,8 @@ export class TextPanelCtrl extends PanelCtrl { } renderText(content: string) { - content = content - .replace(/&/g, '&') - .replace(/>/g, '>') - .replace(/'); - this.updateContent(content); + const safeContent = escapeHtml(content).replace(/\n/g, '
'); + this.updateContent(safeContent); } renderMarkdown(content: string) {