Errors from requests with invalid subjects are now implementation specific.
authorwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Fri, 12 Mar 2004 17:22:43 +0000 (17:22 +0000)
committerwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Fri, 12 Mar 2004 17:22:43 +0000 (17:22 +0000)
git-svn-id: https://subversion.switch.ch/svn/shibboleth/java-idp/trunk@913 ab3bd59b-922f-494d-bb5f-6f0a3c29deca

src/edu/internet2/middleware/shibboleth/aa/AAServlet.java
src/edu/internet2/middleware/shibboleth/common/InvalidNameIdentifierException.java
src/edu/internet2/middleware/shibboleth/common/NameMapper.java
src/edu/internet2/middleware/shibboleth/hs/HSNameMapper.java
src/edu/internet2/middleware/shibboleth/hs/provider/AQHNameIdentifierMapping.java
src/edu/internet2/middleware/shibboleth/hs/provider/CryptoShibHandle.java
src/edu/internet2/middleware/shibboleth/hs/provider/SharedMemoryShibHandle.java

index 7b77efc..1d514d7 100755 (executable)
@@ -55,7 +55,6 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.apache.log4j.Logger;
 import org.apache.log4j.MDC;
-import org.opensaml.QName;
 import org.opensaml.SAMLAssertion;
 import org.opensaml.SAMLAttribute;
 import org.opensaml.SAMLAttributeQuery;
@@ -79,6 +78,7 @@ import edu.internet2.middleware.shibboleth.aa.arp.ArpException;
 import edu.internet2.middleware.shibboleth.aa.attrresolv.AttributeResolver;
 import edu.internet2.middleware.shibboleth.aa.attrresolv.AttributeResolverException;
 import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
+import edu.internet2.middleware.shibboleth.common.InvalidNameIdentifierException;
 import edu.internet2.middleware.shibboleth.common.NameIdentifierMapping;
 import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
 import edu.internet2.middleware.shibboleth.common.NameMapper;
