]>
git.argeo.org Git - gpl/argeo-suite.git/blob - org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java
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
.naming
.ldap
.LdapName
;
12 import javax
.security
.auth
.x500
.X500Principal
;
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
;
23 /** Utilities around the Argeo Suite APIs. */
24 public class SuiteUtils
{
26 public static String
getUserNodePath(LdapName userDn
) {
27 String uid
= userDn
.getRdn(userDn
.size() - 1).getValue().toString();
28 return EntityType
.user
.basePath() + '/' + uid
;
31 public static Node
getOrCreateUserNode(Session adminSession
, LdapName userDn
) {
33 Node usersBase
= adminSession
.getNode(EntityType
.user
.basePath());
34 String uid
= userDn
.getRdn(userDn
.size() - 1).getValue().toString();
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
);
43 JackrabbitSecurityUtils
.denyPrivilege(adminSession
, userNode
.getPath(), SuiteRole
.coworker
.dn(),
45 JcrUtils
.addPrivilege(adminSession
, userNode
.getPath(), new X500Principal(userDn
.toString()).getName(),
47 JcrUtils
.addPrivilege(adminSession
, userNode
.getPath(), CmsConstants
.ROLE_USER_ADMIN
,
50 userNode
= usersBase
.getNode(uid
);
53 } catch (RepositoryException e
) {
54 throw new JcrException("Cannot create user node for " + userDn
, e
);
58 public static Node
getCmsSessionNode(Session session
, CmsSession cmsSession
) {
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
);
66 public static Node
getOrCreateCmsSessionNode(Session adminSession
, CmsSession cmsSession
) {
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();
79 // userNode = usersBase.getNode(uid);
81 String cmsSessionUuid
= cmsSession
.getUuid().toString();
83 if (!userNode
.hasNode(cmsSessionUuid
)) {
84 cmsSessionNode
= userNode
.addNode(cmsSessionUuid
, NodeType
.NT_UNSTRUCTURED
);
85 cmsSessionNode
.addMixin(NodeType
.MIX_CREATED
);
87 JcrUtils
.addPrivilege(adminSession
, cmsSessionNode
.getPath(), cmsSession
.getUserRole(),
90 cmsSessionNode
= userNode
.getNode(cmsSessionUuid
);
92 return cmsSessionNode
;
93 } catch (RepositoryException e
) {
94 throw new JcrException("Cannot create session dir for " + cmsSession
, e
);
99 private SuiteUtils() {
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());
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());