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 @Deprecated
91 public AddUsersPermissionTask(String taskName, String pathToUsers, String workspace, String workspacePath, long permission) {
92 this(taskName, pathToUsers, workspace, workspacePath, permission, Components.getComponent(NodeNameHelper.class));
93 }
94
95 public AddUsersPermissionTask exclude(String... excludedUserNames) {
96 this.excludedUserNames = Arrays.asList(excludedUserNames);
97 return this;
98 }
99
100 @Override
101 protected boolean nodeMatches(Node node) {
102 try {
103 return NodeTypes.User.NAME.equals(node.getPrimaryNodeType().getName()) && !excludedUserNames.contains(node.getName());
104 } catch (RepositoryException e) {
105 log.error(e.getMessage(), e);
106 return false;
107 }
108 }
109
110 @Override
111 protected void operateOnNode(InstallContext installContext, Node user) {
112 try {
113 final Node aclNode = NodeUtil.createPath(user, "acl_" + workspaceName, NodeTypes.ContentNode.NAME);
114 final String path = StringUtils.replace(this.path, USER_PATH_REPLACEMENT, user.getPath());
115
116 if (permissionExists(aclNode, path)) {
117 installContext.warn(String.format("User '%s' has already permission for '%s:%s'.", user.getPath(), workspaceName, path));
118 } else {
119 final String nodeName = nodeNameHelper.getUniqueName(aclNode, "0");
120 final Node permissionNode = aclNode.addNode(nodeName, NodeTypes.ContentNode.NAME);
121 permissionNode.setProperty("path", path);
122 permissionNode.setProperty("permissions", permission);
123 }
124 } catch (RepositoryException e) {
125 installContext.error(e.getMessage(), e);
126 }
127 }
128
129 private boolean permissionExists(Node aclNode, String path) throws RepositoryException {
130 NodeIterator children = aclNode.getNodes();
131 while (children.hasNext()) {
132 Node child = children.nextNode();
133 if (child.hasProperty("path") && child.getProperty("path").getString().equals(path)) {
134 return true;
135 }
136 }
137 return false;
138 }
139 }