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.cms.security;
35
36 import info.magnolia.cms.core.Content;
37 import info.magnolia.cms.core.HierarchyManager;
38 import info.magnolia.cms.core.NodeData;
39 import info.magnolia.context.MgnlContext;
40
41 import javax.jcr.ItemNotFoundException;
42 import javax.jcr.PathNotFoundException;
43 import java.util.Collection;
44 import java.util.Set;
45 import java.util.SortedSet;
46 import java.util.TreeSet;
47
48
49
50
51
52
53
54 class MgnlSecurityUtil {
55 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MgnlSecurityUtil.class);
56
57 static Set<String> collectPropertyNames(Content rootNode, String subnodeName, String repositoryName, boolean isDeep) {
58 final SortedSet<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
59 try {
60 final Content node = rootNode.getContent(subnodeName);
61 collectPropertyNames(node, repositoryName, set, isDeep);
62 } catch (PathNotFoundException e) {
63 log.debug("{} does not have any {}", rootNode.getHandle(), repositoryName);
64 } catch (Throwable t) {
65 log.error("Failed to read " + repositoryName, t);
66 }
67 return set;
68 }
69
70 static void collectPropertyNames(Content node, String repositoryName, Collection<String> set, boolean isDeep) throws Throwable {
71 final Collection<NodeData> c = node.getNodeDataCollection();
72 for (NodeData nd : c) {
73 final String uuid = nd.getString();
74 try {
75 final HierarchyManager hierarchyManager = getSystemHierarchyManager(repositoryName);
76 final Content targetNode = hierarchyManager.getContentByUUID(uuid);
77 set.add(targetNode.getName());
78 if (isDeep && targetNode.hasContent("groups")) {
79 collectPropertyNames(targetNode.getContent("groups"), repositoryName, set, true);
80 }
81 }
82 catch (ItemNotFoundException t) {
83 final String path = nd.getHandle();
84
85 log.warn("Can't find {} node by UUID {} referred by node {}", new Object[]{repositoryName, t.getMessage(), path});
86 log.debug("Failed while reading node by UUID", t);
87
88
89 }
90 }
91 }
92
93 static HierarchyManager getContextHierarchyManager(String repositoryId) {
94 return MgnlContext.getHierarchyManager(repositoryId);
95 }
96
97 static HierarchyManager getSystemHierarchyManager(String repositoryName) {
98 return MgnlContext.getSystemContext().getHierarchyManager(repositoryName);
99 }
100 }