]> git.argeo.org Git - gpl/argeo-suite.git/blob - SuiteUtils.java
46cb5de43698b08cebac9364569fd29043f22332
[gpl/argeo-suite.git] / SuiteUtils.java
1 package org.argeo.app.core;
2
3 import java.util.HashSet;
4 import java.util.Set;
5
6 import javax.jcr.Node;
7 import javax.jcr.RepositoryException;
8 import javax.jcr.Session;
9 import javax.jcr.nodetype.NodeType;
10 import javax.jcr.security.Privilege;
11 import javax.security.auth.x500.X500Principal;
12
13 import org.argeo.api.cms.CmsConstants;
14 import org.argeo.api.cms.CmsSession;
15 import org.argeo.app.api.EntityType;
16 import org.argeo.app.api.SuiteRole;
17 import org.argeo.cms.auth.RoleNameUtils;
18 import org.argeo.jackrabbit.security.JackrabbitSecurityUtils;
19 import org.argeo.jcr.JcrException;
20 import org.argeo.jcr.JcrUtils;
21 import org.argeo.util.naming.LdapAttrs;
22
23 /** Utilities around the Argeo Suite APIs. */
24 public class SuiteUtils {
25 @Deprecated
26 public static String getUserNodePath(String userDn) {
27 String uid = RoleNameUtils.getLastRdnValue(userDn);
28 return EntityType.user.basePath() + '/' + uid;
29 }
30
31 @Deprecated
32 private static Node getOrCreateUserNode(Session adminSession, String userDn) {
33 try {
34 Node usersBase = adminSession.getNode(EntityType.user.basePath());
35 String uid = RoleNameUtils.getLastRdnValue(userDn);
36 Node userNode;
37 if (!usersBase.hasNode(uid)) {
38 userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
39 userNode.addMixin(EntityType.user.get());
40 userNode.addMixin(NodeType.MIX_CREATED);
41 userNode.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString());
42 userNode.setProperty(LdapAttrs.uid.property(), uid);
43 adminSession.save();
44 JackrabbitSecurityUtils.denyPrivilege(adminSession, userNode.getPath(), SuiteRole.coworker.dn(),
45 Privilege.JCR_READ);
46 JcrUtils.addPrivilege(adminSession, userNode.getPath(), new X500Principal(userDn.toString()).getName(),
47 Privilege.JCR_READ);
48 JcrUtils.addPrivilege(adminSession, userNode.getPath(), CmsConstants.ROLE_USER_ADMIN,
49 Privilege.JCR_ALL);
50 } else {
51 userNode = usersBase.getNode(uid);
52 }
53 return userNode;
54 } catch (RepositoryException e) {
55 throw new JcrException("Cannot create user node for " + userDn, e);
56 }
57 }
58
59 @Deprecated
60 public static Node getCmsSessionNode(Session session, CmsSession cmsSession) {
61 try {
62 return session.getNode(getUserNodePath(cmsSession.getUserDn()) + '/' + cmsSession.getUuid().toString());
63 } catch (RepositoryException e) {
64 throw new JcrException("Cannot get session dir for " + cmsSession, e);
65 }
66 }
67
68 @Deprecated
69 public static Node getOrCreateCmsSessionNode(Session adminSession, CmsSession cmsSession) {
70 try {
71 String userDn = cmsSession.getUserDn();
72 // String uid = userDn.get(userDn.size() - 1);
73 Node userNode = getOrCreateUserNode(adminSession, userDn);
74 // if (!usersBase.hasNode(uid)) {
75 // userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
76 // userNode.addMixin(EntityType.user.get());
77 // userNode.addMixin(NodeType.MIX_CREATED);
78 // usersBase.setProperty(LdapAttrs.uid.property(), uid);
79 // usersBase.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString());
80 // adminSession.save();
81 // } else {
82 // userNode = usersBase.getNode(uid);
83 // }
84 String cmsSessionUuid = cmsSession.getUuid().toString();
85 Node cmsSessionNode;
86 if (!userNode.hasNode(cmsSessionUuid)) {
87 cmsSessionNode = userNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED);
88 cmsSessionNode.addMixin(NodeType.MIX_CREATED);
89 adminSession.save();
90 JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(),
91 Privilege.JCR_ALL);
92 } else {
93 cmsSessionNode = userNode.getNode(cmsSessionUuid);
94 }
95 return cmsSessionNode;
96 } catch (RepositoryException e) {
97 throw new JcrException("Cannot create session dir for " + cmsSession, e);
98 }
99 }
100
101 /** Singleton. */
102 private SuiteUtils() {
103
104 }
105
106 public static Set<String> extractRoles(String[] semiColArr) {
107 Set<String> res = new HashSet<>();
108 // TODO factorize and make it more robust
109 final String rolesPrefix = "roles:=\"";
110 // first one is layer id
111 for (int i = 1; i < semiColArr.length; i++) {
112 if (semiColArr[i].startsWith(rolesPrefix)) {
113 String rolesStr = semiColArr[i].substring(rolesPrefix.length());
114 // remove last "
115 rolesStr = rolesStr.substring(0, rolesStr.lastIndexOf('\"'));
116 // TODO support AND (&) as well
117 String[] roles = rolesStr.split("\\|");// OR (|)
118 for (String role : roles) {
119 res.add(role.trim());
120 }
121 }
122 }
123 return res;
124 }
125
126 }