'use strict'; /** * Licensed Materials - Property of IBM * IBM Cognos Products: BI Cloud (C) Copyright IBM Corp. 2014, 2018 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ define([], function () { var blackListContentTags = ['body', 'embed', 'script', 'object', 'applet', 'meta', 'style', 'link']; return { /** * Cleans the provided html string input to only the supplied array of whiteListedElements * @param {String} input Input html to process * @param {String | Array} whiteListedElements all whitelisted html tags as an array. ie ['
', '

'...] or as a string '

' * @param {Boolean} removeComments if true, strips html comments */ cleanseContentElements: function cleanseContentElements(input, whiteListedElements, removeComments) { if (!input) { return null; } whiteListedElements = whiteListedElements || []; // making sure the allowed arg is a string containing only tags in lowercase () var allowed = ((whiteListedElements + '').toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi; if (removeComments) { var commentsAndTags = /|<\?(?:php)?[\s\S]*?\?>/gi; input = input.replace(commentsAndTags, ''); } return input.replace(tags, function ($0, $1) { return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : ''; }); }, isValidHtmlContent: function isValidHtmlContent(widgetContent) { return !this.containsTag(widgetContent) && !this.containsBlackListedAttributes(widgetContent) && this.isHtmlSafe(widgetContent); }, containsTag: function containsTag(widgetContent) { // Validate by matching whole tag name // ie. '', '', '|$)', 'i'); return re.test(widgetContent); }, containsBlackListedAttributes: function containsBlackListedAttributes(widgetContent) { // Block any attribute that starts with 'on' var re = new RegExp('<\\w+[^>]*\\bon\\w+\\s*=', 'i'); return re.test(widgetContent); }, isHtmlSafe: function isHtmlSafe(s) { var matches = s.match(/<\s*\w+\b[^>]+\s*>/g); if (!matches) { return true; } return [true].concat(matches). // return all Html elements with some attributes reduce( // reduce matches to true/false if valid or not function (prevValue, el) { // s is attribute, like class='a b c' or src='url()' // return true if attribute starts with javascript return prevValue && (el.match(/\w+\s*=\s*"?\s*javascript/gi) ? false : true); }); }, /** * check html strings is valid. If not, we reset it */ sanitizeHtml: function sanitizeHtml(html) { if (!html || !this.isValidHtmlContent(html)) { return ''; } return html; } }; }); //# sourceMappingURL=HtmlXSSUtils.js.map