Skip to content

Commit 410a7cf

Browse files
authored
Merge pull request #394 from wttech/391-clean-command-doesnt-purge-permissions
Clean command doesn't purge permissions #391
2 parents fa18be7 + 51235fa commit 410a7cf

File tree

1 file changed

+46
-22
lines changed
  • app/aem/actions.main/src/main/java/com/cognifide/apm/main/actions/clearpermissions

1 file changed

+46
-22
lines changed

app/aem/actions.main/src/main/java/com/cognifide/apm/main/actions/clearpermissions/Purge.java

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,23 @@
2727
import com.cognifide.apm.api.status.Status;
2828
import com.cognifide.apm.main.utils.MessagingUtils;
2929
import com.cognifide.apm.main.utils.PathUtils;
30+
import java.util.HashSet;
31+
import java.util.List;
32+
import java.util.Set;
3033
import javax.jcr.Node;
3134
import javax.jcr.NodeIterator;
3235
import javax.jcr.RepositoryException;
36+
import javax.jcr.security.AccessControlPolicy;
3337
import org.apache.commons.lang3.StringUtils;
3438
import org.apache.jackrabbit.api.JackrabbitSession;
39+
import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry;
40+
import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
3541
import org.apache.jackrabbit.api.security.user.Authorizable;
42+
import org.apache.jackrabbit.oak.api.Type;
43+
import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.ACE;
44+
import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AbstractAccessControlList;
3645
import org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionConstants;
46+
import org.apache.jackrabbit.oak.spi.security.authorization.restriction.Restriction;
3747
import org.slf4j.Logger;
3848
import org.slf4j.LoggerFactory;
3949

@@ -45,7 +55,7 @@ public class Purge implements Action {
4555

4656
private final String path;
4757

48-
public Purge(final String path) {
58+
public Purge(String path) {
4959
this.path = path;
5060
}
5161

@@ -55,19 +65,19 @@ public ActionResult simulate(Context context) {
5565
}
5666

5767
@Override
58-
public ActionResult execute(final Context context) {
68+
public ActionResult execute(Context context) {
5969
return process(context, true);
6070
}
6171

62-
private ActionResult process(final Context context, boolean execute) {
72+
private ActionResult process(Context context, boolean execute) {
6373
ActionResult actionResult = context.createActionResult();
6474
try {
6575
Authorizable authorizable = context.getCurrentAuthorizable();
6676
actionResult.setAuthorizable(authorizable.getID());
6777
if (context.isCompositeNodeStore() && PathUtils.isAppsOrLibsPath(path)) {
6878
actionResult.changeStatus(Status.SKIPPED, "Skipped purging privileges for " + authorizable.getID() + " on " + path);
6979
} else {
70-
LOGGER.info(String.format("Purging privileges for authorizable with id = %s under path = %s",
80+
LOGGER.info(String.format("Purging privileges for authorizable with id=%s under path=%s",
7181
authorizable.getID(), path));
7282
if (execute) {
7383
purge(context, actionResult);
@@ -81,23 +91,18 @@ private ActionResult process(final Context context, boolean execute) {
8191
return actionResult;
8292
}
8393

84-
private void purge(final Context context, final ActionResult actionResult)
94+
private void purge(Context context, ActionResult actionResult)
8595
throws RepositoryException, ActionExecutionException {
86-
NodeIterator iterator = getPermissions(context);
96+
Set<String> accessControlledPaths = getAccessControlledPaths(context);
8797
String normalizedPath = normalizePath(path);
88-
while (iterator != null && iterator.hasNext()) {
89-
Node node = iterator.nextNode();
90-
if (node.hasProperty(PermissionConstants.REP_ACCESS_CONTROLLED_PATH)) {
91-
String parentPath = node.getProperty(PermissionConstants.REP_ACCESS_CONTROLLED_PATH)
92-
.getString();
93-
String normalizedParentPath = normalizePath(parentPath);
94-
boolean isUsersPermission = parentPath.startsWith(context.getCurrentAuthorizable().getPath());
95-
if (StringUtils.startsWith(normalizedParentPath, normalizedPath) && !isUsersPermission) {
96-
RemoveAll removeAll = new RemoveAll(parentPath);
97-
ActionResult removeAllResult = removeAll.execute(context);
98-
if (Status.ERROR.equals(removeAllResult.getStatus())) {
99-
copyErrorMessages(removeAllResult, actionResult);
100-
}
98+
for (String parentPath : accessControlledPaths) {
99+
String normalizedParentPath = normalizePath(parentPath);
100+
boolean isUsersPermission = parentPath.startsWith(context.getCurrentAuthorizable().getPath());
101+
if (StringUtils.startsWith(normalizedParentPath, normalizedPath) && !isUsersPermission) {
102+
RemoveAll removeAll = new RemoveAll(parentPath);
103+
ActionResult removeAllResult = removeAll.execute(context);
104+
if (Status.ERROR.equals(removeAllResult.getStatus())) {
105+
copyErrorMessages(removeAllResult, actionResult);
101106
}
102107
}
103108
}
@@ -111,14 +116,33 @@ private void copyErrorMessages(ActionResult from, ActionResult to) {
111116
}
112117
}
113118

114-
private NodeIterator getPermissions(Context context)
119+
private Set<String> getAccessControlledPaths(Context context)
115120
throws ActionExecutionException, RepositoryException {
121+
Set<String> result = new HashSet<>();
116122
JackrabbitSession session = context.getSession();
117123
String path = PERMISSION_STORE_PATH + context.getCurrentAuthorizable().getID();
118-
NodeIterator result = null;
119124
if (session.nodeExists(path)) {
120125
Node node = session.getNode(path);
121-
result = node.getNodes();
126+
NodeIterator nodes = node.getNodes();
127+
while (nodes.hasNext()) {
128+
node = nodes.nextNode();
129+
if (node.hasProperty(PermissionConstants.REP_ACCESS_CONTROLLED_PATH)) {
130+
result.add(node.getProperty(PermissionConstants.REP_ACCESS_CONTROLLED_PATH).getString());
131+
}
132+
}
133+
} else {
134+
JackrabbitAccessControlManager accessControlManager = (JackrabbitAccessControlManager) session.getAccessControlManager();
135+
AccessControlPolicy[] accessControlPolicies = accessControlManager.getPolicies(context.getCurrentAuthorizable().getPrincipal());
136+
for (AccessControlPolicy accessControlPolicy : accessControlPolicies) {
137+
AbstractAccessControlList abstractAccessControlList = (AbstractAccessControlList) accessControlPolicy;
138+
List<? extends JackrabbitAccessControlEntry> jackrabbitAccessControlEntries = abstractAccessControlList.getEntries();
139+
for (JackrabbitAccessControlEntry jackrabbitAccessControlEntry : jackrabbitAccessControlEntries) {
140+
Set<Restriction> restrictions = ((ACE) jackrabbitAccessControlEntry).getRestrictions();
141+
for (Restriction restriction : restrictions) {
142+
result.add(restriction.getProperty().getValue(Type.STRING));
143+
}
144+
}
145+
}
122146
}
123147
return result;
124148
}

0 commit comments

Comments
 (0)