]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.jcr/src/org/argeo/app/jcr/SuiteJcrUtils.java
Adapt to changes in Argeo Build and Argeo Commons
[gpl/argeo-suite.git] / org.argeo.app.jcr / src / org / argeo / app / jcr / SuiteJcrUtils.java
1 package org.argeo.app.jcr;
2
3 import static org.argeo.app.core.SuiteUtils.USER_DEVICES_NODE_NAME;
4 import static org.argeo.app.core.SuiteUtils.USER_SESSIONS_NODE_NAME;
5 import static org.argeo.app.core.SuiteUtils.USER_STATE_NODE_NAME;
6
7 import javax.jcr.Node;
8 import javax.jcr.NodeIterator;
9 import javax.jcr.RepositoryException;
10 import javax.jcr.Session;
11 import javax.jcr.nodetype.NodeType;
12 import javax.jcr.security.Privilege;
13 import javax.security.auth.x500.X500Principal;
14
15 import org.argeo.api.acr.ldap.LdapAttr;
16 import org.argeo.api.cms.CmsConstants;
17 import org.argeo.api.cms.CmsSession;
18 import org.argeo.app.api.AppUserState;
19 import org.argeo.app.api.EntityType;
20 import org.argeo.app.core.SuiteUtils;
21 import org.argeo.cms.RoleNameUtils;
22 import org.argeo.jcr.JcrException;
23 import org.argeo.jcr.JcrUtils;
24
25 /** JCR utilities. */
26 public class SuiteJcrUtils {
27 /** @deprecated Use {@link AppUserState} instead. */
28 @Deprecated
29 public static Node getOrCreateUserNode(Session adminSession, String userDn) {
30 try {
31 Node usersBase = adminSession.getNode(EntityType.user.basePath());
32 String uid = RoleNameUtils.getLastRdnValue(userDn);
33 Node userNode;
34 if (!usersBase.hasNode(uid)) {
35 userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
36 userNode.addMixin(EntityType.user.get());
37 userNode.addMixin(NodeType.MIX_CREATED);
38 userNode.setProperty(LdapAttr.distinguishedName.get(), userDn.toString());
39 userNode.setProperty(LdapAttr.uid.get(), uid);
40 } else {
41 userNode = usersBase.getNode(uid);
42 }
43
44 if (!userNode.hasNode(USER_SESSIONS_NODE_NAME)) {
45 // Migrate existing user node
46 Node sessionsNode = userNode.addNode(USER_SESSIONS_NODE_NAME, NodeType.NT_UNSTRUCTURED);
47 oldSessions: for (NodeIterator nit = userNode.getNodes(); nit.hasNext();) {
48 Node child = nit.nextNode();
49 if (USER_SESSIONS_NODE_NAME.equals(child.getName()) || child.getName().startsWith("rep:")
50 || child.getName().startsWith("jcr:"))
51 continue oldSessions;
52 Node target = sessionsNode.addNode(child.getName());
53 JcrUtils.copy(child, target);
54 }
55
56 Node userStateNode = userNode.addNode(USER_STATE_NODE_NAME, NodeType.NT_UNSTRUCTURED);
57 Node userDevicesNode = userNode.addNode(USER_DEVICES_NODE_NAME, NodeType.NT_UNSTRUCTURED);
58
59 adminSession.save();
60 // JackrabbitSecurityUtils.denyPrivilege(adminSession, userNode.getPath(), SuiteRole.coworker.dn(),
61 // Privilege.JCR_READ);
62 JcrUtils.addPrivilege(adminSession, userNode.getPath(), new X500Principal(userDn.toString()).getName(),
63 Privilege.JCR_READ);
64 JcrUtils.addPrivilege(adminSession, userNode.getPath(), CmsConstants.ROLE_USER_ADMIN,
65 Privilege.JCR_ALL);
66
67 JcrUtils.addPrivilege(adminSession, userStateNode.getPath(), userDn, Privilege.JCR_ALL);
68 JcrUtils.addPrivilege(adminSession, userDevicesNode.getPath(), userDn, Privilege.JCR_ALL);
69 }
70 return userNode;
71 } catch (RepositoryException e) {
72 throw new JcrException("Cannot create user node for " + userDn, e);
73 }
74 }
75
76 /** @deprecated Use {@link AppUserState} instead. */
77 @Deprecated
78 public static Node getCmsSessionNode(Session session, CmsSession cmsSession) {
79 try {
80 return session.getNode(SuiteUtils.getUserNodePath(cmsSession.getUserDn()) + '/' + USER_SESSIONS_NODE_NAME
81 + '/' + cmsSession.uuid().toString());
82 } catch (RepositoryException e) {
83 throw new JcrException("Cannot get session dir for " + cmsSession, e);
84 }
85 }
86
87 /** @deprecated Use {@link AppUserState} instead. */
88 @Deprecated
89 public static Node getOrCreateCmsSessionNode(Session adminSession, CmsSession cmsSession) {
90 try {
91 String userDn = cmsSession.getUserDn();
92 Node userNode = getOrCreateUserNode(adminSession, userDn);
93 Node sessionsNode = userNode.getNode(USER_SESSIONS_NODE_NAME);
94 String cmsSessionUuid = cmsSession.uuid().toString();
95 Node cmsSessionNode;
96 if (!sessionsNode.hasNode(cmsSessionUuid)) {
97 cmsSessionNode = sessionsNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED);
98 cmsSessionNode.addMixin(NodeType.MIX_CREATED);
99 adminSession.save();
100 JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(),
101 Privilege.JCR_ALL);
102 } else {
103 cmsSessionNode = sessionsNode.getNode(cmsSessionUuid);
104 }
105 return cmsSessionNode;
106 } catch (RepositoryException e) {
107 throw new JcrException("Cannot create session dir for " + cmsSession, e);
108 }
109 }
110
111 /** singleton */
112 private SuiteJcrUtils() {
113 }
114 }