blob: d31fb2412871b6361dcce61f6f5eace4533a7e80 [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.utils.resolver;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import org.apache.xml.security.signature.XMLSignatureInput;
import org.apache.xml.security.utils.resolver.ResourceResolverContext;
import org.apache.xml.security.utils.resolver.ResourceResolverException;
import org.apache.xml.security.utils.resolver.ResourceResolverSpi;
/**
* This class helps us home users to resolve http URIs without a network
* connection.
* <p></p>
* The OfflineResolver is only needed for Unit testing. This is not needed for
* a production environment. It's a very simple cache/proxy to HTTP space
* so that I can do unit testing with http:// URIs even if I'm not connected
* to the internet.
*
*/
public class OfflineResolver extends ResourceResolverSpi {
static org.slf4j.Logger LOG =
org.slf4j.LoggerFactory.getLogger(OfflineResolver.class);
/** Field _uriMap */
static Map<String, String> _uriMap = null;
/** Field _mimeMap */
static Map<String, String> _mimeMap = null;
static {
org.apache.xml.security.Init.init();
_uriMap = new HashMap<>();
_mimeMap = new HashMap<>();
String basedir =
System.getProperty("basedir") == null ? "./": System.getProperty("basedir") + "/";
OfflineResolver.register(
"http://www.w3.org/TR/xml-stylesheet",
basedir + "src/test/resources/org/w3c/www/TR/xml-stylesheet.html", "text/html"
);
OfflineResolver.register(
"http://www.w3.org/TR/2000/REC-xml-20001006",
basedir + "src/test/resources/org/w3c/www/TR/2000/REC-xml-20001006", "text/xml"
);
OfflineResolver.register(
"http://www.nue.et-inf.uni-siegen.de/index.html",
basedir + "src/test/resources/org/apache/xml/security/temp/nuehomepage", "text/html"
);
OfflineResolver.register(
"http://www.nue.et-inf.uni-siegen.de/~geuer-pollmann/id2.xml",
basedir + "src/test/resources/org/apache/xml/security/temp/id2.xml", "text/xml"
);
OfflineResolver.register(
"http://xmldsig.pothole.com/xml-stylesheet.txt",
basedir + "src/test/resources/com/pothole/xmldsig/xml-stylesheet.txt", "text/xml"
);
OfflineResolver.register(
"http://www.w3.org/Signature/2002/04/xml-stylesheet.b64",
basedir
+ "src/test/resources/ie/baltimore/merlin-examples/merlin-xmldsig-twenty-three/xml-stylesheet.b64",
"text/plain"
);
}
/**
* Method engineResolve
*
* @param context
*
* @throws ResourceResolverException
*/
@Override
public XMLSignatureInput engineResolveURI(ResourceResolverContext context)
throws ResourceResolverException {
try {
String URI = context.uriToResolve;
if (OfflineResolver._uriMap.containsKey(URI)) {
String newURI = OfflineResolver._uriMap.get(URI);
LOG.debug("Mapped " + URI + " to " + newURI);
InputStream is = new FileInputStream(newURI);
LOG.debug("Available bytes = " + is.available());
XMLSignatureInput result = new XMLSignatureInput(is);
result.setSourceURI(URI);
result.setMIMEType(OfflineResolver._mimeMap.get(URI));
return result;
} else {
Object[] exArgs = {"The URI " + URI + " is not configured for offline work" };
throw new ResourceResolverException(
"generic.EmptyMessage", exArgs, context.uriToResolve, context.baseUri
);
}
} catch (IOException ex) {
throw new ResourceResolverException(
ex, context.uriToResolve, context.baseUri, "generic.EmptyMessage"
);
}
}
/**
* We resolve http URIs <I>without</I> fragment...
*
* @param context
*/
@Override
public boolean engineCanResolveURI(ResourceResolverContext context) {
String uriNodeValue = context.uriToResolve;
if (uriNodeValue.isEmpty() || uriNodeValue.charAt(0) == '#') {
return false;
}
URI uriNew = null;
try {
uriNew = getNewURI(context.uriToResolve, context.baseUri);
if ("http".equals(uriNew.getScheme())) {
LOG.debug("I state that I can resolve " + uriNew.toString());
return true;
}
} catch (URISyntaxException ex) {
//
}
return false;
}
/**
* Method register
*
* @param URI
* @param filename
* @param MIME
*/
private static void register(String URI, String filename, String MIME) {
OfflineResolver._uriMap.put(URI, filename);
OfflineResolver._mimeMap.put(URI, MIME);
}
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;
}
}