@@ -252,25 +252,20 @@ public class AAServlet extends HttpServlet {
 
                                //TODO Do something about these silly passthru errors
 
-                       } catch (NameIdentifierMappingException e) {
-                               log.info("Could not associate the request subject with a principal: " + e);
+                       } catch (InvalidNameIdentifierException invalidNameE) {
+                               log.info("Could not associate the request subject with a principal: " + invalidNameE);
                                try {
-                                       //TODO this doesn't always make sense anymore
-                                       QName[] codes =
-                                               {
-                                                       SAMLException.REQUESTER,
-                                                       new QName(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS, "InvalidHandle")};
                                        if (relyingParty.passThruErrors()) {
                                                sendFailure(
                                                        resp,
                                                        samlRequest,
-                                                       new SAMLException(Arrays.asList(codes), "The supplied Subject was unrecognized.", e));
+                                                       new SAMLException(Arrays.asList(invalidNameE.getSAMLErrorCodes()), "The supplied Subject was unrecognized.", invalidNameE));
 
                                        } else {
                                                sendFailure(
                                                        resp,
                                                        samlRequest,
-                                                       new SAMLException(Arrays.asList(codes), "The supplied Subject was unrecognized."));
+                                                       new SAMLException(Arrays.asList(invalidNameE.getSAMLErrorCodes()), "The supplied Subject was unrecognized."));
                                        }
                                        return;
                                } catch (Exception ee) {
index ddf31e4..0720cb3 100644 (file)
@@ -1,58 +1,46 @@
 /*
- * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation
- * for Advanced Internet Development, Inc. All rights reserved
- * 
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- * 
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution, if any, must include
- * the following acknowledgment: "This product includes software developed by
- * the University Corporation for Advanced Internet Development
- * <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement
- * may appear in the software itself, if and wherever such third-party
- * acknowledgments normally appear.
- * 
- * Neither the name of Shibboleth nor the names of its contributors, nor
- * Internet2, nor the University Corporation for Advanced Internet Development,
- * Inc., nor UCAID may be used to endorse or promote products derived from this
- * software without specific prior written permission. For written permission,
- * please contact shibboleth@shibboleth.org
- * 
- * Products derived from this software may not be called Shibboleth, Internet2,
- * UCAID, or the University Corporation for Advanced Internet Development, nor
- * may Shibboleth appear in their name, without prior written permission of the
- * University Corporation for Advanced Internet Development.
- * 
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
- * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
+ * All rights reserved Redistribution and use in source and binary forms, with or without modification, are permitted
+ * provided that the following conditions are met: Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution, if any, must include the following acknowledgment: "This product includes
+ * software developed by the University Corporation for Advanced Internet Development <http://www.ucaid.edu> Internet2
+ * Project. Alternately, this acknowledegement may appear in the software itself, if and wherever such third-party
+ * acknowledgments normally appear. Neither the name of Shibboleth nor the names of its contributors, nor Internet2,
+ * nor the University Corporation for Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote
+ * products derived from this software without specific prior written permission. For written permission, please
+ * contact shibboleth@shibboleth.org Products derived from this software may not be called Shibboleth, Internet2,
+ * UCAID, or the University Corporation for Advanced Internet Development, nor may Shibboleth appear in their name,
+ * without prior written permission of the University Corporation for Advanced Internet Development. THIS SOFTWARE IS
+ * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+ * NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS
+ * WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY CORPORATION FOR ADVANCED
+ * INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
+
 package edu.internet2.middleware.shibboleth.common;
 
+import org.opensaml.QName;
+
 /**
  * @author Walter Hoehn
  */
 public class InvalidNameIdentifierException extends NameIdentifierMappingException {
 
-       public InvalidNameIdentifierException(String message) {
+       QName[] errorCodes;
+
+       public InvalidNameIdentifierException(String message, QName[] errorCodes) {
                super(message);
+               this.errorCodes = errorCodes;
        }
 
+       public QName[] getSAMLErrorCodes() {
+               return errorCodes;
+       }
 }
index 6ee5d99..61bbf09 100644 (file)
@@ -1,38 +1,27 @@
 /*
  * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
- * All rights reserved
- * 
- * 
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
- * following conditions are met:
- * 
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
- * disclaimer.
- * 
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided with the distribution, if any, must include the
- * following acknowledgment: "This product includes software developed by the University Corporation for Advanced
- * Internet Development <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement may appear in the
- * software itself, if and wherever such third-party acknowledgments normally appear.
- * 
- * Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor the University Corporation for
- * Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software
- * without specific prior written permission. For written permission, please contact shibboleth@shibboleth.org
- * 
- * Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the University Corporation
- * for Advanced Internet Development, nor may Shibboleth appear in their name, without prior written permission of the
- * University Corporation for Advanced Internet Development.
- * 
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE,
- * ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * All rights reserved Redistribution and use in source and binary forms, with or without modification, are permitted
+ * provided that the following conditions are met: Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution, if any, must include the following acknowledgment: "This product includes
+ * software developed by the University Corporation for Advanced Internet Development <http://www.ucaid.edu> Internet2
+ * Project. Alternately, this acknowledegement may appear in the software itself, if and wherever such third-party
+ * acknowledgments normally appear. Neither the name of Shibboleth nor the names of its contributors, nor Internet2,
+ * nor the University Corporation for Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote
+ * products derived from this software without specific prior written permission. For written permission, please
+ * contact shibboleth@shibboleth.org Products derived from this software may not be called Shibboleth, Internet2,
+ * UCAID, or the University Corporation for Advanced Internet Development, nor may Shibboleth appear in their name,
+ * without prior written permission of the University Corporation for Advanced Internet Development. THIS SOFTWARE IS
+ * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+ * NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS
+ * WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY CORPORATION FOR ADVANCED
+ * INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 package edu.internet2.middleware.shibboleth.common;
@@ -63,28 +52,25 @@ import edu.internet2.middleware.shibboleth.hs.provider.SharedMemoryShibHandle;
  */
 public class NameMapper {
 
-       private static Logger log = Logger.getLogger(NameMapper.class.getName());
-       protected Map byFormat = new HashMap();
-       private static Map registeredMappingTypes = Collections.synchronizedMap(new HashMap());
+       private static Logger                           log                                             = Logger.getLogger(NameMapper.class.getName());
+       protected Map                                           byFormat                                = new HashMap();
+       private static Map                                      registeredMappingTypes  = Collections.synchronizedMap(new HashMap());
        /** true if mappings have been added */
-       protected boolean initialized = false;
+       protected boolean                                       initialized                             = false;
        /** Mapping to use if no other mappings have been added */
-       protected SharedMemoryShibHandle defaultMapping;
+       protected SharedMemoryShibHandle        defaultMapping;
 
        //Preload aliases for bundled mappings
        static {
                try {
-                       registeredMappingTypes.put(
-                               "CryptoHandleGenerator",
-                               Class.forName("edu.internet2.middleware.shibboleth.hs.provider.CryptoShibHandle"));
+                       registeredMappingTypes.put("CryptoHandleGenerator", Class
+                                       .forName("edu.internet2.middleware.shibboleth.hs.provider.CryptoShibHandle"));
 
-                       registeredMappingTypes.put(
-                               "SharedMemoryShibHandle",
-                               Class.forName("edu.internet2.middleware.shibboleth.hs.provider.SharedMemoryShibHandle"));
+                       registeredMappingTypes.put("SharedMemoryShibHandle", Class
+                                       .forName("edu.internet2.middleware.shibboleth.hs.provider.SharedMemoryShibHandle"));
 
-                       registeredMappingTypes.put(
-                               "Principal",
-                               Class.forName("edu.internet2.middleware.shibboleth.common.PrincipalNameIdentifier"));
+                       registeredMappingTypes.put("Principal", Class
+                                       .forName("edu.internet2.middleware.shibboleth.common.PrincipalNameIdentifier"));
 
                } catch (ClassNotFoundException e) {
                        log.error("Unable to pre-register Name mapping implementation types.");
@@ -97,10 +83,8 @@ public class NameMapper {
        public NameMapper() {
                try {
                        //Load the default mapping
-                       String rawConfig =
-                               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-                                       + "<NameMapping format=\"urn:mace:shibboleth:1.0:nameIdentifier\""
-                                       + "             handleTTL=\"1800\"/>";
+                       String rawConfig = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                                       + "<NameMapping format=\"urn:mace:shibboleth:1.0:nameIdentifier\"" + "          handleTTL=\"1800\"/>";
                        DOMParser parser = new DOMParser();
                        parser.parse(new InputSource(new StringReader(rawConfig)));
                        defaultMapping = new SharedMemoryShibHandle(parser.getDocument().getDocumentElement());
@@ -122,7 +106,6 @@ public class NameMapper {
         * 
         * @param e
         *            An XML representation of a {@link NameIdentifierMapping}
-        * 
         * @throws NameIdentifierMappingException
         *             If the mapping could not be constructed according to the supplied configuration
         */
@@ -148,12 +131,8 @@ public class NameMapper {
                                throw new NameIdentifierMappingException("Invalid mapping implementation specified.");
                        }
 
-                       log.debug(
-                               "Found type ("
-                                       + type
-                                       + ") registered with an implementation class of ("
-                                       + registeredImplementation.getName()
-                                       + ").");
+                       log.debug("Found type (" + type + ") registered with an implementation class of ("
+                                       + registeredImplementation.getName() + ").");
                        addNameMapping(loadNameIdentifierMapping(registeredImplementation, e));
 
                } else if (implementation != null && (!implementation.equals(""))) {
@@ -207,18 +186,17 @@ public class NameMapper {
        }
 
        protected NameIdentifierMapping loadNameIdentifierMapping(Class implementation, Element config)
-               throws NameIdentifierMappingException {
+                       throws NameIdentifierMappingException {
 
                try {
-                       Class[] params = new Class[] { Element.class };
+                       Class[] params = new Class[]{Element.class};
                        Constructor implementorConstructor = implementation.getConstructor(params);
-                       Object[] args = new Object[] { config };
+                       Object[] args = new Object[]{config};
                        log.debug("Initializing Name Identifier Mapping of type (" + implementation.getName() + ").");
                        return (NameIdentifierMapping) implementorConstructor.newInstance(args);
 
                } catch (NoSuchMethodException nsme) {
-                       log.error(
-                               "Failed to instantiate a Name Identifier Mapping: NameIdentifierMapping "
+                       log.error("Failed to instantiate a Name Identifier Mapping: NameIdentifierMapping "
                                        + "implementation must contain a constructor that accepts an Element object for "
                                        + "configuration data.");
                        throw new NameIdentifierMappingException("Failed to instantiate a Name Identifier Mapping.");
@@ -247,7 +225,7 @@ public class NameMapper {
         *             If the {@link SAMLNameIdentifier}contains invalid data
         */
        public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
-               throws NameIdentifierMappingException, InvalidNameIdentifierException {
+                       throws NameIdentifierMappingException, InvalidNameIdentifierException {
 
                NameIdentifierMapping mapping = null;
                try {
@@ -256,7 +234,7 @@ public class NameMapper {
                        log.error("Invalid Name Identifier format.");
                }
                if (mapping == null) {
-                       throw new InvalidNameIdentifierException("Name Identifier format not registered.");
+                       throw new NameIdentifierMappingException("Name Identifier format not registered.");
                }
                return mapping.getPrincipal(nameId, sProv, idProv);
        }
@@ -265,10 +243,10 @@ public class NameMapper {
         * Cleanup resources that won't be released when this object is garbage-collected
         */
        public void destroy() {
-                       Iterator mappingIterator = byFormat.values().iterator();
-                       while (mappingIterator.hasNext()) {
-                               ((NameIdentifierMapping)mappingIterator.next()).destroy();
-                       }
+               Iterator mappingIterator = byFormat.values().iterator();
+               while (mappingIterator.hasNext()) {
+                       ((NameIdentifierMapping) mappingIterator.next()).destroy();
+               }
        }
 
 }
index 9b95ac3..2498781 100644 (file)
@@ -54,7 +54,6 @@ import org.opensaml.SAMLNameIdentifier;
 
 import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
 import edu.internet2.middleware.shibboleth.common.IdentityProvider;
-import edu.internet2.middleware.shibboleth.common.InvalidNameIdentifierException;
 import edu.internet2.middleware.shibboleth.common.NameIdentifierMapping;
 import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
 import edu.internet2.middleware.shibboleth.common.NameMapper;
@@ -146,7 +145,7 @@ public class HSNameMapper extends NameMapper {
                HSNameIdentifierMapping mapping = getNameIdentifierMappingById(id);
 
                if (mapping == null) {
-                       throw new InvalidNameIdentifierException("Name Identifier id not registered.");
+                       throw new NameIdentifierMappingException("Name Identifier id not registered.");
                }
                return mapping.getNameIdentifierName(principal, sProv, idProv);
        }
index 93540de..2ae8f99 100644 (file)
@@ -1,44 +1,36 @@
 /*
  * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
- * All rights reserved
- * 
- * 
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
- * following conditions are met:
- * 
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
- * disclaimer.
- * 
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided with the distribution, if any, must include the
- * following acknowledgment: "This product includes software developed by the University Corporation for Advanced
- * Internet Development <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement may appear in the
- * software itself, if and wherever such third-party acknowledgments normally appear.
- * 
- * Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor the University Corporation for
- * Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software
- * without specific prior written permission. For written permission, please contact shibboleth@shibboleth.org
- * 
- * Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the University Corporation for
- * Advanced Internet Development, nor may Shibboleth appear in their name, without prior written permission of the
- * University Corporation for Advanced Internet Development.
- * 
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE,
- * ACCURACY, AND EFFORT IS WITH LICENSEE.  IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * All rights reserved Redistribution and use in source and binary forms, with or without modification, are permitted
+ * provided that the following conditions are met: Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution, if any, must include the following acknowledgment: "This product includes
+ * software developed by the University Corporation for Advanced Internet Development <http://www.ucaid.edu> Internet2
+ * Project. Alternately, this acknowledegement may appear in the software itself, if and wherever such third-party
+ * acknowledgments normally appear. Neither the name of Shibboleth nor the names of its contributors, nor Internet2,
+ * nor the University Corporation for Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote
+ * products derived from this software without specific prior written permission. For written permission, please
+ * contact shibboleth@shibboleth.org Products derived from this software may not be called Shibboleth, Internet2,
+ * UCAID, or the University Corporation for Advanced Internet Development, nor may Shibboleth appear in their name,
+ * without prior written permission of the University Corporation for Advanced Internet Development. THIS SOFTWARE IS
+ * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+ * NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS
+ * WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY CORPORATION FOR ADVANCED
+ * INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
+
 package edu.internet2.middleware.shibboleth.hs.provider;
 
 import java.io.Serializable;
 
 import org.apache.log4j.Logger;
+import org.opensaml.QName;
+import org.opensaml.SAMLException;
 import org.w3c.dom.Element;
 
 import edu.internet2.middleware.shibboleth.common.AuthNPrincipal;
@@ -46,16 +38,18 @@ import edu.internet2.middleware.shibboleth.common.BaseNameIdentifierMapping;
 import edu.internet2.middleware.shibboleth.common.NameIdentifierMappingException;
 
 /**
- * Base class for {@link NameIdentifierMapping} implementations that support Shibboleth Attribute Query Handles.
+ * Base class for {@link NameIdentifierMapping}implementations that support Shibboleth Attribute Query Handles.
  * 
  * @author Walter Hoehn
  */
 public abstract class AQHNameIdentifierMapping extends BaseNameIdentifierMapping {
 
-       private static Logger log = Logger.getLogger(AQHNameIdentifierMapping.class.getName());
+       private static Logger           log                     = Logger.getLogger(AQHNameIdentifierMapping.class.getName());
        /** Time in seconds for which handles are valid */
-       protected long handleTTL = 1800;
-       private String id;
+       protected long                          handleTTL       = 1800;
+       private String                          id;
+       protected static QName[]        errorCodes      = {SAMLException.REQUESTER,
+                       new QName(edu.internet2.middleware.shibboleth.common.XML.SHIB_NS, "InvalidHandle")};
 
        public AQHNameIdentifierMapping(Element config) throws NameIdentifierMappingException {
                super(config);
@@ -69,8 +63,7 @@ public abstract class AQHNameIdentifierMapping extends BaseNameIdentifierMapping
                        if (rawTTL != null && !rawTTL.equals("")) {
                                handleTTL = Long.parseLong(rawTTL);
                                if (handleTTL < 30) {
-                                       log.warn(
-                                               "You have set the Attribute Query Handle \"Time To Live\' to a very low "
+                                       log.warn("You have set the Attribute Query Handle \"Time To Live\' to a very low "
                                                        + "value.  It is recommended that you increase it.");
                                }
                        }
@@ -94,9 +87,9 @@ public abstract class AQHNameIdentifierMapping extends BaseNameIdentifierMapping
 
 class HandleEntry implements Serializable {
 
-       static final long serialVersionUID = 1L;
-       protected AuthNPrincipal principal;
-       protected long expirationTime;
+       static final long                       serialVersionUID        = 1L;
+       protected AuthNPrincipal        principal;
+       protected long                          expirationTime;
 
        /**
         * Creates a HandleEntry
index b7abaf0..0ea1041 100644 (file)
@@ -1,48 +1,27 @@
 /*
- * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation
- * for Advanced Internet Development, Inc. All rights reserved
- * 
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- * 
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution, if any, must include
- * the following acknowledgment: "This product includes software developed by
- * the University Corporation for Advanced Internet Development
- * <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement
- * may appear in the software itself, if and wherever such third-party
- * acknowledgments normally appear.
- * 
- * Neither the name of Shibboleth nor the names of its contributors, nor
- * Internet2, nor the University Corporation for Advanced Internet Development,
- * Inc., nor UCAID may be used to endorse or promote products derived from this
- * software without specific prior written permission. For written permission,
- * please contact shibboleth@shibboleth.org
- * 
- * Products derived from this software may not be called Shibboleth, Internet2,
- * UCAID, or the University Corporation for Advanced Internet Development, nor
- * may Shibboleth appear in their name, without prior written permission of the
- * University Corporation for Advanced Internet Development.
- * 
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
- * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
+ * All rights reserved Redistribution and use in source and binary forms, with or without modification, are permitted
+ * provided that the following conditions are met: Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution, if any, must include the following acknowledgment: "This product includes
+ * software developed by the University Corporation for Advanced Internet Development <http://www.ucaid.edu> Internet2
+ * Project. Alternately, this acknowledegement may appear in the software itself, if and wherever such third-party
+ * acknowledgments normally appear. Neither the name of Shibboleth nor the names of its contributors, nor Internet2,
+ * nor the University Corporation for Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote
+ * products derived from this software without specific prior written permission. For written permission, please
+ * contact shibboleth@shibboleth.org Products derived from this software may not be called Shibboleth, Internet2,
+ * UCAID, or the University Corporation for Advanced Internet Development, nor may Shibboleth appear in their name,
+ * without prior written permission of the University Corporation for Advanced Internet Development. THIS SOFTWARE IS
+ * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+ * NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS
+ * WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY CORPORATION FOR ADVANCED
+ * INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 package edu.internet2.middleware.shibboleth.hs.provider;
@@ -93,16 +72,16 @@ import edu.internet2.middleware.shibboleth.common.ShibResource;
 import edu.internet2.middleware.shibboleth.hs.HSNameIdentifierMapping;
 
 /**
- * {@link HSNameIdentifierMapping} implementation that uses symmetric encryption to store principal data inside
+ * {@link HSNameIdentifierMapping}implementation that uses symmetric encryption to store principal data inside
  * Shibboleth Attribute Query Handles.
  * 
  * @author Walter Hoehn
  */
 public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSNameIdentifierMapping {
 
-       private static Logger log = Logger.getLogger(CryptoShibHandle.class.getName());
-       protected SecretKey secret;
-       private SecureRandom random = new SecureRandom();
+       private static Logger   log             = Logger.getLogger(CryptoShibHandle.class.getName());
+       protected SecretKey             secret;
+       private SecureRandom    random  = new SecureRandom();
 
        public CryptoShibHandle(Element config) throws NameIdentifierMappingException {
                super(config);
@@ -114,9 +93,8 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
                        String keyStoreKeyPassword = getElementConfigData(config, "KeyStoreKeyPassword");
 
                        KeyStore keyStore = KeyStore.getInstance("JCEKS");
-                       keyStore.load(
-                               new ShibResource(keyStorePath, this.getClass()).getInputStream(),
-                               keyStorePassword.toCharArray());
+                       keyStore.load(new ShibResource(keyStorePath, this.getClass()).getInputStream(), keyStorePassword
+                                       .toCharArray());
                        secret = (SecretKey) keyStore.getKey(keyStoreKeyAlias, keyStoreKeyPassword.toCharArray());
 
                        //Before we finish initilization, make sure that things are
@@ -124,52 +102,57 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
                        testEncryption();
 
                        if (usingDefaultSecret()) {
-                               log.warn(
-                                       "You are running Crypto AQH Name Mapping with the default secret key.  This is UNSAFE!  Please change "
-                                               + "this configuration and restart the origin.");
+                               log
+                                               .warn("You are running Crypto AQH Name Mapping with the default secret key.  This is UNSAFE!  Please change "
+                                                               + "this configuration and restart the origin.");
                        }
                } catch (StreamCorruptedException e) {
                        if (System.getProperty("java.version").startsWith("1.4.2")) {
-                               log.error(
-                                       "There is a bug in Java 1.4.2 that prevents JCEKS keystores from being loaded properly.  "
+                               log.error("There is a bug in Java 1.4.2 that prevents JCEKS keystores from being loaded properly.  "
                                                + "You probably need to upgrade or downgrade your JVM in order to make this work.");
                        }
-                       log.error(
-                               "An error occurred while loading the java keystore.  Unable to initialize Crypto Name Mapping: " + e);
-                       throw new NameIdentifierMappingException("An error occurred while loading the java keystore.  Unable to initialize Crypto Name Mapping.");
+                       log.error("An error occurred while loading the java keystore.  Unable to initialize Crypto Name Mapping: "
+                                       + e);
+                       throw new NameIdentifierMappingException(
+                                       "An error occurred while loading the java keystore.  Unable to initialize Crypto Name Mapping.");
                } catch (KeyStoreException e) {
-                       log.error(
-                               "An error occurred while loading the java keystore.  Unable to initialize Crypto Name Mapping: " + e);
-                       throw new NameIdentifierMappingException("An error occurred while loading the java keystore.  Unable to initialize Crypto Name Mapping.");
+                       log.error("An error occurred while loading the java keystore.  Unable to initialize Crypto Name Mapping: "
+                                       + e);
+                       throw new NameIdentifierMappingException(
+                                       "An error occurred while loading the java keystore.  Unable to initialize Crypto Name Mapping.");
                } catch (CertificateException e) {
                        log.error("The java keystore contained corrupted data.  Unable to initialize Crypto Name Mapping: " + e);
-                       throw new NameIdentifierMappingException("The java keystore contained corrupted data.  Unable to initialize Crypto Name Mapping.");
+                       throw new NameIdentifierMappingException(
+                                       "The java keystore contained corrupted data.  Unable to initialize Crypto Name Mapping.");
                } catch (NoSuchAlgorithmException e) {
-                       log.error(
-                               "Appropriate JCE provider not found in the java environment. Unable to initialize Crypto Name Mapping: "
-                                       + e);
-                       throw new NameIdentifierMappingException("Appropriate JCE provider not found in the java environment. Unable to initialize Crypto Name Mapping.");
+                       log
+                                       .error("Appropriate JCE provider not found in the java environment. Unable to initialize Crypto Name Mapping: "
+                                                       + e);
+                       throw new NameIdentifierMappingException(
+                                       "Appropriate JCE provider not found in the java environment. Unable to initialize Crypto Name Mapping.");
                } catch (IOException e) {
-                       log.error(
-                               "An error accessing while loading the java keystore.  Unable to initialize Crypto Name Mapping: " + e);
-                       throw new NameIdentifierMappingException("An error occurred while accessing the java keystore.  Unable to initialize Crypto Name Mapping.");
-               } catch (UnrecoverableKeyException e) {
-                       log.error(
-                               "Secret could not be loaded from the java keystore.  Verify that the alias and password are correct: "
+                       log.error("An error accessing while loading the java keystore.  Unable to initialize Crypto Name Mapping: "
                                        + e);
-                       throw new NameIdentifierMappingException("Secret could not be loaded from the java keystore.  Verify that the alias and password are correct. ");
+                       throw new NameIdentifierMappingException(
+                                       "An error occurred while accessing the java keystore.  Unable to initialize Crypto Name Mapping.");
+               } catch (UnrecoverableKeyException e) {
+                       log
+                                       .error("Secret could not be loaded from the java keystore.  Verify that the alias and password are correct: "
+                                                       + e);
+                       throw new NameIdentifierMappingException(
+                                       "Secret could not be loaded from the java keystore.  Verify that the alias and password are correct. ");
                }
        }
 
        public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
-               throws NameIdentifierMappingException, InvalidNameIdentifierException {
+                       throws NameIdentifierMappingException, InvalidNameIdentifierException {
 
                try {
                        //Separate the IV and handle
                        byte[] in = new BASE64Decoder().decodeBuffer(nameId.getName());
                        if (in.length < 9) {
                                log.debug("Attribute Query Handle is malformed (not enough bytes).");
-                               throw new InvalidNameIdentifierException("Attribute Query Handle is malformed (not enough bytes).");
+                               throw new NameIdentifierMappingException("Attribute Query Handle is malformed (not enough bytes).");
                        }
                        byte[] iv = new byte[8];
                        System.arraycopy(in, 0, iv, 0, 8);
@@ -190,14 +173,14 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
 
                        if (handleEntry.isExpired()) {
                                log.debug("Attribute Query Handle is expired.");
-                               throw new InvalidNameIdentifierException("Attribute Query Handle is expired.");
+                               throw new InvalidNameIdentifierException("Attribute Query Handle is expired.", errorCodes);
                        }
 
                        Mac mac = Mac.getInstance("HmacSHA1");
                        mac.init(secret);
                        if (!handleEntry.isValid(mac)) {
                                log.warn("Attribute Query Handle failed integrity check.");
-                               throw new InvalidNameIdentifierException("Attribute Query Handle failed integrity check.");
+                               throw new NameIdentifierMappingException("Attribute Query Handle failed integrity check.");
                        }
 
                        log.debug("Attribute Query Handle recognized.");
@@ -205,31 +188,32 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
 
                } catch (NoSuchAlgorithmException e) {
                        log.error("Appropriate JCE provider not found in the java environment.  Could not load Algorithm: " + e);
-                       throw new InvalidNameIdentifierException("Appropriate JCE provider not found in the java environment.  Could not load Algorithm.");
+                       throw new NameIdentifierMappingException(
+                                       "Appropriate JCE provider not found in the java environment.  Could not load Algorithm.");
                } catch (NoSuchPaddingException e) {
-                       log.error(
-                               "Appropriate JCE provider not found in the java environment.  Could not load Padding method: " + e);
-                       throw new InvalidNameIdentifierException("Appropriate JCE provider not found in the java environment.  Could not load Padding method.");
+                       log.error("Appropriate JCE provider not found in the java environment.  Could not load Padding method: "
+                                       + e);
+                       throw new NameIdentifierMappingException(
+                                       "Appropriate JCE provider not found in the java environment.  Could not load Padding method.");
                } catch (InvalidKeyException e) {
                        log.error("Could not use the supplied secret key: " + e);
-                       throw new InvalidNameIdentifierException("Could not use the supplied secret key.");
+                       throw new NameIdentifierMappingException("Could not use the supplied secret key.");
                } catch (GeneralSecurityException e) {
                        log.warn("Unable to decrypt the supplied Attribute Query Handle: " + e);
-                       throw new InvalidNameIdentifierException("Unable to decrypt the supplied Attribute Query Handle.");
+                       throw new NameIdentifierMappingException("Unable to decrypt the supplied Attribute Query Handle.");
                } catch (ClassNotFoundException e) {
                        log.warn("The supplied Attribute Query Handle does not represent a serialized AuthNPrincipal: " + e);
-                       throw new InvalidNameIdentifierException("The supplied Attribute Query Handle does not represent a serialized AuthNPrincipal.");
+                       throw new NameIdentifierMappingException(
+                                       "The supplied Attribute Query Handle does not represent a serialized AuthNPrincipal.");
                } catch (IOException e) {
                        log.warn("The AuthNPrincipal could not be de-serialized from the supplied Attribute Query Handle: " + e);
-                       throw new InvalidNameIdentifierException("The AuthNPrincipal could not be de-serialized from the supplied Attribute Query Handle.");
+                       throw new NameIdentifierMappingException(
+                                       "The AuthNPrincipal could not be de-serialized from the supplied Attribute Query Handle.");
                }
        }
 
-       public SAMLNameIdentifier getNameIdentifierName(
-               AuthNPrincipal principal,
-               ServiceProvider sProv,
-               IdentityProvider idProv)
-               throws NameIdentifierMappingException {
+       public SAMLNameIdentifier getNameIdentifierName(AuthNPrincipal principal, ServiceProvider sProv,
+                       IdentityProvider idProv) throws NameIdentifierMappingException {
                try {
                        if (principal == null) {
                                log.error("A principal must be supplied for Attribute Query Handle creation.");
@@ -265,10 +249,8 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
                        outStream.close();
 
                        try {
-                               return new SAMLNameIdentifier(
-                                       handle.replaceAll(System.getProperty("line.separator"), ""),
-                                       idProv.getProviderId(),
-                                       getNameIdentifierFormat().toString());
+                               return new SAMLNameIdentifier(handle.replaceAll(System.getProperty("line.separator"), ""), idProv
+                                               .getProviderId(), getNameIdentifierFormat().toString());
                        } catch (SAMLException e) {
                                throw new NameIdentifierMappingException("Unable to generate Attribute Query Handle: " + e);
                        }
@@ -278,10 +260,12 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
                        throw new NameIdentifierMappingException("Could not use the supplied secret key.");
                } catch (GeneralSecurityException e) {
                        log.error("Appropriate JCE provider not found in the java environment.  Could not load Cipher: " + e);
-                       throw new NameIdentifierMappingException("Appropriate JCE provider not found in the java environment.  Could not load Cipher.");
+                       throw new NameIdentifierMappingException(
+                                       "Appropriate JCE provider not found in the java environment.  Could not load Cipher.");
                } catch (IOException e) {
                        log.error("Could not serialize Principal for handle creation: " + e);
-                       throw new NameIdentifierMappingException("Could not serialize Principal for Attribute Query Handle creation.");
+                       throw new NameIdentifierMappingException(
+                                       "Could not serialize Principal for Attribute Query Handle creation.");
                }
        }
 
@@ -291,8 +275,7 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
 
                if (itemElements.getLength() < 1) {
                        log.error(itemName + " not specified.");
-                       throw new NameIdentifierMappingException(
-                               "Crypto Name Mapping requires a <" + itemName + "> specification.");
+                       throw new NameIdentifierMappingException("Crypto Name Mapping requires a <" + itemName + "> specification.");
                }
 
                if (itemElements.getLength() > 1) {
@@ -306,8 +289,7 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
                }
                if (item == null || item.equals("")) {
                        log.error(itemName + " not specified.");
-                       throw new NameIdentifierMappingException(
-                               "Crypto Name Mapping requires a <" + itemName + "> specification.");
+                       throw new NameIdentifierMappingException("Crypto Name Mapping requires a <" + itemName + "> specification.");
                }
                return item;
        }
@@ -351,32 +333,10 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
        }
 
        private boolean usingDefaultSecret() {
-               byte[] defaultKey =
-                       new byte[] {
-                               (byte) 0xC7,
-                               (byte) 0x49,
-                               (byte) 0x80,
-                               (byte) 0xD3,
-                               (byte) 0x02,
-                               (byte) 0x4A,
-                               (byte) 0x61,
-                               (byte) 0xEF,
-                               (byte) 0x25,
-                               (byte) 0x5D,
-                               (byte) 0xE3,
-                               (byte) 0x2F,
-                               (byte) 0x57,
-                               (byte) 0x51,
-                               (byte) 0x20,
-                               (byte) 0x15,
-                               (byte) 0xC7,
-                               (byte) 0x49,
-                               (byte) 0x80,
-                               (byte) 0xD3,
-                               (byte) 0x02,
-                               (byte) 0x4A,
-                               (byte) 0x61,
-                               (byte) 0xEF };
+               byte[] defaultKey = new byte[]{(byte) 0xC7, (byte) 0x49, (byte) 0x80, (byte) 0xD3, (byte) 0x02, (byte) 0x4A,
+                               (byte) 0x61, (byte) 0xEF, (byte) 0x25, (byte) 0x5D, (byte) 0xE3, (byte) 0x2F, (byte) 0x57, (byte) 0x51,
+                               (byte) 0x20, (byte) 0x15, (byte) 0xC7, (byte) 0x49, (byte) 0x80, (byte) 0xD3, (byte) 0x02, (byte) 0x4A,
+                               (byte) 0x61, (byte) 0xEF};
                byte[] encodedKey = secret.getEncoded();
                return Arrays.equals(defaultKey, encodedKey);
        }
@@ -384,14 +344,13 @@ public class CryptoShibHandle extends AQHNameIdentifierMapping implements HSName
 }
 
 /**
- * <code>HandleEntry</code> extension class that performs message
- * authentication.
- *  
+ * <code>HandleEntry</code> extension class that performs message authentication.
  */
+
 class HMACHandleEntry extends HandleEntry implements Serializable {
 
-       static final long serialVersionUID = 1L;
-       protected byte[] code;
+       static final long       serialVersionUID        = 1L;
+       protected byte[]        code;
 
        protected HMACHandleEntry(AuthNPrincipal principal, long TTL, Mac mac) {
                super(principal, TTL);
index 432543a..27f7b6e 100644 (file)
@@ -1,39 +1,29 @@
 /*
  * The Shibboleth License, Version 1. Copyright (c) 2002 University Corporation for Advanced Internet Development, Inc.
- * All rights reserved
- * 
- * 
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
- * following conditions are met:
- * 
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
- * disclaimer.
- * 
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided with the distribution, if any, must include the
- * following acknowledgment: "This product includes software developed by the University Corporation for Advanced
- * Internet Development <http://www.ucaid.edu> Internet2 Project. Alternately, this acknowledegement may appear in the
- * software itself, if and wherever such third-party acknowledgments normally appear.
- * 
- * Neither the name of Shibboleth nor the names of its contributors, nor Internet2, nor the University Corporation for
- * Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote products derived from this software
- * without specific prior written permission. For written permission, please contact shibboleth@shibboleth.org
- * 
- * Products derived from this software may not be called Shibboleth, Internet2, UCAID, or the University Corporation
- * for Advanced Internet Development, nor may Shibboleth appear in their name, without prior written permission of the
- * University Corporation for Advanced Internet Development.
- * 
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE,
- * ACCURACY, AND EFFORT IS WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * All rights reserved Redistribution and use in source and binary forms, with or without modification, are permitted
+ * provided that the following conditions are met: Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution, if any, must include the following acknowledgment: "This product includes
+ * software developed by the University Corporation for Advanced Internet Development <http://www.ucaid.edu> Internet2
+ * Project. Alternately, this acknowledegement may appear in the software itself, if and wherever such third-party
+ * acknowledgments normally appear. Neither the name of Shibboleth nor the names of its contributors, nor Internet2,
+ * nor the University Corporation for Advanced Internet Development, Inc., nor UCAID may be used to endorse or promote
+ * products derived from this software without specific prior written permission. For written permission, please
+ * contact shibboleth@shibboleth.org Products derived from this software may not be called Shibboleth, Internet2,
+ * UCAID, or the University Corporation for Advanced Internet Development, nor may Shibboleth appear in their name,
+ * without prior written permission of the University Corporation for Advanced Internet Development. THIS SOFTWARE IS
+ * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+ * NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS
+ * WITH LICENSEE. IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY CORPORATION FOR ADVANCED
+ * INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
+
 package edu.internet2.middleware.shibboleth.hs.provider;
 
 import java.util.HashMap;
@@ -64,18 +54,15 @@ import edu.internet2.middleware.shibboleth.hs.HSNameIdentifierMapping;
  */
 public class SharedMemoryShibHandle extends AQHNameIdentifierMapping implements HSNameIdentifierMapping {
 
-       protected HandleCache cache = HandleCache.instance();
-       private static Logger log = Logger.getLogger(SharedMemoryShibHandle.class.getName());
+       protected HandleCache   cache   = HandleCache.instance();
+       private static Logger   log             = Logger.getLogger(SharedMemoryShibHandle.class.getName());
 
        public SharedMemoryShibHandle(Element config) throws NameIdentifierMappingException {
                super(config);
        }
 
-       public SAMLNameIdentifier getNameIdentifierName(
-               AuthNPrincipal principal,
-               ServiceProvider sProv,
-               IdentityProvider idProv)
-               throws NameIdentifierMappingException {
+       public SAMLNameIdentifier getNameIdentifierName(AuthNPrincipal principal, ServiceProvider sProv,
+                       IdentityProvider idProv) throws NameIdentifierMappingException {
 
                if (principal == null) {
                        log.error("A principal must be supplied for Attribute Query Handle creation.");
@@ -97,12 +84,13 @@ public class SharedMemoryShibHandle extends AQHNameIdentifierMapping implements
        }
 
        public AuthNPrincipal getPrincipal(SAMLNameIdentifier nameId, ServiceProvider sProv, IdentityProvider idProv)
-               throws NameIdentifierMappingException, InvalidNameIdentifierException {
+                       throws NameIdentifierMappingException, InvalidNameIdentifierException {
 
                synchronized (cache.handleEntries) {
                        if (!cache.handleEntries.containsKey(nameId.getName())) {
                                log.debug("The Name Mapping Cache does not contain an entry for this Attribute Query Handle.");
-                               throw new NameIdentifierMappingException("The Name Mapping Cache does not contain an entry for this Attribute Query Handle.");
+                               throw new InvalidNameIdentifierException(
+                                               "The Name Mapping Cache does not contain an entry for this Attribute Query Handle.", errorCodes);
                        }
                }
 
@@ -116,13 +104,13 @@ public class SharedMemoryShibHandle extends AQHNameIdentifierMapping implements
                        synchronized (cache.handleEntries) {
                                cache.handleEntries.remove(nameId.getName());
                        }
-                       throw new InvalidNameIdentifierException("Attribute Query Handle is expired.");
+                       throw new InvalidNameIdentifierException("Attribute Query Handle is expired.", errorCodes);
                } else {
                        log.debug("Attribute Query Handle recognized.");
                        return handleEntry.principal;
                }
        }
-       
+
        public void destroy() {
                cache.destroy();
        }
@@ -131,13 +119,12 @@ public class SharedMemoryShibHandle extends AQHNameIdentifierMapping implements
 
 class HandleCache {
 
-       protected Map handleEntries = new HashMap();
-       private static HandleCache instance;
-       protected MemoryRepositoryCleaner cleaner = new MemoryRepositoryCleaner();
-       private static Logger log = Logger.getLogger(HandleCache.class.getName());
+       protected Map                                           handleEntries   = new HashMap();
+       private static HandleCache                      instance;
+       protected MemoryRepositoryCleaner       cleaner                 = new MemoryRepositoryCleaner();
+       private static Logger                           log                             = Logger.getLogger(HandleCache.class.getName());
 
-       protected HandleCache() {
-       }
+       protected HandleCache() {}
 
        public static synchronized HandleCache instance() {
                if (instance == null) {
@@ -151,7 +138,7 @@ class HandleCache {
                super.finalize();
                destroy();
        }
-       
+
        protected void destroy() {
                synchronized (cleaner) {
                        if (cleaner != null) {
@@ -163,11 +150,12 @@ class HandleCache {
 
        private class MemoryRepositoryCleaner extends Thread {
 
-               private boolean shutdown = false;
-               private Thread master;
+               private boolean shutdown        = false;
+               private Thread  master;
 
                public MemoryRepositoryCleaner() {
-                       super("edu.internet2.middleware.shibboleth.hs.provider.SharedMemoryShibHandle.HandleCache.MemoryRepositoryCleaner");
+                       super(
+                                       "edu.internet2.middleware.shibboleth.hs.provider.SharedMemoryShibHandle.HandleCache.MemoryRepositoryCleaner");
                        this.master = Thread.currentThread();
                        setDaemon(true);
                        if (getPriority() > Thread.MIN_PRIORITY) {