|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
package com.sun.org.apache.xml.internal.security.transforms.implementations; |
|
|
|
import java.io.ByteArrayInputStream; |
|
import java.io.ByteArrayOutputStream; |
|
import java.io.IOException; |
|
import java.io.InputStream; |
|
import java.io.OutputStream; |
|
|
|
import javax.xml.XMLConstants; |
|
import javax.xml.transform.Source; |
|
import javax.xml.transform.Transformer; |
|
import javax.xml.transform.TransformerConfigurationException; |
|
import javax.xml.transform.TransformerException; |
|
import javax.xml.transform.TransformerFactory; |
|
import javax.xml.transform.dom.DOMSource; |
|
import javax.xml.transform.stream.StreamResult; |
|
import javax.xml.transform.stream.StreamSource; |
|
|
|
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException; |
|
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput; |
|
import com.sun.org.apache.xml.internal.security.transforms.Transform; |
|
import com.sun.org.apache.xml.internal.security.transforms.TransformSpi; |
|
import com.sun.org.apache.xml.internal.security.transforms.TransformationException; |
|
import com.sun.org.apache.xml.internal.security.transforms.Transforms; |
|
import com.sun.org.apache.xml.internal.security.utils.XMLUtils; |
|
import org.w3c.dom.Element; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class TransformXSLT extends TransformSpi { |
|
|
|
|
|
public static final String implementedTransformURI = |
|
Transforms.TRANSFORM_XSLT; |
|
|
|
static final String XSLTSpecNS = "http://www.w3.org/1999/XSL/Transform"; |
|
static final String defaultXSLTSpecNSprefix = "xslt"; |
|
static final String XSLTSTYLESHEET = "stylesheet"; |
|
|
|
private static final com.sun.org.slf4j.internal.Logger LOG = |
|
com.sun.org.slf4j.internal.LoggerFactory.getLogger(TransformXSLT.class); |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
protected String engineGetURI() { |
|
return implementedTransformURI; |
|
} |
|
|
|
protected XMLSignatureInput enginePerformTransform( |
|
XMLSignatureInput input, OutputStream baos, Transform transformObject |
|
) throws IOException, TransformationException { |
|
try { |
|
Element transformElement = transformObject.getElement(); |
|
|
|
Element xsltElement = |
|
XMLUtils.selectNode(transformElement.getFirstChild(), XSLTSpecNS, "stylesheet", 0); |
|
if (xsltElement == null) { |
|
xsltElement = |
|
XMLUtils.selectNode(transformElement.getFirstChild(), XSLTSpecNS, "transform", 0); |
|
} |
|
if (xsltElement == null) { |
|
Object exArgs[] = { "xslt:stylesheet", "Transform" }; |
|
|
|
throw new TransformationException("xml.WrongContent", exArgs); |
|
} |
|
|
|
TransformerFactory tFactory = TransformerFactory.newInstance(); |
|
|
|
tFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
Source stylesheet; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
{ |
|
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { |
|
Transformer transformer = tFactory.newTransformer(); |
|
DOMSource source = new DOMSource(xsltElement); |
|
StreamResult result = new StreamResult(os); |
|
|
|
transformer.transform(source, result); |
|
|
|
stylesheet = |
|
new StreamSource(new ByteArrayInputStream(os.toByteArray())); |
|
} |
|
} |
|
|
|
Transformer transformer = tFactory.newTransformer(stylesheet); |
|
|
|
// Force Xalan to use \n as line separator on all OSes. This |
|
// avoids OS specific signature validation failures due to line |
|
// separator differences in the transformed output. Unfortunately, |
|
// this is not a standard JAXP property so will not work with non-Xalan |
|
|
|
try { |
|
transformer.setOutputProperty("{http://xml.apache.org/xalan}line-separator", "\n"); |
|
} catch (Exception e) { |
|
LOG.warn("Unable to set Xalan line-separator property: " + e.getMessage()); |
|
} |
|
|
|
try (InputStream is = new ByteArrayInputStream(input.getBytes())) { |
|
Source xmlSource = new StreamSource(is); |
|
if (baos == null) { |
|
try (ByteArrayOutputStream baos1 = new ByteArrayOutputStream()) { |
|
StreamResult outputTarget = new StreamResult(baos1); |
|
transformer.transform(xmlSource, outputTarget); |
|
XMLSignatureInput output = new XMLSignatureInput(baos1.toByteArray()); |
|
output.setSecureValidation(secureValidation); |
|
return output; |
|
} |
|
} |
|
StreamResult outputTarget = new StreamResult(baos); |
|
|
|
transformer.transform(xmlSource, outputTarget); |
|
} |
|
XMLSignatureInput output = new XMLSignatureInput((byte[])null); |
|
output.setSecureValidation(secureValidation); |
|
output.setOutputStream(baos); |
|
return output; |
|
} catch (XMLSecurityException ex) { |
|
throw new TransformationException(ex); |
|
} catch (TransformerConfigurationException ex) { |
|
throw new TransformationException(ex); |
|
} catch (TransformerException ex) { |
|
throw new TransformationException(ex); |
|
} |
|
} |
|
} |