]> git.argeo.org Git - lgpl/argeo-commons.git/blob - NodeUserAdmin.java
0746d4301d5b324ac61921a56c77d720e342c767
[lgpl/argeo-commons.git] / NodeUserAdmin.java
1 package org.argeo.cms.internal.osgi;
2
3 import java.util.Dictionary;
4 import java.util.HashMap;
5 import java.util.Hashtable;
6 import java.util.Map;
7
8 import org.argeo.api.cms.CmsConstants;
9 import org.argeo.api.cms.CmsLog;
10 import org.argeo.cms.internal.runtime.CmsUserAdmin;
11 import org.argeo.cms.internal.runtime.KernelConstants;
12 import org.argeo.osgi.useradmin.UserAdminConf;
13 import org.argeo.osgi.useradmin.UserDirectory;
14 import org.osgi.framework.Constants;
15 import org.osgi.service.cm.ConfigurationException;
16 import org.osgi.service.cm.ManagedServiceFactory;
17 import org.osgi.service.useradmin.UserAdmin;
18
19 /**
20 * Aggregates multiple {@link UserDirectory} and integrates them with system
21 * roles.
22 */
23 public class NodeUserAdmin extends CmsUserAdmin implements ManagedServiceFactory, KernelConstants {
24 private final static CmsLog log = CmsLog.getLog(NodeUserAdmin.class);
25
26 // OSGi
27 private Map<String, String> pidToBaseDn = new HashMap<>();
28
29 @Override
30 public void updated(String pid, Dictionary<String, ?> properties) throws ConfigurationException {
31
32 String basePath = (String) properties.get(UserAdminConf.baseDn.name());
33
34 // FIXME make updates more robust
35 if (pidToBaseDn.containsValue(basePath)) {
36 if (log.isDebugEnabled())
37 log.debug("Ignoring user directory update of " + basePath);
38 return;
39 }
40
41 UserDirectory userDirectory = enableUserDirectory(properties);
42 // OSGi
43 Hashtable<String, Object> regProps = new Hashtable<>();
44 regProps.put(Constants.SERVICE_PID, pid);
45 if (isSystemRolesBaseDn(basePath))
46 regProps.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
47 regProps.put(UserAdminConf.baseDn.name(), basePath);
48
49 CmsActivator.getBundleContext().registerService(UserDirectory.class, userDirectory, regProps);
50 pidToBaseDn.put(pid, basePath);
51
52 if (isSystemRolesBaseDn(basePath)) {
53 // publishes itself as user admin only when system roles are available
54 Dictionary<String, Object> userAdminregProps = new Hashtable<>();
55 userAdminregProps.put(CmsConstants.CN, CmsConstants.DEFAULT);
56 userAdminregProps.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
57 CmsActivator.getBundleContext().registerService(UserAdmin.class, this, userAdminregProps);
58 }
59 }
60
61 @Override
62 public void deleted(String pid) {
63 // assert pidToServiceRegs.get(pid) != null;
64 assert pidToBaseDn.get(pid) != null;
65 // pidToServiceRegs.remove(pid).unregister();
66 String basePath = pidToBaseDn.remove(pid);
67 removeUserDirectory(basePath);
68 }
69
70 @Override
71 public String getName() {
72 return "Node User Admin";
73 }
74
75 }