Added schema validation for the HS config file.
authorwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Thu, 6 Jun 2002 07:19:25 +0000 (07:19 +0000)
committerwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Thu, 6 Jun 2002 07:19:25 +0000 (07:19 +0000)
git-svn-id: https://subversion.switch.ch/svn/shibboleth/java-idp/trunk@33 ab3bd59b-922f-494d-bb5f-6f0a3c29deca

src/edu/internet2/middleware/shibboleth/common/ServletDigester.java [new file with mode: 0755]
src/edu/internet2/middleware/shibboleth/hs/HandleService.java
src/edu/internet2/middleware/shibboleth/hs/HsConfigDigester.java
webApplication/WEB-INF/conf/hsconfig.xml
webApplication/WEB-INF/schemas/hsconfig.xsd [moved from webApplication/WEB-INF/conf/hsconfig.xsd with 98% similarity]

diff --git a/src/edu/internet2/middleware/shibboleth/common/ServletDigester.java b/src/edu/internet2/middleware/shibboleth/common/ServletDigester.java
new file mode 100755 (executable)
index 0000000..bdf3260
--- /dev/null
@@ -0,0 +1,104 @@
+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&#064;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);
+            }
+        }
+
+    }
+}
index 3ad7c01..c6eb78e 100755 (executable)
@@ -13,6 +13,7 @@ import javax.servlet.ServletException;
 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;
@@ -113,8 +114,11 @@ public class HandleService extends HttpServlet {
 
                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);
@@ -231,7 +235,8 @@ public class HandleService extends HttpServlet {
        private void handleError(
                HttpServletRequest req,
                HttpServletResponse res,
-               Exception e) throws ServletException {
+               Exception e)
+               throws ServletException {
 
                log.warn("Handle Service Failure: " + e);
 
@@ -248,7 +253,7 @@ public class HandleService extends HttpServlet {
                } catch (ServletException se) {
                        log.error(
                                "Problem trying to display Handle Service error page: " + se);
-                               throw se;
+                       throw se;
                }
        }
 
index eae3f59..abd426d 100755 (executable)
@@ -1,9 +1,12 @@
 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
@@ -13,32 +16,27 @@ import org.xml.sax.XMLReader;
  * @author Walter Hoehn wassa&#064;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();
index e81eb50..b291d0b 100755 (executable)
@@ -1,14 +1,13 @@
 <?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>
similarity index 98%
rename from webApplication/WEB-INF/conf/hsconfig.xsd
rename to webApplication/WEB-INF/schemas/hsconfig.xsd
index 007b3d9..d787c69 100755 (executable)
@@ -1,19 +1,19 @@
-<?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