SLING-9212 Distribution code checks for jcr:removeNode permissions on importer side for DELETE request
Incorporating review feedback.
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategy.java b/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategy.java
index 95d1266..97b4826 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategy.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategy.java
@@ -77,7 +77,7 @@
throws RepositoryException, DistributionException {
AccessControlManager acMgr = session.getAccessControlManager();
additionalJcrPrivilegesForAdd = additionalJcrPrivilegesForAdd != null ? additionalJcrPrivilegesForAdd : new String[] {Privilege.JCR_READ};
- Privilege[] privileges = computePrivileges(acMgr, additionalJcrPrivilegesForAdd);
+ Privilege[] privileges = computePrivileges(acMgr, additionalJcrPrivilegesForAdd, jcrPrivilege);
for (String path : paths) {
if (!acMgr.hasPrivileges(path, privileges)) {
throw new DistributionException("Not enough privileges");
@@ -90,7 +90,7 @@
throws RepositoryException, DistributionException {
AccessControlManager acMgr = session.getAccessControlManager();
additionalJcrPrivilegesForDelete = additionalJcrPrivilegesForDelete != null ? additionalJcrPrivilegesForDelete : new String[] {Privilege.JCR_REMOVE_NODE};
- Privilege[] privileges = computePrivileges(acMgr, additionalJcrPrivilegesForDelete);
+ Privilege[] privileges = computePrivileges(acMgr, additionalJcrPrivilegesForDelete, jcrPrivilege);
for (String path : paths) {
String closestParentPath = getClosestParent(session, path);
@@ -113,13 +113,13 @@
return null;
}
- private Privilege[] computePrivileges(AccessControlManager acMgr, String[] jcrPrivileges)
+ private static Privilege[] computePrivileges(AccessControlManager acMgr, String[] jcrPrivileges, String jcrPrivilege)
throws RepositoryException {
ArrayList<Privilege> privileges = new ArrayList<Privilege>();
+ privileges.add(acMgr.privilegeFromName(jcrPrivilege));
for (String privilege : jcrPrivileges) {
privileges.add(acMgr.privilegeFromName(privilege));
}
- privileges.add(acMgr.privilegeFromName(jcrPrivilege));
return privileges.toArray(new Privilege[0]);
}
diff --git a/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java b/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
index a2b5ba4..e19bc7b 100644
--- a/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
+++ b/src/main/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyFactory.java
@@ -62,23 +62,23 @@
/**
* privilege ADD request authorization strategy jcr privilege property
*/
- @Property(cardinality = 100, label = "Jcr Privilege Add", description = "Additional Jcr privileges to check for authorizing ADD distribution requests. The privilege is checked for the calling user session.")
- private static final String JCR_ADD_PRIVILEGE = "additionalJcrPrivilegesForAdd";
+ @Property(cardinality = 100, label = "Additional Jcr Privileges for Add", description = "Additional Jcr privileges to check for authorizing ADD distribution requests. The privilege is checked for the calling user session.")
+ private static final String JCR_ADD_PRIVILEGES = "additionalJcrPrivilegesForAdd";
/**
* privilege DELETE request authorization strategy jcr privilege property
*/
- @Property(cardinality = 100, label = "Jcr Privilege Delete", description = "Additional Jcr privileges to check for authorizing DELETE distribution requests. The privilege is checked for the calling user session.")
- private static final String JCR_DELETE_PRIVILEGE = "additionalJcrPrivilegesForDelete";
+ @Property(cardinality = 100, label = "Additional Jcr Privileges for Delete", description = "Additional Jcr privileges to check for authorizing DELETE distribution requests. The privilege is checked for the calling user session.")
+ private static final String JCR_DELETE_PRIVILEGES = "additionalJcrPrivilegesForDelete";
private DistributionRequestAuthorizationStrategy authorizationStrategy;
@Activate
public void activate(BundleContext context, Map<String, Object> config) {
String jcrPrivilege = PropertiesUtil.toString(config.get(JCR_PRIVILEGE), null);
- String[] jcrAddPrivilege = PropertiesUtil.toStringArray(config.get(JCR_ADD_PRIVILEGE), null);
- String[] jcrDeletePrivilege = PropertiesUtil.toStringArray(config.get(JCR_DELETE_PRIVILEGE), null);
- authorizationStrategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, jcrAddPrivilege, jcrDeletePrivilege);
+ String[] jcrAddPrivileges = PropertiesUtil.toStringArray(config.get(JCR_ADD_PRIVILEGES), null);
+ String[] jcrDeletePrivileges = PropertiesUtil.toStringArray(config.get(JCR_DELETE_PRIVILEGES), null);
+ authorizationStrategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, jcrAddPrivileges, jcrDeletePrivileges);
}
public void checkPermission(@NotNull ResourceResolver resourceResolver, @NotNull DistributionRequest distributionRequest) throws DistributionException {
diff --git a/src/test/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyTest.java b/src/test/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyTest.java
index 274052b..0335961 100644
--- a/src/test/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyTest.java
+++ b/src/test/java/org/apache/sling/distribution/agent/impl/PrivilegeDistributionRequestAuthorizationStrategyTest.java
@@ -36,13 +36,10 @@
*/
public class PrivilegeDistributionRequestAuthorizationStrategyTest {
- String jcrPrivilege = "foo";
- String[] additionalJcrPrivilegesForAdd;
- String[] additionalJcrPrivilegesForDelete;
-
@Test(expected = DistributionException.class)
public void testCheckPermissionWithoutSession() throws Exception {
- PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, additionalJcrPrivilegesForDelete);
+ String jcrPrivilege = "foo";
+ PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, null, null);
DistributionRequest distributionRequest = mock(DistributionRequest.class);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
strategy.checkPermission(resourceResolver, distributionRequest);
@@ -50,7 +47,8 @@
@Test
public void testCheckPermissionWithSession() throws Exception {
- PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, additionalJcrPrivilegesForDelete);
+ String jcrPrivilege = "foo";
+ PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, null, null);
DistributionRequest distributionRequest = mock(DistributionRequest.class);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -60,7 +58,8 @@
@Test(expected = DistributionException.class)
public void testNoPermissionOnAdd() throws Exception {
- PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, additionalJcrPrivilegesForDelete);
+ String jcrPrivilege = "somePermission";
+ PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, null, null);
DistributionRequest distributionRequest = mock(DistributionRequest.class);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -83,7 +82,8 @@
@Test
public void testPermissionOnAdd() throws Exception {
- PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, additionalJcrPrivilegesForDelete);
+ String jcrPrivilege = "somePermission";
+ PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, null, null);
DistributionRequest distributionRequest = mock(DistributionRequest.class);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -97,7 +97,7 @@
when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
String[] paths = new String[]{"/foo"};
for (String path : paths) {
- when(acm.hasPrivileges(path, new Privilege[]{jcrReadPrivilege, privilege})).thenReturn(true);
+ when(acm.hasPrivileges(path, new Privilege[]{privilege, jcrReadPrivilege})).thenReturn(true);
}
when(distributionRequest.getPaths()).thenReturn(paths);
@@ -107,8 +107,9 @@
@Test
public void testAdditionalPermissionsOnAdd() throws Exception {
- additionalJcrPrivilegesForAdd = new String[] {"addPermission"};
- PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, additionalJcrPrivilegesForDelete);
+ String jcrPrivilege = "somePermission";
+ String[] additionalJcrPrivilegesForAdd = new String[]{"addPermission"};
+ PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, null);
DistributionRequest distributionRequest = mock(DistributionRequest.class);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -116,15 +117,13 @@
Privilege privilege = mock(Privilege.class);
when(acm.privilegeFromName(jcrPrivilege)).thenReturn(privilege);
Privilege additionalPrivilegeForAdd = mock(Privilege.class);
- for (String privilegeAdd : additionalJcrPrivilegesForAdd) {
- when(acm.privilegeFromName(privilegeAdd)).thenReturn(additionalPrivilegeForAdd);
- }
+ when(acm.privilegeFromName(additionalJcrPrivilegesForAdd[0])).thenReturn(additionalPrivilegeForAdd);
when(session.getAccessControlManager()).thenReturn(acm);
when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
String[] paths = new String[]{"/foo"};
for (String path : paths) {
- when(acm.hasPrivileges(path, new Privilege[]{additionalPrivilegeForAdd, privilege})).thenReturn(true);
+ when(acm.hasPrivileges(path, new Privilege[]{privilege, additionalPrivilegeForAdd})).thenReturn(true);
}
when(distributionRequest.getPaths()).thenReturn(paths);
@@ -134,7 +133,8 @@
@Test(expected = DistributionException.class)
public void testNoPermissionOnDelete() throws Exception {
- PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, additionalJcrPrivilegesForDelete);
+ String jcrPrivilege = "somePermission";
+ PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, null, null);
DistributionRequest distributionRequest = mock(DistributionRequest.class);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -158,7 +158,8 @@
@Test
public void testPermissionOnDelete() throws Exception {
- PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, additionalJcrPrivilegesForDelete);
+ String jcrPrivilege = "somePermission";
+ PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, null, null);
DistributionRequest distributionRequest = mock(DistributionRequest.class);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -172,7 +173,7 @@
when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
String[] paths = new String[]{"/foo"};
for (String path : paths) {
- when(acm.hasPrivileges(path, new Privilege[]{jcrDeletePrivilege, privilege})).thenReturn(true);
+ when(acm.hasPrivileges(path, new Privilege[]{privilege, jcrDeletePrivilege})).thenReturn(true);
when(session.nodeExists(path)).thenReturn(true);
}
when(distributionRequest.getPaths()).thenReturn(paths);
@@ -183,8 +184,9 @@
@Test
public void testAdditionalPermissionsOnDelete() throws Exception {
- additionalJcrPrivilegesForDelete = new String[] {"deletePermission"};
- PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, additionalJcrPrivilegesForAdd, additionalJcrPrivilegesForDelete);
+ String jcrPrivilege = "somePermission";
+ String[] additionalJcrPrivilegesForDelete = new String[]{"deletePermission"};
+ PrivilegeDistributionRequestAuthorizationStrategy strategy = new PrivilegeDistributionRequestAuthorizationStrategy(jcrPrivilege, null, additionalJcrPrivilegesForDelete);
DistributionRequest distributionRequest = mock(DistributionRequest.class);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
Session session = mock(Session.class);
@@ -192,15 +194,13 @@
Privilege privilege = mock(Privilege.class);
when(acm.privilegeFromName(jcrPrivilege)).thenReturn(privilege);
Privilege additionalPrivilegeForDelete = mock(Privilege.class);
- for (String privilegeDelete : additionalJcrPrivilegesForDelete) {
- when(acm.privilegeFromName(privilegeDelete)).thenReturn(additionalPrivilegeForDelete);
- }
+ when(acm.privilegeFromName(additionalJcrPrivilegesForDelete[0])).thenReturn(additionalPrivilegeForDelete);
when(session.getAccessControlManager()).thenReturn(acm);
when(resourceResolver.adaptTo(Session.class)).thenReturn(session);
String[] paths = new String[]{"/foo"};
for (String path : paths) {
- when(acm.hasPrivileges(path, new Privilege[]{additionalPrivilegeForDelete, privilege})).thenReturn(true);
+ when(acm.hasPrivileges(path, new Privilege[]{privilege, additionalPrivilegeForDelete})).thenReturn(true);
when(session.nodeExists(path)).thenReturn(true);
}
when(distributionRequest.getPaths()).thenReturn(paths);