You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2010/09/09 14:29:39 UTC

svn commit: r995401 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/security/user/GroupImpl.java test/java/org/apache/jackrabbit/api/security/user/GroupTest.java

Author: mduerig
Date: Thu Sep  9 12:29:39 2010
New Revision: 995401

URL: http://svn.apache.org/viewvc?rev=995401&view=rev
Log:
JCR-2743: ClassCastException in GroupImpl.isCyclicMembership

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/GroupImpl.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/GroupTest.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/GroupImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/GroupImpl.java?rev=995401&r1=995400&r2=995401&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/GroupImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/GroupImpl.java Thu Sep  9 12:29:39 2010
@@ -16,28 +16,6 @@
  */
 package org.apache.jackrabbit.core.security.user;
 
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.security.Principal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-import javax.jcr.ItemNotFoundException;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.Value;
-
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.UserManager;
@@ -50,13 +28,34 @@ import org.apache.jackrabbit.commons.ite
 import org.apache.jackrabbit.core.NodeImpl;
 import org.apache.jackrabbit.core.PropertyImpl;
 import org.apache.jackrabbit.core.session.SessionContext;
-import org.apache.jackrabbit.core.session.SessionOperation;
 import org.apache.jackrabbit.core.session.SessionWriteOperation;
 import org.apache.jackrabbit.spi.commons.iterator.Iterators;
 import org.apache.jackrabbit.util.Text;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
 /**
  * GroupImpl...
  */
@@ -403,7 +402,7 @@ class GroupImpl extends AuthorizableImpl
                 Value[] members = node.getProperty(P_MEMBERS).getValues();
 
                 if (includeIndirect) {
-                    return includeIndirect(toAuthorizables(members, type));
+                    return includeIndirect(toAuthorizables(members, type), type);
                 }
                 else {
                     return toAuthorizables(members, type);
@@ -500,7 +499,7 @@ class GroupImpl extends AuthorizableImpl
             if (node.hasNode(N_MEMBERS)) {
                 PropertySequence members = getPropertySequence(node.getNode(N_MEMBERS), userManager);
                 if (includeIndirect) {
-                    return includeIndirect(toAuthorizables(members.iterator(), type));
+                    return includeIndirect(toAuthorizables(members.iterator(), type), type);
                 }
                 else {
                     return toAuthorizables(members.iterator(), type);
@@ -519,7 +518,7 @@ class GroupImpl extends AuthorizableImpl
      * Returns an iterator of authorizables which includes all indirect members of the given iterator
      * of authorizables.
      */
-    private Iterator<Authorizable> includeIndirect(final Iterator<Authorizable> authorizables) {
+    private Iterator<Authorizable> includeIndirect(final Iterator<Authorizable> authorizables, final int type) {
         Iterator<Iterator<Authorizable>> indirectMembers = new Iterator<Iterator<Authorizable>>() {
             public boolean hasNext() {
                 return authorizables.hasNext();
@@ -540,7 +539,7 @@ class GroupImpl extends AuthorizableImpl
             private Iterator<Authorizable> indirect(Authorizable authorizable) {
                 if (authorizable.isGroup()) {
                     try {
-                        return ((Group) authorizable).getMembers();
+                        return ((GroupImpl) authorizable).getMembers(true, type);
                     }
                     catch (RepositoryException e) {
                         log.warn("Could not determine members of " + authorizable, e);

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/GroupTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/GroupTest.java?rev=995401&r1=995400&r2=995401&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/GroupTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/api/security/user/GroupTest.java Thu Sep  9 12:29:39 2010
@@ -405,6 +405,29 @@ public class GroupTest extends AbstractU
         }
     }
 
+    public void testCyclicGroups() throws AuthorizableExistsException, RepositoryException, NotExecutableException {
+        Group group1 = null;
+        Group group2 = null;
+        Group group3 = null;
+        try {
+            group1 = userMgr.createGroup(getTestPrincipal());
+            group2 = userMgr.createGroup(getTestPrincipal());
+            group3 = userMgr.createGroup(getTestPrincipal());
+
+            group1.addMember(getTestUser(superuser));
+            group2.addMember(getTestUser(superuser));
+
+            assertTrue(group1.addMember(group2));
+            assertTrue(group2.addMember(group3));
+            assertFalse(group3.addMember(group1));
+        }
+        finally {
+            if (group1 != null) group1.remove();
+            if (group2 != null) group2.remove();
+            if (group3 != null) group3.remove();
+        }
+    }
+
     public void testRemoveMemberTwice() throws NotExecutableException, RepositoryException {
         User auth = getTestUser(superuser);
         Group newGroup = null;