]> git.argeo.org Git - lgpl/argeo-commons.git/blob - kernel/NodeUserAdmin.java
Prepare next development cycle
[lgpl/argeo-commons.git] / kernel / NodeUserAdmin.java
1 package org.argeo.cms.internal.kernel;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 import javax.naming.InvalidNameException;
12 import javax.naming.ldap.LdapName;
13
14 import org.argeo.cms.KernelHeader;
15 import org.argeo.osgi.useradmin.ArgeoUserAdminException;
16 import org.argeo.osgi.useradmin.UserAdminAggregator;
17 import org.osgi.framework.InvalidSyntaxException;
18 import org.osgi.service.useradmin.Authorization;
19 import org.osgi.service.useradmin.Role;
20 import org.osgi.service.useradmin.User;
21 import org.osgi.service.useradmin.UserAdmin;
22
23 public class NodeUserAdmin implements UserAdmin, UserAdminAggregator {
24 final static LdapName ROLES_BASE;
25 static {
26 try {
27 ROLES_BASE = new LdapName(KernelHeader.ROLES_BASEDN);
28 } catch (InvalidNameException e) {
29 throw new ArgeoUserAdminException("Cannot initialize "
30 + NodeUserAdmin.class, e);
31 }
32 }
33
34 private UserAdmin nodeRoles = null;
35 private Map<LdapName, UserAdmin> userAdmins = new HashMap<LdapName, UserAdmin>();
36
37 @Override
38 public Role createRole(String name, int type) {
39 return findUserAdmin(name).createRole(name, type);
40 }
41
42 @Override
43 public boolean removeRole(String name) {
44 return findUserAdmin(name).removeRole(name);
45 }
46
47 @Override
48 public Role getRole(String name) {
49 return findUserAdmin(name).getRole(name);
50 }
51
52 @Override
53 public Role[] getRoles(String filter) throws InvalidSyntaxException {
54 List<Role> res = new ArrayList<Role>();
55 for (UserAdmin userAdmin : userAdmins.values()) {
56 res.addAll(Arrays.asList(userAdmin.getRoles(filter)));
57 }
58 res.addAll(Arrays.asList(nodeRoles.getRoles(filter)));
59 return res.toArray(new Role[res.size()]);
60 }
61
62 @Override
63 public User getUser(String key, String value) {
64 List<User> res = new ArrayList<User>();
65 for (UserAdmin userAdmin : userAdmins.values()) {
66 User u = userAdmin.getUser(key, value);
67 if (u != null)
68 res.add(u);
69 }
70 // Note: node roles cannot contain users, so it is not searched
71 return res.size() == 1 ? res.get(0) : null;
72 }
73
74 @Override
75 public Authorization getAuthorization(User user) {
76 UserAdmin userAdmin = findUserAdmin(user.getName());
77 // FIXME clarify assumptions
78 return userAdmin.getAuthorization(user);
79 // String[] roles = auth.getRoles();
80 // // Gather system roles
81 // Set<String> systemRoles = new HashSet<String>();
82 // for(String businessRole:roles){
83 //
84 // }
85 // return null;
86 }
87
88 //
89 // USER ADMIN AGGREGATOR
90 //
91 @Override
92 public synchronized void addUserAdmin(String baseDn, UserAdmin userAdmin) {
93 if (baseDn.equals(KernelHeader.ROLES_BASEDN)) {
94 nodeRoles = userAdmin;
95 return;
96 }
97
98 if (userAdmins.containsKey(baseDn))
99 throw new ArgeoUserAdminException(
100 "There is already a user admin for " + baseDn);
101 try {
102 userAdmins.put(new LdapName(baseDn), userAdmin);
103 } catch (InvalidNameException e) {
104 throw new ArgeoUserAdminException("Badly formatted base DN "
105 + baseDn, e);
106 }
107 }
108
109 @Override
110 public synchronized void removeUserAdmin(String baseDn) {
111 if (baseDn.equals(KernelHeader.ROLES_BASEDN))
112 throw new ArgeoUserAdminException("Node roles cannot be removed.");
113 LdapName base;
114 try {
115 base = new LdapName(baseDn);
116 } catch (InvalidNameException e) {
117 throw new ArgeoUserAdminException("Badly formatted base DN "
118 + baseDn, e);
119 }
120 if (!userAdmins.containsKey(base))
121 throw new ArgeoUserAdminException("There is no user admin for "
122 + base);
123 userAdmins.remove(base);
124 }
125
126 private UserAdmin findUserAdmin(String name) {
127 try {
128 return findUserAdmin(new LdapName(name));
129 } catch (InvalidNameException e) {
130 throw new ArgeoUserAdminException("Badly formatted name " + name, e);
131 }
132 }
133
134 private UserAdmin findUserAdmin(LdapName name) {
135 if (name.startsWith(ROLES_BASE))
136 return nodeRoles;
137 List<UserAdmin> res = new ArrayList<UserAdmin>(1);
138 for (LdapName baseDn : userAdmins.keySet()) {
139 if (name.startsWith(baseDn))
140 res.add(userAdmins.get(baseDn));
141 }
142 if (res.size() == 0)
143 throw new ArgeoUserAdminException("Cannot find user admin for "
144 + name);
145 if (res.size() > 1)
146 throw new ArgeoUserAdminException("Multiple user admin found for "
147 + name);
148 return res.get(0);
149 }
150 }