[Yanel-commits] rev 49638 - public/yanel/trunk/src/contributions/resources/security-api/src/java/org/wyona/yanel/impl/resources/securityapi

michi at wyona.com michi at wyona.com
Sun May 16 23:40:31 CEST 2010


Author: michi
Date: 2010-05-16 23:40:31 +0200 (Sun, 16 May 2010)
New Revision: 49638

Modified:
   public/yanel/trunk/src/contributions/resources/security-api/src/java/org/wyona/yanel/impl/resources/securityapi/UserManagerResource.java
Log:
loop detection implemented

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-05-16 21:11:53 UTC (rev 49637)
+++ public/yanel/trunk/src/contributions/resources/security-api/src/java/org/wyona/yanel/impl/resources/securityapi/UserManagerResource.java	2010-05-16 21:40:31 UTC (rev 49638)
@@ -146,13 +146,15 @@
         StringBuilder sb = new StringBuilder("<group xmlns=\"http://www.wyona.org/security/1.0\" id=\"" + id + "\">");
 
         String paraResolveGroups = getEnvironment().getRequest().getParameter("resolve-groups");
-        boolean resolveGroups = false;
+        boolean doResolveGroups = false;
         if (paraResolveGroups != null && paraResolveGroups.equals("true")) {
             log.warn("DEBUG: Resolve groups!");
-            resolveGroups = true;
+            doResolveGroups = true;
         }
 
-        sb.append(getGroupMembers(group, resolveGroups));
+        java.util.List resolvedGroups = new java.util.ArrayList(); // INFO: Save info in order to detect loops
+        resolvedGroups.add(group.getID());
+        sb.append(getGroupMembers(gm, group, doResolveGroups, resolvedGroups));
 
         Group[] parentGroups = group.getParents();
         if (parentGroups != null && parentGroups.length > 0) {
@@ -412,20 +414,27 @@
     /**
      * Get group members as XML
      */
-    private String getGroupMembers(Group group, boolean resolveGroups) throws Exception {
+    private String getGroupMembers(GroupManager gm, Group group, boolean doResolveGroups, java.util.List resolvedGroups) throws Exception {
         Item[] members = group.getMembers();
         StringBuilder sb = new StringBuilder();
         sb.append("<members>");
         // INFO: See policymanager/src/java/org/wyona/yanel/impl/resources/policymanager/PolicyManagerResource.java#resolveGroup(), also re Loops!
         for (int i = 0; i < members.length; i++) {
-            log.warn("DEBUG: Member: " + members[i].getID());
+            //log.warn("DEBUG: Member: " + members[i].getID());
             if (members[i] instanceof User) {
                 sb.append("<user id=\"" + members[i].getID() + "\"/>");
             } else if (members[i] instanceof Group) {
-                if (resolveGroups) {
-                    sb.append("<group id=\"" + members[i].getID() + "\">");
-                    log.warn("DEBUG: Resolve group: " + members[i].getID());
-                    sb.append("</group>");
+                if (doResolveGroups) {
+                    if (alreadyResolved(members[i].getID(), resolvedGroups)) {
+                        log.error("Loop detected: " + resolvedGroups);
+                        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());
+                        resolvedGroups.add(members[i].getID());
+                        sb.append(getGroupMembers(gm, gm.getGroup(members[i].getID()), doResolveGroups, resolvedGroups));
+                        sb.append("</group>");
+                    }
                 } else {
                     sb.append("<group id=\"" + members[i].getID() + "\"/>");
                 }
@@ -441,4 +450,16 @@
         sb.append("</members>");
         return sb.toString();
     }
+
+    /**
+     * 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))) {
+                 return true;
+             }
+         }
+         return false;
+     }
 }



More information about the Yanel-commits mailing list