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.core.Path;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.jcr.util.NodeUtil;
39 import info.magnolia.module.InstallContext;
40 import info.magnolia.repository.RepositoryConstants;
41
42 import java.util.ArrayList;
43 import java.util.Arrays;
44 import java.util.List;
45
46 import javax.jcr.Node;
47 import javax.jcr.NodeIterator;
48 import javax.jcr.RepositoryException;
49
50 import org.apache.commons.lang3.StringUtils;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54
55
56
57
58 public class AddUsersPermissionTask extends NodeVisitorTask {
59
60 public static final String USER_PATH_REPLACEMENT = "${USER_PATH}";
61
62 private static final Logger log = LoggerFactory.getLogger(AddUsersPermissionTask.class);
63
64 private final String workspaceName;
65 private final String path;
66 private final long permission;
67 private List<String> excludedUserNames = new ArrayList<>();
68
69
70
71
72
73
74
75 public AddUsersPermissionTask(String taskName, String pathToUsers, String workspace, String workspacePath, long permission) {
76 super(taskName, String.format("Adds permission '%s:%s=%d' to users under the path '%s'", workspace, workspacePath, permission, pathToUsers), RepositoryConstants.USERS, pathToUsers);
77 this.workspaceName = workspace;
78 this.path = workspacePath;
79 this.permission = permission;
80 }
81
82 public AddUsersPermissionTask exclude(String... excludedUserNames) {
83 this.excludedUserNames = Arrays.asList(excludedUserNames);
84 return this;
85 }
86
87 @Override
88 protected boolean nodeMatches(Node node) {
89 try {
90 return NodeTypes.User.NAME.equals(node.getPrimaryNodeType().getName()) && !excludedUserNames.contains(node.getName());
91 } catch (RepositoryException e) {
92 log.error(e.getMessage(), e);
93 return false;
94 }
95 }
96
97 @Override
98 protected void operateOnNode(InstallContext installContext, Node user) {
99 try {
100 final Node aclNode = NodeUtil.createPath(user, "acl_" + workspaceName, NodeTypes.ContentNode.NAME);
101 final String path = StringUtils.replace(this.path, USER_PATH_REPLACEMENT, user.getPath());
102
103 if (permissionExists(aclNode, path)) {
104 installContext.warn(String.format("User '%s' has already permission for '%s:%s'.", user.getPath(), workspaceName, path));
105 } else {
106 final String nodeName = Path.getUniqueLabel(aclNode, "0");
107 final Node permissionNode = aclNode.addNode(nodeName, NodeTypes.ContentNode.NAME);
108 permissionNode.setProperty("path", path);
109 permissionNode.setProperty("permissions", permission);
110 }
111 } catch (RepositoryException e) {
112 installContext.error(e.getMessage(), e);
113 }
114 }
115
116 private boolean permissionExists(Node aclNode, String path) throws RepositoryException {
117 NodeIterator children = aclNode.getNodes();
118 while (children.hasNext()) {
119 Node child = children.nextNode();
120 if (child.hasProperty("path") && child.getProperty("path").getString().equals(path)) {
121 return true;
122 }
123 }
124 return false;
125 }
126 }