]>
git.argeo.org Git - gpl/argeo-suite.git/blob - SuiteUtils.java
93f3b148c085d3ba1ba0c3dbe54e29d64aa597d4
1 package org
.argeo
.suite
;
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
.naming
.ldap
.LdapName
;
12 import javax
.security
.auth
.x500
.X500Principal
;
14 import org
.argeo
.api
.NodeConstants
;
15 import org
.argeo
.cms
.auth
.CmsSession
;
16 import org
.argeo
.entity
.EntityType
;
17 import org
.argeo
.jackrabbit
.security
.JackrabbitSecurityUtils
;
18 import org
.argeo
.jcr
.JcrException
;
19 import org
.argeo
.jcr
.JcrUtils
;
20 import org
.argeo
.naming
.LdapAttrs
;
22 /** Utilities around the Argeo Suite APIs. */
23 public class SuiteUtils
{
25 public static String
getUserNodePath(LdapName userDn
) {
26 String uid
= userDn
.getRdn(userDn
.size() - 1).getValue().toString();
27 return EntityType
.user
.basePath() + '/' + uid
;
30 public static Node
getOrCreateUserNode(Session adminSession
, LdapName userDn
) {
32 Node usersBase
= adminSession
.getNode(EntityType
.user
.basePath());
33 String uid
= userDn
.getRdn(userDn
.size() - 1).getValue().toString();
35 if (!usersBase
.hasNode(uid
)) {
36 userNode
= usersBase
.addNode(uid
, NodeType
.NT_UNSTRUCTURED
);
37 userNode
.addMixin(EntityType
.user
.get());
38 userNode
.addMixin(NodeType
.MIX_CREATED
);
39 userNode
.setProperty(LdapAttrs
.distinguishedName
.property(), userDn
.toString());
40 userNode
.setProperty(LdapAttrs
.uid
.property(), uid
);
42 JackrabbitSecurityUtils
.denyPrivilege(adminSession
, userNode
.getPath(), SuiteRole
.coworker
.dn(),
44 JcrUtils
.addPrivilege(adminSession
, userNode
.getPath(), new X500Principal(userDn
.toString()).getName(),
46 JcrUtils
.addPrivilege(adminSession
, userNode
.getPath(), NodeConstants
.ROLE_USER_ADMIN
,
49 userNode
= usersBase
.getNode(uid
);
52 } catch (RepositoryException e
) {
53 throw new JcrException("Cannot create user node for " + userDn
, e
);
57 public static Node
getCmsSessionNode(Session session
, CmsSession cmsSession
) {
59 return session
.getNode(getUserNodePath(cmsSession
.getUserDn()) + '/' + cmsSession
.getUuid().toString());
60 } catch (RepositoryException e
) {
61 throw new JcrException("Cannot get session dir for " + cmsSession
, e
);
65 public static Node
getOrCreateCmsSessionNode(Session adminSession
, CmsSession cmsSession
) {
67 LdapName userDn
= cmsSession
.getUserDn();
68 // String uid = userDn.get(userDn.size() - 1);
69 Node userNode
= getOrCreateUserNode(adminSession
, userDn
);
70 // if (!usersBase.hasNode(uid)) {
71 // userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
72 // userNode.addMixin(EntityType.user.get());
73 // userNode.addMixin(NodeType.MIX_CREATED);
74 // usersBase.setProperty(LdapAttrs.uid.property(), uid);
75 // usersBase.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString());
76 // adminSession.save();
78 // userNode = usersBase.getNode(uid);
80 String cmsSessionUuid
= cmsSession
.getUuid().toString();
82 if (!userNode
.hasNode(cmsSessionUuid
)) {
83 cmsSessionNode
= userNode
.addNode(cmsSessionUuid
, NodeType
.NT_UNSTRUCTURED
);
84 cmsSessionNode
.addMixin(NodeType
.MIX_CREATED
);
86 JcrUtils
.addPrivilege(adminSession
, cmsSessionNode
.getPath(), cmsSession
.getUserRole(),
89 cmsSessionNode
= userNode
.getNode(cmsSessionUuid
);
91 return cmsSessionNode
;
92 } catch (RepositoryException e
) {
93 throw new JcrException("Cannot create session dir for " + cmsSession
, e
);
98 private SuiteUtils() {
102 public static Set
<String
> extractRoles(String
[] semiColArr
) {
103 Set
<String
> res
= new HashSet
<>();
104 // TODO factorize and make it more robust
105 final String rolesPrefix
= "roles:=\"";
106 // first one is layer id
107 for (int i
= 1; i
< semiColArr
.length
; i
++) {
108 if (semiColArr
[i
].startsWith(rolesPrefix
)) {
109 String rolesStr
= semiColArr
[i
].substring(rolesPrefix
.length());
111 rolesStr
= rolesStr
.substring(0, rolesStr
.lastIndexOf('\"'));
112 // TODO support AND (&) as well
113 String
[] roles
= rolesStr
.split("\\|");// OR (|)
114 for (String role
: roles
) {
115 res
.add(role
.trim());