]>
git.argeo.org Git - gpl/argeo-suite.git/blob - SuiteUtils.java
46cb5de43698b08cebac9364569fd29043f22332
1 package org
.argeo
.app
.core
;
3 import java
.util
.HashSet
;
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
;
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
;
23 /** Utilities around the Argeo Suite APIs. */
24 public class SuiteUtils
{
26 public static String
getUserNodePath(String userDn
) {
27 String uid
= RoleNameUtils
.getLastRdnValue(userDn
);
28 return EntityType
.user
.basePath() + '/' + uid
;
32 private static Node
getOrCreateUserNode(Session adminSession
, String userDn
) {
34 Node usersBase
= adminSession
.getNode(EntityType
.user
.basePath());
35 String uid
= RoleNameUtils
.getLastRdnValue(userDn
);
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
);
44 JackrabbitSecurityUtils
.denyPrivilege(adminSession
, userNode
.getPath(), SuiteRole
.coworker
.dn(),
46 JcrUtils
.addPrivilege(adminSession
, userNode
.getPath(), new X500Principal(userDn
.toString()).getName(),
48 JcrUtils
.addPrivilege(adminSession
, userNode
.getPath(), CmsConstants
.ROLE_USER_ADMIN
,
51 userNode
= usersBase
.getNode(uid
);
54 } catch (RepositoryException e
) {
55 throw new JcrException("Cannot create user node for " + userDn
, e
);
60 public static Node
getCmsSessionNode(Session session
, CmsSession cmsSession
) {
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
);
69 public static Node
getOrCreateCmsSessionNode(Session adminSession
, CmsSession cmsSession
) {
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();
82 // userNode = usersBase.getNode(uid);
84 String cmsSessionUuid
= cmsSession
.getUuid().toString();
86 if (!userNode
.hasNode(cmsSessionUuid
)) {
87 cmsSessionNode
= userNode
.addNode(cmsSessionUuid
, NodeType
.NT_UNSTRUCTURED
);
88 cmsSessionNode
.addMixin(NodeType
.MIX_CREATED
);
90 JcrUtils
.addPrivilege(adminSession
, cmsSessionNode
.getPath(), cmsSession
.getUserRole(),
93 cmsSessionNode
= userNode
.getNode(cmsSessionUuid
);
95 return cmsSessionNode
;
96 } catch (RepositoryException e
) {
97 throw new JcrException("Cannot create session dir for " + cmsSession
, e
);
102 private SuiteUtils() {
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());
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());