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.core;
35
36 import java.util.Map;
37
38 import javax.jcr.RepositoryException;
39
40 import org.apache.jackrabbit.core.SessionImpl;
41 import org.apache.jackrabbit.core.cache.GrowingLRUMap;
42 import org.apache.jackrabbit.core.id.ItemId;
43 import org.apache.jackrabbit.core.id.PropertyId;
44 import org.apache.jackrabbit.spi.Path;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48
49
50
51 public class RootOnlyPermissions extends DefaultACLBasedPermissions {
52
53 @SuppressWarnings("unchecked")
54 private final Map<ItemId, Boolean> readCache = new GrowingLRUMap(1024, 5000);
55 private final Object monitor = new Object();
56
57 private static final Logger log = LoggerFactory.getLogger(RootOnlyPermissions.class);
58
59 public RootOnlyPermissions(SessionImpl systemSession) {
60 super(null, systemSession, null);
61 this.session = systemSession;
62 }
63
64 @Override
65 public boolean canRead(Path itemPath, ItemId itemId) throws RepositoryException {
66
67 if (itemPath == null) {
68
69
70 if (!itemId.denotesNode()) {
71 itemId = ((PropertyId) itemId).getParentId();
72 }
73
74 synchronized (monitor) {
75
76 if (readCache.containsKey(itemId)) {
77 return readCache.get(itemId);
78 }
79
80 itemPath = session.getHierarchyManager().getPath(itemId);
81
82 boolean canRead = "/".equals(pathResolver.getJCRPath(itemPath));
83 readCache.put(itemId, canRead);
84 return canRead;
85 }
86 }
87
88 String path = pathResolver.getJCRPath(itemPath);
89 log.debug("Read request for " + path + " :: " + itemId);
90 return "/".equals(pathResolver.getJCRPath(itemPath));
91 }
92
93 @Override
94 public boolean grants(Path absPath, int permissions) throws RepositoryException {
95 return "/".equals(pathResolver.getJCRPath(absPath));
96 }
97 }