Author: angela
Date: Tue Feb 17 14:01:34 2015
New Revision: 1660382
URL: http://svn.apache.org/r1660382
Log:
OAK-2225 : MultipleMoveTest doesn't restore ACEs properly causing later tests
to fail
NA : Additional user management related test
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/MultipleMoveTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java?rev=1660382&r1=1660381&r2=1660382&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
Tue Feb 17 14:01:34 2015
@@ -18,10 +18,10 @@ package org.apache.jackrabbit.oak.jcr.se
import java.security.Principal;
import java.util.Collections;
-import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.jcr.Credentials;
@@ -35,8 +35,10 @@ import javax.jcr.Value;
import javax.jcr.security.AccessControlEntry;
import javax.jcr.security.AccessControlList;
import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.AccessControlPolicy;
import javax.jcr.security.Privilege;
+import com.google.common.collect.Maps;
import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
import org.apache.jackrabbit.api.security.user.Group;
@@ -48,7 +50,6 @@ import org.apache.jackrabbit.test.api.se
import org.junit.After;
import org.junit.Before;
-import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import static org.junit.Assert.assertArrayEquals;
@@ -81,7 +82,7 @@ public abstract class AbstractEvaluation
protected Session testSession;
protected AccessControlManager testAcMgr;
- private List<ACL> toRestore = Lists.newArrayList();
+ private Map<String, ACL> toRestore = Maps.newHashMap();
@Override
@Before
@@ -141,10 +142,8 @@ public abstract class AbstractEvaluation
}
superuser.refresh(false);
// restore in reverse order
- for (ACL acl : Lists.reverse(toRestore)) {
- if (acl.path == null || superuser.nodeExists(acl.path)) {
- restoreAces(acl);
- }
+ for (String path : toRestore.keySet()) {
+ toRestore.get(path).restore();
}
toRestore.clear();
if (testGroup != null) {
@@ -225,11 +224,18 @@ public abstract class AbstractEvaluation
}
protected JackrabbitAccessControlList modify(String path, Principal
principal, Privilege[] privileges, boolean isAllow, Map<String, Value>
restrictions) throws Exception {
+ return modify(path, principal, privileges, isAllow, restrictions,
Collections.<String, Value[]>emptyMap());
+ }
+
+ protected JackrabbitAccessControlList modify(String path, Principal
principal,
+ Privilege[] privileges,
boolean isAllow,
+ Map<String, Value>
restrictions,
+ Map<String, Value[]>
mvRestrictions) throws Exception {
// remember for restore during tearDown
- toRestore.add(getACL(path));
+ rememberForRestore(path);
JackrabbitAccessControlList tmpl =
AccessControlUtils.getAccessControlList(acMgr, path);
- tmpl.addEntry(principal, privileges, isAllow, restrictions);
+ tmpl.addEntry(principal, privileges, isAllow, restrictions,
mvRestrictions);
acMgr.setPolicy(tmpl.getPath(), tmpl);
superuser.save();
@@ -272,35 +278,56 @@ public abstract class AbstractEvaluation
return modify(nPath, principal, privileges, false, EMPTY_RESTRICTIONS);
}
- private ACL getACL(String path) throws RepositoryException {
- return new ACL(path,
AccessControlUtils.getAccessControlList(superuser, path));
- }
-
- private void restoreAces(ACL restore) throws RepositoryException {
- AccessControlList acl =
AccessControlUtils.getAccessControlList(superuser, path);
- if (acl != null) {
- for (AccessControlEntry ace : acl.getAccessControlEntries()) {
- acl.removeAccessControlEntry(ace);
- }
- for (AccessControlEntry ace : restore.entries) {
- acl.addAccessControlEntry(ace.getPrincipal(),
ace.getPrivileges());
- }
- acMgr.setPolicy(path, acl);
- superuser.save();
+ private void rememberForRestore(@Nullable String path) throws
RepositoryException {
+ if (!toRestore.containsKey(path)) {
+ toRestore.put(path, new ACL(path));
}
}
- private static final class ACL {
+ private final class ACL {
private final String path;
+ private final boolean remove;
private final Set<AccessControlEntry> entries = Sets.newHashSet();
- ACL(String path, AccessControlList list)
- throws RepositoryException {
+ private ACL(String path) throws RepositoryException {
this.path = path;
+
+ AccessControlList list = getList(path);
+ remove = (list == null);
if (list != null) {
Collections.addAll(entries, list.getAccessControlEntries());
}
}
+
+ private void restore() throws RepositoryException {
+ AccessControlList list = getList(path);
+ if (list != null) {
+ if (remove) {
+ acMgr.removePolicy(path, list);
+ } else {
+ for (AccessControlEntry ace :
list.getAccessControlEntries()) {
+ list.removeAccessControlEntry(ace);
+ }
+ for (AccessControlEntry ace : entries) {
+ list.addAccessControlEntry(ace.getPrincipal(),
ace.getPrivileges());
+ }
+ acMgr.setPolicy(path, list);
+ }
+ }
+ superuser.save();
+ }
+
+ @CheckForNull
+ private AccessControlList getList(@Nullable String path) throws
RepositoryException {
+ if (path == null || superuser.nodeExists(path)) {
+ for (AccessControlPolicy policy : acMgr.getPolicies(path)) {
+ if (policy instanceof AccessControlList) {
+ return (AccessControlList) policy;
+ }
+ }
+ }
+ return null;
+ }
}
}
\ No newline at end of file
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/MultipleMoveTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/MultipleMoveTest.java?rev=1660382&r1=1660381&r2=1660382&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/MultipleMoveTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/MultipleMoveTest.java
Tue Feb 17 14:01:34 2015
@@ -23,6 +23,7 @@ import javax.jcr.Session;
import javax.jcr.security.Privilege;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
/**
@@ -82,22 +83,21 @@ public class MultipleMoveTest extends Ab
}
}
-// FIXME OAK-2225 AbstractEvaluationTest doesn't restore ACEs properly causing
later tests to fail
-// @Test
-// public void testMoveSubTreeBack2() throws Exception {
-// allow(testRootNode.getPath(), privilegesFromNames(new String[]{
-// Privilege.JCR_REMOVE_NODE,
-// Privilege.JCR_REMOVE_CHILD_NODES,
-// Privilege.JCR_ADD_CHILD_NODES,
-// Privilege.JCR_NODE_TYPE_MANAGEMENT
-// }));
-//
-// first move must succeed
-// move(childNPath, siblingDestPath);
-// moving child back must fail due to missing privileges
-// move(siblingDestPath + '/' + nodeName3, path + "/subtreeBack");
-// testSession.save();
-// }
+ @Test
+ public void testMoveSubTreeBack2() throws Exception {
+ allow(testRootNode.getPath(), privilegesFromNames(new String[]{
+ Privilege.JCR_REMOVE_NODE,
+ Privilege.JCR_REMOVE_CHILD_NODES,
+ Privilege.JCR_ADD_CHILD_NODES,
+ Privilege.JCR_NODE_TYPE_MANAGEMENT
+ }));
+
+ //first move must succeed
+ move(childNPath, siblingDestPath);
+ //moving child back must fail due to missing privileges
+ move(siblingDestPath + '/' + nodeName3, path + "/subtreeBack");
+ testSession.save();
+ }
@Test
public void testMoveSubTreeBack3() throws Exception {
@@ -115,23 +115,22 @@ public class MultipleMoveTest extends Ab
}
}
-// FIXME OAK-2225 AbstractEvaluationTest doesn't restore ACEs properly causing
later tests to fail
-// @Ignore("Known Limitation of OAK-710")
-// @Test
-// public void testMoveSubTreeBack4() throws Exception {
-// allow(testRootNode.getPath(), privilegesFromNames(new String[]{
-// Privilege.JCR_REMOVE_NODE,
-// Privilege.JCR_REMOVE_CHILD_NODES,
-// Privilege.JCR_ADD_CHILD_NODES,
-// Privilege.JCR_NODE_TYPE_MANAGEMENT
-// }));
-//
-// first move must succeed
-// move(childNPath, siblingDestPath);
-// moving child back must fail due to missing privileges
-// move(siblingDestPath + '/' + nodeName3, childNPath);
-// testSession.save();
-// }
+ @Ignore("Known Limitation of OAK-710")
+ @Test
+ public void testMoveSubTreeBack4() throws Exception {
+ allow(testRootNode.getPath(), privilegesFromNames(new String[]{
+ Privilege.JCR_REMOVE_NODE,
+ Privilege.JCR_REMOVE_CHILD_NODES,
+ Privilege.JCR_ADD_CHILD_NODES,
+ Privilege.JCR_NODE_TYPE_MANAGEMENT
+ }));
+
+ //first move must succeed
+ move(childNPath, siblingDestPath);
+ //moving child back must fail due to missing privileges
+ move(siblingDestPath + '/' + nodeName3, childNPath);
+ testSession.save();
+ }
@Test
public void testMoveDestParent() throws Exception {
@@ -149,23 +148,22 @@ public class MultipleMoveTest extends Ab
}
}
-// FIXME OAK-2225 AbstractEvaluationTest doesn't restore ACEs properly causing
later tests to fail
-// @Ignore("Known Limitation of OAK-710")
-// @Test
-// public void testMoveDestParent2() throws Exception {
-// allow(testRootNode.getPath(), privilegesFromNames(new String[]{
-// Privilege.JCR_REMOVE_NODE,
-// Privilege.JCR_REMOVE_CHILD_NODES,
-// Privilege.JCR_ADD_CHILD_NODES,
-// Privilege.JCR_NODE_TYPE_MANAGEMENT
-// }));
-//
-// first move must succeed
-// move(childNPath, siblingDestPath);
-// moving dest parent to original source location
-// move(siblingPath, path + "/parentMove");
-// testSession.save();
-// }
+ @Ignore("Known Limitation of OAK-710")
+ @Test
+ public void testMoveDestParent2() throws Exception {
+ allow(testRootNode.getPath(), privilegesFromNames(new String[]{
+ Privilege.JCR_REMOVE_NODE,
+ Privilege.JCR_REMOVE_CHILD_NODES,
+ Privilege.JCR_ADD_CHILD_NODES,
+ Privilege.JCR_NODE_TYPE_MANAGEMENT
+ }));
+
+ //first move must succeed
+ move(childNPath, siblingDestPath);
+ //moving dest parent to original source location
+ move(siblingPath, path + "/parentMove");
+ testSession.save();
+ }
@Test
public void testMoveDestParent3() throws Exception {
@@ -183,21 +181,20 @@ public class MultipleMoveTest extends Ab
}
}
-// FIXME OAK-2225 AbstractEvaluationTest doesn't restore ACEs properly causing
later tests to fail
-// @Ignore("Known Limitation of OAK-710")
-// @Test
-// public void testMoveDestParent4() throws Exception {
-// allow(testRootNode.getPath(), privilegesFromNames(new String[]{
-// Privilege.JCR_REMOVE_NODE,
-// Privilege.JCR_REMOVE_CHILD_NODES,
-// Privilege.JCR_ADD_CHILD_NODES,
-// Privilege.JCR_NODE_TYPE_MANAGEMENT
-// }));
-//
-// first move must succeed
-// move(childNPath, siblingDestPath);
-// moving dest parent to original source location
-// move(siblingPath, childNPath);
-// testSession.save();
-// }
+ @Ignore("Known Limitation of OAK-710")
+ @Test
+ public void testMoveDestParent4() throws Exception {
+ allow(testRootNode.getPath(), privilegesFromNames(new String[]{
+ Privilege.JCR_REMOVE_NODE,
+ Privilege.JCR_REMOVE_CHILD_NODES,
+ Privilege.JCR_ADD_CHILD_NODES,
+ Privilege.JCR_NODE_TYPE_MANAGEMENT
+ }));
+
+ //first move must succeed
+ move(childNPath, siblingDestPath);
+ //moving dest parent to original source location
+ move(siblingPath, childNPath);
+ testSession.save();
+ }
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java?rev=1660382&r1=1660381&r2=1660382&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
Tue Feb 17 14:01:34 2015
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.oak.jcr.security.authorization;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -23,6 +24,9 @@ import java.util.Set;
import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
+import javax.jcr.PropertyType;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
import javax.jcr.query.Query;
import javax.jcr.security.Privilege;
@@ -34,6 +38,7 @@ import org.apache.jackrabbit.api.securit
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.commons.JcrUtils;
import
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
@@ -456,4 +461,29 @@ public class UserManagementTest extends
}
assertTrue("Result mismatch", ids.isEmpty());
}
+
+ @Test
+ public void testGlobRestriction() throws Exception {
+ String groupHome =
Text.getRelativeParent(UserConstants.DEFAULT_GROUP_PATH, 1);
+ Privilege[] privs =
privilegesFromName(PrivilegeConstants.REP_USER_MANAGEMENT);
+ allow(groupHome, privs);
+ deny(groupHome, privs, createGlobRestriction("*/" +
UserConstants.REP_MEMBERS));
+
+ UserManager testUserMgr = getUserManager(testSession);
+
+ // creating a new group must be allow
+ Group gr = testUserMgr.createGroup(groupId);
+ testSession.save();
+
+ // modifying group membership must be denied
+ try {
+ gr.addMember(testUserMgr.getAuthorizable(testSession.getUserID()));
+ testSession.save();
+ fail();
+ } catch (AccessDeniedException e) {
+ // success
+ } finally {
+ testSession.refresh(false);
+ }
+ }
}
\ No newline at end of file