/* * Copyright 2018 Scytl Secure Electronic Voting SA * * All rights reserved * * See our extended copyright notice in *file 'Copyright.txt' which is part of this source code package */ /* jshint node:true */ 'use strict'; var windowObject_ = typeof window === 'undefined' ? Object.create(null) : window; module.exports = { /** * Converts a string to an XML document. For internal use only. * * @function xmlFromString * @private * @param {string} * str The string to convert. * @returns {string} The XML document from the conversion. */ xmlFromString: function(str) { if (windowObject_.ActiveXObject) { // Remove null terminating character if exists var strNoNull = str.replace(/\x00+$/, ''); var xmlDoc = new windowObject_.ActiveXObject('Microsoft.XMLDOM'); xmlDoc.async = false; xmlDoc.loadXML(strNoNull); return xmlDoc; } else if (typeof windowObject_.DOMParser !== 'undefined') { return (new windowObject_.DOMParser()).parseFromString(str, 'text/xml'); } else { // No native parser, use a JS one. var DOMParser = require('xmldom').DOMParser; return new DOMParser().parseFromString(str, 'text/xml'); } }, /** * Converts an XML document to a string. For internal use only. * * @function xmlToString * @private * @param {string} * xmlDoc xml document to convert, as string. * @param {boolean} * removeSelfClosingTags removes self closing tags to explicit * tags. Example: to * @returns {string} The string from the conversion. */ xmlToString: function(xmlDoc, removeSelfClosingTags) { var result = this.xmlToStringIeCompatible(xmlDoc); if (removeSelfClosingTags) { result = this.xmlRemoveSelfClosingTags(result); } return result; }, /** * Removes all self-closing tags from some XML data. For internal use only. * * @function xmlRemoveSelfClosingTags * @private * @param {string} * data The XML data before removing the tags. * @returns {string} The XML data after removing the tags. */ xmlRemoveSelfClosingTags: function(data) { var split = data.split('/>'); var newXml = ''; for (var i = 0; i < split.length - 1; i++) { var edsplit = split[i].split('<'); newXml += split[i] + '>'; } return newXml + split[split.length - 1]; }, /** * Converts an XML document to an IE compatible string. For internal use * only. * * @function xmlToStringIeCompatible * @private * @param {string} * data The XML document to convert. * @returns {string} The IE compatible string. */ xmlToStringIeCompatible: function(xmlNode) { if (windowObject_.XMLSerializer) { return (new windowObject_.XMLSerializer()).serializeToString(xmlNode); } else if (xmlNode.xml) { return xmlNode.xml; } else { var XMLSerializer = require('xmldom').XMLSerializer; return new XMLSerializer().serializeToString(xmlNode); } }, /** * Removes all newline characters from some data. For internal use only. * * @function removeNewLineChars * @private * @param {string} * data data from which to remove all newline characters, as * string. * @returns {string} data with all newline characters removed, as string. */ removeNewLineChars: function(data) { return data.replace(/(\r\n|\n|\r)/gm, ''); }, /** * Removes all carriage return characters from some data. For internal use * only. * * @param data * Data from which to remove all carriage return characters, as * string. * @return Data with all carriage return characters removed, as string. */ removeCarriageReturnChars: function(data) { return data.replace(/\r/gm); }, /** * Removes the null terminating character from some data. For internal use * only. * * @function removeNullTerminatingChar * @private * @param {string} * data Data from which to remove the null terminating character, * as string. * @returns {string} data with null terminating character removed, as * string. */ removeNullTerminatingChar: function(data) { return data.replace(/\x00+$/, ''); }, /** * Removes the XML header from a string representing an XML. For internal * use only. * * @function removeXmlHeaderFromString * @private * @param data * The XML string from which to remove the XML header. * @return XML string with the XML header removed. */ removeXmlHeaderFromString: function(data) { return data.replace('', ''); }, /** * Removes the signature node from a string representing an XML. For * internal use only. * * @function removeXmlSignature * @private * @param data * The XML string from which to remove the signature node. * @return XML string with the signature node removed. */ removeXmlSignature: function(data) { return data.replace(//g, ''); } };