]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/useradmin/JcrUserAdmin.java
Remove deprecated code
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / useradmin / JcrUserAdmin.java
1 package org.argeo.cms.internal.useradmin;
2
3 import static org.argeo.jcr.ArgeoJcrConstants.ALIAS_NODE;
4 import static org.argeo.jcr.ArgeoJcrConstants.JCR_REPOSITORY_ALIAS;
5
6 import java.util.ArrayList;
7 import java.util.Collection;
8 import java.util.Iterator;
9 import java.util.List;
10
11 import javax.jcr.Node;
12 import javax.jcr.Repository;
13 import javax.jcr.RepositoryException;
14 import javax.jcr.Session;
15
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;
33
34 public class JcrUserAdmin implements UserAdmin {
35 private final BundleContext bundleContext;
36 private UserAdminService userAdminService;
37
38 private final JcrSecurityModel jcrSecurityModel = new SimpleJcrSecurityModel();
39 private final Session session;
40
41 public JcrUserAdmin(BundleContext bundleContext) {
42 try {
43 this.bundleContext = bundleContext;
44
45 ServiceReference<Repository> nodeRepo = bundleContext
46 .getServiceReferences(Repository.class,
47 "(" + JCR_REPOSITORY_ALIAS + "=" + ALIAS_NODE + ")")
48 .iterator().next();
49 this.session = bundleContext.getService(nodeRepo).login();
50 } catch (Exception e) {
51 throw new ArgeoException("Cannot initialize user admin", e);
52 }
53 }
54
55 @Override
56 public Role createRole(String name, int type) {
57 try {
58 if (Role.USER == type) {
59 Node userProfile = jcrSecurityModel.sync(session, name, null);
60 session.getWorkspace().getVersionManager()
61 .checkout(userProfile.getPath());
62 String password = "";
63 // TODO add roles
64 JcrUserDetails userDetails = new JcrUserDetails(userProfile,
65 password, new ArrayList<GrantedAuthority>());
66 session.save();
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);
74 } else {
75 throw new ArgeoException("Unsupported role type " + type);
76 }
77 } catch (RepositoryException e) {
78 throw new ArgeoException("Cannot create role " + name);
79 }
80 }
81
82 @Override
83 public boolean removeRole(String name) {
84 Role role = getRole(name);
85 if (role == null)
86 return false;
87 if (role instanceof JcrEnduser)
88 userAdminService().deleteUser(role.getName());
89 else if (role instanceof JcrGroup)
90 userAdminService().deleteRole(role.getName());
91 else
92 return false;
93 return true;
94 }
95
96 @Override
97 public Role getRole(String name) {
98 if (userAdminService().listEditableRoles().contains(name))
99 return new JcrGroup(name);
100 try {
101 UserDetails userDetails = userAdminService().loadUserByUsername(
102 name);
103 return new JcrEnduser(userDetails);
104 } catch (UsernameNotFoundException e) {
105 return null;
106 }
107 }
108
109 @Override
110 public Role[] getRoles(String filter) throws InvalidSyntaxException {
111 if (filter != null)
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()
116 .listUsers());
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)));
123 return res;
124 }
125
126 @Override
127 public User getUser(String key, String value) {
128 throw new ArgeoException("Property based search not yet implemented");
129 }
130
131 @Override
132 public Authorization getAuthorization(User user) {
133 return null;
134 }
135
136 private synchronized UserAdminService userAdminService() {
137 return userAdminService;
138 }
139
140 public void setUserAdminService(UserAdminService userAdminService) {
141 this.userAdminService = userAdminService;
142 }
143
144 protected synchronized void notifyEvent(UserAdminEvent event) {
145 try {
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);
153 }
154 } catch (InvalidSyntaxException e) {
155 throw new ArgeoException("Cannot notify listeners", e);
156 }
157 }
158 }