From: markt Date: Mon, 8 Mar 2010 17:59:51 +0000 (+0000) Subject: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48629 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=9b88073e5deab1ea24f59ba525b6234581026aca;p=tomcat7.0 Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48629 Make nested role search work with username as well as DN Add roleNested to the docs Patch provided by Felix Schumacher git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@920422 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/realm/JNDIRealm.java b/java/org/apache/catalina/realm/JNDIRealm.java index d4f26af63..2fed70979 100644 --- a/java/org/apache/catalina/realm/JNDIRealm.java +++ b/java/org/apache/catalina/realm/JNDIRealm.java @@ -30,7 +30,9 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.Map.Entry; import javax.naming.Context; import javax.naming.CommunicationException; @@ -1683,12 +1685,12 @@ public class JNDIRealm extends RealmBase { // Directory Groups". It avoids group slurping and handles cyclic group memberships as well. // See http://middleware.internet2.edu/dir/ for details - Set newGroupDNs = new HashSet(groupMap.keySet()); - while (!newGroupDNs.isEmpty()) { - Set newThisRound = new HashSet(); // Stores the groups we find in this iteration + Map newGroups = new HashMap(groupMap); + while (!newGroups.isEmpty()) { + Map newThisRound = new HashMap(); // Stores the groups we find in this iteration - for (String groupDN : newGroupDNs) { - filter = roleFormat.format(new String[] { groupDN }); + for (Entry group : newGroups.entrySet()) { + filter = roleFormat.format(new String[] { group.getKey(), group.getValue() }); if (containerLog.isTraceEnabled()) { containerLog.trace("Perform a nested group search with base "+ roleBase + " and filter " + filter); @@ -1706,7 +1708,7 @@ public class JNDIRealm extends RealmBase { String name = getAttributeValue(roleName, attrs); if (name != null && dname != null && !groupMap.keySet().contains(dname)) { groupMap.put(dname, name); - newThisRound.add(dname); + newThisRound.put(dname, name); if (containerLog.isTraceEnabled()) { containerLog.trace(" Found nested role " + dname + " -> " + name); @@ -1720,7 +1722,7 @@ public class JNDIRealm extends RealmBase { } } - newGroupDNs = newThisRound; + newGroups = newThisRound; } } diff --git a/webapps/docs/realm-howto.xml b/webapps/docs/realm-howto.xml index 44e0999ae..710895ebb 100644 --- a/webapps/docs/realm-howto.xml +++ b/webapps/docs/realm-howto.xml @@ -651,6 +651,12 @@ find the names of roles associated with the authenticated user:

  • roleName - the attribute in a role entry containing the name of that role.
  • +
  • roleNested - enable nested roles. Set to + true if you want to nest roles in roles. If configured + every newly found roleName and distinguished + Name will be recursively tried for a new role search. + The default value is false.
  • +