]> git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java
Instrument image utils
[gpl/argeo-suite.git] / org.argeo.app.core / src / org / argeo / app / core / 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.naming.ldap.LdapName;
12 import javax.security.auth.x500.X500Principal;
13
14 import org.argeo.api.cms.CmsConstants;
15 import org.argeo.api.cms.CmsSession;
16 import org.argeo.app.api.EntityType;
17 import org.argeo.app.api.SuiteRole;
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
26 public static String getUserNodePath(LdapName userDn) {
27 String uid = userDn.getRdn(userDn.size() - 1).getValue().toString();
28 return EntityType.user.basePath() + '/' + uid;
29 }
30
31 public static Node getOrCreateUserNode(Session adminSession, LdapName userDn) {
32 try {
33 Node usersBase = adminSession.getNode(EntityType.user.basePath());
34 String uid = userDn.getRdn(userDn.size() - 1).getValue().toString();
35 Node userNode;
36 if (!usersBase.hasNode(uid)) {
37 userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
38 userNode.addMixin(EntityType.user.get());
39 userNode.addMixin(NodeType.MIX_CREATED);
40 userNode.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString());
41 userNode.setProperty(LdapAttrs.uid.property(), uid);
42 adminSession.save();
43 JackrabbitSecurityUtils.denyPrivilege(adminSession, userNode.getPath(), SuiteRole.coworker.dn(),
44 Privilege.JCR_READ);
45 JcrUtils.addPrivilege(adminSession, userNode.getPath(), new X500Principal(userDn.toString()).getName(),
46 Privilege.JCR_READ);
47 JcrUtils.addPrivilege(adminSession, userNode.getPath(), CmsConstants.ROLE_USER_ADMIN,
48 Privilege.JCR_ALL);
49 } else {
50 userNode = usersBase.getNode(uid);
51 }
52 return userNode;
53 } catch (RepositoryException e) {
54 throw new JcrException("Cannot create user node for " + userDn, e);
55 }
56 }
57
58 public static Node getCmsSessionNode(Session session, CmsSession cmsSession) {
59 try {
60 return session.getNode(getUserNodePath(cmsSession.getUserDn()) + '/' + cmsSession.getUuid().toString());
61 } catch (RepositoryException e) {
62 throw new JcrException("Cannot get session dir for " + cmsSession, e);
63 }
64 }
65
66 public static Node getOrCreateCmsSessionNode(Session adminSession, CmsSession cmsSession) {
67 try {
68 LdapName userDn = cmsSession.getUserDn();
69 // String uid = userDn.get(userDn.size() - 1);
70 Node userNode = getOrCreateUserNode(adminSession, userDn);
71 // if (!usersBase.hasNode(uid)) {
72 // userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
73 // userNode.addMixin(EntityType.user.get());
74 // userNode.addMixin(NodeType.MIX_CREATED);
75 // usersBase.setProperty(LdapAttrs.uid.property(), uid);
76 // usersBase.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString());
77 // adminSession.save();
78 // } else {
79 // userNode = usersBase.getNode(uid);
80 // }
81 String cmsSessionUuid = cmsSession.getUuid().toString();
82 Node cmsSessionNode;
83 if (!userNode.hasNode(cmsSessionUuid)) {
84 cmsSessionNode = userNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED);
85 cmsSessionNode.addMixin(NodeType.MIX_CREATED);
86 adminSession.save();
87 JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(),
88 Privilege.JCR_ALL);
89 } else {
90 cmsSessionNode = userNode.getNode(cmsSessionUuid);
91 }
92 return cmsSessionNode;
93 } catch (RepositoryException e) {
94 throw new JcrException("Cannot create session dir for " + cmsSession, e);
95 }
96 }
97
98 /** Singleton. */
99 private SuiteUtils() {
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 }