1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.delta;
35
36 import info.magnolia.cms.security.Security;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.jcr.iterator.SameChildNodeTypeIterator;
39 import info.magnolia.module.InstallContext;
40 import info.magnolia.repository.RepositoryConstants;
41
42 import java.util.ArrayList;
43 import java.util.Collection;
44 import java.util.Iterator;
45
46 import javax.jcr.Node;
47 import javax.jcr.NodeIterator;
48 import javax.jcr.RepositoryException;
49 import javax.jcr.Session;
50
51 import org.apache.commons.lang3.StringUtils;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55
56
57
58 public class RemoveDuplicatePermissionTask extends AbstractRepositoryTask {
59 private static final Logger log = LoggerFactory.getLogger(RemoveDuplicatePermissionTask.class);
60
61 private final String roleName;
62 private final String aclNodeWorkspaceName;
63
64 public RemoveDuplicatePermissionTask(String roleName, String aclNodeWorkspaceName) {
65 this("Remove duplicate permissions",
66 String.format("Remove duplicate permissions for role '%s' in '%s' workspace.", roleName, StringUtils.removeStart(aclNodeWorkspaceName, "acl_")),
67 roleName, aclNodeWorkspaceName);
68 }
69
70 public RemoveDuplicatePermissionTask(String taskName, String taskDescription, String roleName, String aclNodeWorkspaceName) {
71 super(taskName, taskDescription);
72 this.roleName = roleName;
73 this.aclNodeWorkspaceName = aclNodeWorkspaceName;
74 }
75
76 @Override
77 protected void doExecute(InstallContext ctx) throws RepositoryException, TaskExecutionException {
78 try {
79 Session session = MgnlContext.getJCRSession(RepositoryConstants.USER_ROLES);
80 Collection<Node> deleteNode = new ArrayList<Node>();
81
82 Node roleNode = session.getNodeByIdentifier(Security.getRoleManager().getRole(roleName).getId());
83 Node aclNode = roleNode.getNode(aclNodeWorkspaceName);
84 NodeIterator childrenIter = new SameChildNodeTypeIterator(aclNode);
85 for (int i = 0; i < childrenIter.getSize(); i++) {
86 Node child = childrenIter.nextNode();
87 NodeIterator secondChildrenIter = new SameChildNodeTypeIterator(aclNode);
88 for (int j = 0; j < secondChildrenIter.getSize(); j++) {
89 Node otherChild = secondChildrenIter.nextNode();
90 if (childrenIter.getPosition() < secondChildrenIter.getPosition()) {
91 if (child.getProperty("path").getString().equals(otherChild.getProperty("path").getString()) && child.getProperty("permissions").getLong() == otherChild.getProperty("permissions").getLong()) {
92 log.warn("Found duplicate permission. Role: {} Workspace: {} Permission: {} Path: {}", roleName, aclNodeWorkspaceName, otherChild.getProperty("permissions").getLong(), otherChild.getProperty("path").getString());
93 deleteNode.add(otherChild);
94 break;
95 }
96 }
97 }
98 }
99 Iterator<Node> deleteNodeIter = deleteNode.iterator();
100 while (deleteNodeIter.hasNext()) {
101 deleteNodeIter.next().remove();
102 }
103 session.save();
104 } catch (Exception e) {
105 log.error("can't remove duplicate permission", e);
106 }
107 }
108 }