For Sun's JNDI ldap provider, add the dn of returned entries to the attribute set...
authorwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Fri, 19 Nov 2004 16:53:34 +0000 (16:53 +0000)
committerwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Fri, 19 Nov 2004 16:53:34 +0000 (16:53 +0000)
git-svn-id: https://subversion.switch.ch/svn/shibboleth/java-idp/trunk@1194 ab3bd59b-922f-494d-bb5f-6f0a3c29deca

src/edu/internet2/middleware/shibboleth/aa/attrresolv/provider/JNDIDirectoryDataConnector.java

index 85004b7..a290d25 100644 (file)
@@ -1,50 +1,26 @@
-/* 
- * 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.aa.attrresolv.provider;
@@ -53,9 +29,11 @@ import java.security.Principal;
 import java.util.Properties;
 
 import javax.naming.CommunicationException;
+import javax.naming.Context;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttribute;
 import javax.naming.directory.InitialDirContext;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
@@ -70,11 +48,10 @@ import edu.internet2.middleware.shibboleth.aa.attrresolv.Dependencies;
 import edu.internet2.middleware.shibboleth.aa.attrresolv.ResolutionPlugInException;
 
 /**
- * <code>DataConnectorPlugIn</code> implementation that utilizes a user-specified JNDI 
- * <code>DirContext</code> to retrieve attribute data.
+ * <code>DataConnectorPlugIn</code> implementation that utilizes a user-specified JNDI <code>DirContext</code> to
+ * retrieve attribute data.
  * 
  * @author Walter Hoehn (wassa@columbia.edu)
- *
  */
 public class JNDIDirectoryDataConnector extends BaseDataConnector implements DataConnectorPlugIn {
 
@@ -82,20 +59,20 @@ public class JNDIDirectoryDataConnector extends BaseDataConnector implements Dat
        protected String searchFilter;
        protected Properties properties;
        protected SearchControls controls;
-    protected String failover = null;
-
-    /**
-     * Constructs a DataConnector based on DOM configuration.
-     * 
-     * @param e a &lt;JNDIDirectoryDataConnector /&gt; DOM Element as specified by 
-     * urn:mace:shibboleth:resolver:1.0
-     * 
-     * @throws ResolutionPlugInException if the PlugIn cannot be initialized
-     */
+       protected String failover = null;
+
+       /**
+        * Constructs a DataConnector based on DOM configuration.
+        * 
+        * @param e
+        *            a &lt;JNDIDirectoryDataConnector /&gt; DOM Element as specified by urn:mace:shibboleth:resolver:1.0
+        * @throws ResolutionPlugInException
+        *             if the PlugIn cannot be initialized
+        */
        public JNDIDirectoryDataConnector(Element e) throws ResolutionPlugInException {
 
                super(e);
-        
+
                NodeList searchNodes = e.getElementsByTagNameNS(AttributeResolver.resolverNamespace, "Search");
                if (searchNodes.getLength() != 1) {
                        log.error("JNDI Directory Data Connector requires a \"Search\" specification.");
@@ -134,12 +111,12 @@ public class JNDIDirectoryDataConnector extends BaseDataConnector implements Dat
                        }
                }
 
-        //Fail-fast connection test
+               //Fail-fast connection test
                InitialDirContext context = null;
                try {
                        context = new InitialDirContext(properties);
                        log.debug("JNDI Directory context activated.");
-                       
+
                } catch (NamingException e1) {
                        log.error("Failed to startup directory context: " + e1);
                        throw new ResolutionPlugInException("Failed to startup directory context.");
@@ -155,11 +132,12 @@ public class JNDIDirectoryDataConnector extends BaseDataConnector implements Dat
                }
        }
 
-    /**
-     * Create JNDI search controls based on DOM configuration
-     * @param searchNode a &lt;Controls /&gt; DOM Element as specified by 
-     * urn:mace:shibboleth:resolver:1.0
-     */
+       /**
+        * Create JNDI search controls based on DOM configuration
+        * 
+        * @param searchNode
+        *            a &lt;Controls /&gt; DOM Element as specified by urn:mace:shibboleth:resolver:1.0
+        */
        protected void defineSearchControls(Element searchNode) {
 
                controls = new SearchControls();
@@ -233,7 +211,7 @@ public class JNDIDirectoryDataConnector extends BaseDataConnector implements Dat
         * @see edu.internet2.middleware.shibboleth.aa.attrresolv.DataConnectorPlugIn#resolve(java.security.Principal)
         */
        public Attributes resolve(Principal principal, String requester, Dependencies depends)
-               throws ResolutionPlugInException {
+                       throws ResolutionPlugInException {
 
                InitialDirContext context = null;
                try {
@@ -241,13 +219,15 @@ public class JNDIDirectoryDataConnector extends BaseDataConnector implements Dat
                        NamingEnumeration nEnumeration = null;
 
                        try {
-                               nEnumeration = context.search("", searchFilter.replaceAll("%PRINCIPAL%", principal.getName()), controls);
+                               nEnumeration = context
+                                               .search("", searchFilter.replaceAll("%PRINCIPAL%", principal.getName()), controls);
                        } catch (CommunicationException e) {
                                log.debug(e);
-                               log.warn(
-                                       "Encountered a connection problem while querying for attributes.  Re-initializing JNDI context and retrying...");
+                               log
+                                               .warn("Encountered a connection problem while querying for attributes.  Re-initializing JNDI context and retrying...");
                                context = new InitialDirContext(context.getEnvironment());
-                               nEnumeration = context.search("", searchFilter.replaceAll("%PRINCIPAL%", principal.getName()), controls);
+                               nEnumeration = context
+                                               .search("", searchFilter.replaceAll("%PRINCIPAL%", principal.getName()), controls);
                        }
 
                        if (nEnumeration == null || !nEnumeration.hasMore()) {
@@ -263,13 +243,18 @@ public class JNDIDirectoryDataConnector extends BaseDataConnector implements Dat
                                throw new ResolutionPlugInException("Cannot disambiguate data for this principal.");
                        }
 
+                       //For Sun's ldap provider only, construct the dn of the returned entry and manually add that as an
+                       // attribute
+                       if (context.getEnvironment().get(Context.INITIAL_CONTEXT_FACTORY)
+                                       .equals("com.sun.jndi.ldap.LdapCtxFactory")) {
+                               BasicAttribute dn = new BasicAttribute("dn", result.getName() + "," + context.getNameInNamespace());
+                               attributes.put(dn);
+                       }
+
                        return attributes;
 
                } catch (NamingException e) {
-                       log.error(
-                               "An error occurred while retieving data for principal ("
-                                       + principal.getName()
-                                       + ") :"
+                       log.error("An error occurred while retieving data for principal (" + principal.getName() + ") :"
                                        + e.getMessage());
                        throw new ResolutionPlugInException("Error retrieving data for principal.");
                } finally {
@@ -282,4 +267,4 @@ public class JNDIDirectoryDataConnector extends BaseDataConnector implements Dat
                        }
                }
        }
-}
+}
\ No newline at end of file