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