--- /dev/null
+package edu.internet2.middleware.shibboleth.common;
+
+import java.io.InputStream;
+import java.util.StringTokenizer;
+
+import javax.servlet.ServletContext;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.commons.digester.Digester;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ * This class is a jakarta Digester style parser that will pull schemas from /WEB-INF/schemas, if they
+ * exist.
+ *
+ * @author Walter Hoehn wassa@columbia.edu
+ */
+
+public class ServletDigester extends Digester {
+
+ ServletContext context;
+
+ public ServletDigester() {
+ super();
+ configure();
+ }
+
+ public ServletDigester(ServletContext context) {
+ super();
+ this.context = context;
+
+ }
+
+ public ServletDigester(SAXParser parser) {
+ super(parser);
+ configure();
+ }
+
+ public ServletDigester(XMLReader reader) {
+ super(reader);
+ configure();
+ }
+
+ /**
+ * @see org.xml.sax.EntityResolver#resolveEntity(String, String)
+ */
+ public InputSource resolveEntity(String publicId, String systemId)
+ throws SAXException {
+
+ if (context != null && systemId != null) {
+ StringTokenizer tokenString = new StringTokenizer(systemId, "/");
+ String xsdFile = "";
+ while (tokenString.hasMoreTokens()) {
+ xsdFile = tokenString.nextToken();
+ }
+ if (xsdFile.endsWith(".xsd")) {
+ InputStream stream =
+ context.getResourceAsStream("/WEB-INF/schemas/" + xsdFile);
+ if (stream != null) {
+ return new InputSource(stream);
+ }
+ }
+ }
+ return null;
+
+ }
+
+ /**
+ * Return the SAXParser we will use to parse the input stream. If there
+ * is a problem creating the parser, return <code>null</code>.
+ */
+ public SAXParser getParser() {
+
+ // Return the parser we already created (if any)
+ if (parser != null) {
+ return (parser);
+ }
+
+ // Create and return a new parser
+ synchronized (this) {
+ try {
+ if (factory == null) {
+ factory = SAXParserFactory.newInstance();
+ }
+ factory.setNamespaceAware(namespaceAware);
+ factory.setValidating(validating);
+ if (validating) {
+ factory.setFeature("http://xml.org/sax/features/namespaces", true);
+ factory.setFeature("http://xml.org/sax/features/validation", true);
+ factory.setFeature("http://apache.org/xml/features/validation/schema", true);
+ factory.setFeature("http://apache.org/xml/features/validation/schema-full-checking", true);
+ }
+ parser = factory.newSAXParser();
+ return (parser);
+ } catch (Exception e) {
+ return (null);
+ }
+ }
+
+ }
+}
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
InputStream is =
getServletContext().getResourceAsStream(hsConfigFileLocation);
- HsConfigDigester digester = new HsConfigDigester();
+
try {
+ HsConfigDigester digester =
+ new HsConfigDigester(getServletContext());
+ digester.setValidating(true);
digester.parse(is);
} catch (SAXException se) {
log.fatal("Error parsing HS configuration file.", se);
private void handleError(
HttpServletRequest req,
HttpServletResponse res,
- Exception e) throws ServletException {
+ Exception e)
+ throws ServletException {
log.warn("Handle Service Failure: " + e);
} catch (ServletException se) {
log.error(
"Problem trying to display Handle Service error page: " + se);
- throw se;
+ throw se;
}
}
package edu.internet2.middleware.shibboleth.hs;
+import javax.servlet.ServletContext;
import javax.xml.parsers.SAXParser;
-import org.apache.commons.digester.Digester;
+
import org.xml.sax.XMLReader;
+import edu.internet2.middleware.shibboleth.common.ServletDigester;
+
/**
* This class is a jakarta Digester style parser for the HS configuration file.
* It should populate the HandleServiceConfig object during HS initilization. NOTE: It is
* @author Walter Hoehn wassa@columbia.edu
*/
-public class HsConfigDigester extends Digester {
+public class HsConfigDigester extends ServletDigester {
- protected String hsConfigClass = "edu.internet2.middleware.shibboleth.hs.HandleServiceConfig";
+ protected String hsConfigClass =
+ "edu.internet2.middleware.shibboleth.hs.HandleServiceConfig";
private boolean configured = false;
- /**
- * Constructor for ShibbolethConfigDigester.
- */
public HsConfigDigester() {
super();
configure();
}
- /**
- * Constructor for ShibbolethConfigDigester.
- * @param parser
- */
public HsConfigDigester(SAXParser parser) {
super(parser);
configure();
}
- /**
- * Constructor for ShibbolethConfigDigester.
- * @param reader
- */
+ public HsConfigDigester(ServletContext context) {
+ super(context);
+ configure();
+ }
+
public HsConfigDigester(XMLReader reader) {
super(reader);
configure();
<?xml version="1.0" encoding="UTF-8"?>
<!-- Example configuration file for the Shibboleth Handle Service - Walter Hoehn - 06/05/2002 -->
-<HandleServiceConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hsconfig.xsd">
+<HandleServiceConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://shibboleth.internet2.edu/hs/alpha-2/hsconfig.xsd"
supportContact="mailto:shib-test@internet2.org"
logoLocation="images/internet2.gif"
validityPeriod="1400000"
- domain="internet2.edu"
+ domain="internet2.edu"
issuer="shib2.internet2.edu"
aaURL="https://shib2.internet2.edu/shibb/servlet/AAServlet"
- detailedHelpURL="http://foo.bar"
-
+ detailedHelpURL="http://foo.bar" >
<HelpText>In order to fulfill the request for the web resource you have just chosen, information must be sent from your home institution to the provider of the resource. The web resource should load automatically. If it does not load within five seconds, click on the Transmit button.</HelpText>
<SecretKey>npsHVB/3OALcE+ydFtxAKp6bB1Qf9zgC</SecretKey>
</HandleServiceConfig>
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Schema for the Shibboleth Handle Service configuration file - Walter Hoehn - 06/05/2002 -->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
- <xs:element name="HandleServiceConfig">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="HelpText" type="xs:string" minOccurs="0" maxOccurs="1"/>
- <xs:element name="SecretKey" type="xs:string" minOccurs="1" maxOccurs="1"/>
- </xs:sequence>
- <xs:attribute name="supportContact" type="xs:string" use="optional"/>
- <xs:attribute name="logoLocation" type="xs:string" use="optional"/>
- <xs:attribute name="validityPeriod" type="xs:int" use="optional"/>
- <xs:attribute name="domain" type="xs:string" use="required"/>
- <xs:attribute name="issuer" type="xs:string" use="required"/>
- <xs:attribute name="aaURL" type="xs:anyURI" use="required"/>
- <xs:attribute name="detailedHelpURL" type="xs:anyURI" use="optional"/>
- </xs:complexType>
- </xs:element>
-</xs:schema>
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- Schema for the Shibboleth Handle Service configuration file - Walter Hoehn - 06/05/2002 -->\r
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">\r
+ <xs:element name="HandleServiceConfig">\r
+ <xs:complexType>\r
+ <xs:sequence>\r
+ <xs:element name="HelpText" type="xs:string" minOccurs="0" maxOccurs="1"/>\r
+ <xs:element name="SecretKey" type="xs:string" minOccurs="1" maxOccurs="1"/>\r
+ </xs:sequence>\r
+ <xs:attribute name="supportContact" type="xs:string" use="optional"/>\r
+ <xs:attribute name="logoLocation" type="xs:string" use="optional"/>\r
+ <xs:attribute name="validityPeriod" type="xs:int" use="optional"/>\r
+ <xs:attribute name="domain" type="xs:string" use="required"/>\r
+ <xs:attribute name="issuer" type="xs:string" use="required"/>\r
+ <xs:attribute name="aaURL" type="xs:anyURI" use="required"/>\r
+ <xs:attribute name="detailedHelpURL" type="xs:anyURI" use="optional"/>\r
+ </xs:complexType>\r
+ </xs:element>\r
+</xs:schema>\r