| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | '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 ['<div>', '<p>'...] or as a string '<div><p>'   * @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 (<a><b><c>)			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 = /<!--[\s\S]*?-->|<\?(?: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. '<tag attr=...', '<tag>', '<tag/>', '<tag'			var re = new RegExp('<(' + blackListContentTags.join('|') + ')(\\s|\\/|>|$)', '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
 |