[Yanel-commits] rev 53390 -
public/yanel/trunk/src/contributions/resources/security-api/src/java/org/wyona/yanel/impl/resources/securityapi
michi at wyona.com
michi at wyona.com
Tue Sep 21 15:30:08 CEST 2010
Author: michi
Date: 2010-09-21 15:30:08 +0200 (Tue, 21 Sep 2010)
New Revision: 53390
Modified:
public/yanel/trunk/src/contributions/resources/security-api/src/java/org/wyona/yanel/impl/resources/securityapi/UserManagerResource.java
Log:
phantom loop detection fixed
Modified: public/yanel/trunk/src/contributions/resources/security-api/src/java/org/wyona/yanel/impl/resources/securityapi/UserManagerResource.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/security-api/src/java/org/wyona/yanel/impl/resources/securityapi/UserManagerResource.java 2010-09-21 13:27:51 UTC (rev 53389)
+++ public/yanel/trunk/src/contributions/resources/security-api/src/java/org/wyona/yanel/impl/resources/securityapi/UserManagerResource.java 2010-09-21 13:30:08 UTC (rev 53390)
@@ -183,9 +183,12 @@
doResolveGroups = true;
}
- java.util.List resolvedGroups = new java.util.ArrayList(); // INFO: Save info in order to detect loops
+ // INFO: Also see org.wyona.security.impl.yarep.YarepUser#getGroups(boolean)
+ java.util.List resolvedGroups = new java.util.ArrayList(); // INFO: List of all resolved groups
+ java.util.List branchGroups = new java.util.ArrayList(); // INFO: Save info in order to detect loops
resolvedGroups.add(group.getID());
- sb.append(getGroupMembers(gm, group, doResolveGroups, resolvedGroups));
+ branchGroups.add(group.getID());
+ sb.append(getGroupMembers(gm, group, doResolveGroups, branchGroups, resolvedGroups));
Group[] parentGroups = group.getParents();
if (parentGroups != null && parentGroups.length > 0) {
@@ -487,8 +490,10 @@
/**
* Get group members as XML
+ * @param branchGroups List of groups within a branch in order to catch loops
+ * @param resolvedGroups List of all parents groups resolved
*/
- private String getGroupMembers(GroupManager gm, Group group, boolean doResolveGroups, java.util.List resolvedGroups) throws Exception {
+ private String getGroupMembers(GroupManager gm, Group group, boolean doResolveGroups, java.util.List branchGroups, java.util.List resolvedGroups) throws Exception {
Item[] members = group.getMembers();
StringBuilder sb = new StringBuilder();
sb.append("<members>");
@@ -499,14 +504,18 @@
sb.append("<user id=\"" + members[i].getID() + "\"/>");
} else if (members[i] instanceof Group) {
if (doResolveGroups) {
- if (alreadyResolved(members[i].getID(), resolvedGroups)) {
- log.error("Loop detected: " + resolvedGroups);
+ if (alreadyResolved(members[i].getID(), branchGroups)) {
+ log.error("Loop detected within members: " + branchGroups);
sb.append("<loop-detected group-id=\"" + members[i].getID() + "\"/>");
} else {
sb.append("<group id=\"" + members[i].getID() + "\">");
//log.warn("DEBUG: Resolve group: " + members[i].getID());
+ // TODO: Make sure that there are no redundencies, whereas since resolvedGroups is not used, it does not matter for the moment.
resolvedGroups.add(members[i].getID());
- sb.append(getGroupMembers(gm, gm.getGroup(members[i].getID()), doResolveGroups, resolvedGroups));
+
+ branchGroups.add(members[i].getID());
+ sb.append(getGroupMembers(gm, gm.getGroup(members[i].getID()), doResolveGroups, branchGroups, resolvedGroups));
+ branchGroups.remove(members[i].getID());
sb.append("</group>");
}
} else {
@@ -528,9 +537,9 @@
/**
* Check whether group has been resolved already
*/
- private boolean alreadyResolved(String groupId, java.util.List resolvedGroupIDs) {
- for (int i = 0; i < resolvedGroupIDs.size(); i++) {
- if (groupId.equals((String)resolvedGroupIDs.get(i))) {
+ private boolean alreadyResolved(String groupId, java.util.List branchGroupIDs) {
+ for (int i = 0; i < branchGroupIDs.size(); i++) {
+ if (groupId.equals((String)branchGroupIDs.get(i))) {
return true;
}
}
More information about the Yanel-commits
mailing list