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