1 package org
.argeo
.cms
.internal
.useradmin
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Collection
;
5 import java
.util
.Iterator
;
9 import javax
.jcr
.Repository
;
10 import javax
.jcr
.RepositoryException
;
11 import javax
.jcr
.Session
;
13 import org
.argeo
.ArgeoException
;
14 import org
.argeo
.jcr
.JcrUtils
;
15 import org
.argeo
.security
.UserAdminService
;
16 import org
.argeo
.security
.jcr
.JcrSecurityModel
;
17 import org
.argeo
.security
.jcr
.JcrUserDetails
;
18 import org
.argeo
.security
.jcr
.SimpleJcrSecurityModel
;
19 import org
.osgi
.framework
.BundleContext
;
20 import org
.osgi
.framework
.InvalidSyntaxException
;
21 import org
.osgi
.framework
.ServiceReference
;
22 import org
.osgi
.service
.useradmin
.Authorization
;
23 import org
.osgi
.service
.useradmin
.Role
;
24 import org
.osgi
.service
.useradmin
.User
;
25 import org
.osgi
.service
.useradmin
.UserAdmin
;
26 import org
.osgi
.service
.useradmin
.UserAdminEvent
;
27 import org
.osgi
.service
.useradmin
.UserAdminListener
;
28 import org
.springframework
.security
.core
.GrantedAuthority
;
29 import org
.springframework
.security
.core
.userdetails
.UsernameNotFoundException
;
31 public class JcrUserAdmin
implements UserAdmin
{
32 private final BundleContext bundleContext
;
33 private UserAdminService userAdminService
;
35 private final JcrSecurityModel jcrSecurityModel
= new SimpleJcrSecurityModel();
36 private final Session session
;
38 public JcrUserAdmin(BundleContext bundleContext
, Repository node
) {
40 this.bundleContext
= bundleContext
;
41 this.session
= node
.login();
42 } catch (Exception e
) {
43 throw new ArgeoException("Cannot initialize user admin", e
);
47 public void destroy() {
48 JcrUtils
.logoutQuietly(session
);
52 public Role
createRole(String name
, int type
) {
54 if (Role
.USER
== type
) {
55 Node userProfile
= jcrSecurityModel
.sync(session
, name
, null);
56 session
.getWorkspace().getVersionManager()
57 .checkout(userProfile
.getPath());
60 JcrUserDetails userDetails
= new JcrUserDetails(userProfile
,
61 password
, new ArrayList
<GrantedAuthority
>());
63 session
.getWorkspace().getVersionManager()
64 .checkin(userProfile
.getPath());
65 userAdminService().createUser(userDetails
);
66 return new JcrEndUser(userDetails
);
67 } else if (Role
.GROUP
== type
) {
68 userAdminService().newRole(name
);
69 return new JcrGroup(name
);
71 throw new ArgeoException("Unsupported role type " + type
);
73 } catch (RepositoryException e
) {
74 throw new ArgeoException("Cannot create role " + name
);
79 public boolean removeRole(String name
) {
80 Role role
= getRole(name
);
83 if (role
instanceof JcrEndUser
)
84 userAdminService().deleteUser(role
.getName());
85 else if (role
instanceof JcrGroup
)
86 userAdminService().deleteRole(role
.getName());
93 public Role
getRole(String name
) {
95 JcrUserDetails userDetails
= (JcrUserDetails
) userAdminService()
96 .loadUserByUsername(name
);
97 return new JcrEndUser(userDetails
);
98 } catch (UsernameNotFoundException e
) {
99 if (userAdminService().listEditableRoles().contains(name
))
100 return new JcrGroup(name
);
107 public Role
[] getRoles(String filter
) throws InvalidSyntaxException
{
109 throw new ArgeoException("Filtering not yet implemented");
110 List
<String
> roles
= new ArrayList
<String
>(userAdminService()
111 .listEditableRoles());
112 List
<String
> users
= new ArrayList
<String
>(userAdminService()
114 Role
[] res
= new Role
[users
.size() + roles
.size()];
115 for (int i
= 0; i
< roles
.size(); i
++)
116 res
[i
] = new JcrGroup(roles
.get(i
));
117 for (int i
= 0; i
< users
.size(); i
++)
118 res
[roles
.size() + i
] = new JcrEndUser(
119 (JcrUserDetails
) userAdminService().loadUserByUsername(
125 public User
getUser(String key
, String value
) {
126 throw new ArgeoException("Property based search not yet implemented");
130 public Authorization
getAuthorization(User user
) {
131 return new JcrAuthorization(((JcrEndUser
) user
).getUserDetails());
134 private synchronized UserAdminService
userAdminService() {
135 return userAdminService
;
138 public void setUserAdminService(UserAdminService userAdminService
) {
139 this.userAdminService
= userAdminService
;
142 protected synchronized void notifyEvent(UserAdminEvent event
) {
144 Collection
<ServiceReference
<UserAdminListener
>> sr
= bundleContext
145 .getServiceReferences(UserAdminListener
.class, null);
146 for (Iterator
<ServiceReference
<UserAdminListener
>> it
= sr
147 .iterator(); it
.hasNext();) {
148 UserAdminListener listener
= bundleContext
149 .getService(it
.next());
150 listener
.roleChanged(event
);
152 } catch (InvalidSyntaxException e
) {
153 throw new ArgeoException("Cannot notify listeners", e
);