1 package org
.argeo
.cms
.internal
.useradmin
;
3 import static org
.argeo
.jcr
.ArgeoJcrConstants
.ALIAS_NODE
;
4 import static org
.argeo
.jcr
.ArgeoJcrConstants
.JCR_REPOSITORY_ALIAS
;
6 import java
.util
.ArrayList
;
7 import java
.util
.Collection
;
8 import java
.util
.Iterator
;
11 import javax
.jcr
.Node
;
12 import javax
.jcr
.Repository
;
13 import javax
.jcr
.RepositoryException
;
14 import javax
.jcr
.Session
;
16 import org
.argeo
.ArgeoException
;
17 import org
.argeo
.security
.UserAdminService
;
18 import org
.argeo
.security
.jcr
.JcrSecurityModel
;
19 import org
.argeo
.security
.jcr
.JcrUserDetails
;
20 import org
.argeo
.security
.jcr
.SimpleJcrSecurityModel
;
21 import org
.osgi
.framework
.BundleContext
;
22 import org
.osgi
.framework
.InvalidSyntaxException
;
23 import org
.osgi
.framework
.ServiceReference
;
24 import org
.osgi
.service
.useradmin
.Authorization
;
25 import org
.osgi
.service
.useradmin
.Role
;
26 import org
.osgi
.service
.useradmin
.User
;
27 import org
.osgi
.service
.useradmin
.UserAdmin
;
28 import org
.osgi
.service
.useradmin
.UserAdminEvent
;
29 import org
.osgi
.service
.useradmin
.UserAdminListener
;
30 import org
.springframework
.security
.core
.GrantedAuthority
;
31 import org
.springframework
.security
.core
.userdetails
.UserDetails
;
32 import org
.springframework
.security
.core
.userdetails
.UsernameNotFoundException
;
34 public class JcrUserAdmin
implements UserAdmin
{
35 private final BundleContext bundleContext
;
36 private UserAdminService userAdminService
;
38 private final JcrSecurityModel jcrSecurityModel
= new SimpleJcrSecurityModel();
39 private final Session session
;
41 public JcrUserAdmin(BundleContext bundleContext
) {
43 this.bundleContext
= bundleContext
;
45 ServiceReference
<Repository
> nodeRepo
= bundleContext
46 .getServiceReferences(Repository
.class,
47 "(" + JCR_REPOSITORY_ALIAS
+ "=" + ALIAS_NODE
+ ")")
49 this.session
= bundleContext
.getService(nodeRepo
).login();
50 } catch (Exception e
) {
51 throw new ArgeoException("Cannot initialize user admin", e
);
56 public Role
createRole(String name
, int type
) {
58 if (Role
.USER
== type
) {
59 Node userProfile
= jcrSecurityModel
.sync(session
, name
, null);
60 session
.getWorkspace().getVersionManager()
61 .checkout(userProfile
.getPath());
64 JcrUserDetails userDetails
= new JcrUserDetails(userProfile
,
65 password
, new ArrayList
<GrantedAuthority
>());
67 session
.getWorkspace().getVersionManager()
68 .checkin(userProfile
.getPath());
69 userAdminService().createUser(userDetails
);
70 return new JcrEnduser(userDetails
);
71 } else if (Role
.GROUP
== type
) {
72 userAdminService().newRole(name
);
73 return new JcrGroup(name
);
75 throw new ArgeoException("Unsupported role type " + type
);
77 } catch (RepositoryException e
) {
78 throw new ArgeoException("Cannot create role " + name
);
83 public boolean removeRole(String name
) {
84 Role role
= getRole(name
);
87 if (role
instanceof JcrEnduser
)
88 userAdminService().deleteUser(role
.getName());
89 else if (role
instanceof JcrGroup
)
90 userAdminService().deleteRole(role
.getName());
97 public Role
getRole(String name
) {
98 if (userAdminService().listEditableRoles().contains(name
))
99 return new JcrGroup(name
);
101 UserDetails userDetails
= userAdminService().loadUserByUsername(
103 return new JcrEnduser(userDetails
);
104 } catch (UsernameNotFoundException e
) {
110 public Role
[] getRoles(String filter
) throws InvalidSyntaxException
{
112 throw new ArgeoException("Filtering not yet implemented");
113 List
<String
> roles
= new ArrayList
<String
>(userAdminService()
114 .listEditableRoles());
115 List
<String
> users
= new ArrayList
<String
>(userAdminService()
117 Role
[] res
= new Role
[users
.size() + roles
.size()];
118 for (int i
= 0; i
< roles
.size(); i
++)
119 res
[i
] = new JcrGroup(roles
.get(i
));
120 for (int i
= 0; i
< users
.size(); i
++)
121 res
[roles
.size() + i
] = new JcrEnduser(userAdminService()
122 .loadUserByUsername(users
.get(i
)));
127 public User
getUser(String key
, String value
) {
128 throw new ArgeoException("Property based search not yet implemented");
132 public Authorization
getAuthorization(User user
) {
136 private synchronized UserAdminService
userAdminService() {
137 return userAdminService
;
140 public void setUserAdminService(UserAdminService userAdminService
) {
141 this.userAdminService
= userAdminService
;
144 protected synchronized void notifyEvent(UserAdminEvent event
) {
146 Collection
<ServiceReference
<UserAdminListener
>> sr
= bundleContext
147 .getServiceReferences(UserAdminListener
.class, null);
148 for (Iterator
<ServiceReference
<UserAdminListener
>> it
= sr
149 .iterator(); it
.hasNext();) {
150 UserAdminListener listener
= bundleContext
151 .getService(it
.next());
152 listener
.roleChanged(event
);
154 } catch (InvalidSyntaxException e
) {
155 throw new ArgeoException("Cannot notify listeners", e
);