blob: f54cca372420204aa581c7705fef6b2a85254b14 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.xml.security.test.dom.signature;
import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.cert.X509Certificate;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.apache.xml.security.signature.XMLSignature;
import org.apache.xml.security.signature.XMLSignatureInput;
import org.apache.xml.security.test.dom.DSNamespaceContext;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.apache.xml.security.utils.XMLUtils;
import org.apache.xml.security.utils.resolver.ResourceResolverContext;
import org.apache.xml.security.utils.resolver.ResourceResolverException;
import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
/**
* A test-case for Bugzilla bug 45744 - "XPath transform and xml-stylesheet".
*/
public class ProcessingInstructionTest {
static {
org.apache.xml.security.Init.init();
}
private static String dir;
public ProcessingInstructionTest() {
String base = System.getProperty("basedir") == null
? "./" : System.getProperty("basedir");
String fs = System.getProperty("file.separator");
dir = base + fs + "src/test/resources" + fs + "org" + fs + "apache" + fs + "xml" +
fs + "security" + fs + "testcases" + fs;
}
@org.junit.Test
public void testProcessingInstruction() throws Exception {
String signatureFileName = dir + "upp_sign.xml";
File f = new File(signatureFileName);
Document doc = XMLUtils.read(new FileInputStream(f), false);
Node obj =
doc.getElementsByTagNameNS("http://uri.etsi.org/01903/v1.3.2#", "QualifyingProperties").item(0);
while (obj != null) {
if (obj instanceof Element) {
Attr attr = ((Element)obj).getAttributeNode("Id");
if (attr != null) {
((Element)obj).setIdAttributeNode(attr, true);
}
}
obj = obj.getFirstChild();
}
XPathFactory xpf = XPathFactory.newInstance();
XPath xpath = xpf.newXPath();
xpath.setNamespaceContext(new DSNamespaceContext());
String expression = "//ds:Signature[1]";
Element sigElement =
(Element) xpath.evaluate(expression, doc, XPathConstants.NODE);
String baseUri = new File(".").toURI().toURL().toString();
XMLSignature signature = new XMLSignature(sigElement, baseUri);
signature.addResourceResolver(FileResolver.getInstance());
X509Certificate cert = signature.getKeyInfo().getX509Certificate();
if (!signature.checkSignatureValue(cert)) {
throw new Exception("Signature is invalid!");
}
}
/**
* This class resolves "out.xml" on the local filesystem.
*/
private static class FileResolver extends ResourceResolverSpi {
private static FileResolver resolver;
public synchronized static ResourceResolverSpi getInstance() {
if (resolver == null) {
resolver = new FileResolver();
}
return resolver;
}
private FileResolver() {
}
@Override
public XMLSignatureInput engineResolveURI(ResourceResolverContext context)
throws ResourceResolverException {
try {
URI uriNew = getNewURI(context.uriToResolve, context.baseUri);
FileInputStream inputStream =
new FileInputStream(dir + "out.xml");
XMLSignatureInput result = new XMLSignatureInput(inputStream);
result.setSourceURI(uriNew.toString());
return result;
} catch (Exception ex) {
throw new ResourceResolverException(
ex, context.uriToResolve, context.baseUri, "generic.EmptyMessage"
);
}
}
@Override
public boolean engineCanResolveURI(ResourceResolverContext context) {
return !(context.uriToResolve == null || !"out.xml".equals(context.uriToResolve));
}
private static URI getNewURI(String uri, String baseURI) throws URISyntaxException {
URI newUri = null;
if (baseURI == null || "".equals(baseURI)) {
newUri = new URI(uri);
} else {
newUri = new URI(baseURI).resolve(uri);
}
// if the URI contains a fragment, ignore it
if (newUri.getFragment() != null) {
URI uriNewNoFrag =
new URI(newUri.getScheme(), newUri.getSchemeSpecificPart(), null);
return uriNewNoFrag;
}
return newUri;
}
}
}