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.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54
55
56
57
58
59 public class RemoveDuplicatePermissionTask extends AbstractRepositoryTask {
60 private static final Logger log = LoggerFactory.getLogger(RemoveDuplicatePermissionTask.class);
61
62
63 private final String roleName;
64 private final String workspaceName;
65
66 public RemoveDuplicatePermissionTask(String taskName, String taskDescription, String roleName, String workspaceName) {
67 super(taskName, taskDescription);
68 this.roleName = roleName;
69 this.workspaceName = workspaceName;
70 }
71
72 @Override
73 protected void doExecute(InstallContext ctx) throws RepositoryException, TaskExecutionException {
74 try {
75 Session session = MgnlContext.getJCRSession(RepositoryConstants.USER_ROLES);
76 Collection<Node> deleteNode = new ArrayList<Node>();
77
78 Node roleNode = session.getNodeByIdentifier(Security.getRoleManager().getRole(roleName).getId());
79 Node aclNode = roleNode.getNode(workspaceName);
80 NodeIterator childrenIter = new SameChildNodeTypeIterator(aclNode);
81 for(int i = 0; i < childrenIter.getSize(); i++){
82 Node child = childrenIter.nextNode();
83 NodeIterator secondChildrenIter = new SameChildNodeTypeIterator(aclNode);
84 for(int j = 0; j < secondChildrenIter.getSize(); j++){
85 Node otherChild = secondChildrenIter.nextNode();
86 if(childrenIter.getPosition() < secondChildrenIter.getPosition()){
87 if(child.getProperty("path").getString().equals(otherChild.getProperty("path").getString()) && child.getProperty("permissions").getLong() == otherChild.getProperty("permissions").getLong()){
88 log.warn("Found duplicate permission. Role: " + roleName + " Workspace: " + workspaceName + " Permission: " + otherChild.getProperty("permissions").getLong() + " Path: " + otherChild.getProperty("path").getString());
89 deleteNode.add(otherChild);
90 break;
91 }
92 }
93 }
94 }
95 Iterator<Node> deleteNodeIter = deleteNode.iterator();
96 while(deleteNodeIter.hasNext()){
97 deleteNodeIter.next().remove();
98 }
99 session.save();
100 }
101 catch (Exception e) {
102 log.error("can't remove duplicate permission", e);
103 }
104 }
105 }